共通部分の算出
プログラムのフローを考えるわけだが、その前に共通部分の連鎖律の導出だけしておこう。
といっても今までの部品の組み合わせだけで対応可能。
それぞれ以下になる。
\(
\displaystyle\Delta_2={\color{red}\frac{\partial E}{\partial A_2}\frac{\partial A_2}{\partial Z_2}}=(A_2-Y)\sigma^\prime(Z_2)
\)
\(
\displaystyle\Delta_1=\Delta_2{\color{blue}\frac{\partial Z_2}{\partial A_1}\frac{\partial A_1}{\partial Z_1}}=\Delta_2 W_2\sigma^\prime(Z_1)
\)
シグモイド関数の導関数はわかってるから、これは計算で出せるものなのは間違いない。
変数を利用していろいろ算出
それでは、共通部分を変数化できたところで、各処理をまとめていこう。
隠れ層の重み\(W_2\)とバイアス\(b_2\)の勾配(\(\Delta W_2,\Delta b_2\))を特定
\(
\Delta W_2=\Delta_2 A_2
\)
\(
\Delta b_2=\Delta_2 1
\)
入力層の重み\(W_1\)とバイアス\(b_1\)の勾配(\(\Delta W_1,\Delta b_1\))を特定
\(
\Delta W_1=\Delta_1 X
\)
\(
\Delta b_1=\Delta_1 1
\)
各勾配から各重み、各バイアスを更新(学習率\(\mu\)を掛けておく)
\(
\begin{eqnarray}
W_1&=&W_1-\mu\Delta W_1\\
b_1&=&b_1-\mu\Delta b_1\\
W_2&=&W_2-\mu\Delta W_2\\
b_2&=&b_2-\mu\Delta b_2\\
\end{eqnarray}
\)
これで誤差逆伝播法による重みとバイアスの更新が可能となる。
いろいろとごちゃごちゃしていたが、いざプログラム化してしまうとかなりシンプルになる。
注意点としては、バイアス、重み以外は順伝播時に決定されるものなので、
事前に順伝播して、各内部変数を記憶しておく必要はある。
といっても、ブロック図に則って順番に処理させれば自然と記憶されることになるはず。
まとめ
- 連鎖律の「プログラミングするための最適化」は連鎖律上の共通部分の特定が重要。
- 連鎖律の共通部分の算出。
- 共通変数で実際の処理に相当する数式を書き出し。
MATLAB、Python、Scilab、Julia比較ページはこちら
Pythonで動かして学ぶ!あたらしい線形代数の教科書
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
ゼロからはじめるPID制御
OpenCVによる画像処理入門
恋する統計学[回帰分析入門(多変量解析1)] 恋する統計学[記述統計入門]
Pythonによる制御工学入門
理工系のための数学入門 ―微分方程式・ラプラス変換・フーリエ解析
コメント