フィード フォワード人工ニューラル ネットワークがほとんどの場合、単純な「OR」パーセプトロンの学習に失敗する理由を理解するのに苦労しています。
- 0 または 0 : 0
- 1 または 0 : 1
- 0 または 1 : 1
- 1または1:1
さまざまなネットワーク構成を試しました: 1 つまたは 2 つの隠れ層、隠れ層の 2 から 8 ニューロン、バイアス (値 = 1、各隠れニューロンと出力ニューロンに接続)
この例では、ネットワークは次のようになります。
[1] [3]
[2] [4] [6]
[5]
- 入力レイヤー : [1] と [2]
- 非表示レイヤー : [3] と [4] と [6]
- 出力レイヤー : [6]
表記法:
- ニューロン i : [i]
- [i] と [j] の間の重み : w(i,j)
- [i] 値 : v(i)
- [i] エラー: e(i)
- sig(t) : 1/(1 + e^-t)
重みの初期化
各重みは -0.5 から 0.5 の間のランダムな値に設定されます
入力
v(1) と v(2) はランダムな値で設定されます: 0 または 1
値を伝播 (左から右へ) :
- v(3) = sig(v(1) * w(1,3) + v(2) * w(2,3))
- v(4) = sig(v(1) * w(1,4) + v(2) * w(2,4))
- v(5) = sig(v(1) * w(1,5) + v(2) * w(2,5))
- v(6) = sig(v(3) * w(3,6) + v(4) * w(4,6) + v(5) * w(5,6))
予想される出力: (v(1) または v(2)) が true の場合は 1、それ以外の場合は 0
- e(6) = (予想 - v(6)) * v(6) * (1 - v(6))
エラーの伝播 (右から左へ)
- e(3) = e(6) * w(3,6) * v(3) * (1 - v(3))
- e(4) = e(6) * w(4,6) * v(4) * (1 - v(4))
- e(5) = e(6) * w(5,6) * v(5) * (1 - v(5))
重みの更新 (学習率 = 1)
- w(1,3) = w(1,3) + v(1) * e(3)
- w(1,4) = w(1,4) + v(1) * e(4)
- w(1,5) = w(1,5) + v(1) * e(5)
- w(2,3) = w(2,3) + v(2) * e(3)
- w(2,4) = w(2,4) + v(2) * e(4)
- w(2,5) = w(2,5) + v(2) * e(5)
- w(3,6) = w(3,6) + v(3) * e(6)
- w(4,6) = w(4,6) + v(4) * e(6)
- w(5,6) = w(5,6) + v(5) * e(6)
それを 300 回実行し、各結果を出力します。
- v(6) > 0.5 の場合、それは True
- v(6) < 0.5 の場合は False
- 期待される出力と比較する
数エポック後、v(1) = v(2) = 0 の場合でも、ネットワークはほとんど常に v(6) > 0.9 を返します。
ときどき (およそ 20 回に 1 回)、機能し、ネットワークが正しく学習した
私は何を間違っていますか?
編集: 見つけました!
犯人は次のとおりです。
- e(3) = e(6) * w(3,6) * v(3) * (1 - v(3))
- e(4) = e(6) * w(4,6) * v(4) * (1 - v(4))
- e(5) = e(6) * w(5,6) * v(5) * (1 - v(5))
だったはずです:
- e(3) = e(6) * w(3,6)
- e(4) = e(6) * w(4,6)
- e(5) = e(6) * w(5,6)