【入門】逆伝播(Scilab)【数値計算】

【入門】逆伝播(Scilab)【数値計算】 数値計算
【入門】逆伝播(Scilab)【数値計算】

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); // 最終的な重み

処理結果

処理結果は以下。

逆伝播で重みの変化(Scilab)
W =
   2.6664366   2.6668967

まとめ

  • 逆伝播を行った際の重みの動き方を確認するプログラムをScilabで作成。
  • おおよそ狙ったところに収束。

MATLAB、Python、Scilab、Julia比較ページはこちら

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