STEP 10:逆伝播(Backpropagation)の理論

🔄 STEP 10: 逆伝播(Backpropagation)の理論

ニューラルネットワークが「学習する仕組み」を理解しよう

📋 このステップで学ぶこと

  • ニューラルネットワークの学習の全体像
  • 勾配降下法の復習
  • 連鎖律(Chain Rule)とは?
  • 逆伝播アルゴリズムの仕組み
  • 計算グラフで理解する逆伝播
  • なぜ「逆」伝播と呼ぶのか?

🎯 1. ニューラルネットワークの学習の全体像

1-1. 学習とは何か?

ニューラルネットワークの学習とは、重み(パラメータ)を調整して、予測精度を上げることです。

🎯 的当てゲームの例え

的当てゲームで、最初は的に当たりません。

試行錯誤:
1回目:右に外れた → 「少し左を狙おう」
2回目:上に外れた → 「少し下を狙おう」
3回目:当たった!

ニューラルネットワークも同じです。
「どのくらいずれたか」を見て、「どう修正すればいいか」を計算します。

1-2. 学習の5つのステップ

以下の図は横スクロールできます。

【ニューラルネットワークの学習サイクル】 ┌─────────────────────────────────────────────────────────────┐ │ │ │ ①入力 ②順伝播 ③損失計算 ④逆伝播 ⑤更新 │ │ │ │ 入力データ → ニューラル → 予測値 → 損失関数 → 勾配計算 → 重み更新 │ │ X ネット ŷ L(y,ŷ) ∂L/∂w w-=η∂L/∂w│ │ │ │ ─────────────→ 順伝播(Forward) ──────────────→ │ │ │ │ ←───────────── 逆伝播(Backward) ←──────────── │ │ │ └─────────────────────────────────────────────────────────────┘ ① 入力:データをネットワークに入れる ② 順伝播:入力から出力を計算する(予測) ③ 損失計算:予測と正解の「ずれ」を計算 ④ 逆伝播:各重みが損失にどう影響したか計算(勾配) ⑤ 更新:勾配を使って重みを修正 → これを繰り返して、損失を小さくしていく
✅ このステップで学ぶのは「④逆伝播」

逆伝播は、各重みが損失にどのくらい影響しているか(勾配)を効率的に計算するアルゴリズムです。

この勾配を使って、重みをどう修正すればいいかが分かります。

📉 2. 勾配降下法の復習

2-1. 勾配とは?

勾配(Gradient)とは、「関数の傾き」のことです。
損失関数の勾配は、「重みを少し変えたとき、損失がどのくらい変わるか」を表します。

📐 勾配の定義

勾配 = ∂L/∂w

意味:「重み w を少し増やすと、損失 L がどのくらい増えるか」

2-2. 勾配降下法の式

📐 重みの更新式

w_new = w_old – η × ∂L/∂w

w_new:更新後の重み
w_old:更新前の重み
η(イータ):学習率
∂L/∂w:損失関数の重みに対する勾配

2-3. なぜマイナスなのか?

【勾配降下法でマイナスを使う理由】 目標:損失 L を小さくしたい ■ 勾配が正(∂L/∂w > 0)の場合: → 重みを増やすと損失が増える → 損失を減らすには、重みを「減らす」べき → w_new = w_old – (正の値) → 重みが減る ✓ ■ 勾配が負(∂L/∂w < 0)の場合: → 重みを増やすと損失が減る → 損失を減らすには、重みを「増やす」べき → w_new = w_old - (負の値) → 重みが増える ✓ 結論:「勾配の逆方向」に進めば、損失が減る!
⛰️ 山下りの例え

霧の中で山を下りたいとき:

1. 足元の傾きを感じる(勾配を計算)
2. 傾きが下がる方向に進む(勾配の逆方向)
3. 繰り返すと、谷底(損失最小)に到達

これが勾配降下法です。

🔗 3. 連鎖律(Chain Rule)

3-1. 連鎖律とは?

連鎖律(Chain Rule)は、合成関数の微分法則です。
逆伝播アルゴリズムの核心となる数学的な道具です。

📐 連鎖律の式

y = f(g(x)) のとき

dy/dx = (dy/dg) × (dg/dx)

つまり:
「y の x に対する微分」=「y の g に対する微分」×「g の x に対する微分」

3-2. 連鎖律の具体例

【連鎖律の具体例】 問題:y = (2x + 3)² を x で微分せよ ■ 通常の方法(展開してから微分): y = (2x + 3)² = 4x² + 12x + 9 dy/dx = 8x + 12 ■ 連鎖律を使う方法: g = 2x + 3 とおく y = g² dy/dx = (dy/dg) × (dg/dx) = 2g × 2 = 2(2x + 3) × 2 = 4(2x + 3) = 8x + 12 ✓ → 同じ答えになる!

