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

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

MATLAB、Python、Scilab、Julia比較ページはこちら
https://www.simulationroom999.com/blog/comparison-of-matlab-python-scilab/

はじめに

の、

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

を書き直したもの。

単純パーセプトロンに対する逆伝播を行う。
まずは逆伝播を行った際の重みの動き方を確認するプログラムを作成する。
今回はPythonでこれを実現する。

【再掲】プログラム化する数式

まずは、今回プログラム化する数式を再掲。

\(
\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}
\)

これをPythonで実現する。
重みはそれぞれ2.7近辺に収束すればOKだ。

Pythonコード

以下がPythonコード。

import numpy as np
import matplotlib.pyplot as plt

# シグモイド関数の定義
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# シグモイド関数の導関数の定義
def sigmoid_derivative(x):
    return sigmoid(x) * (1 - sigmoid(x))

# データセットの定義
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
Y = np.array([[0], [0], [0], [1]])
W = np.array([1.0, 6.0])
b = -4.0

N = 200  # ループ回数
aW = np.zeros((N, 2))  # 重み記録用バッファ

for i in range(N):
    # 順伝播
    Z = X@W.reshape(-1,1) + b
    A = sigmoid(Z)

    # 逆伝播
    dW = np.sum((A - Y) * sigmoid_derivative(Z)@np.ones((1,2)) * X, axis=0)

    # パラメータの更新
    W = W - dW
    aW[i, :] = W  # 重みを記憶

plt.plot(aW)  # 重みの変化の経緯をplot
plt.legend(['w_1', 'w_2'])
plt.grid(True)
plt.show()

print("W =", W)  # 最終的な重み

処理結果

処理結果は以下。

逆伝播で重みの変化(Python)
W = [2.66643661 2.66689667]

まとめ

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

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

Pythonで動かして学ぶ!あたらしい線形代数の教科書

https://amzn.to/3OE5bVp

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

https://amzn.to/3OBiaax

ゼロからはじめるPID制御

https://amzn.to/3SvzuyR

OpenCVによる画像処理入門

https://amzn.to/498ZUgK

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

https://amzn.to/3STAe2i

Pythonによる制御工学入門

https://amzn.to/3uskuK5

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

https://amzn.to/3UAunQK

コメント

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