Softmax /クロスエントロピーによる逆伝播


40

私は、ソフトマックス/クロスエントロピー出力層での逆伝播の仕組みを理解しようとしています。

クロスエントロピー誤差関数は

E(t,o)=−∑jtjlog⁡oj

とニューロンにおける目標出力としてそれぞれ。合計は、出力層の各ニューロンに対するものです。自体は、関数の結果です。tojoj

oj=softmax(zj)=ezj∑jezj

この場合も、合計は出力層の各ニューロンあり、はニューロンへの入力です。zjj

zj=∑iwijoi+b

これは、対応する出力とニューロンに対する重みにバイアス加えた、前の層のすべてのニューロンの合計です。oiwijjb

ここで、出力層のニューロンを前の層のニューロンに接続する重みを更新するには、チェーンルールを使用して誤差関数の偏微分を計算する必要があります。wijji

∂E∂wij=∂E∂oj∂oj∂zj∂zj∂wij

ニューロンへの入力として、。zjj

最後の用語は非常に簡単です。と間に重みが1つしかないため、導関数は次のようになります。ij

∂zj∂wij=oi

最初の項は、出力に関するエラー関数の導出です。oj

∂E∂oj=−tjoj

中間項は、その入力に対する関数のが難しいことです。zj

∂oj∂zj=∂∂zjezj∑jezj

クラス対応する3つの出力ニューロンがあり、が次のようになっているとします。a,b,cob=softmax(b)

ob=ezb∑ez=ezbeza+ezb+ezc

および商ルールを使用したその導出:

∂ob∂zb=ezb∗∑ez−(ezb)2(∑jez)2=ezb∑ez−(ezb)2(∑ez)2
=softmax(b)−softmax2(b)=ob−ob2=ob(1−ob)
バックプロパゲーションの中間用語に戻ると、これは次のことを意味します:
∂oj∂zj=oj(1−oj)

すべてをまとめると

∂E∂wij=−tjoj∗oj(1−oj)∗oi=−tj(1−oj)∗oi

つまり、このクラスのターゲットがである場合、この重みを更新しません。それは正しく聞こえません。tj=0

この私に調査することは、人々はソフトマックス導出、1のための2つのバリエーションを持った用およびその他のように、ここやここ。i=ji≠j

しかし、私はこれを理解することはできません。また、これが私のエラーの原因であるかどうかもわかりません。そのため、すべての計算を投稿しています。誰かが私が何かを見逃している、または間違っている場所を明確にしてくれることを願っています。


指定したリンクは、入力に対する微分を計算していますが、重みに対する微分を計算しています。
— ジェンカー

回答:


35

注:私はbackpropの専門家ではありませんが、少し読みましたが、次の警告が適切だと思います。ニューラルネットに関する論文や本を読むとき、標準的な合計/インデックス表記、マトリックス表記、マルチインデックス表記の組み合わせを使用してデリバティブが記述されることは珍しくありません(テンソルテンソル派生の最後の2つのハイブリッドを含みます) )。通常、これは「コンテキストから理解する」必要があるため、注意する必要があります!

私はあなたの派生にいくつかの矛盾があることに気づきました。私は実際にニューラルネットワークをしていませんので、以下は間違っているかもしれません。ただし、ここで問題を解決する方法を示します。

まず、の合計を考慮する必要があり、各項が1つの重みにのみ依存すると仮定することはできません。勾配を取るように成分に対しての、我々は EEkz

E=−∑jtjlog⁡oj⟹∂E∂zk=−∑jtj∂log⁡oj∂zk

次いで、発現として 我々はを ありますクロネッカーのデルタ。そして、分母の勾配は あり、 または、ログを展開 微分は、、任意oj

oj=1Ωezj,Ω=∑iezi⟹log⁡oj=zj−log⁡Ω
∂log⁡oj∂zk=δjk−1Ω∂Ω∂zk
δjk
∂Ω∂zk=∑ieziδik=ezk
∂log⁡oj∂zk=δjk−ok
∂oj∂zk=oj(δjk−ok)
zk項を与えるコンポーネント(場合のみ)。zδjk=1k=j

勾配ように関してその後され ここで、 は定数です(特定のベクトルに対して)。Ez

∂E∂zk=∑jtj(ok−δjk)=ok(∑jtj)−tk⟹∂E∂zk=okτ−tk
τ=∑jtjt