3-3. なぜ連鎖律が必要?

💡 ニューラルネットワークは合成関数の塊

ニューラルネットワークは、たくさんの関数が連なった合成関数です。

【ニューラルネットワークを数式で表すと】 入力 x ↓ z₁ = w₁×x + b₁ (線形変換) ↓ a₁ = ReLU(z₁) (活性化関数) ↓ z₂ = w₂×a₁ + b₂ (線形変換) ↓ a₂ = ReLU(z₂) (活性化関数) ↓ ŷ = softmax(a₂) (出力) ↓ L = CrossEntropy(y, ŷ) (損失) これは巨大な合成関数! L = f₆(f₅(f₄(f₃(f₂(f₁(x)))))) この関数の w₁ に対する微分 ∂L/∂w₁ を求めたい → 連鎖律を使って効率的に計算できる!

🔙 4. 逆伝播アルゴリズム

4-1. 逆伝播とは?

逆伝播(Backpropagation)は、連鎖律を使って、出力側から入力側に向かって勾配を効率的に計算するアルゴリズムです。

✅ なぜ「逆」伝播?

順伝播(Forward):入力 → 出力(予測を計算)
逆伝播(Backward):出力 → 入力(勾配を計算)

勾配を計算するとき、出力側から入力側に「逆向き」に進むから「逆伝播」!

4-2. シンプルな例で理解する

2層のシンプルなネットワークで考えてみましょう。

以下の図は横スクロールできます。

【シンプルな2層ネットワーク】 入力 x = 2 ↓ 第1層:z₁ = w₁ × x = 3 × 2 = 6 (w₁ = 3) ↓ 活性化:a₁ = ReLU(z₁) = ReLU(6) = 6 ↓ 第2層:z₂ = w₂ × a₁ = 2 × 6 = 12 (w₂ = 2) ↓ 出力:ŷ = z₂ = 12 ↓ 損失:L = (y – ŷ)² = (10 – 12)² = 4 (正解 y = 10) 【順伝播の流れ】 x=2 → z₁=6 → a₁=6 → z₂=12 → ŷ=12 → L=4 【逆伝播で求めたいもの】 ∂L/∂w₁ = ? (w₁ をどう修正すればいいか) ∂L/∂w₂ = ? (w₂ をどう修正すればいいか)

4-3. 連鎖律で勾配を計算

【逆伝播の計算】 ■ ステップ1:∂L/∂ŷ を計算(出力に対する勾配) L = (y – ŷ)² = (10 – ŷ)² ∂L/∂ŷ = -2(10 – ŷ) = -2(10 – 12) = 4 ■ ステップ2:∂L/∂z₂ を計算 ŷ = z₂ なので ∂ŷ/∂z₂ = 1 ∂L/∂z₂ = ∂L/∂ŷ × ∂ŷ/∂z₂ = 4 × 1 = 4 ■ ステップ3:∂L/∂w₂ を計算 z₂ = w₂ × a₁ なので ∂z₂/∂w₂ = a₁ = 6 ∂L/∂w₂ = ∂L/∂z₂ × ∂z₂/∂w₂ = 4 × 6 = 24 ■ ステップ4:∂L/∂a₁ を計算(逆方向に伝播) z₂ = w₂ × a₁ なので ∂z₂/∂a₁ = w₂ = 2 ∂L/∂a₁ = ∂L/∂z₂ × ∂z₂/∂a₁ = 4 × 2 = 8 ■ ステップ5:∂L/∂z₁ を計算 a₁ = ReLU(z₁)、z₁ > 0 なので ∂a₁/∂z₁ = 1 ∂L/∂z₁ = ∂L/∂a₁ × ∂a₁/∂z₁ = 8 × 1 = 8 ■ ステップ6:∂L/∂w₁ を計算 z₁ = w₁ × x なので ∂z₁/∂w₁ = x = 2 ∂L/∂w₁ = ∂L/∂z₁ × ∂z₁/∂w₁ = 8 × 2 = 16 【結果】 ∂L/∂w₁ = 16 ∂L/∂w₂ = 24

4-4. 重みの更新

【勾配を使って重みを更新】 学習率 η = 0.01 とすると w₁_new = w₁_old – η × ∂L/∂w₁ = 3 – 0.01 × 16 = 3 – 0.16 = 2.84 w₂_new = w₂_old – η × ∂L/∂w₂ = 2 – 0.01 × 24 = 2 – 0.24 = 1.76 → 重みが更新された! → これを繰り返すと、損失が小さくなっていく

