MATLAB、Python、Scilab、Julia比較ページはこちら
https://www.simulationroom999.com/blog/comparison-of-matlab-python-scilab/
はじめに
の、
MATLAB,Python,Scilab,Julia比較 第4章 その63【逆伝播⑭】
を書き直したもの。
単純パーセプトロンに対する逆伝播を行う。
まずは逆伝播を行った際の重みの動き方を確認するプログラムを作成する。
今回はScilabでこれを実現する。
【再掲】プログラム化する数式
まずは、今回プログラム化する数式を再掲。
\(
\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}
\)
これをScilabで実現する。
重みはそれぞれ2.7近辺に収束すればOK。
Scilabコード
以下がScilabコード。
// シグモイド関数の定義
function y = sigmoid(x)
y = 1./(1 + exp(-x));
endfunction
// シグモイド関数の導関数の定義
function y = sigmoid_derivative(x)
y = sigmoid(x).*(1 - sigmoid(x));
endfunction
// データセットの定義
X = [0 0; 0 1; 1 0; 1 1];
Y = [0; 0; 0; 1];
W = [1.0,6.0];
b = -4.0;
N = 200; // ループ回数
aW = zeros(N, 2); // 重み記録用バッファ
for i = 1:N
// 順伝播
Z = X * W' + b;
A = sigmoid(Z);
// 逆伝播
dW = sum((A - Y) .* sigmoid_derivative(Z)*ones(1,2).*X,1);
// パラメータの更新
W = W - dW;
aW(i, :) = W'; // 重みを記憶
end
plot(aW); // 重みの変化の経緯をplot
legend('w_1', 'w_2');
xgrid;
printf("W =");
disp(W); // 最終的な重み
処理結果
処理結果は以下。
W =
2.6664366 2.6668967
まとめ
- 逆伝播を行った際の重みの動き方を確認するプログラムをScilabで作成。
- おおよそ狙ったところに収束。
MATLAB、Python、Scilab、Julia比較ページはこちら
Pythonで動かして学ぶ!あたらしい線形代数の教科書
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
ゼロからはじめるPID制御
OpenCVによる画像処理入門
恋する統計学[回帰分析入門(多変量解析1)] 恋する統計学[記述統計入門]
Pythonによる制御工学入門
理工系のための数学入門 ―微分方程式・ラプラス変換・フーリエ解析
コメント