バックナンバーはこちら。
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
多層パーセプトロンの誤差逆伝播法の説明の流れ【再掲】
まずは、多層パーセプトロンの誤差逆伝播法の説明の流れを再掲。
- 誤差逆伝播法の全体像の確認(済)
- 出力層の重みとバイアスを求める誤差からの連鎖律(済)
- 隠れ層の重みとバイアスを求める誤差からの連鎖律
- 上記をプログラミングするための最適化
今回は、「隠れ層の重みとバイアスを求める誤差からの連鎖律」を確認する。
隠れ層から誤差関数までの合成関数
まず、全体の合成関数から隠れ層から誤差関数までの合成関数の位置を確認。
以下に図示する。
そして、以前も記載したが出力層で見た合成関数は以下になる。
\(
{\rm{SSE}}(\sigma(g(\sigma(h(X,W_1)),W_2)))
\)
途中までは出力層と一緒に見えるけど\(Z_1\)は\(W_2\)に対しての偏微分じゃなくて、\(A_1\)に対しての偏微分をするって感じかな。
正解。
隠れ層から誤差関数までの連鎖律
誤差\(E\)を隠れ層の重み\(W_1\)で微分するにあたって、
間に\(A_2,Z_2,A_1,Z_1\)が居るので、連鎖律は以下になる。
\(
\displaystyle\frac{\partial E}{\partial W_2}=\frac{\partial E}{\partial A_2}\frac{\partial A_2}{\partial Z_2}\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 A_2}=\frac{1}{2}(A_2-Y)^2=A_2=Y
\)
\(
\displaystyle\frac{\partial A_2}{\partial Z_2}=\sigma^\prime(Z_2)
\)
\(
\displaystyle\frac{\partial Z_2}{\partial A_1}=(W_2 A_1 + b_2)^\prime=W_2
\)
\(
\displaystyle\frac{\partial A_1}{\partial Z_1}=\sigma^\prime(Z_1)
\)
\(
\displaystyle\frac{\partial Z_1}{\partial W_1}=(W_1X+b_1)^\prime=X
\)
連鎖律として組み合わせる。
\(
\displaystyle\frac{\partial E}{\partial W_2}=(A-Y)\sigma^\prime(Z_2)W_2\sigma^\prime(Z_1)X
\)
バイアスの方は途中過程は省略するが以下になる。
\(
\displaystyle\frac{\partial E}{\partial b_2}=(A-Y)\sigma^\prime(Z_2)W_2\sigma^\prime(Z_1)
\)
長い式にはなったけど、それぞれはどういう計算になるか分かってるから、
それほど問題にはならなそうだね。
まとめ
まとめだよ。
- 隠れ層から誤差関数までの合成関数を確認。
- 隠れ層から誤差関数までの連鎖律を導出。
バックナンバーはこちら。
Pythonで動かして学ぶ!あたらしい線形代数の教科書
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
ゼロからはじめるPID制御
OpenCVによる画像処理入門
恋する統計学[回帰分析入門(多変量解析1)] 恋する統計学[記述統計入門]
Pythonによる制御工学入門
理工系のための数学入門 ―微分方程式・ラプラス変換・フーリエ解析
コメント