49

更新:問題のより良い定式化。

例として、XOR ニューラル ネットワークを使用してバックプロパゲーション アルゴリズムを理解しようとしています。この場合、2 つの入力ニューロン + 1 つのバイアス、隠れ層の 2 つのニューロン + 1 つのバイアス、および 1 つの出力ニューロンがあります。

 A   B  A XOR B
 1    1   -1
 1   -1    1
-1    1    1
-1   -1   -1

サンプル XOR ニューラル ネットワーク
(出典: wikimedia.org )

私は確率的逆伝播を使用しています。

もう少し読んだ後、出力ユニットのエラーが隠れ層に伝播することがわかりました...ニューラルネットワークの入力層に到達すると、各ニューロンがエラー調整を取得するため、最初は混乱しました隠れ層の両方のニューロンから。特に誤差の分布の仕方は、最初は把握しにくいものです。

ステップ 1では、入力の各インスタンスの出力を計算します。
ステップ 2では、出力ニューロン (この場合は 1 つしかありません) とターゲット値の間の誤差を計算します。ステップ 3では、ステップ 2 の誤差を使用して、各隠れユニット h の誤差を計算します。
ステップ2

ステップ 3

「重み kh」は、隠れユニット h と出力ユニット k の間の重みです。入力ユニットには出力ユニットに関連付けられた直接の重みがないため、これは混乱を招きます。数式を数時間見つめた後、合計が何を意味するのかを考え始めました。隠れ層ニューロンに接続する各入力ニューロンの重みに出力誤差を掛けて合計するという結論に達し始めています。 . これは論理的な結論ですが、「重み kh」(出力レイヤー k と非表示レイヤー h の間) が明確に示されているため、この式は少し混乱しているように見えます。

ここですべてを正しく理解していますか? 誰でもこれを確認できますか?

入力層の O(h) とは? 私の理解では、各入力ノードには 2 つの出力があります。1 つは隠れ層の最初のノードに入り、もう 1 つは 2 番目のノードの隠れ層に入ります。O(h)*(1 - O(h))2 つの出力のうち、式の一部にプラグインする必要があるのはどれですか?
ステップ 3

4

3 に答える 3

34

ここに投稿したチュートリアルは、実際には間違っています。私は、Bishop の 2 冊の標準的な本と 2 つの私の実用的な実装に対して、それを再確認しました。以下に正確にどこを指摘します。

心に留めておくべき重要なことは、単位または重量に関する誤差関数の導関数を常に検索していることです。前者はデルタで、後者は重みの更新に使用するものです。

バックプロパゲーションを理解したい場合は、連鎖律を理解する必要があります。ここではチェーンルールがすべてです。正確な仕組みがわからない場合は、wikipedia を調べてください。それほど難しいことではありません。しかし、派生を理解するとすぐに、すべてがうまくいきます。約束!:)

∂E/∂W は、連鎖律により ∂E/∂o ∂o/∂W に合成できます。∂o/∂W は、重みに関するユニットの活性化/出力の導関数にすぎないため、簡単に計算できます。∂E/∂o は実際にはデルタと呼ばれるものです。(ここでは、E、o、および W はベクトル/行列であると想定しています)

エラーを計算できる場所であるため、出力ユニット用にそれらがあります。(ほとんどの場合、(t_k - o_k) のデルタになるエラー関数があります。たとえば、線形出力の場合は 2 次エラー関数、ロジスティック出力の場合はクロス エントロピーです。)

ここでの問題は、内部単位の導関数をどのように取得するかということです。ユニットの出力は、重みによって重み付けされたすべての入力ユニットの合計と、その後の伝達関数の適用であることはわかっています。したがって、o_k = f(sum(w_kj * o_j、すべての j))。

つまり、o_j に関して o_k を導出します。delta_j = ∂E/∂o_j = ∂E/∂o_k ∂o_k/∂o_j = delta_k ∂o_k/o_j なので。したがって、delta_k が与えられれば、delta_j を計算できます。

これをやろう。o_k = f(sum(w_kj * o_j, for all j)) => ∂o_k/∂o_j = f'(sum(w_kj * o_j, for all j)) * w_kj = f'(z_k) * w_kj.

シグモイド伝達関数の場合、これは z_k(1 - z_k) * w_kj になります。(これがチュートリアルのエラーです。著者は o_k(1 - o_k) * w_kj! と言っています)

于 2010-02-04T16:12:51.430 に答える
8

あなたの質問が何であるかはわかりませんが、私は実際にそのチュートリアルを自分でやりました.1つの明らかなタイプミスを除いて、間違いはありません.

あなたの質問は、バックプロパゲーションの隠れたデルタがどのように導出されるかについて混乱しているためであると仮定します。これが本当にあなたの質問である場合は、検討してください

代替テキスト
(出典: pandamatak.com )

著者がこの方程式をどのように導出したかについて、おそらく混乱しているでしょう。これは実際には、多変量連鎖規則の簡単な適用です。すなわち、(以下はウィキペディアからの引用)

「z = f(u, v) の各引数が、u = h(x, y) および v = g(x, y) のような 2 変数関数であり、これらの関数がすべて微分可能であるとします。次に、チェーン ルールは次のようになります。

代替テキスト

代替テキスト "

ここで、帰納引数によって連鎖律を次のように拡張することを想像してください。

E(z' 1 ,z' 2 ,..,z' n ) ここで、z' kは活性化前の k 番目の出力層の出力であり、z' k (w ji )、つまり E は関数です。 z' と z' 自体の関数は w jiの関数です(これが意味をなさない場合は、最初に NN がどのようにセットアップされるかについて非常に慎重に考えてください)。 n 変数に直接拡張された連鎖規則を適用します。

δE(z' 1 ,z' 2 ,..,z' n ) / δw ji = Σ k δE / δz' k δz' k / δw ji

これが最も重要なステップであり、著者は連鎖律を再び適用します。今回は和の範囲内でδz' k / δw ji項を展開します。つまり、

δz' k / δw ji = δz' k / δo j δo j / δz j δz j / δw ji .

チェーン ルールを理解するのが難しい場合は、多変量解析のコースを受講するか、教科書のそのようなセクションを読む必要があります。

幸運を。

于 2010-06-22T17:25:17.970 に答える
3

ステップ3の式から読み取ったのは次のとおりです。

  1. O_h = この隠れユニットの最後の出力 (入力層の O_h は実際の入力値)
  2. w_kh = この隠れユニットと次のレイヤーのユニットとの間の結合の重み (出力方向)
  3. delta_k = 次の層の単位の誤差 (出力に向かって、前の箇条書きと同じ単位)

各ユニットには 1 つの出力しかありませんが、出力と次の層の間の各リンクには重みが付けられています。したがって、出力は同じですが、リンクの重みが異なる場合、受信側では各ユニットが異なる値を受け取ります。O_h は常に、最後の反復でのこのニューロンの値を参照します。エラーは入力レイヤーには適用されません。定義上、入力自体には「エラー」はありません。

層 N を計算するには層 N+1 の誤差値が必要なので、誤差は出力側から始めて層ごとに計算する必要があります。

直感に反するとしても、方程式は正しいと思います。おそらく紛らわしいのは、各ユニットの順伝播では、ユニットの左側にあるすべてのユニットとリンク (入力値) を考慮する必要がありますが、エラー伝播 (逆伝播) では、右側のユニット (出力) を考慮する必要があることです。処理中のユニットの値)。

于 2010-02-03T22:14:50.193 に答える