質問

アップデート:問題をより適切に定式化します。

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

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

A sample XOR neural network
(ソース: ウィキメディア.org)

使っています 確率的逆伝播.

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

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

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

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

入力層のO(h)は何でしょうか?私の理解では、各入力ノードには 2 つの出力があると考えられます。1 つは隠れ層の最初のノードに入り、もう 1 つは 2 番目のノードの隠れ層に入ります。2 つの出力のうちどちらを接続する必要がありますか? O(h)*(1 - O(h)) 式の一部ですか?
Step 3

役に立ちましたか?

解決

ここに投稿したチュートリアルは実際には間違っています。私はそれを 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、すべての j)) => ∂o_k/∂o_j = f'(sum(w_kj * o_j、すべての j)) * w_kj = f'(z_k) * w_kj。

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

他のヒント

1つの明らかにタイプミス以外、それについて間違って何もない、私はあなたの質問が何であるかわからないが、私は実際にそのチュートリアルを経て自分自身を、私はあなたを保証することができます。

私は、あなたがどのようにバックプロパゲーションの隠されたのデルタが誘導さについて混乱しているので、あなたの質問があるという仮定を行います。これは確かにあなたの質問であれば、

ご検討ください


<サブ>(ソース: pandamatak.com の)

あなたはおそらく著者はこの式を導出する方法として混乱しています。これは、実際には、多変量チェーンルールの簡単なアプリケーションです。すなわち、(何がウィキペディアするから取られる以下)

"Z = Fの各引数は(U、V)uは、H(x、y)とV = G(x、y)を=ように、二変数関数であること、そしてこれらの機能はすべての微分であると仮定する。そして、チェーンルールは次のようになります:

altテキスト

altテキスト

これに誘導引数によってチェーンルールを拡張想像

E(Z '<サブ> 1 、Z' 2 、..、Z '<サブ> N ) ここで、Z '<サブ> K k番目の出力層の出力が予め活性化、 そしてZおよびZ」自体は<サブ> JI JI W)<サブ> K Eは、zの関数であると言うことです[サブ>(これが最初であなたに意味をなさない場合の NNを設置しているかについて非常に慎重に>

δ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

あなたが連鎖法則を理解する難しさを持っている場合は、多変量計算上のコースを取る必要があり、あるいは教科書で、このようなセクションを読むことがあります。

幸運ます。

ステップ 3 の方程式から読み取れるのは次のとおりです。

  1. O_h = この隠れユニットの最後の出力 (入力層の O_h は実際の入力値)
  2. w_kh = この隠れユニットと次の層のユニット (出力方向) の間の接続の重み
  3. delta_k = 次の層のユニットのエラー (出力方向、前の箇条書きと同じユニット)

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

レイヤ N を計算するにはレイヤ N+1 の誤差値が必要であるため、誤差は出力側からレイヤごとに計算する必要があります。おっしゃるとおり、バックプロパゲーションでは入力と出力の間に直接のつながりはありません。

直観に反するとしても、この方程式は正しいと思います。おそらく混乱を招くのは、各ユニットの順伝播では、ユニットの左側にあるすべてのユニットとリンク (入力値) を考慮する必要があるのに対し、エラー伝播 (バックプロパゲーション) では右側のユニット (出力値) を考慮する必要があることです。値) が処理されているユニットの。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top