web-dev-qa-db-ja.com

ソフトマックス関数の説明の導関数

ソフトマックスの活性化関数の導関数を計算しようとしています。私はこれを見つけました: https://math.stackexchange.com/questions/945871/derivative-of-softmax-loss-function 誰も私たちが私のために答えを得る方法について適切な導出を与えていないようです= jおよびi!= j。誰かがこれを説明してもらえますか?ソフトマックス活性化関数の分母のように総和が含まれる場合、導関数と混同されます。

9
Roshini

合計の導関数は、導関数の合計です。

    d(f1 + f2 + f3 + f4)/dx = df1/dx + df2/dx + df3/dx + df4/dx

p_jに関してo_iの導関数を導出するには、次のように開始します。

    d_i(p_j) = d_i(exp(o_j) / Sum_k(exp(o_k)))

これを読みやすくするために、d_iに関する導関数にo_iを使用することにしました。積の法則を使用すると、次のようになります。

     d_i(exp(o_j)) / Sum_k(exp(o_k)) + exp(o_j) * d_i(1/Sum_k(exp(o_k)))

最初の項を見ると、導関数は0になります。i != jの場合、これは デルタ関数 で表すことができます。これをD_ijと呼びます。これにより、(最初の用語について)次のようになります。

    = D_ij * exp(o_j) / Sum_k(exp(o_k))

これは、元の関数にD_ijを掛けたものです。

    = D_ij * p_j

第2項では、合計の各要素を個別に導出する場合、ゼロ以外の項はi = kの場合のみになります。これにより、次のようになります(合計が分母にあるため、べき乗則を忘れないでください)。

    = -exp(o_j) * Sum_k(d_i(exp(o_k)) / Sum_k(exp(o_k))^2
    = -exp(o_j) * exp(o_i) / Sum_k(exp(o_k))^2
    = -(exp(o_j) / Sum_k(exp(o_k))) * (exp(o_j) / Sum_k(exp(o_k)))
    = -p_j * p_i

この2つを組み合わせると、驚くほど単純な式が得られます。

    D_ij * p_j - p_j * p_i

本当に必要な場合は、i = ji != jのケースに分割できます。

    i = j: D_ii * p_i - p_i * p_i = p_i - p_i * p_i = p_i * (1 - p_i)

    i != j: D_ij * p_i - p_i * p_j = -p_i * p_j

それが私たちの答えです。

15
SirGuy

その価値については、SirGuyの回答に基づいた私の導出です:(エラーが見つかった場合は、遠慮なく指摘してください)。

enter image description here

7