📊 5. 計算グラフで理解する

5-1. 計算グラフとは?

計算グラフは、計算の流れをグラフ(ノードとエッジ)で表現したものです。
TensorFlowなどの深層学習フレームワークは、内部で計算グラフを作成しています。

以下の図は横スクロールできます。

【計算グラフの例】 f = (a + b) × c を計算グラフで表す a=2 ↘ [+] → d=5 ↗ ↘ b=3 [×] → f=20 ↗ c=4 【順伝播】 ① d = a + b = 2 + 3 = 5 ② f = d × c = 5 × 4 = 20 【逆伝播】∂f/∂a を求める ③ ∂f/∂d = c = 4 ④ ∂d/∂a = 1 ⑤ ∂f/∂a = ∂f/∂d × ∂d/∂a = 4 × 1 = 4

5-2. 逆伝播の伝播イメージ

【逆伝播の伝播イメージ】 順伝播(→):値が前に流れる 逆伝播(←):勾配が後ろに流れる ────────→ 順伝播 ────────→ 入力 隠れ層1 隠れ層2 出力 損失 x → h₁ → h₂ → ŷ → L ←──────── 逆伝播 ←──────── ∂L/∂x ∂L/∂h₁ ∂L/∂h₂ ∂L/∂ŷ 1 ↑ ↑ ↑ ↑ ↑ 計算 計算 計算 計算 スタート 逆伝播は「1」からスタートして、連鎖律で勾配を計算しながら逆向きに進む

5-3. TensorFlowでの自動微分

💡 実際には手計算不要!

TensorFlow/Kerasは、自動微分(Automatic Differentiation)機能を持っています。

順伝播を定義するだけで、逆伝播は自動的に計算されます!

→ 理論を理解しておくことは重要ですが、実装時に手計算する必要はありません。

import tensorflow as tf # 自動微分の例 x = tf.Variable(3.0) with tf.GradientTape() as tape: y = x ** 2 # y = x² # 勾配を自動計算 grad = tape.gradient(y, x) print(f”x = {x.numpy()}”) print(f”y = x² = {y.numpy()}”) print(f”dy/dx = {grad.numpy()}”) # 2x = 6
実行結果:
x = 3.0
y = x² = 9.0
dy/dx = 6.0

→ TensorFlowが自動で微分を計算してくれる!

⚠️ 6. 勾配消失問題

6-1. 勾配消失とは?

勾配消失(Vanishing Gradient)は、逆伝播で勾配が0に近づいてしまう問題です。
深いネットワークで特に発生しやすいです。

⚠️ 勾配消失の問題点

勾配が0に近いと…
→ 重みの更新量も0に近くなる
→ 学習が進まない!

特に入力に近い層(浅い層)で発生しやすい

6-2. なぜ勾配消失が起きる?

【勾配消失の原因:sigmoid関数の場合】 sigmoid関数の微分の最大値は 0.25 逆伝播で各層を通るたびに、勾配が掛け算される: 層が5つの場合: ∂L/∂w₁ = ∂L/∂a₅ × ∂a₅/∂z₅ × … × ∂a₁/∂z₁ × ∂z₁/∂w₁ sigmoid’の最大値 0.25 が5回かかると: 0.25 × 0.25 × 0.25 × 0.25 × 0.25 = 0.001 → 勾配が1000分の1に! → 深い層では勾配がほぼ0になる

6-3. 解決策

✅ 勾配消失の解決策
  • ReLU活性化関数:勾配が0か1なので消失しにくい(STEP 4で学習済み)
  • バッチ正規化:各層の出力を正規化(STEP 13で学習)
  • 適切な重み初期化:He初期化、Xavier初期化
  • 残差接続(ResNet):勾配のショートカット

📝 STEP 10 のまとめ

✅ このステップで学んだこと
  • 学習は「順伝播→損失計算→逆伝播→重み更新」のサイクル
  • 勾配降下法は、勾配の逆方向に重みを更新して損失を減らす
  • 連鎖律は、合成関数の微分法則
  • 逆伝播は、連鎖律を使って出力から入力に向かって勾配を計算
  • 計算グラフで計算の流れを表現できる
  • 自動微分でTensorFlowが勾配を自動計算してくれる
  • 勾配消失問題は、ReLUやバッチ正規化で解決
💡 覚えておくべきポイント

逆伝播の本質:
「各重みが損失にどのくらい影響しているか」を、
連鎖律を使って効率的に計算するアルゴリズム

実装時のポイント:
TensorFlow/Kerasが自動で計算してくれるので、
理論を理解した上で、フレームワークを信頼して使おう!

