誤差逆伝播法
田中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-3 | SGD の一般的な範囲 | Warm-up と組み合わせ |
| 1e-3 ~ 1e-4 | Adam の一般的な範囲 | 最もよく使われる |
| 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分