興味がある人のために、ここで自己完結型の投稿に答えると思いました。これはここで説明された記法を使用するでしょう。
前書き
バックプロパゲーションの背後にある考え方は、ネットワークのトレーニングに使用する「トレーニング例」のセットを用意することです。これらにはそれぞれ既知の答えがあるため、それらをニューラルネットワークに接続して、どれだけ間違っていたかを見つけることができます。
たとえば、手書き認識では、実際の文字と並んで多くの手書き文字が使用されます。その後、バックプロパゲーションを介してニューラルネットワークをトレーニングして、各シンボルの認識方法を「学習」することができます。そのため、後で未知の手書き文字が表示されると、正しいものを識別できます。
具体的には、いくつかのトレーニングサンプルをニューラルネットワークに入力し、その効果を確認してから、「逆方向にトリクル」して、各ノードの重みとバイアスを変更してより良い結果を得ることができる量を見つけ、それに応じて調整します。これを続けると、ネットワークは「学習」します。
トレーニングプロセスに含まれる可能性のある他の手順(ドロップアウトなど)もありますが、これはこの質問の目的であるため、主にバックプロパゲーションに焦点を当てます。
偏微分
偏微分は、変数に関する微分です。 FX∂f∂xfx
たとえば、、場合、はに関する単なる定数であるためです。同様に、、ので、単にに対して一定である。∂ Ff(x,y)=x2+y2、Y2、X∂F∂f∂x=2xy2x、X2、Y∂f∂y=2yx2y
でれる関数の勾配は、すべての変数の偏微分を含む関数です。具体的には:∇f
∇f(v1,v2,...,vn)=∂f∂v1e1+⋯+∂f∂vnen
、
ここで、は変数方向を指す単位ベクトルです。v 1eiv1
今、私たちが計算したらいくつかの機能のための、我々は位置にある場合、私たちができる「ダウンスライド」方向に行くことによって。F (V 1、V 2、。。。、V N)F - ∇ F (V 1、V 2、。。。、V N)∇ff(v1,v2,...,vn)f−∇f(v1,v2,...,vn)
我々の例では、単位ベクトルであると、なぜならと、およびそれらベクトルは、軸と軸の方向を指します。したがって、。、E 1 = (1 、0 )、E 2 = (0 、1 )V 1 = X V 2 = Y のX 、Y ∇ F (X 、Yは)= 2 X (1 、0 )+ 2 Y (0 、1 )f(x,y)=x2+y2e1=(1,0)e2=(0,1)v1=xv2=yxy∇f(x,y)=2x(1,0)+2y(0,1)
ここで、関数を「下にスライド」するには、ポイントいるとしましょう。次に、方向に移動する必要があります。f(−2,4)−∇f(−2,−4)=−(2⋅−2⋅(1,0)+2⋅4⋅(0,1))=−((−4,0)+(0,8))=(4,−8)
このベクトルの大きさは、丘がどれほど急勾配であるかを示します(値が大きいほど、丘が急になります)。この場合、ます。42+(−8)2−−−−−−−−−√≈8.944
アダマール製品
2つの行列のアダマール積は、行列を要素単位で加算する代わりに、要素単位で乗算することを除いて、行列加算と同じです。A,B∈Rn×m
形式的には、行列の加算はですが、はA+B=CC∈Rn×m
Cij=Aij+Bij
、
アダマール商品、ようA⊙B=CC∈Rn×m
Cij=Aij⋅Bij
勾配の計算
(このセクションのほとんどはNeilsenの本からのものです)。
トレーニングサンプルのセットがあり。ここで、は単一の入力トレーニングサンプルであり、はそのトレーニングサンプルの予想出力値です。また、バイアスおよび重みで構成されるニューラルネットワークもあります。は、フィードフォワードネットワークの定義で使用される、、およびによる混乱を防ぐために使用されます。(S,E)SrErWBrijk
次に、ニューラルネットワークと単一のトレーニングの例を取り入れて、コスト関数を定義し、それがどれほど良いかを出力します。C(W,B,Sr,Er)
通常使用されるのは二次コストであり、次のように定義されます
C(W,B,Sr,Er)=0.5∑j(aLj−Erj)2
ここでは入力サンプル与えられた場合のニューラルネットワークへの出力ですaLSr
次に、フィードフォワードニューラルネットワークの各ノードのおよびをます。∂C∂wij∂C∂bij
とを定数と見なすので、これを各ニューロンのの勾配と呼ぶことができます。学習しようとしているときに変更できないためです。私たちがする方向に移動したい-そして、これは理にかなってと最小限に抑え、コストという、およびに対する勾配の負の方向に移動とこれを行います。CSrErWBWB
これを行うには、レイヤーニューロンのエラーとしてを定義します。δij=∂C∂zijji
をニューラルネットワークに接続してを計算から始めます。aLSr
そして、私たちは、出力層の誤差、計算経由して、δL
δLj=∂C∂aLjσ′(zLj)
。
次のように書くこともできます
δL=∇aC⊙σ′(zL)
。
次に、我々は、エラーを見つける次の層におけるエラーの観点、を介してδiδi+1
δi=((Wi+1)Tδi+1)⊙σ′(zi)
ニューラルネットワークの各ノードにエラーがあるため、重みとバイアスに関する勾配の計算は簡単です。
∂C∂wijk=δijai−1k=δi(ai−1)T
∂C∂bij=δij
出力層のエラーの方程式は、コスト関数に依存する唯一の方程式であるため、コスト関数に関係なく、最後の3つの方程式は同じであることに注意してください。
例として、二次コストでは、
δL=(aL−Er)⊙σ′(zL)
出力層のエラー。次に、この方程式を2番目の方程式にプラグインして、レイヤーのエラーを取得できます。L−1th
δL−1=((WL)TδL)⊙σ′(zL−1)
=((WL)T((aL−Er)⊙σ′(zL)))⊙σ′(zL−1)
これは我々がに対して任意の層のエラーを見つけるために、このプロセスを繰り返すことができるその後、我々はに対して任意のノードの重みおよびバイアスの勾配を計算することができ、。CC
必要に応じて、これらの方程式の説明と証明を書くことができますが、それらの証明もここで見つけることができます。ただし、定義から、チェーンルールを自由に適用して、これを読んでいる人にこれらを証明することをお勧めします。δij=∂C∂zij
いくつかの例については、ここでいくつかのコスト関数とその勾配のリストを作成しました。
勾配降下
これらの勾配ができたので、学習を使用する必要があります。前のセクションで、ある点に関して曲線を「下にスライド」させる方法を見つけました。この場合、重みとそのノードのバイアスに関するノードの勾配であるため、「座標」はそのノードの現在の重みとバイアスです。これらの座標に関して勾配が既に見つかっているため、これらの値は変更する必要がある量です。
斜面を非常に速い速度で滑り落ちることは望ましくありません。これを防ぐために、「ステップサイズ」です。η
次に、それぞれの重みとバイアスをどの程度修正する必要があるかを見つけます。
Δwijk=−η∂C∂wijk
Δbij=−η∂C∂bij
したがって、新しい重みとバイアスは
wijk=wijk+Δwijk
bij=bij+Δbij
入力層と出力層のみを持つニューラルネットワークでこのプロセスを使用することをデルタルールと呼びます。
確率的勾配降下
単一のサンプルに対して逆伝播を実行する方法がわかったので、このプロセスを使用してトレーニングセット全体を「学習」する方法が必要です。
1つのオプションは、トレーニングデータの各サンプルに対して逆伝搬を1つずつ実行することです。しかし、これはかなり非効率的です。
より良いアプローチは、確率的勾配降下法です。各サンプルに対して逆伝播を実行する代わりに、トレーニングセットの小さなランダムサンプル(バッチと呼ばれる)を選択し、そのバッチ内の各サンプルに対して逆伝播を実行します。これを行うことにより、すべてのサンプルの勾配を計算することなく、データセットの「意図」をキャプチャできることが期待されます。
たとえば、1000個のサンプルがある場合、サイズ50のバッチを選択し、このバッチ内の各サンプルに対して逆伝播を実行できます。希望するのは、学習する実際のデータの分布を表す十分に大きなトレーニングセットが与えられ、小さなランダムサンプルを選択するだけでこの情報を取得できることです。
ただし、ミニバッチの各トレーニング例で逆伝播を行うことは理想的ではありません。トレーニングサンプルがウェイトとバイアスを修正し、互いに打ち消しあい、それらが到達しないようにする「ぐるぐる回る」ことができるためです。私たちが到達しようとしている最小値。
これを防ぐために、平均でサンプルの勾配が傾斜を指すことが期待されているため、「平均最小値」に移動します。そのため、バッチをランダムに選択した後、バッチの小さなランダムサンプルであるミニバッチを作成します。次に、トレーニングサンプルを含むミニバッチを指定し、ミニバッチ内の各サンプルの勾配を平均化した後にのみ重みとバイアスを更新します。n
正式には、
Δwijk=1n∑rΔwrijk
そして
Δbij=1n∑rΔbrij
ここで、はサンプル重みの計算された変化であり、はサンプルバイアスの計算された変化です。 R 、Δ BのR I jは RΔwrijkrΔbrijr
次に、前と同様に、次の方法で重みとバイアスを更新できます。
B 、I 、J = B I 、J + Δ B I J
wijk=wijk+Δwijk
bij=bij+Δbij
これにより、勾配降下の実行方法にある程度の柔軟性が与えられます。多くのローカルミニマムで学習しようとしている関数がある場合、この「ウィグリングアラウンド」動作は実際に望ましいものです。これは、1つのローカルミニマムに「スタック」する可能性がはるかに低く、あるローカルミニマムから「飛び出して」、できればグローバルミニマムに近い別のミニマムに落ちます。したがって、小さなミニバッチが必要です。
一方、ローカルミニマムが非常に少なく、一般に勾配降下がグローバルミニマムに向かうことがわかっている場合は、この「ぐるぐる回る」振る舞いによって坂を下がらないようにするため、より大きなミニバッチが必要です。好きなように。こちらをご覧ください。
1つの選択肢は、バッチ全体を1つのミニバッチと見なして、可能な限り最大のミニバッチを選択することです。これは、バッチの勾配を単純に平均化するため、バッチ勾配降下法と呼ばれます。ただし、これは非常に非効率的であるため、実際にはほとんど使用されません。