🚀 次のステップへ

逆伝播の理論を習得したので、次のSTEP 11では最適化アルゴリズムを学びます。

SGD、Momentum、Adamなど、重みをより効率的に更新する方法を学びましょう!

📝 練習問題

問題1 やさしい

学習のサイクル

ニューラルネットワークの学習サイクルとして、正しい順序を選んでください。

  • A. 逆伝播 → 順伝播 → 損失計算 → 重み更新
  • B. 順伝播 → 損失計算 → 逆伝播 → 重み更新
  • C. 重み更新 → 順伝播 → 逆伝播 → 損失計算
  • D. 損失計算 → 順伝播 → 重み更新 → 逆伝播
正解:B

学習サイクルの正しい順序

【正しい学習サイクル】 ① 順伝播(Forward Propagation) → 入力データから予測を計算 ② 損失計算(Loss Calculation) → 予測と正解の「ずれ」を計算 ③ 逆伝播(Backpropagation) → 各重みの勾配を計算 ④ 重み更新(Weight Update) → 勾配を使って重みを修正 → これを繰り返して損失を小さくしていく
問題2 やさしい

連鎖律

y = f(g(x)) のとき、dy/dx を求める連鎖律の式として正しいものを選んでください。

  • A. dy/dx = dy/dg + dg/dx
  • B. dy/dx = dy/dg × dg/dx
  • C. dy/dx = dy/dg ÷ dg/dx
  • D. dy/dx = dy/dg – dg/dx
正解:B

連鎖律は「掛け算」

【連鎖律の式】 dy/dx = (dy/dg) × (dg/dx) 「y の g に対する微分」×「g の x に対する微分」 例:y = (2x + 3)² の場合 g = 2x + 3 とおくと y = g² dy/dx = (dy/dg) × (dg/dx) = 2g × 2 = 4(2x + 3) = 8x + 12
問題3 ふつう

逆伝播の特徴

逆伝播(Backpropagation)について、正しい説明を選んでください。

  • A. 入力から出力に向かって勾配を計算する
  • B. 出力から入力に向かって勾配を計算する
  • C. 勾配の計算は不要で、直接重みを更新する
  • D. 順伝播と同じ方向で計算する
正解:B

逆伝播は「逆向き」に計算

【順伝播と逆伝播の方向】 順伝播(Forward):入力 → 出力 入力 → 隠れ層 → 出力 → 損失 値を前に流す 逆伝播(Backward):出力 → 入力 損失 → 出力 → 隠れ層 → 入力 勾配を後ろに流す なぜ「逆」伝播と呼ぶ? → 勾配を計算するとき、出力側から入力側に 「逆向き」に進むから!
問題4 ふつう

勾配消失問題

勾配消失問題の解決策として適切でないものを選んでください。

  • A. ReLU活性化関数を使う
  • B. バッチ正規化を使う
  • C. sigmoid活性化関数をすべての層で使う
  • D. 適切な重み初期化(He初期化など)を使う
正解:C

sigmoidは勾配消失の原因

【なぜsigmoidは問題か?】 sigmoid関数の微分の最大値は 0.25 深いネットワークで各層を通るたびに勾配が掛け算される: 0.25 × 0.25 × 0.25 × … → ほぼ0に! 【解決策】 ✅ A. ReLU:勾配が0か1なので消失しにくい ✅ B. バッチ正規化:各層の出力を正規化 ❌ C. sigmoid:勾配消失の原因になる ✅ D. 適切な重み初期化:He初期化、Xavier初期化
問題5 むずかしい

勾配降下法の式

勾配降下法の重み更新式 w_new = w_old – η × ∂L/∂w で、マイナスを使う理由として正しいものを選んでください。

  • A. 損失を最大化するため
  • B. 勾配の方向に進むと損失が増えるから、逆方向に進む
  • C. 学習率を負にするため
  • D. 計算を簡単にするため
正解:B

勾配の逆方向に進む理由

【マイナスを使う理由】 目標:損失 L を小さくしたい 勾配 ∂L/∂w は「wを増やすとLがどのくらい増えるか」を表す ■ 勾配が正(∂L/∂w > 0)の場合: → wを増やすとLが増える → Lを減らすにはwを「減らす」べき → マイナスをつけて減らす ✓ ■ 勾配が負(∂L/∂w < 0)の場合: → wを増やすとLが減る → Lを減らすにはwを「増やす」べき → マイナスで符号が反転して増える ✓ 結論:勾配の「逆方向」に進めば、損失が減る!
📝

学習メモ

ディープラーニング基礎 - Step 10

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE