バックナンバーはこちら。
https://www.simulationroom999.com/blog/compare-matlabpythonscilabjulia4-backnumber/
はじめに
多層パーセプトロンの誤差逆伝播法について。
今回は、「プログラミングするための最適化」を確認する。
登場人物
博識フクロウのフクさん

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
多層パーセプトロンの誤差逆伝播法の説明の流れ【再掲】

まずは、多層パーセプトロンの誤差逆伝播法の説明の流れを再掲。
- 誤差逆伝播法の全体像の確認(済)
- 出力層の重みとバイアスを求める誤差からの連鎖律(済)
- 隠れ層の重みとバイアスを求める誤差からの連鎖律(済)
- 上記をプログラミングするための最適化

今回は、「プログラミングするための最適化」を確認する。
連鎖律の最適化方針

プログラミング向けに連鎖律を最適化するって話だけど、
以前と同じように共通部分を切り出して、流用しまくるって感じなのかな?

そうだね。
なんとなく察したと思うけど、各連鎖律は結構似通っている。
それを整理していけばおのずと共通部分がハッキリして最適化可能だ。
連鎖律の共通部分の洗い出し

じゃー、いままでの連鎖律を並べてみよう。
出力層の重み
\(
\displaystyle\frac{\partial E}{\partial W_2}={\color{red}\frac{\partial E}{\partial A_2}\frac{\partial A_2}{\partial Z_2}}\frac{\partial Z_2}{\partial W_2}
\)
出力層のバイアス
\(
\displaystyle\frac{\partial E}{\partial W_2}={\color{red}\frac{\partial E}{\partial A_2}\frac{\partial A_2}{\partial Z_2}}1
\)
隠れ層の重み
\(
\displaystyle\frac{\partial E}{\partial W_2}={\color{red}\frac{\partial E}{\partial A_2}\frac{\partial A_2}{\partial Z_2}}{\color{blue}\frac{\partial Z_2}{\partial A_1}\frac{\partial A_1}{\partial Z_1}}\frac{\partial Z_1}{\partial W_1}
\)
隠れ層のバイアス
\(
\displaystyle\frac{\partial E}{\partial W_2}={\color{red}\frac{\partial E}{\partial A_2}\frac{\partial A_2}{\partial Z_2}}{\color{blue}\frac{\partial Z_2}{\partial A_1}\frac{\partial A_1}{\partial Z_1}}1
\)

とりあえず、共通部分だと思わしきところは赤字、青字にしておいた。
共通部分の変数化

じゃー、共通部分をそれぞれ変数として割り当ててしまおう。
\(
\displaystyle\Delta_2={\color{red}\frac{\partial E}{\partial A_2}\frac{\partial A_2}{\partial Z_2}}
\)
\(
\displaystyle\Delta_1=\Delta_2{\color{blue}\frac{\partial Z_2}{\partial A_1}\frac{\partial A_1}{\partial Z_1}}
\)

上記を利用して各重みをバイアスを書き直すと以下になる。
\(
\displaystyle\frac{\partial E}{\partial W_2}=\Delta_2\frac{\partial Z_2}{\partial W_2}
\)
\(
\displaystyle\frac{\partial E}{\partial W_1}=\Delta_1\frac{\partial Z_1}{\partial W_1}
\)
\(
\displaystyle\frac{\partial E}{\partial b_2}=\Delta_2 1
\)
\(
\displaystyle\frac{\partial E}{\partial b_1}=\Delta_1 1
\)

びっくりするほとスッキリしたね。

あとはプログラムのフローを想定するだけだな。
まとめ

まとめだよ。
- 連鎖律の「プログラミングするための最適化」は連鎖律上の共通部分の特定が重要。
- 連鎖律の共通部分を特定。
- 共通部分を変数化。
- 変数化したもので連鎖律を表現し直し。
バックナンバーはこちら。
Pythonで動かして学ぶ!あたらしい線形代数の教科書
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
ゼロからはじめるPID制御
OpenCVによる画像処理入門
恋する統計学[回帰分析入門(多変量解析1)] 恋する統計学[記述統計入門]
Pythonによる制御工学入門
理工系のための数学入門 ―微分方程式・ラプラス変換・フーリエ解析
コメント