誤差逆伝播法(バックプロパゲーション)と合成関数の微分
ディープラーニングの学習エンジン — 微分の連鎖律(チェインルール)によるパラメータ更新
- 1
- AIが賢くなる(学習する)とは、出力の『予測誤差』を最小化するように数十億個の重みパラメータを微分で微調整すること
- 2
- 合成関数の微分公式である『連鎖律(Chain Rule)』を用いることで、出力層の誤差を出力から入力方向へと効率的に逆流(逆伝播)できる
- 3
- 各重みの勾配(傾き)が求まれば、最急降下法()によって損失が減る方向へと重みを更新できる
なぜこれを学ぶのか? — 現実社会とテクノロジーでの価値
なぜ生まれたのか?
深層学習ブームの立役者ジェフリー・ヒントンらが1986年に再発見した数式。何百層ものディープな層を持つニューラルネットワークであっても、高校数学の『微分の連鎖律』さえあれば、全自動で微分係数を計算して学習させることができます。
身につく武器・思考力
自動微分(Autograd)の数学的理解、PyTorch等の深層学習フレームワークの内部動作の直感、数理最適化の確固たる基盤
実社会・ITでの活躍現場
- •PyTorch (`loss.backward()`) や TensorFlow (`tf.GradientTape`) の自動微分エンジン
- •大規模言語モデル(LLM)の事前学習およびRLHF(人間のフィードバックによる強化学習)
- •自動運転車の障害物検知ニューラルネットワークのパラメータ最適化
- •画像生成モデル(Stable Diffusion等)のノイズ除去ネットワークの重み学習
Layer 1 — 直感・シミュレーター
入力値 と目標値 を設定し、ネットワークの重み を調整してみましょう。「1ステップ逆伝播」ボタンを押すと、出力誤差から連鎖律(掛け算)によって各層へ勾配が逆流し、重みが更新されて損失(Loss)がゼロに向かって減っていく様子を観察できます。
誤差逆伝播(バックプロパゲーション):微分の掛け算が後ろ向きに流れて重みを直す
青い矢印(順伝播)で計算して出た誤差(Loss)に対し、 赤い矢印(逆伝播)で微分の連鎖律(チェインルール)を逆流させて勾配を求め、重み $w_1, w_2$ を更新します。
深層ニューラルネットワークで層が深くなると、誤差逆伝播の際に勾配がどんどん小さくなって初段の層が全く学習しなくなる現象を何と呼ぶか?
Layer 2 — 定義・受験・証明
定義
**誤差逆伝播法(Backpropagation)**とは、ニューラルネットワークの損失関数 を各層の重みパラメータ で偏微分した勾配 を、出力層から入力層に向かって連鎖律(Chain Rule)を用いて再帰的に計算する高速アルゴリズムである。
公式・数理モデル
証明・導出
**単純な2層ネットワークでの連鎖律の導出** 入力 、第1層の重み 、活性化関数 、第2層の重み 、二乗誤差損失 を考える。 順伝播の計算グラフ:
各中間変数の局所的な偏微分(ローカル勾配)を計算すると: 1. 出力損失の微分: 2. 第2層の重みへの影響: 3. 第1層への誤差の逆流: 4. 活性化関数の微分: 5. 第1層の重みへの影響:
合成関数の微分律(連鎖律)により、第1層の重み に関する損失の微分はこれらの一連の積として求まる:
数値微分のようにパラメータごとに何度も順伝播をやり直す必要がなく、**たった1回の逆伝播(掛け算の連鎖)で全重みの勾配が同時に手に入る**(計算量 )。
押さえておきたいポイント
- 数値微分(微小量 を足して引く方法)に比べ、逆伝播は数万倍以上高速に全パラメータの微分を計算できる
- 誤差信号 が後ろから前へと順次バトンタッチ(積算)されていく
- 活性化関数にシグモイドを使うと微分値が常に 以下になるため、多層で勾配が消滅する(勾配消失問題)。これを解決したのがReLU関数である
本トピックの内容・数理モデルは、文部科学省学習指導要領(算数・数学・情報)および国際標準カリキュラムに準拠し、エンジニアリング現場の実装事例と照らし合わせてMath World Lab編集部により検証・作成されています。
Layer 3 — 工学応用・現場実装
NumPyによる2層ニューラルネットワークと逆伝播のスクラッチ実装
PyTorchなどのフレームワークを使わずに純粋な行列積と連鎖律だけで実装した学習コードです。
1import numpy as np23# シグモイド関数とその微分4def sigmoid(x): return 1.0 / (1.0 + np.exp(-x))5def d_sigmoid(x): return sigmoid(x) * (1.0 - sigmoid(x))67# 順伝播8x = np.array([1.0, 2.0])9y_true = np.array([1.0])10w1 = np.random.randn(2, 3) # 入力2 -> 隠れ311w2 = np.random.randn(3, 1) # 隠れ3 -> 出力11213z1 = np.dot(x, w1)14a1 = sigmoid(z1)15y_pred = np.dot(a1, w2)16loss = 0.5 * (y_pred - y_true)**21718# 逆伝播(連鎖律による勾配計算)19d_loss = y_pred - y_true20d_w2 = np.outer(a1, d_loss) # 第2層重みの勾配2122d_a1 = np.dot(d_loss, w2.T)23d_z1 = d_a1 * d_sigmoid(z1)24d_w1 = np.outer(x, d_z1) # 第1層重みの勾配2526# 勾配降下法による重み更新27lr = 0.128w1 -= lr * d_w129w2 -= lr * d_w2
次に学ぶならコレ!おすすめトピック
この単元と深い繋がりを持つ、あわせて学ぶと理解が深まるおすすめ単元