わかる学習論第 2 回 / 誤差逆伝播 ── 勾配を自動で作る帳簿

進化・学習・意識を、ひとつの勾配で読む

バックプロパゲーションとは、
連鎖律の帳簿である 第1回で「手に入る前提」にした勾配 \(\nabla L\) を、ニューラルネットはどう自動計算するのか。
答えは合成関数の微分=連鎖律を、出力から入力へ後ろ向きに配って回る帳簿係だった。

必要な道具:第1回の勾配降下、合成関数の微分(連鎖律) この回のキー:\(\dfrac{dL}{d\theta}=\dfrac{dL}{dh}\dfrac{dh}{d\theta}\)

前回、学習を一本の式に凝縮しました ── \(\theta\leftarrow\theta-\eta\,\nabla L\)。パラメータを、勾配の逆向きに少しだけ動かす。坂を下る。ただしあの式には、こっそり置いた前提がありました。勾配 \(\nabla L\) は、もう手もとにあるものとする。では、その \(\nabla L\) は誰が計算するのか。重みが一億本あるニューラルネットで、「各重みを動かすと損失がどれだけ変わるか」を一億個、どうやって手に入れるのか。素朴にやれば絶望的に高くつくこの計算を、順伝播とほぼ同じ手間で丸ごと片づけてしまう仕掛け ── それが誤差逆伝播(バックプロパゲーション, BP)です。その正体は魔法ではなく、高校で習う合成関数の微分=連鎖律を、出力から入力へ後ろ向きに配って回る、几帳面な帳簿係にすぎません。今日はその帳簿を一枚ずつ開いて、\(\nabla L\) が生まれる瞬間を自分の手で見ます。

01前回の宿題 ── ∇L はどこから来るのか

更新則 \(\theta\leftarrow\theta-\eta\,\nabla L\) を動かすには、勾配 \(\nabla L=\big(\partial L/\partial\theta_1,\dots,\partial L/\partial\theta_n\big)\) の全成分が要ります。いちばん素朴な手は、定義どおり各つまみを少しだけ突いてみることです。パラメータ \(\theta_i\) を \(\varepsilon\) だけ動かし、損失の変化を割り算する ── いわゆる有限差分

素朴な方法(有限差分)── 正しいが、高い
$$\frac{\partial L}{\partial \theta_i}\;\approx\;\frac{L(\theta+\varepsilon e_i)-L(\theta)}{\varepsilon}$$

この式は正しい。けれど \(\partial L/\partial\theta_i\) をひとつ得るのに、\(\theta_i\) だけずらした損失 \(L(\theta+\varepsilon e_i)\) を計算する ── つまりネットワーク全体を一度走らせる(順伝播を一回)必要があります。勾配は成分が \(n\) 個。だから素朴には順伝播 \(n\) 回。重みが百万本なら、一歩下るたびに百万回ネットを走らせる。これでは学習が終わりません。バックプロパゲーションは、この \(n\) 回を実質1回に畳みます。その鍵が、次の連鎖律です。

02連鎖律 ── 合成関数の微分は、掛け算で連なる

ニューラルネットは、単純な関数を何段も重ねた合成関数です。「重みを掛ける」「非線形をかける」「また重みを掛ける」…を積み上げ、最後に損失 \(L\) を出す。合成関数の微分には、たった一つの規則しかありません ── 連鎖律です。損失が \(L=g(h(\theta))\) という二段重ねなら、

連鎖律(合成関数の微分)
$$\frac{dL}{d\theta}\;=\;\frac{dL}{dh}\cdot\frac{dh}{d\theta}$$

「\(\theta\) が動くと \(h\) がどれだけ動くか(\(dh/d\theta\))」に、「\(h\) が動くと \(L\) がどれだけ動くか(\(dL/dh\))」を掛ける。途中の感度を掛け合わせていくのです。段が増えても同じで、\(L=f_3(f_2(f_1(\theta)))\) なら因子が一つずつ増えるだけ ──

多段でも、ただ積で連なる
$$\frac{dL}{d\theta}\;=\;\frac{dL}{df_2}\cdot\frac{df_2}{df_1}\cdot\frac{df_1}{d\theta}$$

ここに、後で効いてくる非対称があります。この積はどちらの端から掛けても答えは同じですが、掛ける順序で計算量が変わる。入力側から掛けるのが前進、出力側(\(L\) の側)から掛けていくのが逆伝播です。なぜ後ろからだと得なのかは第6セクションで精算します。まずは、この連鎖を具体的な二層ネットで走らせてみましょう。

03順伝播 ── まず、値を前へ流す

入力ひとつ、重みふたつの、いちばん小さなネットを考えます。入力 \(x\)、重み \(w_1,w_2\)、正解 \(y\)。途中でシグモイド \(\sigma(z)=1/(1+e^{-z})\) を一枚はさみます。左から右へ、値を順に計算していく ── これが順伝播(forward pass)です。

順伝播 ── 入力から損失まで、値を前へ
$$z_1=w_1 x,\quad a_1=\sigma(z_1),\quad \hat y=w_2 a_1,\quad L=\tfrac12(\hat y-y)^2$$

まず線形に混ぜて \(z_1\)、非線形で曲げて \(a_1\)、もう一度重みを掛けて予測 \(\hat y\)、正解とのズレを二乗して損失 \(L\)。ここが肝心 ── 順伝播では、答え \(L\) だけでなく、途中で出た \(z_1,\,a_1,\,\hat y\) をすべて覚えておきます。この控えが、逆伝播という帳簿の元帳になるからです。シグモイドの微分だけ、先に控えておきましょう。素性のよい形をしています。

シグモイドの微分は、自分自身で書ける \(\sigma(z)=\dfrac{1}{1+e^{-z}}\) を微分すると \(\sigma'(z)=\sigma(z)\big(1-\sigma(z)\big)\)。つまり順伝播で計算済みの \(a_1=\sigma(z_1)\) さえあれば、微分 \(\sigma'(z_1)=a_1(1-a_1)\) は掛け算ひとつで出る。改めて \(z_1\) に \(e^{-z}\) を計算し直す必要すらない ── これも「途中値を控えておく」ことの配当です。

04逆伝播 ── 誤差 δ を後ろへ配る帳簿

順伝播で \(L\) まで着いたら、今度は連鎖律を出力側から逆に辿ります。まず「予測 \(\hat y\) が動くと \(L\) がどれだけ動くか」から始め、その感度を一段ずつ後ろへ受け渡していく。この受け渡される量を、伝統的に \(\delta\)(デルタ)と呼びます ── 各ノードに割り当てられた「損失への責任額」です。

逆伝播 ── 連鎖律を後ろから。δ を配って各勾配を精算する
$$\delta_{\text{out}}=\frac{\partial L}{\partial \hat y}=\hat y-y$$ $$\frac{\partial L}{\partial w_2}=\delta_{\text{out}}\cdot a_1,\qquad \frac{\partial L}{\partial a_1}=\delta_{\text{out}}\cdot w_2$$ $$\frac{\partial L}{\partial z_1}=\frac{\partial L}{\partial a_1}\cdot \sigma'(z_1),\qquad \frac{\partial L}{\partial w_1}=\frac{\partial L}{\partial z_1}\cdot x$$