これは、結果との最初の違いを示していますは乗算しなくなり。が「ワンホット」である典型的なケースでは、を持っていることに注意してください(最初のリンクで述べたように)。tkoktτ=1

私が正しく理解していれば第二矛盾は、「ということであるに入力され、」「可能性は低いと思われるソフトマックスから出力さ」。これは、実際にはネットワークアーキテクチャの「さらに先」にあるというのが理にかなっていると思います。ozo

このベクトル呼び出すと、 y

zk=∑iwikyi+bk⟹∂zk∂wpq=∑iyi∂wik∂wpq=∑iyiδipδkq=δkqyp

最後に、重み行列に関するの勾配を取得するには、チェーンルール (1を仮定 -hot、つまり) ここで、は(あなたの例の)最低レベルの入力です。Ew

∂E∂wpq=∑k∂E∂zk∂zk∂wpq=∑k(okτ−tk)δkqyp=yp(oqτ−tq)
tτ=1
∂E∂wij=yi(oj−tj)
y

したがって、これは結果との2番目の違いを示しています。「」は、おそらくより上のレベル()ではなく、より下のレベル(と呼びます)からでなければなりません。oizyzo

これがお役に立てば幸いです。この結果はより一貫しているように見えますか?

更新:コメント内のOPからのクエリへの応答として、最初のステップを拡張します。まず、ベクトルチェーンルールには合計が必要であることに注意してください(こちらを参照)。第二に、すべての勾配成分を確実に取得するために、偏導関数の分母に成分の新しい添え字を常に導入する必要があります。したがって、完全チェーンルールで勾配を完全に書き出すには、 および だから

∂E∂wpq=∑i∂E∂oi∂oi∂wpq
∂oi∂wpq=∑k∂oi∂zk∂zk∂wpq
∂E∂wpq=∑i[∂E∂oi(∑k∂oi∂zk∂zk∂wpq)]
実際には、多くの項を取得するため、完全な合計は減少します。多くの場合「余分な」合計と下付き文字が含まれますが、完全なチェーンルールを使用すると、常に正しい結果が得られます。δab

