MATLAB,Python,Scilab,Julia比較 第4章 その78【誤差逆伝播法⑤】

MATLAB,Python,Scilab,Julia比較 第4章 その78【誤差逆伝播法⑤】 数値計算
MATLAB,Python,Scilab,Julia比較 第4章 その78【誤差逆伝播法⑤】

バックナンバーはこちら。
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で動かして学ぶ!あたらしい線形代数の教科書

Amazon.co.jp

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

Amazon.co.jp

ゼロからはじめるPID制御

https://amzn.to/3SvzuyR

OpenCVによる画像処理入門

https://amzn.to/498ZUgK

恋する統計学[回帰分析入門(多変量解析1)] 恋する統計学[記述統計入門]

Amazon.co.jp

Pythonによる制御工学入門

Amazon.co.jp

理工系のための数学入門 ―微分方程式・ラプラス変換・フーリエ解析

https://amzn.to/3UAunQK

コメント

タイトルとURLをコピーしました