一行ずつが連鎖律の一段です。出力の責任 \(\delta_{\text{out}}=\hat y-y\)(外れた分そのもの)を起点に、右の項が左へ流れ込む。\(\hat y=w_2 a_1\) だから \(w_2\) への感度は \(a_1\) 倍、\(a_1\) への感度は \(w_2\) 倍。次に \(a_1=\sigma(z_1)\) を通すので \(\sigma'(z_1)\) を掛けて \(z_1\) の責任に、最後に \(z_1=w_1 x\) だから \(x\) を掛けて \(w_1\) の勾配になる。一度後ろへ流した \(\delta\) を、各層でそのつど使い回しているのが見えるでしょうか。これが「帳簿」の妙で、\(\partial L/\partial a_1\) は \(\partial L/\partial z_1\) の計算にそのまま再利用され、\(\partial L/\partial z_1\) はさらに \(\partial L/\partial w_1\) に流れ込みます。実際の数で、最後まで精算してみましょう。

やってみよう ── 2層ネットで ∇L を最後まで出す

設定:x=1, y=0, w₁=0.5, w₂=0.8(σ(0.5)=0.6225 を使う)

① 順伝播(値を前へ)

$$z_1=w_1 x=0.5,\quad a_1=\sigma(0.5)=0.6225,\quad \hat y=w_2 a_1=0.8\times0.6225=0.4980$$ $$L=\tfrac12(\hat y-y)^2=\tfrac12(0.4980)^2=0.1240$$

② 逆伝播(誤差 δ を後ろへ)

$$\delta_{\text{out}}=\hat y-y=0.4980$$ $$\frac{\partial L}{\partial w_2}=\delta_{\text{out}}\cdot a_1=0.4980\times0.6225=0.3100$$ $$\frac{\partial L}{\partial a_1}=\delta_{\text{out}}\cdot w_2=0.4980\times0.8=0.3984$$ $$\sigma'(z_1)=\sigma(0.5)\big(1-\sigma(0.5)\big)=0.6225\times0.3775=0.2350$$ $$\frac{\partial L}{\partial z_1}=\frac{\partial L}{\partial a_1}\cdot\sigma'(z_1)=0.3984\times0.2350=0.0936$$ $$\frac{\partial L}{\partial w_1}=\frac{\partial L}{\partial z_1}\cdot x=0.0936\times1=0.0936$$

逆伝播をたった一往復させただけで、全パラメータの勾配 \(\nabla L=\big(\partial L/\partial w_1,\ \partial L/\partial w_2\big)=(0.0936,\ 0.3100)\) がそろいました。あとは第1回の更新則 \(w\leftarrow w-\eta\,\nabla L\) に入れるだけ。責任額の大きい \(w_2\) の方が大きく動く ── 損失をより強く動かした重みを、より強く直すのです。

05動かしてみる ── 計算グラフに δ を流す

下は、上のネットを一枚の計算グラフにしたものです。上段(琥珀)は順伝播=左から右へ流れる値、下段(緑)は逆伝播=右から左へ流れる勾配 \(\delta\)。囲みのついた \(\partial L/\partial w_1,\ \partial L/\partial w_2\) が、更新にそのまま使う勾配です。\(x=1,\ y=0\) は固定、重み \(w_1,\ w_2\) のつまみを動かすと、順伝播の各値と逆伝播の各勾配が同時に組み替わります。

図:2層ネットの計算グラフ。上=順伝播(値を前へ)/下=逆伝播(勾配 δ を後ろへ)。w₁,w₂ を動かすと ∇L が即座に再計算される。読み取り欄に「この勾配で1歩下ると L がどう変わるか」を表示
順伝播(値を前へ) 逆伝播(勾配 δ を後ろへ) 更新に使う勾配 ∂L/∂w

いくつか動かすと、帳簿の呼吸が見えてきます。\(y=0\) を狙っているので、\(\hat y\) が \(0\) に近いほど \(L\) も勾配も小さくなる ── \(w_2\) を \(0\) 付近にすると \(\hat y\to0\) で損失がほとんど消える。逆に \(w_1\) を大きくすると \(a_1\) がシグモイドの平らな肩(\(\sigma'\approx0\))へ押し上げられ、\(\partial L/\partial w_1\) がやせ細ります ── これが後の回で出会う「勾配消失」の芽です。どの重みをいじっても、下段の勾配が一度の逆流で全部いっぺんに更新されることを確かめてください。

06なぜ速いか ── O(n) 対 O(1) の帳簿術

ここで第1セクションの宿題に戻ります。有限差分は勾配1成分ごとに順伝播1回、合計 \(n\) 回。パラメータ数に正比例する \(O(n)\) の重さでした。ところが逆伝播は、順伝播を1回、逆伝播を1回流すだけで、\(n\) 個の勾配をまとめて吐き出します。パラメータが何本あろうと往復の回数は変わらない ── 順伝播1回分を基準にすれば、追加コストは本質的に \(O(1)\)。

同じ ∇L を得るコスト(順伝播1回を単位として)
$$\text{有限差分:}\ \underbrace{O(n)\ \text{回}}_{\text{パラメータ数に比例}}\qquad\text{vs}\qquad \text{逆伝播:}\ \underbrace{O(1)}_{\text{往復1回で全勾配}}$$

種明かしは、連鎖律を掛ける向きです(第2セクションの非対称)。出力側の共通因子 \(\delta\) を一度だけ計算し、それを各層で使い回す。\(\partial L/\partial z_1\) はいったん求めれば \(\partial L/\partial w_1\) にそのまま流用できる ── もし入力側から前向きに掛けていたら、パラメータごとに感度の連鎖を頭から作り直す羽目になり、\(O(n)\) に逆戻りします。後ろから流すからこそ、途中の \(\delta\) が全パラメータの共有財産になる。これがリバースモード自動微分の核心で、バックプロパゲーションはその機械学習における呼び名にほかなりません。

「帳簿」という比喩の正体 順伝播で途中値(\(z_1,a_1,\hat y\))を元帳に記帳し、逆伝播でそれを参照しながら各ノードの責任額 \(\delta\) を出力から順に転記・精算していく ── 会計そのものです。だから「一度計算した数字を二度と作り直さない」。損失に効いた分をきっちり一円単位で各重みへ配賦する几帳面さが、\(O(1)\) の速さを生みます。
◇ ◇ ◇

07判決 ── バックプロパゲーションは何ができて、何ができないか

強力な帳簿係にも、成り立つための約束事があります。正直に裁きましょう。

問いバックプロパゲーションの答え判決
勾配 \(\nabla L\) を厳密に、しかも安価に出せるか 出せる。有限差分の近似と違い連鎖律による厳密値を、往復1回=\(O(1)\) で全パラメータ分 できる
どんな損失・どんなネットでも使えるか \(L\) が微分可能で、順伝播の途中値を保持できることが要る(記憶と滑らかさが前提) 前提が要る
自然界の進化にも使えるか 使えない。生物には損失を微分してくれる神がいない ── 微分の連鎖を後ろへ流す仕組みそのものが無い 使えない
正直な線 ── 微分できる世界の外へ

バックプロパゲーションは、リバースモード自動微分として厳密な勾配を安価に与える確立した技術です。今日の深層学習はほぼ全てこの上に立っています。ただし線を二本、正直に引いておきます ── (1)微分可能性と計算グラフの保持が要る。\(L\) が滑らかで、順伝播の途中値を控えておける場合にしか回りません。(2)生物の進化はこれを持たない。DNA を微分する装置も、途中値を記帳する元帳も、自然界には無い。

では、微分できない世界では、どうやって坂を下るのか。答えは微分せずに下る方法 ── 進化戦略(ES)です(第4回)。そしてその前に、この損失地形と生物の適応度地形が同じ絵だったこと(第3回)を確かめます。さらに驚くべきことに、「微分するBP」と「微分しないES」は、第6回で数学的に同じ計算だと分かります。今日組み上げた帳簿は、そのとき比較の一方の主役として、もう一度この舞台に立ちます。

練習問題(今回の式だけで解けます)
  1. 同じ2層ネットで \(x=1,\ y=0,\ w_1=1,\ w_2=1\) とする。\(\sigma(1)=0.7311\) を使い、\(L,\ \delta_{\text{out}},\ \partial L/\partial w_2\) を求めよ。
    答えを見る
    \(z_1=1,\ a_1=\sigma(1)=0.7311,\ \hat y=1\times0.7311=0.7311\)。\(L=\tfrac12(0.7311)^2=0.2673\)。\(\delta_{\text{out}}=\hat y-y=0.7311\)。\(\partial L/\partial w_2=\delta_{\text{out}}\cdot a_1=0.7311\times0.7311=0.5345\)。
  2. 逆伝播で \(\partial L/\partial z_1=\partial L/\partial a_1\cdot\sigma'(z_1)\) と、途中に \(\sigma'(z_1)\) が掛かるのはなぜか。連鎖律の言葉で説明せよ。
    答えを見る
    \(z_1\) は \(a_1=\sigma(z_1)\) を通してのみ \(L\) に影響する合成関数だから。連鎖律 \(\dfrac{\partial L}{\partial z_1}=\dfrac{\partial L}{\partial a_1}\dfrac{\partial a_1}{\partial z_1}\) で、局所の感度 \(\partial a_1/\partial z_1=\sigma'(z_1)\) が一段分の因子として掛かる。\(\sigma\) の肩(\(\sigma'\approx0\))では勾配がほぼ消えるのはこのため。
  3. パラメータ数 \(n=1{,}000{,}000\) のネットで、勾配 \(\nabla L\) を1回得るのに、有限差分と逆伝播はそれぞれ順伝播およそ何回分の手間か。
    答えを見る
    有限差分は成分ごとに順伝播1回で、基準点を含め約 \(1{,}000{,}001\) 回=\(O(n)\)。逆伝播は順伝播1回+逆伝播1回で、順伝播およそ2回分=パラメータ数によらない \(O(1)\)。百万倍の差。学習が現実的になる理由がここにある。

第2回まとめ∇L は、後ろ向きの帳簿から生まれる

更新則 \(\theta\leftarrow\theta-\eta\nabla L\) が要求する \(\nabla L\) を、素朴な有限差分は \(O(n)\) 回の順伝播で近似する(STEP 01)。ニューラルネットは合成関数だから、微分は連鎖律で掛け算に連なる(STEP 02)。順伝播で値と途中値を前へ流して控え(STEP 03)、逆伝播で誤差 \(\delta\) を出力から後ろへ配り、\(\delta_{\text{out}}=\hat y-y\) を起点に各層の勾配を精算する(STEP 04・具体例では \(\nabla L=(0.0936,\,0.3100)\))。連鎖を後ろから掛け、途中の \(\delta\) を使い回すことで、全勾配が厳密に、往復1回=\(O(1)\) で得られる ── これがリバースモード自動微分の核心(STEP 06)。ただし微分可能性と途中値の保持が前提で、進化には使えない(STEP 07)。

第1回の「前提」だった \(\nabla L\) に、今回はきちんと供給元をつなぎました。次回はいったん機械を離れ、この損失地形が生物学の適応度地形と同じ絵であることを確かめます。そしてその地形を、微分せずに下る方法へ ── やがて今日の帳簿と、第6回で再会します。

この文書は「わかる学習論」シリーズ第2回、物理・数学・AIに興味のある高校生・大学生向けの読み物です。誤差逆伝播(バックプロパゲーション)は合成関数の連鎖律 \(\frac{dL}{d\theta}=\frac{dL}{dh}\frac{dh}{d\theta}\) をリバースモードで適用するもので、勾配 \(\nabla L\) の厳密値を、順伝播1回+逆伝播1回(順伝播1回分を単位として \(O(1)\))で全パラメータ分まとめて与えます ── これは確立した数学・計算技術です。有限差分による勾配近似がパラメータ数 \(n\) に対して \(O(n)\) 回の順伝播を要すること、シグモイド \(\sigma(z)=1/(1+e^{-z})\) が \(\sigma'(z)=\sigma(z)(1-\sigma(z))\) を満たすことも既知の事実です。本稿の2層ネットは説明用の最小模型で、\(\sigma(0.5)=0.6225\) 等の数値は小数第4位程度で丸めた目安です(\(\nabla L\approx(0.0936,\,0.3100)\))。バックプロパゲーションが微分可能性と計算グラフの保持を前提とすること、生物進化がこれを持たないこと、そして進化戦略(ES)との数学的一致(第6回)は後続回で扱います。 ── 印刷する場合はブラウザの「印刷」から「PDF に保存」を(印刷版ではスライダーと解答は静止・非表示になります)。

印刷 / PDF 化:⌘+P(Windows は Ctrl+P)。画面では重み「w₁」「w₂」を動かすと、順伝播の値と逆伝播の勾配 ∇L が同時に組み替わり、読み取り欄に「1歩下ると L がどう変わるか」が出ます。「答えを見る」で解答が開きます。