月影

日々の雑感

誤差逆伝播法とは?計算例で学ぶAIが賢くなる仕組み【機械学習入門】

 

誤差逆伝播法とは?AIが「反省」して賢くなる仕組み

AIが答えを出す「順伝播」と、答え合わせの「損失関数」に続き、いよいよAI学習サイクルの最終章です。AIが自らの間違いを元に「反省」し、パラメータを修正していくプロセス、それが誤差逆伝播法(Backpropagation)です。今回は具体的な計算例を通して、その仕組みの核心に迫ります。

1. 誤差逆伝播法の役割:間違いの「責任のなすりつけ合い」

誤差逆伝播法は、出力層で計算された誤差(損失)を、逆方向(入力層に向かって)に伝播させ、最終的な間違いに対して「ネットワークのどの重みやバイアスが、どれくらい責任があるのか」を特定する手法です。

この「責任の大きさ」を数学的に表現したものが勾配(Gradient)です。勾配が分かれば、それぞれの重みを「どちらの方向に」「どれくらい」修正すれば損失が減るのかが分かり、AIは学習できるのです。

2. 具体例で学ぶ:計算で追う誤差逆伝播

非常にシンプルなニューラルネットワークを使って、計算の流れを体験してみましょう。

シナリオ設定

  • ネットワーク: 入力(1) - 隠れ層(1) - 出力(1) の単純な構造
  • 活性化関数: 隠れ層ではシグモイド関数  \sigma(z) を使用
  • 損失関数: 平均二乗誤差 (MSE) を使用
  • 入力と正解: 入力  x=2 のとき、正解  y_{true}=1 であるとします。
  • 初期パラメータ: 重みとバイアスを適当に決めます。  w_1=0.5, b_1=0.1, w_2=0.3, b_2=0.2
  • 学習率:  \eta = 0.1 (どれくらい学習を進めるかの歩幅)

ステップ1:順伝播 (Forward Propagation) - まずは予測してみる

入力  x=2 を使って、ネットワークの最終的な予測値  y_{pred} を計算します。

隠れ層の計算:

 z_1 = w_1 \cdot x + b_1 = 0.5 \times 2 + 0.1 = 1.1
 a_1 = \sigma(z_1) = \frac{1}{1 + e^{-1.1}} \approx \frac{1}{1 + 0.333} \approx 0.75

出力層の計算:

 y_{pred} = w_2 \cdot a_1 + b_2 = 0.3 \times 0.75 + 0.2 = 0.225 + 0.2 = 0.425

AIは「0.425」と予測しました。正解は「1」なので、かなりズレていますね。

ステップ2:損失の計算 - どれくらい間違えたか?

平均二乗誤差(MSE)で損失  L を計算します。

 L = (y_{pred} - y_{true})^2 = (0.425 - 1)^2 = (-0.575)^2 \approx 0.33

現在の損失は「0.33」です。この数値を0に近づけるのが目標です。

ステップ3:誤差逆伝播法 (Backpropagation) - 責任の所在を突き止める

ここからが本題です。損失  L=0.33 の原因を、出力側から入力側へ遡って探っていきます。

3-1. 出力層の重み  w_2 の勾配(責任)を計算する

まず、 w_2 が損失  L にどれだけ影響を与えたか(勾配  \frac{\partial L}{\partial w_2})を計算します。これは「連鎖律」という考え方で、影響を分解して考えます。

  • (A)  y_{pred} が1増えると、損失  L はどれだけ増えるか?
  • (B)  w_2 が1増えると、 y_{pred} はどれだけ増えるか?

勾配は (A) × (B) で求まります。

 \frac{\partial L}{\partial w_2} = \frac{\partial L}{\partial y_{pred}} \times \frac{\partial y_{pred}}{\partial w_2}

各パーツを計算すると...

 \begin{align*} \frac{\partial L}{\partial y_{pred}} &= 2(y_{pred} - y_{true}) = 2(0.425 - 1) = -1.15 \\ \frac{\partial y_{pred}}{\partial w_2} &= a_1 = 0.75 \end{align*}

よって、 w_2 の勾配は、

 \frac{\partial L}{\partial w_2} = -1.15 \times 0.75 = -0.8625

 w_2 の責任の大きさは「-0.8625」であると分かりました。

【初心者向け解説】なぜ「かけ算」で勾配が求まるのか?(クリックで展開)

なぜ「かけ算」なのか?連鎖律(Chain Rule)の考え方

AIの計算は、玉ねぎの皮のように、何層にも重なった関数の組み合わせでできています。

今回の例では、重み  w_2 が最終的な損失  L に影響を与えるまでには、以下のような2段階のプロセスがあります。

  1. [影響①] 重み  w_2 を変えると、まず予測値  y_{pred} が変わる。
  2. [影響②] そして、その変わった予測値  y_{pred} が、最終的な損失  L を変える。

私たちが知りたいのは「 w_2 をほんの少し動かしたとき、最終的に  L はどれくらい動くのか?」ということです。これを数学的に表現したものが勾配  \frac{\partial L}{\partial w_2} です。

この「間接的な影響」の大きさを知るために使うのが、高校数学で学ぶ連鎖律(Chain Rule)です。連鎖律は、それぞれの直接的な影響の大きさをかけ算することで、最終的な影響の大きさを計算できる、というルールです。

🚲 簡単な例え話:自転車のギア

  • あなたがペダルを1回転させると、前のギアが2回転するとします (影響①)
  • 前のギアが1回転すると、後ろのタイヤが3回転するとします (影響②)