「Backprop / AutoDiff」コミュニティがこれらの問題をどのように処理するかはわかりませんが、ショートカットを作成しようとすると、エラーが発生する可能性があります。ですから、ここでのようにして、すべてを添え字付きの合計で書き、常にすべての派生物に新しい添え字を導入します。(ここでの私の答えに似ています ...少なくとも最終的には正しい結果を
— 出せる

個人的には、すべてを書き留めておくことで、フォローしやすくなります。結果は正しいように見えます。
— ジェンカー

私はまだあなたの各ステップを完全に理解しようとしていますが、全体像を理解するのに役立ついくつかの貴重な洞察を得ました。派生と合計のトピックをもっと読む必要があると思います。しかし、Eの合計を考慮するようにあなたのアドバイスを受けて、私はこれを思いつきました
— 。– micha

2つの出力および withクロスエントロピーエラーは 導関数は そのあなたの結果に準拠...エラーの合計の前にマイナス記号がなかったことを考慮してoj1=ezj1Ωoj1=ezj1Ω
Ω=ezj1+ezj2
E=−(t1logoj1+t2logoj2)=−(t1(zj1−log(Ω))+t2(zj2−log(Ω)))
∂E∂(zj1=−(t1−t1ezj1Ω−t2ezj2Ω)=−t1+oj1(t1+t2)
— -micha

しかし、私が持っているさらなる質問は: これは一般に逆伝播で導入されたもので、次のように計算しました:をキャンセルするように。なぜこの方法が正しい結果につながるのですか?
∂E∂wij=∂E∂oj∂oj∂zj∂zj∂wij
∂E∂wij=∂E∂zj∂zj∂wij
∂oj
— ミカ

12

@ GeoMatt22の答えは正しいですが、個人的には問題をおもちゃの例に減らして絵を描くことは非常に便利だと思いました。

グラフィカルモデル。

次に、各ノードが計算する操作を定義し、と「ネットワーク」への入力として扱います(は、データポイントのクラスラベルを表すワンホットベクトルです)。hwt

L=−t1log⁡o1−t2log⁡o2
o1=exp⁡(y1)exp⁡(y1)+exp⁡(y2)
o2=exp⁡(y2)exp⁡(y1)+exp⁡(y2)
y1=w11h1+w21h2+w31h3
y2=w12h1+w22h2+w32h3

に関する損失の導関数を計算するとします。私は自分の写真を使用して、損失から関心のある重量までの経路をたどることができます(わかりやすくするためにの2番目の列を削除しました)。w21w

後方パスが強調表示されたグラフィカルモデル。

次に、必要な導関数を計算できます。には至る2つのパスがあるため、それぞれを通る導関数を合計する必要があることに注意してください。y1w21

∂L∂o1=−t1o1
∂L∂o2=−t2o2
∂o1∂y1=exp⁡(y1)exp⁡(y1)+exp⁡(y2)−(exp⁡(y1)exp⁡(y1)+exp⁡(y2))2=o1(1−o1)
∂o2∂y1=−exp⁡(y2)exp⁡(y1)(exp⁡(y1)+exp⁡(y2))2=−o2o1
∂y1∂w21=h2

最後に、チェーン規則をまとめます:

∂L∂w21=∂L∂o1∂o1∂y1∂y1∂w21+∂L∂o2∂o2∂y1∂y1∂w21=−t1o1[o1(1−o1)]h2+−t2o2(−o2o1)h2=h2(t2o1−t1+t1o1)=h2(o1(t1+t2)−t1)=h2(o1−t1)

ベクトルはワンホットベクトルであるため、最後のステップではことに注意してください。t1+t2=1t


これは最終的に私のためにこれをクリアしたものです!優れたエレガントな説明!!!!
— SantoshGupta7

2
私の投稿を読んで、楽しんで、そして恩恵を受けてくれて嬉しいです!それを書いて説明することも私にとって役に立ちました。
— ビベックスブラマニアン

@VivekSubramanianは、代わりに になりますか?
=−t1o1[o1(1−o1)]h2+−t2o2(−o2o1)h2
— コリアキンプ

あなたは正しい-それはタイプミスでした!変更します。
— ビベックスブラマニアン

ここで理解できないのは、いくつかのニューロンにロジット(スケールなしのスコア)を割り当てることです。(oはソフトマックスロジット(予測)、yはロジットです)。しかし、これは通常そうではありませんか?この図(o_out1は予測で、o_in1はロジット)を見てください。この場合、y1に関してo2の偏微分をどのように見つけることができますか?
— ARAT

6

代わりに、視覚的に大文字と小文字が区別される文字が必要です。置き換えてみましょう。また、変数を使用して、前のレイヤーのを指定します。{oi},{yi}{pi}{oi}

LET、その対角線等しいベクトルの対角行列であるすなわち、 、この新しいマトリックス変数と使用フロベニウス内積を我々は勾配計算することができる WRT。 Yy

Y=Diag(y)
EW
z=Wp+bdz=dWpy=softmax(z)dy=(Y−yyT)dzE=−t:log⁡(y)dE=−t:Y−1dydE=−t:Y−1(Y−yyT)dz=−t:(I−1yT)dz=−t:(I−1yT)dWp=(y1T−I)tpT:dW=((1Tt)ypT−tpT):dW∂E∂W=(1Tt)ypT−tpT

6

これは、「クロスエントロピー損失関数を使用した逆伝播アルゴリズムの導関数の計算」について説明した、ウェブ上で出会った最もクリーンでよく書かれたメモの 1つです。


与えられたpdfでは、式22はどのようにして式23になりましたか?Summation(k!= i)が負の符号を取得した方法と同様です。それは肯定的な兆候を得るべきではありませんか?同様にSummation(Fn)(For All K) = Fn(k=i) + Summation(Fn)(k!=i)私の理解に基づいて起こってしなければなりません。
— ファイザン

1

ここに、softmaxとその派生物を説明するリンクがあります。

i = jおよびi!= jを使用する理由を説明します。


将来リンクが壊れた場合に備えて、最小限のスタンドアロンの回答を提供することをお勧めします。それ以外の場合、これは将来他のユーザーに役立たなくなる可能性があります。
— ルチョナチョ

0

他の答えは導関数を計算する正しい方法を提供しましたが、彼らはあなたがどこを間違えたかを指摘しません。実際、最後の方程式ではは常に1です。これは、が出力のターゲット1のノードを取ると仮定したためです。他のノードのの確率関数の形式は異なるため、導関数の形式も異なります。したがって、他の人がと異なる方法で処理した理由を理解する必要があります。tjojoji=ji≠j

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.