誤差逆伝播(back_propagation)って手書きで書いたらどうなんの???
[python][手書き]
ニューラルネットワークで誤差逆伝播法を用いた重みの更新式は、数学経験者なら少し時間をかければ理解できたと思います。
しかしいざそれをライブラリを使わずに書くとなると、、、、、
あれ???どうなんだっけ???ってなりませんか???
まずは一直線のシンプルなネットワークで考えます
このネットワークのweight1の更新式は
この式を偏微分を駆使して展開していくと最終的に下記のようになります
つまりweight1の更新量は
【output1とyの差 ×ソフトマックス関数の微分× output0】
ということですね
そして重みweight0の更新式は同じく展開して書くと
になります
さて、ここからです
実際ニューラルネットワークは
こうなっていますよね???笑
実際の重みの数は複数個存在します。
もう何が何やら、、、、、、、
今回は784の入力層、15層の中間層、10層の出力層を仮定します
入力はx、正解はyとします
weight0は784個を15列
weight1は15個を10列準備しました
re_weightは重み更新用の配列です
weight1(0–0)の更新は
これを15個10列一気にfor文で表現するとこうなります
一方、weight0の更新はかなりめんどくさいです
中間層1個のシナプスに対してoutput1とyのズレをすべて伝播させなければいけません
(↓中間層0番目のシナプスの場合、これらをすべて合計します)
コードで書くとこうなります
関数化してシナプスの番号によって対応できるようにすると
あとはweight1の時と同じ要領です。
sigmoidとsoftmaxの手書きのカンマがうざい人のために、、、、
このニューラルネットワークの完成版はこちら