LESSON

誤差逆伝播法

田中VPoE:「パーセプトロンの仕組みは理解できたね。次は、ニューラルネットワークがどうやって『学習する』のかを見ていこう。鍵になるのが誤差逆伝播法(バックプロパゲーション)だ。」

あなた:「重みをどう更新するかという話ですね。」

田中VPoE:「その通り。予測と正解の差(誤差)を使って、各パラメータをどう調整すべきかを効率的に計算する手法だ。これが深層学習を可能にした核心技術と言える。」

学習の全体フロー

ニューラルネットワークの学習は、以下のサイクルを繰り返します。

1. 順伝播(Forward Pass): 入力 → 予測を計算
2. 損失計算: 予測と正解の誤差を計算
3. 逆伝播(Backward Pass): 誤差から各パラメータの勾配を計算
4. パラメータ更新: 勾配を使って重みを修正
5. 1に戻る

損失関数(Loss Function)

損失関数は、モデルの予測と正解との「ズレ」を数値化します。

損失関数数式(概要)用途
MSE(平均二乗誤差)(1/n)Σ(y - y_hat)^2回帰
Binary Cross-Entropy-[y*log(y_hat) + (1-y)*log(1-y_hat)]二値分類
Cross-Entropy-Σ y_i * log(y_hat_i)多クラス分類
import numpy as np

# Binary Cross-Entropy の例
def binary_cross_entropy(y_true, y_pred):
    epsilon = 1e-7  # log(0) を防ぐ
    y_pred = np.clip(y_pred, epsilon, 1 - epsilon)
    loss = -np.mean(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred))
    return loss

# 例: 離反予測
y_true = np.array([1, 0, 1, 1, 0])  # 正解ラベル
y_pred = np.array([0.9, 0.1, 0.8, 0.7, 0.3])  # モデルの予測

loss = binary_cross_entropy(y_true, y_pred)
print(f"損失: {loss:.4f}")  # 小さいほど良い予測

勾配降下法(Gradient Descent)

勾配降下法は、損失関数の勾配(傾き)を計算し、損失が小さくなる方向にパラメータを更新するアルゴリズムです。

w_new = w_old - learning_rate * (dL/dw)
  • dL/dw: 損失関数 L の重み w に対する偏微分(勾配)
  • learning_rate: 学習率(更新の大きさを制御)

勾配降下法の種類

方式データ量特徴
バッチ勾配降下法全データ安定だが遅い
確率的勾配降下法(SGD)1サンプル高速だが不安定
ミニバッチ勾配降下法バッチ単位バランスが良い(実務で主流)
# ミニバッチ勾配降下法のイメージ
batch_size = 32
learning_rate = 0.01

for epoch in range(num_epochs):
    for batch in get_mini_batches(X_train, y_train, batch_size):
        # 1. 順伝播
        predictions = model.forward(batch.X)
        # 2. 損失計算
        loss = compute_loss(predictions, batch.y)
        # 3. 逆伝播(勾配計算)
        gradients = model.backward(loss)
        # 4. パラメータ更新
        for param, grad in zip(model.parameters, gradients):
            param -= learning_rate * grad

誤差逆伝播法の仕組み

逆伝播は、連鎖律(Chain Rule)を使って、出力層から入力層に向かって勾配を効率的に計算する手法です。

入力層 → 隠れ層1 → 隠れ層2 → 出力層 → 損失

損失の勾配 ← 出力層の勾配 ← 隠れ層2の勾配 ← 隠れ層1の勾配
         (逆伝播の方向)

連鎖律の例

z = w * x     (重み付き入力)
a = ReLU(z)   (活性化)
L = loss(a, y) (損失)

dL/dw = dL/da * da/dz * dz/dw
      = dL/da * ReLU'(z) * x

各層の勾配は、後段の勾配を「チェーン」のようにつなげて計算します。これにより、数百層のネットワークでも効率的に全パラメータの勾配を求められます。

学習率の影響

学習率は深層学習で最も重要なハイパーパラメータの1つです。

学習率が大きすぎる場合:
  損失が発散する(最小値を飛び越える)

学習率が小さすぎる場合:
  学習が極端に遅い / 局所最適解に陥る

適切な学習率:
  損失が安定して減少する
学習率挙動対策
1e-1 ~発散しやすい通常は使わない
1e-2 ~ 1e-3SGD の一般的な範囲Warm-up と組み合わせ
1e-3 ~ 1e-4Adam の一般的な範囲最もよく使われる
1e-5 ~学習が遅すぎるFine-tuning 時に使用
# 学習率の影響を確認する簡易実験
import numpy as np

def train_with_lr(learning_rate, steps=50):
    """単純な2次関数 f(w) = w^2 の最小化"""
    w = 5.0  # 初期値
    history = [w]
    for _ in range(steps):
        grad = 2 * w  # df/dw = 2w
        w = w - learning_rate * grad
        history.append(w)
    return history

# 異なる学習率での挙動
for lr in [0.01, 0.1, 0.5, 1.1]:
    history = train_with_lr(lr)
    final = history[-1]
    print(f"lr={lr:.2f}: 最終値={final:.6f} {'(発散!)' if abs(final) > 100 else ''}")

まとめ

  • ニューラルネットワークの学習は「順伝播 → 損失計算 → 逆伝播 → パラメータ更新」のサイクル
  • 損失関数はタスクに応じて選択する(回帰→MSE、分類→Cross-Entropy)
  • 勾配降下法で損失を最小化する方向にパラメータを更新する
  • 誤差逆伝播法は連鎖律を使って勾配を効率的に計算する手法
  • 学習率はモデルの収束に大きく影響する重要なハイパーパラメータ

チェックリスト

  • 順伝播→損失計算→逆伝播→パラメータ更新の学習サイクルを説明できる
  • 損失関数の役割とタスク別の選び方を理解した
  • 勾配降下法の仕組みと3つの種類を説明できる
  • 学習率が大きすぎる/小さすぎる場合の影響を理解した

推定読了時間: 30分