進化・学習・意識を、ひとつの勾配で読む
前回、学習を一本の式に凝縮しました ── \(\theta\leftarrow\theta-\eta\,\nabla L\)。パラメータを、勾配の逆向きに少しだけ動かす。坂を下る。ただしあの式には、こっそり置いた前提がありました。勾配 \(\nabla L\) は、もう手もとにあるものとする。では、その \(\nabla L\) は誰が計算するのか。重みが一億本あるニューラルネットで、「各重みを動かすと損失がどれだけ変わるか」を一億個、どうやって手に入れるのか。素朴にやれば絶望的に高くつくこの計算を、順伝播とほぼ同じ手間で丸ごと片づけてしまう仕掛け ── それが誤差逆伝播(バックプロパゲーション, BP)です。その正体は魔法ではなく、高校で習う合成関数の微分=連鎖律を、出力から入力へ後ろ向きに配って回る、几帳面な帳簿係にすぎません。今日はその帳簿を一枚ずつ開いて、\(\nabla 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\) だけ動かし、損失の変化を割り算する ── いわゆる有限差分。
この式は正しい。けれど \(\partial L/\partial\theta_i\) をひとつ得るのに、\(\theta_i\) だけずらした損失 \(L(\theta+\varepsilon e_i)\) を計算する ── つまりネットワーク全体を一度走らせる(順伝播を一回)必要があります。勾配は成分が \(n\) 個。だから素朴には順伝播 \(n\) 回。重みが百万本なら、一歩下るたびに百万回ネットを走らせる。これでは学習が終わりません。バックプロパゲーションは、この \(n\) 回を実質1回に畳みます。その鍵が、次の連鎖律です。
ニューラルネットは、単純な関数を何段も重ねた合成関数です。「重みを掛ける」「非線形をかける」「また重みを掛ける」…を積み上げ、最後に損失 \(L\) を出す。合成関数の微分には、たった一つの規則しかありません ── 連鎖律です。損失が \(L=g(h(\theta))\) という二段重ねなら、
「\(\theta\) が動くと \(h\) がどれだけ動くか(\(dh/d\theta\))」に、「\(h\) が動くと \(L\) がどれだけ動くか(\(dL/dh\))」を掛ける。途中の感度を掛け合わせていくのです。段が増えても同じで、\(L=f_3(f_2(f_1(\theta)))\) なら因子が一つずつ増えるだけ ──
ここに、後で効いてくる非対称があります。この積はどちらの端から掛けても答えは同じですが、掛ける順序で計算量が変わる。入力側から掛けるのが前進、出力側(\(L\) の側)から掛けていくのが逆伝播です。なぜ後ろからだと得なのかは第6セクションで精算します。まずは、この連鎖を具体的な二層ネットで走らせてみましょう。
入力ひとつ、重みふたつの、いちばん小さなネットを考えます。入力 \(x\)、重み \(w_1,w_2\)、正解 \(y\)。途中でシグモイド \(\sigma(z)=1/(1+e^{-z})\) を一枚はさみます。左から右へ、値を順に計算していく ── これが順伝播(forward pass)です。
まず線形に混ぜて \(z_1\)、非線形で曲げて \(a_1\)、もう一度重みを掛けて予測 \(\hat y\)、正解とのズレを二乗して損失 \(L\)。ここが肝心 ── 順伝播では、答え \(L\) だけでなく、途中で出た \(z_1,\,a_1,\,\hat y\) をすべて覚えておきます。この控えが、逆伝播という帳簿の元帳になるからです。シグモイドの微分だけ、先に控えておきましょう。素性のよい形をしています。
順伝播で \(L\) まで着いたら、今度は連鎖律を出力側から逆に辿ります。まず「予測 \(\hat y\) が動くと \(L\) がどれだけ動くか」から始め、その感度を一段ずつ後ろへ受け渡していく。この受け渡される量を、伝統的に \(\delta\)(デルタ)と呼びます ── 各ノードに割り当てられた「損失への責任額」です。
一行ずつが連鎖律の一段です。出力の責任 \(\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\) に流れ込みます。実際の数で、最後まで精算してみましょう。
設定: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\) の方が大きく動く ── 損失をより強く動かした重みを、より強く直すのです。
下は、上のネットを一枚の計算グラフにしたものです。上段(琥珀)は順伝播=左から右へ流れる値、下段(緑)は逆伝播=右から左へ流れる勾配 \(\delta\)。囲みのついた \(\partial L/\partial w_1,\ \partial L/\partial w_2\) が、更新にそのまま使う勾配です。\(x=1,\ y=0\) は固定、重み \(w_1,\ w_2\) のつまみを動かすと、順伝播の各値と逆伝播の各勾配が同時に組み替わります。
いくつか動かすと、帳簿の呼吸が見えてきます。\(y=0\) を狙っているので、\(\hat y\) が \(0\) に近いほど \(L\) も勾配も小さくなる ── \(w_2\) を \(0\) 付近にすると \(\hat y\to0\) で損失がほとんど消える。逆に \(w_1\) を大きくすると \(a_1\) がシグモイドの平らな肩(\(\sigma'\approx0\))へ押し上げられ、\(\partial L/\partial w_1\) がやせ細ります ── これが後の回で出会う「勾配消失」の芽です。どの重みをいじっても、下段の勾配が一度の逆流で全部いっぺんに更新されることを確かめてください。
ここで第1セクションの宿題に戻ります。有限差分は勾配1成分ごとに順伝播1回、合計 \(n\) 回。パラメータ数に正比例する \(O(n)\) の重さでした。ところが逆伝播は、順伝播を1回、逆伝播を1回流すだけで、\(n\) 個の勾配をまとめて吐き出します。パラメータが何本あろうと往復の回数は変わらない ── 順伝播1回分を基準にすれば、追加コストは本質的に \(O(1)\)。
種明かしは、連鎖律を掛ける向きです(第2セクションの非対称)。出力側の共通因子 \(\delta\) を一度だけ計算し、それを各層で使い回す。\(\partial L/\partial z_1\) はいったん求めれば \(\partial L/\partial w_1\) にそのまま流用できる ── もし入力側から前向きに掛けていたら、パラメータごとに感度の連鎖を頭から作り直す羽目になり、\(O(n)\) に逆戻りします。後ろから流すからこそ、途中の \(\delta\) が全パラメータの共有財産になる。これがリバースモード自動微分の核心で、バックプロパゲーションはその機械学習における呼び名にほかなりません。
強力な帳簿係にも、成り立つための約束事があります。正直に裁きましょう。
| 問い | バックプロパゲーションの答え | 判決 |
|---|---|---|
| 勾配 \(\nabla L\) を厳密に、しかも安価に出せるか | 出せる。有限差分の近似と違い連鎖律による厳密値を、往復1回=\(O(1)\) で全パラメータ分 | できる |
| どんな損失・どんなネットでも使えるか | \(L\) が微分可能で、順伝播の途中値を保持できることが要る(記憶と滑らかさが前提) | 前提が要る |
| 自然界の進化にも使えるか | 使えない。生物には損失を微分してくれる神がいない ── 微分の連鎖を後ろへ流す仕組みそのものが無い | 使えない |
バックプロパゲーションは、リバースモード自動微分として厳密な勾配を安価に与える確立した技術です。今日の深層学習はほぼ全てこの上に立っています。ただし線を二本、正直に引いておきます ── (1)微分可能性と計算グラフの保持が要る。\(L\) が滑らかで、順伝播の途中値を控えておける場合にしか回りません。(2)生物の進化はこれを持たない。DNA を微分する装置も、途中値を記帳する元帳も、自然界には無い。
では、微分できない世界では、どうやって坂を下るのか。答えは微分せずに下る方法 ── 進化戦略(ES)です(第4回)。そしてその前に、この損失地形と生物の適応度地形が同じ絵だったこと(第3回)を確かめます。さらに驚くべきことに、「微分するBP」と「微分しないES」は、第6回で数学的に同じ計算だと分かります。今日組み上げた帳簿は、そのとき比較の一方の主役として、もう一度この舞台に立ちます。
更新則 \(\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回で再会します。
印刷 / PDF 化:⌘+P(Windows は Ctrl+P)。画面では重み「w₁」「w₂」を動かすと、順伝播の値と逆伝播の勾配 ∇L が同時に組み替わり、読み取り欄に「1歩下ると L がどう変わるか」が出ます。「答えを見る」で解答が開きます。