バックプロパゲーションアルゴリズム


19

多層パーセプトロン(MLP)で使用される逆伝播アルゴリズムについて少し混乱しました。

エラーはコスト関数によって調整されます。バックプロパゲーションでは、隠れ層の重みを調整しようとしています。私が理解できる出力エラー、つまりe = d - y[添え字なし]。

質問は次のとおりです。

  1. 隠れ層のエラーはどのようにして得られますか?どのように計算しますか?
  2. バックプロパゲートする場合、重みを更新するために、適応フィルターのコスト関数として使用する必要がありますか、または(C / C ++で)プログラミングの意味でポインターを使用する必要がありますか?

NNはどちらかと言えば時代遅れの技術なので、ここに誰も使用していないので答えが得られないのではないかと思います。

@mbq:私はあなたの言葉を疑いませんが、NNが「時代遅れの技術」であるという結論にどのように到達しますか?
ステフェン

1
@steffen観察による。つまり、NNコミュニティの重要な人物が誰も出てきて「みんな、ライフワークをやめて、もっと良いもので遊んでみよう!」 -トレーニング終了。そして、人々はそれらを支持してNNを落とします。

5
@mbqと言ったとき、これにはいくらかの真実がありましたが、もうありませんでした。
ジェラド

1
@jerad非常に簡単です-他の方法との公正な比較はまだ見ていません(特に、すべての高得点チームの結果が非常に近い場合、Kaggleは精度の信頼区間がないため公平な比較ではありません) Merckコンテストのように)、パラメーター最適化の堅牢性の分析も行われません。

回答:


27

興味がある人のために、ここで自己完結型の投稿に答えると思いました。これはここで説明さた記法を使用するでしょう。

前書き

バックプロパゲーションの背後にある考え方は、ネットワークのトレーニングに使用する「トレーニング例」のセットを用意することです。これらにはそれぞれ既知の答えがあるため、それらをニューラルネットワークに接続して、どれだけ間違っていたかを見つけることができます。

たとえば、手書き認識では、実際の文字と並んで多くの手書き文字が使用されます。その後、バックプロパゲーションを介してニューラルネットワークをトレーニングして、各シンボルの認識方法を「学習」することができます。そのため、後で未知の手書き文字が表示されると、正しいものを識別できます。

具体的には、いくつかのトレーニングサンプルをニューラルネットワークに入力し、その効果を確認してから、「逆方向にトリクル」して、各ノードの重みとバイアスを変更してより良い結果を得ることができる量を見つけ、それに応じて調整します。これを続けると、ネットワークは「学習」します。

トレーニングプロセスに含まれる可能性のある他の手順(ドロップアウトなど)もありますが、これはこの質問の目的であるため、主にバックプロパゲーションに焦点を当てます。

偏微分

偏微分は、変数に関する微分です。 FXfxfx

たとえば、、場合、はに関する単なる定数であるためです。同様に、、ので、単にに対して一定である。Ff(x,y)=x2+y2、Y2、XFfx=2xy2x、X2、Yfy=2yx2y

でれる関数の勾配は、すべての変数の偏微分を含む関数です。具体的には:f

f(v1,v2,...,vn)=fv1e1++fvnen

ここで、は変数方向を指す単位ベクトルです。v 1eiv1

