MATLAB,Python,Scilab,Julia比較 第4章 その60【逆伝播⑪】

MATLAB,Python,Scilab,Julia比較 第4章 その60【逆伝播⑪】 数値計算
MATLAB,Python,Scilab,Julia比較 第4章 その60【逆伝播⑪】

バックナンバーはこちら。
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

今後の予定

太郎くん
太郎くん

とりあえず、連鎖律の話がハッキリして、逆伝播に関連する情報はそろった感じかな。

フクさん
フクさん

というわけでプログラム化の話に入る。

太郎くん
太郎くん

でも、いきなりプログラムを組めと言われてもわからんな・・・。

フクさん
フクさん

それに、逆伝播は実際の動きが見えにくい。
よって、まずは逆伝播の挙動を見ることに特化したプログラムを作成する。

太郎くん
太郎くん

魔境臭がするが、1歩ずつやってもらった方が良いのかもしれん・・・。

プログラムのフロー

フクさん
フクさん

というわけで、プログラムのフローを記載しておく。

  • シグモイド関数の定義
  • シグモイド関数の導関数の定義
  • データセットの定義
  • 順伝播
  • 逆伝播
  • パラメータの更新
  • 重みの変化の経緯をplot
太郎くん
太郎くん

逆伝播の前に順伝播ってのが必要なのか。

太郎くん
太郎くん

で、順伝播って何?

フクさん
フクさん

普通に入力して出力を見るだけ。
実際は、この出力と正解値であるラベルとの差を元に誤差\(E\)が確定する。

太郎くん
太郎くん

そうか。
連鎖律としては誤差\(E\)が必要だから、
順伝播という普通の処理を一回実施するのか。

フクさん
フクさん

ちなみに「順伝播」から「パラメータ更新」までの3つのプロセスは複数回ループさせる。
今回は200回くらいで良いだろう。
これにより、徐々に分類の決定境界を定める重みが更新される。

予測される適正値は?

太郎くん
太郎くん

ちなみに、重みはどういった値になっていればOKな感じ?

フクさん
フクさん

以前のシグモイド関数を形式ニューロンの活性化関数とし、
総当たり法で求めたときは、重み\(w_1,w_2\)ともに\(2.70\)、
バイアス\(b\)は\(-4.0\)だったな。

太郎くん
太郎くん

じゃー、それになればOKってことかな。

フクさん
フクさん

バイアスの兼ね合いがあると、別の解に収束する可能性もあるから、
今回は、バイアス\(b\)を-4.0に固定し、
重みは\(w_1=1.0,w_2=6.0\)の状態で学習させてみる予定だ。

太郎くん
太郎くん

まぁ、見るパラメータは2つくらいに絞ってあった方が分かり易そうだし、
学習開始時の値も統一しておかないと、環境の差で結果が変わりそうだもんね。

ベクトル、行列演算を加味した場合の注意点

フクさん
フクさん

演算する場合、ベクトル、行列の都合がいれいろ出てくる。
ここでは、プログラム化する際の数式を記載しておく。

\(
\begin{eqnarray}
\displaystyle\frac{\partial E}{\partial W}&=&(A-Y)\cdot\sigma(Z)\{1-\sigma(Z)\}\cdot X\\
&=&\sum \Bigg\{\Bigg(\begin{bmatrix}a_1\\a_2\\a_3\\a_4\end{bmatrix}-\begin{bmatrix}0\\0\\0\\1\end{bmatrix}\Bigg)\Bigg\}\circ
\sigma\Bigg(\begin{bmatrix}z_1\\z_2\\z_3\\z_4\end{bmatrix}\Bigg)
\Bigg\{1-\sigma\Bigg(\begin{bmatrix}z_1\\z_2\\z_3\\z_4\end{bmatrix}\Bigg)\Bigg\}
\begin{bmatrix}1&1\end{bmatrix}
\begin{bmatrix}0&0\\0&1\\1&0\\1&1\end{bmatrix}
\end{eqnarray}
\)

太郎くん
太郎くん

途中の\(\begin{bmatrix}1&1\end{bmatrix}\)はなんだ?

フクさん
フクさん

入力\(X\)が2入力であり、その結果、入力が4×2行列になるんだよね。
特に2列であることが重要で、
その2列に合わせこむために\(\begin{bmatrix}1&1\end{bmatrix}\)と直積を取って、ベクトルから行列にしている。
その上でアダマール積を実施。
これをやらなくてもブロードキャストという機能で演算として通ってしまうこともあるようだが、
念のため合わせこみをしている感じだな。

太郎くん
太郎くん

言ってることは1ミリもわからんけど、
とりあえず、次元の合わせこみをしているって雰囲気だけは察した。

フクさん
フクさん

まぁ、ここではその程度の認識でOKかな・・・。

まとめ

フクさん
フクさん

まとめだよ。

  • 逆伝播の確認用プログラムのフローを記載。
  • 逆伝播の挙動を確認するため、重みの開始位置とバイアスは固定。
  • ベクトル、行列演算をプログラム都合に合わせて表現しなおし。

バックナンバーはこちら。

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をコピーしました