#07 人工知能入門 DNN基礎
誤差逆伝播——間違いから学ぶ仕組み
「どの重みが悪かったのか」を探る
前回、損失関数で「どれだけ間違えたか」を数値化できました。次の問いは「どの重みを、どの方向に、どれだけ修正すればいいか?」です。
これを解決するのが誤差逆伝播(バックプロパゲーション、Backpropagation) です。
責任の配分という考え方
誤差逆伝播は「間違いの責任を各重みに配分する」というイメージで考えると理解しやすいです。
例えばチームのプロジェクトが失敗したとき、誰がどれだけ責任があるかを調べますよね。責任が重い人(間違いに大きく影響した重み)ほど多く修正し、責任が軽い人(あまり影響しなかった重み)はあまり修正しない、というイメージです。
出力層で間違いが発生
↓
「どの隠れ層ニューロンが、どれだけこの間違いに影響した?」
↓
「そのニューロンへの入力は、どの重みが影響した?」
↓
出力層 → 隠れ層 → 入力層と、逆向きに責任を伝播していく
これが「逆伝播」の意味です。フォワードパスとは逆方向に計算が進みます。
勾配(グラジェント)という概念
誤差逆伝播では、各重みに対して勾配(gradient) を計算します。
勾配とは「この重みを少し変えると、損失はどう変わるか」を表す値です。
勾配 > 0 の場合: 重みを増やすと損失が増える → 重みを減らすべき
勾配 < 0 の場合: 重みを増やすと損失が減る → 重みを増やすべき
勾配 ≈ 0 の場合: 重みを変えても損失はほぼ変わらない → 修正不要
勾配降下法
勾配が計算できたら、次は勾配降下法(Gradient Descent) で重みを更新します。
新しい重み = 現在の重み - 学習率 × 勾配
例: 重み = 0.5, 勾配 = 0.3, 学習率 = 0.01 のとき
新しい重み = 0.5 - 0.01 × 0.3 = 0.5 - 0.003 = 0.497
学習率(Learning Rate) は「一度にどれだけ重みを変えるか」を決める係数です。
山を下るイメージ
勾配降下法は「山を下る」イメージで理解できます。
損失の大きさ
↑
│ ∧ ← 現在地(損失が大きい)
│ / \
│ / \
│ / \___/\____
│ ↑
│ 目指す谷(損失が小さい)
└──────────────────→ 重みの値
- 現在地の「斜面の傾き(勾配)」を計算する
- 傾きの方向と逆向き(下り坂の方向)に少し進む
- これを繰り返すと谷(損失が小さい場所)に近づいていく
学習率が大きすぎると・小さすぎると
学習率 小さすぎる場合: 学習率 大きすぎる場合:
─────○→→→→→→ 谷を飛び越える
(歩幅が小さくて ○→→→→→→↗
なかなか進まない) ↑ ↑ ↑ ↑
どんどん外れていく
| 学習率 | 特徴 |
|---|---|
| 大きすぎる | 損失が下がらず発散することも |
| 小さすぎる | 学習が遅い、局所解に陥りやすい |
| 適切 | 安定して損失が下がる |
誤差逆伝播の全体の流れ
# 概念的な擬似コード(実際にはフレームワークが自動で行う)
for each バッチ(データのひとかたまり):
# 1. フォワードパス(順伝播)
予測値 = ネットワーク(入力)
# 2. 損失を計算
損失 = 損失関数(予測値, 正解値)
# 3. バックプロパゲーション(逆伝播)
各重みの勾配 = 損失.backward() # 自動微分
# 4. 重みを更新(勾配降下法)
for 各重み w:
w = w - 学習率 × w の勾配
PyTorchなどのフレームワークでは loss.backward() の1行で逆伝播の計算がすべて自動的に行われます。数学的には微分の連鎖律(チェーンルール)を使いますが、コードを書く側は気にしなくて大丈夫です。
直感的なまとめ
誤差逆伝播をひと言で表すなら「試験で間違えた問題を見直して、何が悪かったかを分析し、次に活かす」作業です。
- 試験を受ける(フォワードパス)
- 採点する(損失を計算)
- どこで間違えたか分析する(バックプロパゲーション)
- 間違えた点を修正する(重みの更新)
- また試験を受ける(繰り返し)
まとめ
- 誤差逆伝播は「間違いの責任を各重みに配分する」仕組み
- 勾配(gradient)は「この重みを変えると損失がどう変わるか」を表す
- 勾配降下法では「勾配の逆方向に重みを少しずつ更新」する
- 学習率は1回の更新の大きさ——大きすぎても小さすぎてもNG
- 現代のフレームワークでは自動微分で逆伝播が自動計算される
次回は、この一連の学習ループを管理する仕組み——バッチ、エポック、学習率、過学習について学びます。