では、あなたがペダルを1回転させたら、最終的にタイヤは何回転するでしょうか?

答えは `2回転 × 3回転 = 6回転` ですよね。このように、連続する影響は「かけ算」で全体の効果を求めることができます。

この考え方を、今回のAIの計算に当てはめてみましょう。


(A)と(B)の計算:それぞれの影響度を数値化する

ご質問の(A)と(B)は、まさにこの連鎖している影響を一つずつ分解して計算している部分です。数学的には**偏微分(へんびぶん)**という計算を行っています。

(A)  y_{pred} が1増えると、損失  L はどれだけ増えるか?

これは、[影響②] の大きさを計算しています。数式で書くと  \frac{\partial L}{\partial y_{pred}} となります。

  • 元の式: 損失  L (y_{pred} - y_{true})^2 で計算されます。
  • 計算: この式を  y_{pred}微分すると  2(y_{pred} - y_{true}) となります。(合成関数の微分
  • 数値を代入:  y_{pred} = 0.425 y_{true} = 1 を入れると、  2(0.425 - 1) = -1.15
  • 意味: これは「もし  y_{pred} が1だけ増えたら、損失  L は1.15だけ減る」という関係性を示しています。(マイナスなので減る方向です)

(B)  w_2 が1増えると、 y_{pred} はどれだけ増えるか?

これは、[影響①] の大きさを計算しています。数式で書くと  \frac{\partial y_{pred}}{\partial w_2} となります。

  • 元の式: 予測値  y_{pred} w_2 \cdot a_1 + b_2 で計算されます。
  • 計算: この式を  w_2微分すると、 w_2 にかかっている  a_1 だけが残ります。
  • 数値を代入: 順伝播の計算から  a_1 = 0.75 でしたので、  \frac{\partial y_{pred}}{\partial w_2} = a_1 = 0.75
  • 意味: これは「もし  w_2 が1だけ増えたら、予測値  y_{pred} は0.75だけ増える」という非常に直接的な関係を示しています。

まとめ:影響のかけ算で最終的な責任を求める

これで、2つの影響の大きさが数値でわかりました。

  • (A)  y_{pred} の変化が  L に与える影響度: -1.15
  • (B)  w_2 の変化が  y_{pred} に与える影響度: 0.75

連鎖律(自転車のギアの例え)に従って、これらをかけ算します。

 \frac{\partial L}{\partial w_2} = \frac{\partial L}{\partial y_{pred}} \times \frac{\partial y_{pred}}{\partial w_2} = -1.15 \times 0.75 = -0.8625

この -0.8625 という最終的な勾配は、「 w_2 を少し増やすと、 y_{pred} を経由して、最終的に損失  L が大きく減る」ということを意味しています。だからこそ、次のステップである「最適化」では、この勾配のマイナス方向(つまりプラス方向)に  w_2 を更新することで、AIは賢くなっていくのです。

3-2. 隠れ層の重み  w_1 の勾配(責任)を計算する

 w_1 の勾配  \frac{\partial L}{\partial w_1} は、さらに長い連鎖で計算します。

 \frac{\partial L}{\partial w_1} = \frac{\partial L}{\partial y_{pred}} \times \frac{\partial y_{pred}}{\partial a_1} \times \frac{\partial a_1}{\partial z_1} \times \frac{\partial z_1}{\partial w_1}

各パーツを計算すると...

 \begin{align*} \frac{\partial L}{\partial y_{pred}} &= -1.15 \quad (\text{計算済み}) \\ \frac{\partial y_{pred}}{\partial a_1} &= w_2 = 0.3 \\ \frac{\partial a_1}{\partial z_1} &= \sigma(z_1)(1-\sigma(z_1)) = 0.75 \times (1 - 0.75) = 0.1875 \\ \frac{\partial z_1}{\partial w_1} &= x = 2 \end{align*}

これら全てを掛け合わせると、 w_1 の勾配は、

 \frac{\partial L}{\partial w_1} = -1.15 \times 0.3 \times 0.1875 \times 2 \approx -0.129

 w_1 の責任の大きさは「-0.129」であると分かりました。

ステップ4:重みの更新 - パラメータを修正して賢くなる

全ての重みの責任(勾配)が分かったので、学習率  \eta=0.1 を使って重みを更新します。

 新しい重み = 古い重み - (\eta \times 勾配)

 w_2 の更新:

 w_2' = 0.3 - (0.1 \times -0.8625) = 0.3 + 0.08625 = 0.38625

 w_1 の更新:

 w_1' = 0.5 - (0.1 \times -0.129) = 0.5 + 0.0129 = 0.5129

この1回の学習で、重みは  w_1: 0.5 \to 0.5129 w_2: 0.3 \to 0.38625 とわずかに修正されました。この新しい重みを使ってもう一度順伝播を行えば、損失が先程の  0.33 よりも少しだけ小さくなっているはずです。

まとめ:AI学習の完全なサイクル

今回で、AIが学習するための完全なサイクルを見てきました。

  1. 順伝播: とにかく予測してみる。
  2. 損失計算: 間違いの大きさを採点する。
  3. 誤差逆伝播: 間違いの原因を特定(勾配を計算)する。
  4. 重み更新: 原因を元にパラメータを少しだけ修正する。

誤差逆伝播は、このループの心臓部であり、AIがデータから自動的に賢くなっていくための魔法の杖なのです。このサイクルを何百万回と繰り返すことで、AIは複雑なパターンを学習し、驚くべき精度を達成します。

www.namuamidabu.com