【Python】ディープラーニングの誤差逆伝播法をやさしく解説!

  • URLをコピーしました!

今回はディープラーニングを学習していると、必ず登場する「誤差逆伝播法」について解説します。

誤差逆伝播法は、理解が少し難しいかと思いますが、ディープラーニングの仕組みを理解する上で重要になります。

また、具体的にイメージしやすいようにPythonで「誤差逆伝播法」を実装する方法も合わせて紹介していきます。

動画で詳しく学習したい方はこちらもおすすめ

目次

誤差逆伝播法とは

誤差逆伝播法は、出力の誤差を起点に入力方向に向かって「重み」、「バイアス」というパラメータを調整する手法です。

入力から出力に向かってパラメータを調整する方法を「順伝播」といい、出力の誤差から入力に向かって調整することを「逆伝播」といいます。

ニューラルネットワークは、なにより出力が重要です。出力の精度が悪ければ、役に立たないモデルになってしまいます。

そこで、出力の誤差に注目し、出力よりも前の層(隠れ層)にフィードバックをかけて徐々に出力の精度を上げていくために、誤差逆伝播法を用います。

誤差逆伝播法の流れ

誤差逆伝播法のざっくりとした流れは以下の通りです。

  1. 順伝播
    まずは入力から出力までを流し、出力値(予測値)を取得
  2. 損失関数により誤差の計算
    二乗和誤差などの損失関数で出力値(予測値)と正解値の誤差を計算
  3. 逆伝播
    出力から入力に向かって、各層の重み、バイアスに対し、誤差への影響度(損失)を計算(この損失を勾配という)
  4. 重み、バイアスの更新
    勾配に基づいて、重み、バイアスを調整

Python実践 誤差逆伝播法

それでは、Pythonを使用し誤差逆伝播法を実装する方法を紹介します。

サンプルコードは以下の通りです。

import numpy as np

# 活性化関数(シグモイド)とその微分
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def sigmoid_deriv(x):
    return sigmoid(x) * (1 - sigmoid(x))

# 入力データ(XOR問題)
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])  # XORの正解

# 初期重みの設定(ランダム)
np.random.seed(0)
W1 = np.random.randn(2, 2)  # 入力層 → 隠れ層
b1 = np.zeros((1, 2))
W2 = np.random.randn(2, 1)  # 隠れ層 → 出力層
b2 = np.zeros((1, 1))

# 学習率
lr = 0.1

# 学習ループ
for epoch in range(10000):
    # --- 順伝播 ---
    z1 = X @ W1 + b1
    a1 = sigmoid(z1)
    z2 = a1 @ W2 + b2
    a2 = sigmoid(z2)  # 出力

    # --- 損失(平均二乗誤差) ---
    loss = np.mean((a2 - y) ** 2)

    # --- 逆伝播 ---
    d_loss_a2 = 2 * (a2 - y)
    d_a2_z2 = sigmoid_deriv(z2)
    d_z2_W2 = a1

    d_loss_W2 = d_z2_W2.T @ (d_loss_a2 * d_a2_z2)
    d_loss_b2 = np.sum(d_loss_a2 * d_a2_z2, axis=0, keepdims=True)

    d_z2_a1 = W2
    d_loss_a1 = (d_loss_a2 * d_a2_z2) @ d_z2_a1.T
    d_a1_z1 = sigmoid_deriv(z1)
    d_z1_W1 = X

    d_loss_W1 = d_z1_W1.T @ (d_loss_a1 * d_a1_z1)
    d_loss_b1 = np.sum(d_loss_a1 * d_a1_z1, axis=0, keepdims=True)

    # --- 重み・バイアス更新 ---
    W2 -= lr * d_loss_W2
    b2 -= lr * d_loss_b2
    W1 -= lr * d_loss_W1
    b1 -= lr * d_loss_b1

        
print("最終出力:")
print(a2.round(3))

実行結果

最終出力:
[[0.025]
 [0.499]
 [0.97 ]
 [0.502]]

入力 、正解値、予測値を整理すると以下の通りです。

入力1入力2正解値予測値
0000.025
0110.499
1010.97
1100.502

正解値が1に対し、予測値0.499となっているため、予測精度があまり良くないといえます。

まとめ

誤差逆伝播法の仕組みを簡単な図を使って紹介しました。

誤差逆伝播法は、出力と正解値の誤差から重みやバイアスといったパラメータを調整し、最終的な予測精度を高める手法です。

また、Pythonで誤差逆伝播法を実装する方法を紹介しました。

コードは少し長いですが、具体的な実装イメージがついたかと思います。

みなさんの学習の少しでも助けになれば幸いです。

ここまで読んでくださりありがとうございます。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

エンジニア。20代。組み込みエンジニアとして働き始めるも、働き方や業務内容に限界を感じ、 AI,Web3エンジニアを目指して勉強中。 エンジニアとして思うことや、学んだことを発信します。

目次