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