2016-06-13 7 views
7

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

答えて

13

和の誘導体はすなわち、デリバティブの合計です:

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

我々が開始o_iに関してp_jの誘導体を導出する:

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

私が使用することを決めましたこれをより読みやすくするために、o_iに関する派生語についてはd_iとなります。 我々が得る製品のルールの使用:

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

は、第一項を見るとし、誘導体は0i != j場合、これは私がD_ijを呼び出しますdelta functionで表すことができるだろう。これは、(第一項のために)提供します:

ちょうど私たちの本来の機能は、我々は個別に和の各要素を導き出す第二項、唯一の非について D_ij

= D_ij * p_j 

を乗じて

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

、これは私たちを与えたときに -zero用語は

= -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トンを置く(合計が分母にあるため、電源ルールを忘れてはならない)となります

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 

私たちの答えです:あなたは本当に私たちはi = ji != j例にそれを分割することができますしたい場合は

D_ij * p_j - p_j * p_i 

:私たちは、驚くほど簡単な式を得るogether。

+0

ありがとうございました!これはとても明確です。私はより良い説明を求めることができなかった! :)私は派生を完全に理解してうれしいです。私はこれを数学の交換されていないものに言及するつもりです。 – Roshini

+0

@SirGuyは3番目の式を 'd_i(exp(o_j))/ Sum_k(exp(o_k))+ exp(o_j)* d_i(1/Sum_k(exp(o_k))'とすべきではありませんか?最後の 'o_k'の前にexpがありません –

+0

@BenjaminCrouzierありがとう、修正済み – SirGuy

3

SirGuyの答えに基づいた私の派生は次のとおりです。(見つけたら、エラーを指摘してください)。

enter image description here

+0

ありがとうございました!私は疑問が1つしかありません。なぜ、Σ_k((d e^{o_k})/ do_i)がステップ4から5まで「e^{o_i}」と評価されるのですか?私はあなたがその質問に提供できる洞察に非常に感謝しています。 – duhaime

+1

@duhaime良い質問です。その合計のすべての条件を1つずつ考え、それぞれの用語に何が起こるかを見てください。あなたは2つのケースがあることが分かります:i = kのとき、用語は 'd/do_i e^o_i'です。これは' e^o_i'です。 i!= kのとき、あなたはゼロの束を得る。 –

+0

大変感謝しています! – duhaime