💡

誤差逆伝播法を使ったニューラルネットワークの学習を具体的な数値でステップ実行してみた

に公開

はじめに

この記事では、**誤差逆伝播法(バックプロパゲーション)**を用いたニューラルネットワークの学習を、実際の数値例に基づいて手順を追って解説します。
誤差逆伝播法(バックプロパゲーション)が何をしているのかを計算例を用いてみやすい形にしました。

誤差逆伝播法(バックプロパゲーション)とは

**誤差逆伝播法(ごさぎゃくでんぱほう、Backpropagation)**は、ニューラルネットワークの学習において中心的な役割を果たすアルゴリズムです。主に「深層学習(ディープラーニング)」で用いられており、ネットワークの出力と正解との誤差をもとに、ネットワーク内部のパラメータ(重みやバイアス)を効率的に修正するための方法です

仕組みの概要

  • ニューラルネットワークは、入力層から隠れ層を経て出力層まで情報を伝播させ、予測結果を出します。
  • その予測と正解データを比較し、「誤差(損失)」を計算します。
  • この誤差を、出力層から入力層へと「逆方向」に伝播させ、各層のパラメータがどれだけ誤差に影響したかを計算します。

その影響度合い(勾配)に基づいて、パラメータを少しずつ修正し、次回はより正しい予測ができるようにします

🔧 ネットワークの構成

最小構成のネットワークを使います:

  • 入力層(2ノード)
  • 隠れ層(2ノード)
  • 出力層(1ノード)
  • 活性化関数:シグモイド関数
    • \sigma(z) = \frac{1}{1 + e^{-z}}
    • \sigma'(z) = \sigma(z)(1 - \sigma(z))
  • 損失関数:平均二乗誤差(MSE)

🧮 初期の設定

入力データと教師ラベル

  • 入力:\mathbf{x} = \begin{bmatrix} 1 \\ 0 \end{bmatrix}
  • 教師データ: y = 1

重み・バイアスの初期値

  • W^{(1)} = \begin{bmatrix} 0.1 & 0.2 \\ 0.3 & 0.4 \end{bmatrix}
  • \mathbf{b}^{(1)} = \begin{bmatrix} 0.1 \\ 0.1 \end{bmatrix}
  • W^{(2)} = \begin{bmatrix} 0.5 & 0.6 \end{bmatrix}
  • b^{(2)} = 0.1
  • 学習率: eta = 0.1

✅ ステップ1: 順伝播

隠れ層への入力

\mathbf{z}^{(1)} = W^{(1)} \mathbf{x} + \mathbf{b}^{(1)} = \begin{bmatrix} 0.2 \\ 0.4 \end{bmatrix}

隠れ層の出力(シグモイド関数)

\mathbf{a}^{(1)} = \sigma(\mathbf{z}^{(1)}) = \begin{bmatrix} \sigma(0.2) \\ \sigma(0.4) \end{bmatrix} \approx \begin{bmatrix} 0.5498 \\ 0.5987 \end{bmatrix}

出力層の入力

z^{(2)} = W^{(2)} \cdot \mathbf{a}^{(1)} + b^{(2)} = 0.7341

出力層の出力

\hat{y} = \sigma(z^{(2)}) \approx \sigma(0.7341) \approx 0.6757

✅ ステップ2: 損失の計算

L = \frac{1}{2}(y - \hat{y})^2 = \frac{1}{2}(1 - 0.6757)^2 \approx 0.0524

✅ ステップ3: 誤差逆伝播

出力層の誤差(デルタ)

\delta^{(2)} = (\hat{y} - y) \cdot \sigma'(z^{(2)}) \approx -0.0712

隠れ層の誤差

\delta^{(1)} = (W^{(2)T} \delta^{(2)}) \circ \sigma'(\mathbf{z}^{(1)}) \approx \begin{bmatrix} -0.0088 \\ -0.0103 \end{bmatrix}

✅ ステップ4: パラメータ更新

出力層の重み・バイアス

\Delta W^{(2)} = \eta \cdot \delta^{(2)} \cdot \mathbf{a}^{(1)\top} \approx \begin{bmatrix} 0.0039 & 0.0043 \end{bmatrix}
W^{(2)} := \begin{bmatrix} 0.5039 & 0.6043 \end{bmatrix}
b^{(2)} := 0.1071

隠れ層の重み・バイアス

\Delta W^{(1)} = \eta \cdot \delta^{(1)} \cdot\mathbf{x}^T=\begin{bmatrix} 0.00088 & 0 \\ 0.00103 & 0 \end{bmatrix}
W^{(1)} := \begin{bmatrix} 0.1009 & 0.2 \\ 0.3010 & 0.4 \end{bmatrix}
\mathbf{b}^{(1)} := \begin{bmatrix} 0.1009 \\ 0.1010 \end{bmatrix}

✅ 最終更新後のパラメータ

パラメータ 更新後の値
W^{(1)} \begin{bmatrix} 0.1009 & 0.2\\ 0.3010 & 0.4 \end{bmatrix}
\mathbf{b}^{(1)} \begin{bmatrix} 0.1009 \\ 0.1010 \end{bmatrix}
W^{(2)} \begin{bmatrix} 0.5039 & 0.6043 \end{bmatrix}
b^{(2)} 0.1071

📝 まとめ

  • 1ステップごとの処理で、ニューラルネットワークの重みがどのように更新されるかが見えてくると思います。
  • こうした地道な学習の繰り返しで、ニューラルネットワークは精度を高めていきます。

Discussion