今、私たちが計算したらいくつかの機能のための、我々は位置にある場合、私たちができる「ダウンスライド」方向に行くことによって。F V 1V 2V NF - F V 1V 2V Nff(v1,v2,...,vn)ff(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=yxyf(x,y)=2x(1,0)+2y(0,1)

ここで、関数を「下にスライド」するには、ポイントいるとしましょう。次に、方向に移動する必要があります。f(2,4)f(2,4)=(22(1,0)+24(0,1))=((4,0)+(0,8))=(4,8)

このベクトルの大きさは、丘がどれほど急勾配であるかを示します(値が大きいほど、丘が急になります)。この場合、ます。42+(8)28.944

勾配降下

アダマール製品

2つの行列のアダマール積は、行列を要素単位で加算する代わりに、要素単位で乗算することを除いて、行列加算と同じです。A,BRn×m

形式的には、行列の加算はですが、はA+B=CCRn×m

Cji=Aji+Bji

アダマール商品、ようAB=CCRn×m

Cji=AjiBji

勾配の計算

(このセクションのほとんどはNeilsenの本からのものです)。

トレーニングサンプルのセットがあり。ここで、は単一の入力トレーニングサンプルであり、はそのトレーニングサンプルの予想出力値です。また、バイアスおよび重みで構成されるニューラルネットワークもあります。は、フィードフォワードネットワークの定義で使用される、、およびによる混乱を防ぐために使用されます。(S,E)SrErWBrijk

次に、ニューラルネットワークと単一のトレーニングの例を取り入れて、コスト関数を定義し、それがどれほど良いかを出力します。C(W,B,Sr,Er)

通常使用されるのは二次コストであり、次のように定義されます

C(W,B,Sr,Er)=0.5j(ajLEjr)2

ここでは入力サンプル与えられた場合のニューラルネットワークへの出力ですaLSr

次に、フィードフォワードニューラルネットワークの各ノードのおよびをます。CwjiCbji

とを定数と見なすので、これを各ニューロンのの勾配と呼ぶことができます。学習しようとしているときに変更できないためです。私たちがする方向に移動したい-そして、これは理にかなってと最小限に抑え、コストという、およびに対する勾配の負の方向に移動とこれを行います。CSrErWBWB

これを行うには、レイヤーニューロンのエラーとしてを定義します。δji=Czjiji

をニューラルネットワークに接続してを計算から始めます。aLSr

そして、私たちは、出力層の誤差、計算経由して、δL

δjL=CajLσ(zjL)

次のように書くこともできます

δL=aCσ(zL)

次に、我々は、エラーを見つける次の層におけるエラーの観点、を介してδiδi+1

δi=((Wi+1)Tδi+1)σ(zi)

ニューラルネットワークの各ノードにエラーがあるため、重みとバイアスに関する勾配の計算は簡単です。

Cwjki=δjiaki1=δi(ai1)T

Cbji=δji

出力層のエラーの方程式は、コスト関数に依存する唯一の方程式であるため、コスト関数に関係なく、最後の3つの方程式は同じであることに注意してください。

例として、二次コストでは、

δL=(aLEr)σ(zL)

出力層のエラー。次に、この方程式を2番目の方程式にプラグインして、レイヤーのエラーを取得できます。L1th

δL1=((WL)TδL)σ(zL1)
=((WL)T((aLEr)σ(zL)))σ(zL1)

これは我々がに対して任意の層のエラーを見つけるために、このプロセスを繰り返すことができるその後、我々はに対して任意のノードの重みおよびバイアスの勾配を計算することができ、。CC

必要に応じて、これらの方程式の説明と証明を書くことができますが、それらの証明もここで見つけることができます。ただし、定義から、チェーンルールを自由に適用して、これを読んでいる人にこれらを証明することをお勧めします。δji=Czji

いくつかの例については、ここでいくつかのコスト関数とその勾配のリストを作成しました

勾配降下

これらの勾配ができたので、学習を使用する必要があります。前のセクションで、ある点に関して曲線を「下にスライド」させる方法を見つけました。この場合、重みとそのノードのバイアスに関するノードの勾配であるため、「座標」はそのノードの現在の重みとバイアスです。これらの座標に関して勾配が既に見つかっているため、これらの値は変更する必要がある量です。

斜面を非常に速い速度で滑り落ちることは望ましくありません。これを防ぐために、「ステップサイズ」です。η

次に、それぞれの重みとバイアスをどの程度修正する必要があるかを見つけます。

Δwjki=ηCwjki

Δbji=ηCbji

したがって、新しい重みとバイアスは

wjki=wjki+Δwjki
bji=bji+Δbji

入力層と出力層のみを持つニューラルネットワークでこのプロセスを使用することをデルタルールと呼びます。

確率的勾配降下

単一のサンプルに対して逆伝播を実行する方法がわかったので、このプロセスを使用してトレーニングセット全体を「学習」する方法が必要です。

1つのオプションは、トレーニングデータの各サンプルに対して逆伝搬を1つずつ実行することです。しかし、これはかなり非効率的です。

より良いアプローチは、確率的勾配降下法です。各サンプルに対して逆伝播を実行する代わりに、トレーニングセットの小さなランダムサンプル(バッチと呼ばれる)を選択し、そのバッチ内の各サンプルに対して逆伝播を実行します。これを行うことにより、すべてのサンプルの勾配を計算することなく、データセットの「意図」をキャプチャできることが期待されます。

たとえば、1000個のサンプルがある場合、サイズ50のバッチを選択し、このバッチ内の各サンプルに対して逆伝播を実行できます。希望するのは、学習する実際のデータの分布を表す十分に大きなトレーニングセットが与えられ、小さなランダムサンプルを選択するだけでこの情報を取得できることです。

ただし、ミニバッチの各トレーニング例で逆伝播を行うことは理想的ではありません。トレーニングサンプルがウェイトとバイアスを修正し、互いに打ち消しあい、それらが到達しないようにする「ぐるぐる回る」ことができるためです。私たちが到達しようとしている最小値。

これを防ぐために、平均でサンプルの勾配が傾斜を指すことが期待されているため、「平均最小値」に移動します。そのため、バッチをランダムに選択した後、バッチの小さなランダムサンプルであるミニバッチを作成します。次に、トレーニングサンプルを含むミニバッチを指定し、ミニバッチ内の各サンプルの勾配を平均化した後にのみ重みとバイアスを更新します。n

正式には、

Δwjki=1nrΔwjkri

そして

Δbji=1nrΔbjri

ここで、はサンプル重みの計算された変化であり、はサンプルバイアスの計算された変化です。 R 、Δ BのR I jは RΔwjkrirΔbjrir

次に、前と同様に、次の方法で重みとバイアスを更新できます。

B 、I 、J = B I 、J + Δ B I J

wjki=wjki+Δwjki
bji=bji+Δbji

これにより、勾配降下の実行方法にある程度の柔軟性が与えられます。多くのローカルミニマムで学習しようとしている関数がある場合、この「ウィグリングアラウンド」動作は実際に望ましいものです。これは、1つのローカルミニマムに「スタック」する可能性がはるかに低く、あるローカルミニマムから「飛び出して」、できればグローバルミニマムに近い別のミニマムに落ちます。したがって、小さなミニバッチが必要です。

一方、ローカルミニマムが非常に少なく、一般に勾配降下がグローバルミニマムに向かうことがわかっている場合は、この「ぐるぐる回る」振る舞いによって坂を下がらないようにするため、より大きなミニバッチが必要です。好きなように。こちらをご覧ください

1つの選択肢は、バッチ全体を1つのミニバッチと見なして、可能な限り最大のミニバッチを選択することです。これは、バッチの勾配を単純に平均化するため、バッチ勾配降下法と呼ばれます。ただし、これは非常に非効率的であるため、実際にはほとんど使用されません。


6

ここ数年、ニューラルネットワークを扱っていませんが、必要なものはすべてここで見つかると思います。

ニューラルネットワーク-体系的な入門、第7章:バックプロパゲーションアルゴリズム

ここに直接答えを書いていないことをおpoびしますが、覚えておくために詳細を調べなければならないので(あなたのように)、バックアップなしの答えは役に立たないかもしれないので、これで大丈夫です。ただし、質問が残っている場合は、コメントをドロップすると、何ができるかがわかります。

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