8  勾配で学ぶ ── 誤差をさかのぼる学習と最適化

前章でわれわれは壁にぶつかった。ボルツマンマシンの学習則は美しかったが、負相の計算に 2^N 通りの和が要る。MCMC で近似しても収束が遅すぎた。

本章では、この壁を迂回する。

やり方は乱暴である。エネルギー関数も分配関数も捨てる。本章ではまず、入力から出力への決定的な写像を学ぶ問題—教師あり学習—に的を絞る。そして「答えとのずれ」を損失関数として、連鎖律で勾配を計算する。これがバックプロパゲーションであり、現代の深層学習を動かしているものである。うまくいく。恐ろしくうまくいく。

だが忘れないでおきたい。捨てたものがある。ボルツマンマシンが持っていた「世界の確率的なモデルを内に持つ」という性格は、この枠組みには入っていない。入力データそのものの分布を表さないので、新しい標本を生み出すこともないし、自分の予測がどれだけ怪しいかも自動では出てこない。

一つ注意しておく。これはバックプロパゲーションの限界ではない。バックプロパゲーションは勾配の計算法であって、モデルが決定的か確率的か、識別的か生成的かを決めるものではない。実際、本章の softmax 出力はすでに条件付き分布 p(y\mid x) を表しているし、第14章以降の生成モデルも同じ勾配法で学習する。ここで狭いのは、いま選んだ問題の立て方のほうである。

第14章で、われわれはこの二つを和解させることになる。変分法という第三の道で、確率モデルを保ったまま勾配で学習する—それが VAE である。本章はその中間地点だと思って読んでほしい。

ヒント本章のガイド

第1〜3節がバックプロパゲーション、第4〜6節が実際に動かすための工夫、第7〜8節がアーキテクチャ、第9節が生物学との対決である。

第3節の導出が本章の核である。バックプロパゲーションは「連鎖律を効率よく適用しているだけ」であって、それ以上の魔法はない。そのことが腑に落ちるように書いた。

第7節で、第4章の畳み込みが再登場する。そこでは「効率のため」と説明するが、それは本当の理由ではない。本当の理由は第13章第7節まで待つことになる。

第9節は短いが、本書の主題(脳とAIを同じ数学で見る)にとって重要な節である。同じ数学で書けることと、同じ機構であることは違う。


1. 必要な数学:多変数関数の微分と連鎖律

勾配

f: \mathbb{R}^n \to \mathbb{R}勾配は、偏微分を並べたベクトルである。

\nabla f = \left( \frac{\partial f}{\partial x_1}, \dots, \frac{\partial f}{\partial x_n}\right)^\top

幾何的な意味

勾配は「もっとも急に増える方向」を指す。実際、単位ベクトル \mathbf{u} 方向の変化率は \nabla f\cdot\mathbf{u} であり、これが最大になるのは \mathbf{u}\nabla f と同じ向きのときだ(コーシー・シュワルツの不等式)。だから逆向きに動けば、もっとも急に減る。これが勾配降下法の原理である。

ヤコビ行列

写像 \mathbf{f}: \mathbb{R}^n\to\mathbb{R}^m に対しては、行列になる。

J = \frac{\partial \mathbf{f}}{\partial \mathbf{x}} \in \mathbb{R}^{m\times n}, \qquad J_{ij} = \frac{\partial f_i}{\partial x_j}

ここでの J は、五つの役目のどれでもない。本章では J が計算の対象そのものになる—バックプロパゲーションとは、ヤコビ行列の積を効率よく計算する手続きに他ならない。

連鎖律

合成関数 \mathbf{z} = \mathbf{g}(\mathbf{y})\mathbf{y} = \mathbf{f}(\mathbf{x}) の微分は、ヤコビ行列の積になる。寸法を決めておこう。\mathbf{x} \in \mathbb{R}^{n}\mathbf{y} \in \mathbb{R}^{m}\mathbf{z} \in \mathbb{R}^{r} をいずれも列ベクトルとし、n, m, r がそれぞれの成分数である。J_f = \partial\mathbf{y}/\partial\mathbf{x} \in \mathbb{R}^{m \times n} は行が \mathbf{y}、列が \mathbf{x} の成分に対応し、J_g = \partial\mathbf{z}/\partial\mathbf{y} \in \mathbb{R}^{r \times m} は行が \mathbf{z}、列が \mathbf{y} の成分に対応する。積 J_g J_f \in \mathbb{R}^{r \times n} は、途中の \mathbf{y} の各成分を経由する変化率を足し合わせたものである。

\frac{\partial \mathbf{z}}{\partial \mathbf{x}} = \frac{\partial\mathbf{z}}{\partial\mathbf{y}}\cdot\frac{\partial\mathbf{y}}{\partial\mathbf{x}} = J_g\, J_f

成分で書けば

\frac{\partial z_i}{\partial x_k} = \sum_j \frac{\partial z_i}{\partial y_j}\frac{\partial y_j}{\partial x_k}

「途中の変数について足し上げる」—これが連鎖律の中身である。バックプロパゲーションはこの式を、深いネットワークに対して効率よく適用するだけの手続きである。

掛ける順序が問題になる

ここで、後で効いてくる論点を一つ。L 層のネットワークなら、勾配はヤコビ行列の積 J_L J_{L-1}\cdots J_1 になる。行列の積は結合的だから、どの順で掛けてもよい。だが計算量は違う。

損失はスカラーだから、いちばん左のヤコビアンは 1\times n の行ベクトルである。左から順に掛けていけば、常にベクトル × 行列の計算で済む。右から掛けると行列 × 行列になり、はるかに重い。

「左から掛ける」がバックプロパゲーション(逆モード自動微分)、「右から掛ける」が前進モードである。出力がスカラー(損失)なら、逆モードが圧倒的に効率的だ。これがバックプロパゲーションが逆向きに進む理由である。


2. 勾配降下法

基本形

損失関数 \mathcal{L}(\theta) を最小化したい。\theta \in \mathbb{R}^P は、学習で調整する P 個のパラメータを並べた列ベクトルである(ネットワークなら重みとバイアスがその成分になる)。\nabla_\theta \mathcal{L} \in \mathbb{R}^P は、各パラメータを変えたときの損失の変化率を同じ順に並べたものだ。その勾配の逆向きに少しずつ動く。

\theta \leftarrow \theta - \eta\, \nabla_\theta \mathcal{L}(\theta)

\eta学習率である。

学習率の効果

\eta の選び方は、実務的にもっとも重要な判断の一つである。まず数で見よう。パラメータが一つで損失が \mathcal{L}(\theta) = \theta^2、初期値を \theta = 2 とする。勾配は 2\theta = 4 である。\eta = 0.25 なら次の値は 2 - 0.25 \times 4 = 1 で、損失は 4 から 1 へ減る。\eta = 0.75 なら次の値は -1、最小点の 0 を飛び越えるが損失はやはり 1 に減る。\eta = 1.25 なら次の値は -3 で、損失は 9 に増えてしまう。歩幅が大きすぎると坂を下るどころか登ってしまうわけである。

このふるまいを一般に書こう。二次関数 \mathcal{L}(\theta) = \frac{1}{2}\lambda\theta^2 で考えてみよう。更新は \theta \leftarrow \theta(1 - \eta\lambda) となる。

  • 0 < \eta\lambda < 1 — 単調に収束する
  • 1 < \eta\lambda < 2 — 符号を変えながら振動して収束する
  • \eta\lambda > 2 — 発散する

収束条件は 0 < \eta < 2/\lambda である。ここで \lambda > 0 は二次関数の曲がり具合を表す。多変数では、二階偏微分を並べたヘッセ行列 H \in \mathbb{R}^{P \times P}(成分は H_{ij} = \partial^2 \mathcal{L}/\partial\theta_i \partial\theta_j。行も列もパラメータの番号に対応する)がこの役目を担い、その固有値が固有ベクトルの方向に沿った曲がり具合になる。だから多変数なら、\lambda をヘッセ行列の最大固有値と読み替えればよい。

条件数の問題

ここから困った帰結が出る。ヘッセ行列の固有値が \lambda_{\max}\lambda_{\min} の間に散らばっているとしよう。

  • 発散しないためには \eta < 2/\lambda_{\max}
  • だが \lambda_{\min} 方向の収束速度は \eta\lambda_{\min} で決まる

\lambda_{\max}/\lambda_{\min}(条件数)が大きいと、いちばん緩い方向の収束が絶望的に遅くなる。幾何的には、等高線が細長い谷になっている状況である。勾配は谷の壁に垂直な方向を向くので、谷底に沿って進まず、壁の間を往復してしまう。第5節の工夫は、主にこの問題への対処である。

非凸性

関数がであるとは、グラフ上の任意の二点を結ぶ線分よりもグラフが上に出ないことである。この形なら局所最小値は大域最小値でもある。深層ネットワークの損失関数は一般に凸ではなく、近くの点より低いだけの局所最小値が、全体でいちばん低い大域最小値とは限らない。だから勾配降下法が大域最小値に到達する保証はない。理論的にはひどい状況である。

にもかかわらず、実際にはうまくいく。なぜか—これは深層学習の大きな謎の一つであり、第9章の主題である。高次元では局所最小値より、勾配はゼロだが方向によって上り坂にも下り坂にもなるサドル点のほうが圧倒的に多く、そしてサドル点は脱出できる、という説明が有力だが、決着していない。


3. バックプロパゲーション

順伝播

勾配の計算に戻ろう。L 層のネットワークを定義する。\ell = 1, \dots, L が層番号で、括弧付きの上付き添字は累乗ではない。層 \ell のユニット数を n_\ell とし、層 \ell の入力を \mathbf{a}^{(\ell-1)} \in \mathbb{R}^{n_{\ell-1}}、出力を \mathbf{a}^{(\ell)} \in \mathbb{R}^{n_\ell} とする(どちらも各ユニットの活動を並べた列ベクトルである)。活性化関数を通す前の値を \mathbf{z}^{(\ell)} \in \mathbb{R}^{n_\ell}、重み行列を W^{(\ell)} \in \mathbb{R}^{n_\ell \times n_{\ell-1}}(行がこの層のユニット、列が前の層のユニット)、バイアスを \mathbf{b}^{(\ell)} \in \mathbb{R}^{n_\ell} と書く。以下の導出では、活性化関数 \varphi は各成分に別々に働くものとする。

\mathbf{z}^{(\ell)} = W^{(\ell)}\mathbf{a}^{(\ell-1)} + \mathbf{b}^{(\ell)}, \qquad \mathbf{a}^{(\ell)} = \varphi\big(\mathbf{z}^{(\ell)}\big)

\mathbf{a}^{(0)} = \mathbf{x} が入力、\mathbf{a}^{(L)} が出力である。損失を \mathcal{L} = \mathcal{L}(\mathbf{a}^{(L)}, \mathbf{y}) と書く。以下、L は層数、\mathcal{L} は損失である—紛らわしいので区別しておく。

誤差信号を定義する

出力の誤りを手がかりに、途中の層のどの値をどちらへ動かせば改善するかを知りたい。

先に、いちばん小さな例で計算しておこう。各層1ユニットの2層ネットワークで、活性化関数は \varphi(z) = z、バイアスはどちらも 0 とする。入力が 2、第1層の重みが 1、第2層の重みが 3 なら、途中の値は 2、出力は 6 である。正解を 5、損失を二乗誤差の半分とすると、損失は (6-5)^2/2 = 0.5 になる。出力に対する損失の変化率は 6 - 5 = 1。途中の値に対する変化率は、そこから第2層の重みを掛けて 3 \times 1 = 3 である。あとは重みごとに、その重みに入ってきた値を掛ければよい—第1層の重みの勾配は 3 \times 2 = 6、第2層の重みの勾配は 1 \times 2 = 2 となる。出力から入力へ向かって変化率を運び、通りすがりに掛け算をしていく。これが以下でやることの全体像である。

そのために、各層の値に対する損失の変化率を用意する。鍵となるのは、次の量である。

\boldsymbol{\delta}^{(\ell)} \equiv \frac{\partial \mathcal{L}}{\partial \mathbf{z}^{(\ell)}}

「層 \ell の活性化関数に入る値 \mathbf{z}^{(\ell)} を少し変えたら、損失がどれだけ変わるか」である。これを誤差信号と呼ぶ。成分 \delta_j^{(\ell)} は、他の成分を止めて z_j^{(\ell)} だけを動かしたときの損失の変化率であり、これを並べた \boldsymbol{\delta}^{(\ell)}\mathbb{R}^{n_\ell} の列ベクトルである。

逆向きの漸化式

\boldsymbol{\delta}^{(\ell)} を、\boldsymbol{\delta}^{(\ell+1)} から計算できる。これが導ければ、あとは出力層から順に降りていくだけである。

連鎖律を書き下す。\mathbf{z}^{(\ell)} が損失に影響するのは、\mathbf{a}^{(\ell)} を経由して \mathbf{z}^{(\ell+1)} に至る道だけである。

\begin{aligned} \delta^{(\ell)}_j &= \frac{\partial \mathcal{L}}{\partial z^{(\ell)}_j} = \sum_k \frac{\partial \mathcal{L}}{\partial z^{(\ell+1)}_k}\cdot\frac{\partial z^{(\ell+1)}_k}{\partial z^{(\ell)}_j} &&\textsf{(連鎖律。} \mathbf{z}^{(\ell+1)} \textsf{ を経由)}\\ &= \sum_k \delta^{(\ell+1)}_k \cdot \frac{\partial}{\partial z_j^{(\ell)}}\Big(\sum_m W^{(\ell+1)}_{km}\varphi(z^{(\ell)}_m) + b_k\Big) &&\textsf{(定義を代入)}\\ &= \sum_k \delta^{(\ell+1)}_k \, W^{(\ell+1)}_{kj}\,\varphi'\big(z^{(\ell)}_j\big) &&\textsf{(} m=j \textsf{ の項だけ残る)} \end{aligned}

ベクトルでまとめると、

\boxed{\;\boldsymbol{\delta}^{(\ell)} = \Big( \big(W^{(\ell+1)}\big)^\top \boldsymbol{\delta}^{(\ell+1)} \Big) \odot \varphi'\big(\mathbf{z}^{(\ell)}\big)\;}

\odot は成分ごとの積である。出発点も決めておかなければならない。この漸化式は上の層から下の層へ運ぶ規則なので、いちばん上(第 L 層)の誤差信号を別に与える必要がある。損失を出力で微分して、活性化関数の微分を掛けたものである。

\boldsymbol{\delta}^{(L)} = J_\varphi\big(\mathbf{z}^{(L)}\big)^\top \frac{\partial \mathcal{L}}{\partial \mathbf{a}^{(L)}}

J_\varphi は活性化関数のヤコビ行列である。\varphi が成分ごとに働く関数(シグモイドや ReLU)なら、この行列は対角なので、上の式は成分ごとの積 \partial\mathcal{L}/\partial\mathbf{a}^{(L)} \odot \varphi'(\mathbf{z}^{(L)}) に簡単になる。softmax のように成分が互いに絡む関数では対角にならないので、行列のまま扱う必要がある。ここで softmax とは、各出力値の指数を取って総和で割り、和が 1 の確率に変える関数である。分母を全クラスで共有するので、一つの出力値を動かすと他のクラスの確率も動く。だから成分が絡む。式と微分は第4節で扱う。

よく使う二つの場合を覚えておくとよい。\mathbf{y} \in \mathbb{R}^{n_L} は、出力と同じ大きさに並べた正解である。線形出力+二乗誤差なら \boldsymbol{\delta}^{(L)} = \mathbf{a}^{(L)} - \mathbf{y}(このとき \mathbf{y} の各成分は予測したい数値で、損失は \mathcal{L} = \tfrac{1}{2}\|\mathbf{a}^{(L)} - \mathbf{y}\|^2 である)。分類では出力ユニットをクラスに対応させ、正解クラスの成分だけを 1、ほかを 0 とした \mathbf{y} を使う。softmax 出力+交差エントロピーなら、損失と softmax をまとめて微分すると絡み合いがきれいに解けて \boldsymbol{\delta}^{(L)} = \mathbf{p} - \mathbf{y} になる(\mathbf{p} が予測した確率)。どちらも「予測 - 正解」という同じ形に収まる。配布コードの d2 = z2 - y がこれである。ここで、隠れ層の誤差信号を上の層から求める漸化式に戻ろう。誤差信号は、

  1. 重み行列の転置を掛けて、上の層から下の層へ運ばれる
  2. 活性化関数の微分を掛けて、その層のゲインで変調される

順伝播では W を掛け、逆伝播では W^\top を掛ける。この対称性が、第9節の生物学的妥当性の議論で焦点になる。

重みの勾配

誤差信号が手に入れば、重みの勾配はすぐ出る。

\frac{\partial \mathcal{L}}{\partial W^{(\ell)}_{ji}} = \frac{\partial \mathcal{L}}{\partial z^{(\ell)}_j}\cdot\frac{\partial z^{(\ell)}_j}{\partial W^{(\ell)}_{ji}} = \delta^{(\ell)}_j\, a^{(\ell-1)}_i

行列で書けば \partial \mathcal{L}/\partial W^{(\ell)} = \boldsymbol{\delta}^{(\ell)}\big(\mathbf{a}^{(\ell-1)}\big)^\top。この形に注目してほしい。重みの更新量は、

\Delta W_{ji} = -\eta\, \underbrace{\delta_j}_{\textsf{後シナプス側の誤差}} \times \underbrace{a_i}_{\textsf{前シナプス側の活動}}

前と後の積である(負号は、勾配を下る向きに動かすことから来る。\eta は学習率)。これは第7章第1節のヘッブ則 w_{ij}\propto \xi_i\xi_j と、形が同じだ。違うのは、後シナプス側が「活動」ではなく「誤差」であること、そして誤差を減らす向きに動くことである。

ここがポイント

バックプロパゲーションは連鎖律の効率的な適用にすぎない。誤差信号 \boldsymbol{\delta} を出力層から逆向きに運び、各層で W^\top を掛けて \varphi' で変調する。重みの勾配は「前シナプス活動 × 後シナプス誤差」—ヘッブ則と同じ形をしている。

計算グラフという見方

上の導出は層状のネットワークに特化していたが、もっと一般に考えられる。計算を有向非巡回グラフとして表す。変数を点、計算上の依存関係を矢印で描き、矢印をたどっても出発点へ戻る輪がない図である。点をノード、矢印をエッジと呼ぶ。各ノードで局所的な微分(ヤコビアン)が計算できれば、あとはグラフを逆向きに辿って掛け合わせればよい。これが自動微分(automatic differentiation)である。PyTorch や JAX がやっているのは、まさにこれだ。任意の計算に対して勾配が自動的に得られる—この汎用性が、深層学習の実験サイクルを劇的に速くした。

この手続きの来歴

「バックプロパゲーション」という名前が付いたのは1986年だが、手続き自体はもっと早い。甘利俊一は1967年に、多層のパターン識別機械を確率的勾配降下法で学習させる方式を提案している(Amari 1967)。要点はいま導いたものと同じである。素子の出力を微分可能な関数にしておけば、出力の誤差を各パラメータで微分でき、中間層の素子も学習に参加できる。当時のパーセプトロンは中間層を学習させられない点で行き詰まっていたから、これはその壁を越える提案だった。甘利は多層パーセプトロンをこの方式で学習させる計算機実験も行っている(甘利 2025)。それが広く知られるようになるのは、二十年近く後である。Rumelhart, Hinton & Williams (1986) が同じ発想を「誤差逆伝播」(back-propagation)という名で提示し、第二次ニューロブームの主役になった。甘利自身、そのゲラ刷りを送られて「まったく同じ発想で議論が進んでいることに驚いた」と書いている(甘利 2025)。この本では「バックプロパゲーション」という普及した名前を使う。ただし、いま導いた式が1960年代に日本で書かれていたことは、記憶しておいてよい。第5節で扱う確率的勾配降下法という呼び名も、甘利の命名である。

ヒント手を動かす

2層のネットワークを NumPy だけで実装し、数値微分で勾配を検証しよう。コードは コード/08_backprop.py にある。

def forward(x, W1, b1, W2, b2):
    z1 = W1 @ x + b1
    a1 = np.tanh(z1)
    return z1, a1, W2 @ a1 + b2

def backward(x, y, W1, b1, W2, b2):
    z1, a1, z2 = forward(x, W1, b1, W2, b2)
    d2 = z2 - y                    # 出力層の誤差信号
    d1 = (W2.T @ d2)*(1 - a1**2)   # tanh の微分を掛ける
    return np.outer(d2, a1), d2, np.outer(d1, x), d1

def numeric(param, eps=1e-5):      # 数値微分(勾配チェック)
    g = np.zeros_like(param)
    it = np.nditer(param, flags=["multi_index"])
    while not it.finished:
        i = it.multi_index; old = param[i]
        param[i] = old + eps; lp = loss(W1, b1, W2, b2)
        param[i] = old - eps; lm = loss(W1, b1, W2, b2)
        param[i] = old
        g[i] = (lp - lm)/(2*eps)
        it.iternext()
    return g

backward\boldsymbol{\delta}_1 の行が、本文の逆向きの漸化式そのものである—重みの転置を掛けて、活性化関数の微分を掛ける。

\epsilon = 10^{-5}\dfrac{\partial \mathcal{L}}{\partial W_{ij}} \approx \dfrac{\mathcal{L}(W_{ij}+\epsilon) - \mathcal{L}(W_{ij}-\epsilon)}{2\epsilon} と比べると、解析的な勾配との相対誤差はこうなる。

W_1 b_1 W_2 b_2
相対誤差 3.7\times10^{-11} 2.5\times10^{-11} 2.6\times10^{-11} 1.3\times10^{-11}

桁が合っていれば実装は正しい。この「勾配チェック」は、バグを見つけるのにいまでも欠かせない。

次に、層を12層まで増やして誤差信号のノルムを測る(シグモイド、各層32ユニット)。

第12層 第9層 第6層 第3層
\|\boldsymbol{\delta}^{(\ell)}\| 6.3 9.2\times10^{-2} 7.6\times10^{-4} 1.1\times10^{-5}

9層さかのぼるあいだに、60万分の1まで減衰している。これが第6節で扱う勾配消失である。

活性化関数を替えると何が起きるかも、同じコードで見られる(図 1)。

図 1: 誤差信号のノルムが層をさかのぼるにつれてどう変わるか(コード/08_backprop.py の出力、縦軸は対数)。シグモイドでは12層で7桁近く減衰するのに対し、ReLU と He 初期化では、ほぼ平らなまま下層まで届く。深いネットワークが学習できるようになった理由が、この一枚に表れている。

第6節で扱う工夫が、なぜ効くのかを先に見ておいてほしい。


4. 損失関数の選び方

二乗誤差と最尤推定

回帰なら二乗誤差を使う。

\mathcal{L} = \frac{1}{2}\|\mathbf{y} - \hat{\mathbf{y}}\|^2

これは天下りの選択ではない。出力にガウスノイズが乗るというモデル p(\mathbf{y}\mid\mathbf{x}) = \mathcal{N}(\hat{\mathbf{y}}, \sigma^2 I) を置けば、その負の対数尤度が

-\log p(\mathbf{y}\mid\mathbf{x}) = \frac{\|\mathbf{y}-\hat{\mathbf{y}}\|^2}{2\sigma^2} + \text{const}

二乗誤差そのものである。第5章第4節で見た「最尤推定は KL 最小化」という話が、ここに効いている。

交差エントロピーとソフトマックス

分類なら、出力を確率にする。ソフトマックス関数を使う。

p_k = \frac{e^{z_k}}{\sum_{k'} e^{z_{k'}}}

この形に見覚えがあるはずだ。第7章第3節のギブス分布 p \propto e^{-E} と同じ形である(z_k = -E_k と読めばよい)。分母は分配関数にあたる。ただし、こちらはクラス数だけの和なので計算できる。第7章の困難は、和を取る状態数が指数的だったことにあった。損失は交差エントロピーである。

\mathcal{L} = -\sum_k y_k \log p_k

勾配が驚くほど簡単になる

ソフトマックスと交差エントロピーを組み合わせると、勾配が単純になる。計算してみよう。

正解が k^* のとき(y_{k^*}=1、他は 0)、\mathcal{L} = -\log p_{k^*} である。z_j で微分する。まずソフトマックスの微分を計算しておく。

\frac{\partial p_k}{\partial z_j} = p_k\big(\delta_{kj} - p_j\big)

\delta_{kj} はクロネッカーのデルタで、k = j のとき 1k \ne j のとき 0 を取る。添字が一致するかどうかを表す量である。この式は商の微分から出る。)正解クラスを k^* と書けば、\delta_{k^*j}j が正解のとき 1、それ以外で 0 だから、正解を1に立てたベクトルの成分 y_j にちょうど等しい。これを使うと、

\begin{aligned} \frac{\partial \mathcal{L}}{\partial z_j} &= -\frac{1}{p_{k^*}}\frac{\partial p_{k^*}}{\partial z_j} &&\textsf{(連鎖律)}\\ &= -\frac{1}{p_{k^*}}\, p_{k^*}\big(\delta_{k^*j} - p_j\big) &&\textsf{(上の式を代入)}\\ &= p_j - \delta_{k^*j} = p_j - y_j \end{aligned}

\boxed{\;\frac{\partial \mathcal{L}}{\partial \mathbf{z}} = \mathbf{p} - \mathbf{y}\;}

予測から正解を引くだけである。二乗誤差の場合とまったく同じ形になった。これは、データから計算する量(統計量)とパラメータの積を指数関数の肩に置く形の分布—指数型分布族—の性質から説明できる。

組み合わせが効いている。ソフトマックスを二乗誤差と組むと、飽和領域で微分が小さくなって勾配が消える。交差エントロピーと組むとそれが起きない—上のとおり \mathbf{p}-\mathbf{y} になるからだ。実装上も、\log\exp が打ち消し合う形にまとめれば桁あふれを避けられる。現代のフレームワークが softmax_cross_entropy を一体で提供するのはこのためである。


5. 最適化の実際

確率的勾配降下法

データが M 個あるとき、損失は各サンプルの和である。サンプル i の損失を \mathcal{L}_i(\theta) と書けば、全体は \sum_{i=1}^{M}\mathcal{L}_i(\theta) である。全部について勾配を計算するのは重い。そこで一部を選ぶ。選んだサンプルの番号の集合を B、その個数を |B| と書き、データ数によって更新量の尺度が変わらないよう、和ではなく平均の勾配を推定する。

ミニバッチ(数十〜数百サンプル)だけで勾配を推定する。これが確率的勾配降下法(SGD)である—第3節で触れたとおり、この名前は Amari (1967) による。

\theta \leftarrow \theta - \eta\, \frac{1}{|B|}\sum_{i\in B}\nabla_\theta \mathcal{L}_i(\theta)

利点は速度だけではない。勾配にノイズが乗ることで、浅い局所最小値やサドル点から脱出しやすくなる。ノイズが正則化として働くという見方もある—第9章でこの論点に戻る。

モーメンタム

第2節で見た「細長い谷で往復する」問題への対処である。

現在の勾配に、前回までの更新方向を残して足し合わせるのである。\mathbf{v} \in \mathbb{R}^P がその方向を蓄えるベクトル(最初はゼロに置く)、0 \le \beta < 1 が前回の値を残す割合である。

\mathbf{v} \leftarrow \beta\mathbf{v} + \nabla_\theta \mathcal{L}, \qquad \theta \leftarrow \theta - \eta\mathbf{v}

過去の勾配を指数移動平均で溜める。谷底に沿った方向は勾配が一貫しているので蓄積され、壁の間で往復する方向は打ち消し合う。結果として谷底方向が加速される。

物理的な比喩が名前の由来である。斜面を転がるボールが慣性を持つように、更新方向に「慣性」を持たせる。

Adam

勾配の大きさは、パラメータごとに桁が違うことがある。各パラメータに違う学習率を割り当てたい。

RMSProp は、勾配の二乗の移動平均で正規化する。

\mathbf{s} \in \mathbb{R}^P が各パラメータの勾配の二乗を蓄えるベクトル(最初はゼロ)、0 \le \gamma < 1 が前回の値を残す割合、\epsilon > 0 がゼロで割るのを避ける小さな定数である。二乗・平方根・除算はすべて成分ごとに行う。

\mathbf{s} \leftarrow \gamma\mathbf{s} + (1-\gamma)(\nabla_\theta \mathcal{L})^2, \qquad \theta \leftarrow \theta - \frac{\eta}{\sqrt{\mathbf{s}}+\epsilon}\odot\nabla_\theta \mathcal{L}

勾配が大きく振れているパラメータは学習率を下げ、小さいパラメータは上げる。

Adam は、モーメンタムと RMSProp を組み合わせたものである。一次モーメント(勾配の平均)と二次モーメント(勾配の二乗の平均)の両方を追跡し、初期のバイアス補正を加える。ここでのバイアスは、ネットワークに足す定数のことではなく、平均の推定が偏ることを指す。平均を蓄える量をゼロから始めるので、最初の数歩ではそのゼロが残って推定がゼロ寄りになる。そこで、それまでの勾配に掛かった重みの合計で割って、この偏りを打ち消す。

実務上の既定値になっているが、SGD + モーメンタムのほうが最終的な汎化性能が良いという報告もあり、選択は課題による。


6. 初期化と勾配消失

何が起きるか

第3節の「手を動かす」で予告した問題である。深いネットワークでは、誤差信号 \boldsymbol{\delta} が下の層へ届かない。原因は逆伝播の式にある。

\boldsymbol{\delta}^{(\ell)} = \big(W^{(\ell+1)}\big)^\top\boldsymbol{\delta}^{(\ell+1)}\odot\varphi'

L 層を遡ると、W^\top\varphi'L 回掛かる。掛かる量が平均的に 1 より小さければ指数的に消え、大きければ指数的に爆発する。

シグモイド関数だと深刻である。\sigma'(z) = \sigma(1-\sigma) \le 1/4。活性化関数の微分だけで、毎層で最大でも 1/4 倍になる。10層なら 4^{-10} \approx 10^{-6}—重みの側がこれを補うほど大きくなければ、下の層は事実上学習しない。

分散を保つ初期化

対処の第一は、初期化である。各層で活性の分散が保たれるように、重みのスケールを決める。

記号を決めておく。一つの層に注目し、入力ユニット数を n_{\text{in}}、出力ユニット数を n_{\text{out}} と書く。a は入力の一成分、z は出力ユニット一つの、活性化関数を通す前の値である。以下の分散は、入力のばらつきと、ランダムに引く初期重みのばらつきの両方についてのものである。入力の各成分は平均 0 で共通の分散を持ち、初期重みは入力と独立、バイアスは 0 としておく。

n_{\text{in}} 個の入力を持つ層で、入力の分散を \mathrm{Var}[a]、重みを平均 0・分散 \sigma_w^2 で独立に初期化すると、

\mathrm{Var}[z] = n_{\text{in}}\,\sigma_w^2\,\mathrm{Var}[a]

分散を保つには \sigma_w^2 = 1/n_{\text{in}} とすればよい。

以下に出る \tanh z = (e^z - e^{-z})/(e^z + e^{-z}) は、入力が大きくなると 1、小さくなると -1 に近づく活性化関数である(第3節の「手を動かす」のコードで使った)。

  • Xavier(Glorot)初期化 — 順伝播と逆伝播の両方を考慮して \sigma_w^2 = 2/(n_{\text{in}}+n_{\text{out}})。tanh 向け
  • He 初期化 — 対称な入力に対して ReLU は二乗平均を半分にする。それを補って \sigma_w^2 = 2/n_{\text{in}}

「初期化を変えるだけで学習できるようになる」—理論的な洞察が実用に直結した好例である。第7章第8節で述べた事前学習が不要になった理由の一つが、これである。

ReLU

対処の第二は、活性化関数である。

\mathrm{ReLU}(z) = \max(0, z), \qquad \mathrm{ReLU}'(z) = \begin{cases}1 & z>0\\ 0 & z<0\end{cases}

正の領域では微分がちょうど 1 である。だから、活性化関数の微分による縮小はそこでは起きない。ただし勾配が保たれると決まったわけではない—遡るときには W^\top の積が残るし、負の側に入ったユニットでは微分が 0 でゲートが閉じる。重みの大きさが小さすぎれば、ReLU でも勾配は消える。だから前項で見た初期化が要る。

代償もある。負の領域では微分が 0 で、そのユニットは完全に学習しなくなる(dying ReLU)。Leaky ReLU(負の領域で小さな傾きを持つ)などの変種が提案されている。

第2章第7節で述べたとおり、ReLU が生物学的な f–I 曲線の近似でもあることは、幸運な一致である。生物学的動機と計算上の都合が、たまたま揃った。

バッチ正規化

対処の第三は、層の出力を明示的に正規化することである。全結合層の一つのユニットに注目し、同じミニバッチ B の各サンプルから得た値を並べて考えよう。z がそのうちの一つの値、\mu_B\sigma_B^2 がそのユニットについてミニバッチ内で求めた平均と分散、\hat{z} が正規化した値、y がさらに大きさと位置を調整した出力である(この y は正解ラベルではない)。\epsilon > 0 は分母がゼロになるのを防ぐ小さな定数、\gamma\beta はユニットごとに学習する倍率と加算量である(第5節で「前回の値を残す割合」に使った \gamma\beta とは別物である)。

\hat{z} = \frac{z - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}}, \qquad y = \gamma\hat{z} + \beta

ミニバッチ内で平均 0・分散 1 に正規化し、学習可能なスケール \gamma とシフト \beta で戻す。

効果は大きい。学習が速くなり、学習率の選択に鈍感になり、正則化としても働く。だが、なぜ効くのかは決着していない。提案者は「内部共変量シフトの軽減」—前の層の重みが変わるたびに各層へ入る値の分布が動くことを抑える、と説明したが、後の研究はこの説明に疑問を投げかけ、「損失関数の地形を滑らかにする効果」という別の説明を提出している。動くことは確かだが、理由は分かっていない—深層学習にはこの種の技法が多い。


7. 畳み込みニューラルネットワーク

全結合の問題

224\times224 のカラー画像を全結合層に入れると、入力は約15万次元である。次の層も同じ規模なら、重みは 225 億個。学習できるはずがない。

そして無駄でもある。画像の構造を何も使っていない。ピクセルの並びをシャッフルしても、全結合層にとっては同じ問題である。だがわれわれは、隣り合うピクセルが関係していることを知っている。

二つの制約

そこで二つの制約を課す。一つは局所性である。各ユニットは、入力の局所的な領域だけを見る。これは第4章の受容野そのものである。

もう一つは重み共有である。同じ重みを、画像のすべての位置で使い回す。この二つを課すと、演算は畳み込みになる。

z_{ij}^{(k)} = \sum_{c}\sum_{p,q} W^{(k)}_{cpq}\, a_{c,\,i+p,\,j+q} + b_k

k が出力チャネル(フィルタの種類)、c が入力チャネルである。入力チャネル数を C_{\mathrm{in}}、画像の高さと幅を HW とすれば(この H は画素の行数で、第2節のヘッセ行列 H とは別物である)、入力は \mathbb{R}^{C_{\mathrm{in}} \times H \times W} の配列になる。高さ h・幅 w のフィルタなら、一つの出力チャネルに使うカーネルは \mathbb{R}^{C_{\mathrm{in}} \times h \times w} である(pq がフィルタ内の縦・横の位置、ij がフィルタを当てる位置、b_k が出力チャネルごとのバイアス。ここでの上付き (k) は層番号ではなくフィルタの番号である)。上の式はフィルタを一画素ずつ動かす形で、動かす間隔をストライド、画像の端に値を補って計算範囲を広げる操作をパディングと呼ぶ。この選び方で出力の縦横の大きさが変わる。第4章第2節で導入した畳み込みが、そのまま層になった。

なぜ重み共有なのか

教科書的な説明は二つある。

説明1:パラメータが減る。全結合なら 15万 \times 15万 だったものが、3\times3 のフィルタなら1枚あたり 3\times3\times(入力チャネル数)個で済む—カラー画像の最初の層なら27個である。

説明2:平行移動と噛み合う。入力を横にずらすと、特徴マップも同じだけ横にずれる(同変性。第13章第4節で不変性と区別する)。猫が画像のどこにあっても、同じフィルタが反応するわけである。ただし端の処理やストライドを入れると、この性質は厳密には破れる。

どちらも正しい。だが、これは本当の理由ではない。

第13章第7節で、次の定理を証明する。

線形かつ平行移動同変な作用素は、畳み込みに限る。

つまり「位置によらず同じ処理をする」ことを要求した瞬間に、畳み込み以外の選択肢は消える。重み共有は効率のための工夫ではなく、対称性を課したことの必然的な帰結である。この伏線は、第4章から引かれて、第13章で回収される。いまは「効率がよい」と思っておいてよい。だがあと5章で見方が変わることを、頭の隅に置いておいてほしい。

プーリング

畳み込み層の後に、空間方向に情報をまとめる層を置く。最大値を取る(max pooling)か、平均を取る。

第4章第5節の複雑細胞と、役割が重なる。単純細胞(畳み込み)の出力を空間的にまとめ、位置ずれに頑健にする—ここで同変だったものが、まとめる操作を通して不変に近づく。ただし演算は同じでない。複雑細胞のモデルは位相が 90 度違う二つのチャネルの二乗和で、プーリングは近傍の位置にわたる最大値や平均である。共有しているのは、いま要らない変換への感度を落とすという役割である。そして第13章第8節で、この操作が「群の軌道上で足し合わせる」ことの一例だったと分かる。福島のネオコグニトロンの S 細胞・C 細胞から、現代の CNN まで、同じ構造が続いている(第4章第7節)。


8. 残差接続と Transformer への一歩

深さの壁

層を深くすれば表現力が上がる—はずだった。だが実際には、ある深さを超えると訓練誤差すら増えることが観察された。過学習ではない。最適化が失敗している。

残差接続

He らの解決策は、驚くほど単純である。層の出力に、入力をそのまま足す。入力と出力がともに n 成分の場合を考えると、F: \mathbb{R}^n \to \mathbb{R}^n は重みと活性化関数で学習する変換で、入力に加える変化分を返す。だから成分どうしを足せる。続く微分の式に出る I \in \mathbb{R}^{n \times n} は、各成分をそのまま通す単位行列である。

\mathbf{a}^{(\ell)} = \mathbf{a}^{(\ell-1)} + F\big(\mathbf{a}^{(\ell-1)}\big)

なぜこれが効くのか。二つの読み方がある。

恒等写像を学びやすくする。もし最適な変換が恒等写像なら、F = 0 とすればよい。重みをゼロに近づけるだけで済む。残差接続がなければ、恒等写像を重みで表現しなければならず、それは難しい。勾配が素通りする。逆伝播を計算すると、

\frac{\partial \mathbf{a}^{(\ell)}}{\partial \mathbf{a}^{(\ell-1)}} = I + \frac{\partial F}{\partial\mathbf{a}^{(\ell-1)}}

単位行列の項があるので、恒等の経路がそのまま残る。層を重ねても I + \partial F/\partial \mathbf{a} の積になるので、\partial F/\partial\mathbf{a} が小さければ積は 1 の近くにとどまりやすい。勾配が届くことを保証する仕組みではないが、届きやすくする構造的な対処になっている。これにより、100層を超えるネットワークが学習可能になった。

自己注意

Transformer の中核である自己注意(self-attention)を、式だけ示しておく。三つに分ける意味を先に言っておこう。文章なら入力の要素は単語やその断片である。ある要素が他の要素から情報を受け取る場面を考えると、クエリは受け取る側の「どんな情報を探しているか」、キーは渡す側の「どんな問い合わせに合うか」、バリューは実際に受け渡す中身を表すベクトルである。合い具合を測る役と、運ばれる中身の役を分けてあるわけだ。入力の要素数(系列長)を S とすると、Q, K \in \mathbb{R}^{S \times d_k}V \in \mathbb{R}^{S \times d_v} で、行が要素、列が特徴の成分に対応する(d_k がクエリとキーに共通の次元、d_v がバリューの次元である)。QK^\top \in \mathbb{R}^{S \times S}(i,j) 成分は要素 i のクエリと要素 j のキーの内積で、softmax は各行の中で取る。出力は \mathbb{R}^{S \times d_v} の行列になる。やりたいことは、各要素がほかのどの要素から情報を受け取るかを、内容の合い具合に応じて決めることだ。合い具合から重みを作り、受け取る情報をその重みで平均する。

\mathrm{Attention}(Q,K,V) = \mathrm{softmax}\!\left(\frac{QK^\top}{\sqrt{d_k}}\right) V

入力の各要素から、クエリ Q・キー K・バリュー V を線形変換で作る。QK^\top で要素どうしの類似度を測り、softmax で正規化して重みにし、V の加重平均を取る。

読み方

「どの要素に注目すべきかを、内容に応じて動的に決める」機構である。畳み込みが「固定された近傍」を見るのに対し、自己注意は「関連する要素」を距離に関係なく見る。

softmax が効いている。重みが非負で総和が 1 になるので、出力は V の行の凸結合である。非負の重みを、合計が 1 になるように付けた加重平均のことだ。このような重みをいろいろに変えてできる点の全体を凸包と呼ぶ。平面なら、もとの点を輪ゴムで囲んだ内側にあたる。「注目先の加重平均」という解釈が、ここから来る。

自己注意は連想記憶の想起である

ここで、本書でもとりわけ意外な合流点に出る。いま書いた自己注意の式は、第7章のホップフィールド・ネットワークから導ける。

第7章のネットワークは状態が \pm1 の離散値で、記憶容量は 0.138N しかなかった—線形にしか増えない。この壁を破ったのが Krotov と Hopfield (2016) で、エネルギー関数に高次の相互作用を入れると容量が多項式オーダーに、Demircigil ら (2017) の指数関数版では 2^{N/2} のオーダーに上がる。相互作用を急峻にするほど、谷が細く深くなり、たくさん掘れる。

連続値に拡張する。Ramsauer ら (2021) は、これを連続値の状態に持ち上げた。記憶させたいパターンを x_i \in \mathbb{R}^Di = 1, \dots, M)、現在の状態を \xi \in \mathbb{R}^D とする。どちらも D 成分の列ベクトルだ。記号に注意してほしい—第7章では記憶させるパターンそのものを \boldsymbol{\xi} と書いたが、ここでの \xi は現在の状態であり、記憶のほうは x_i と書く。M 個のパターンを列に並べた行列が X = (x_1,\dots,x_M) \in \mathbb{R}^{D \times M} で、行が特徴の成分、列が記憶の番号に対応する。だから X^\top \xi \in \mathbb{R}^M は、内積 x_i^\top \xi で測った「全記憶との合い具合」を並べたベクトルである。提案されたエネルギー関数は

E(\xi) = -\frac{1}{\beta}\log\sum_{i=1}^{M} \exp\big(\beta\, x_i^\top \xi\big) \;+\; \frac{1}{2}\,\xi^\top\xi \;+\; \text{const}

式を読もう。ここでの \beta > 0 は、記憶の選び方をどれだけ鋭くするかを決める逆温度である(第5章の情報ボトルネックの重みや、本章第5節で更新方向を残す割合に使った \beta とは別物である)。第一項は「\xi にいちばん近い記憶パターン」を柔らかく選ぶ働きをする。\beta を大きくすれば \max_i x_i^\top\xi に近づき、小さくすれば全パターンの平均に近づく—\tfrac{1}{\beta}\log\sum\exp は「柔らかい最大値」である。第7章第3節の \log Z が、逆温度つきでここに顔を出している。第二項は \xi が無限に伸びないよう抑える錘である。

更新規則を求める。このエネルギーを下げる方向へ \xi を動かしたい。第一項の勾配を計算すると、

\begin{aligned} \nabla_\xi\!\left[-\frac{1}{\beta}\log\sum_i e^{\beta x_i^\top \xi}\right] &= -\sum_i \frac{e^{\beta x_i^\top\xi}}{\sum_j e^{\beta x_j^\top\xi}}\, x_i && \textsf{(合成関数の微分。}\tfrac{1}{\beta}\textsf{ と }\beta\textsf{ が相殺する)} \end{aligned}

この係数は、まさに softmax である。全体で

\nabla_\xi E = -X\,\mathrm{softmax}\big(\beta X^\top \xi\big) + \xi

この式を、更新の規則として読む。\nabla_\xi E = 0\xi について解いた形に整理すると、

\boxed{\;\xi^{\text{new}} = X\,\mathrm{softmax}\big(\beta X^\top \xi\big)\;}

右辺の \xi に現在の状態を入れ、左辺を次の状態とする。これを繰り返した先の固定点 \xi^* = X\,\mathrm{softmax}(\beta X^\top \xi^*) が、エネルギーの停留点である—一回の更新でそこに着くとは限らないことに注意してほしい(初期状態が目標の記憶に近く、パターンの分離と逆温度が十分なら、一回でその近くまで進める)。

これを自己注意と見比べてほしい。\xi をクエリ Q、記憶パターンをキー K とバリュー V両方に置く(K = V とする簡略化である。実際の Transformer では別々の射影で作る)。寸法に注意してほしい—本書は記憶パターンを X の列に並べているが、注意機構の K, V は行に並べる約束なので、K = V = X^\top と読む。クエリも同じ約束に従うので Q = \xi^\top である。この対応では d_k = d_v = D である。ただし比べているのは、クエリ1個から記憶 M 本への注意である—Q \in \mathbb{R}^{1 \times D}K, V \in \mathbb{R}^{M \times D} なので、QK^\top1 \times M、出力は 1 \times D になる。三つの行列を同じ系列長にそろえた自己注意とは、行数の設定が違う。更新の結果 \xi^{\text{new}} \in \mathbb{R}^D も列ベクトルなので、注意機構の出力と見比べるときは、その転置を取る。逆温度を \beta = 1/\sqrt{d_k} と読み替えると、

\mathrm{softmax}\!\left(\frac{QK^\top}{\sqrt{d_k}}\right)V

この簡略化のもとで、完全に一致する。 Transformer の自己注意は、現代版ホップフィールド・ネットワークの一回分の更新と同じ式になる。

ここがポイント

注意機構の式は、指数容量の連想記憶からの想起と同じ形をしている。「どこに注目するか」を計算していると思っていたものが、「どの記憶を思い出すか」の計算と同じ式だった。—ただし一致しているのは式であって、機能が同じだと示されたわけではない。しかも Ramsauer らは、初期状態・パターンの分離・逆温度の条件が整えば、一回の更新で記憶を高精度に想起できることを示している。Transformer が層あたり一回しか注意を計算することと符合するが、それが設計の理由だと示されたわけではない。

第7章のエネルギー関数が、本章で環をなして戻ってきた。そして同じエネルギー関数は、第15章のスコアと第16章の自由エネルギーでもう二度、姿を変えて現れる。

ヒント手を動かす

M 個のランダムなベクトルを並べ、そのうち一本にノイズを乗せたものを \xi の初期値にして、上の更新をまわしてみよう。コードは コード/08_hopfield_modern.py にある。次元 D=64、パターン M=100 本、ノイズの大きさ 0.5 とする。なお配布コードは記憶パターンを行に並べている(XM\times D)ので、更新式は本文を転置した \xi^{\text{new}} = X^\top\mathrm{softmax}(\beta X\xi) の形になっている。

def retrieve(X, xi, beta, n_iter=100, tol=1e-12):
    """収束するまで更新し、(状態, 反復数, 重み) を返す。"""
    for t in range(1, n_iter + 1):
        w = softmax(beta * (X @ xi))   # 注意の重み
        new = X.T @ w                  # バリューの加重平均
        if np.linalg.norm(new - xi) < tol:
            return new, t, w
        xi = new
    return xi, n_iter, w

この4行が本文の更新式そのものである。そして同時に、自己注意の \mathrm{softmax}(QK^\top)V でもある。

\beta を動かすと、こうなる。

\beta 0.5 2 5 10 20 50
目標との余弦 -0.17 -0.17 -0.17 1.0000 1.0000 1.0000
最大の重み 0.010 0.010 0.011 0.993 1.000 1.000
混ざった本数 100.0 99.9 99.6 1.0 1.0 1.0
反復数 8 12 20 10 4 2

\beta \ge 10 で、余弦が 1.0000 と表示される。ノイズを乗せた入力から、元のパターンがほぼ完全に戻ってくる。

二つ、読み方に注意がある。第一に、表示は四捨五入である。\beta=10 の余弦は実際には 0.99999937 で、元のパターンとの距離は 0.0065 ほど残っている。有限の \beta では、他の記憶に配られる重みが厳密にはゼロにならないからだ。距離は \beta とともに急速に縮み、\beta=201.1\times10^{-6}\beta=50 では倍精度の丸め誤差の程度になる(厳密なゼロにはならない)。第二に、この表は \beta を変えても同じ乱数の種を使っているので、記憶集合も雑音入力も同一である。動いているのは \beta だけだと読んでよい。

そして \beta が小さいと、どこへ行くのか。最下段を見てほしい—「混ざった本数」(重みの参加率)が 100.0、つまり M 本すべてが等しく混ざっている。\xi全パターンの平均に落ちているのだ。最大の重みが 0.010、つまりほぼ 1/100 であることからも分かる(等しくなるのは \beta\to0 の極限である)。

反復数の右端にも注目してほしい。\beta=50 では 2—一回の更新後、2回目の変化が停止基準の 10^{-12} 未満になった。一回で高精度に想起できる様子が、ここに見えている。

記憶の本数や雑音、次元を変えると、想起の成功率も変わる。その追加実験と条件ごとの表は第8章第8節「手を動かす」(Web版の追加実験)にまとめた。ここでは、逆温度だけでも「一つを選ぶ」から「全体を混ぜる」へ振る舞いが変わることを押さえよう。

そして問い—\beta が小さいときの「全パターンの平均」は、第7章第2節で見た偽記憶と同じものだろうか。あちらは数本のパターンが混ざった状態だった。ここでは Mすべてが混ざる。同じ現象の両端なのか、それとも別物なのか。\beta を 5 から 10 のあいだで細かく刻むと、何が見えるだろうか。

記憶の本数・雑音・次元を変える

読む前に:第8章第8節。

ここで確かめること:記憶の本数、雑音、次元を変えたとき、何を固定した比較なのか。

コード/08_hopfield_modern.pysuccess_rate で、現代版ホップフィールドの想起を繰り返そう。本文は記憶を列に並べたが、コードは行に並べている。各記憶の長さを1にそろえ、目標の記憶に標準正規雑音を noise / sqrt(D) 倍して加える。D は次元、M は記憶の本数、beta は逆温度だ。

一例の成功だけでは足りない。記憶集合・目標・雑音を変えて20回試し、目標との余弦類似度が0.99以上なら成功と数える。まず D=64beta=32 に固定して、本数と雑音だけを変える。配布コードの20試行では次のようになった。

記憶の本数 noise=0.5 noise=2.0
64 1.00 0.90
20000 1.00 0.30

弱い雑音では2万本でも成功したが、強い雑音では本数を増やすと崩れる。では次元を削ったらどうなるか。今度は M=512beta=32noise=1.0 に固定する。同じコードで D=32 では成功率1.00、D=16 では0.45、D=8 では0.30だった。

二つの比較を混ぜないでほしい。前者は次元を固定して本数と雑音を変え、後者は本数と雑音を固定して次元を変えている。試行数を増やしたり、success_rate が使う乱数の種を変えたりして、傾向がどこまで残るか確かめよう。表は有限回の実験結果で、成功率1.00も一般的な想起保証ではない。第7章の二値パターンと本項の正規化した実数ベクトルでは設定も成功基準も違う。指数容量の理論と、この表の成功率は分けて読む必要がある。理論の出典は本文参考文献の Ramsauer ら (2021) である。

留保も書いておく。一致するのは数式であって、機能が同じだと示されたわけではない。実際の Transformer では KV が別々の行列であり(上の対応では両方 X^\top)、更新も反復されない。「連想記憶として使える」ことと「連想記憶として働いている」ことは別である—第1章第2節から繰り返してきた区別が、ここでも要る。

なお本書では、Transformer を独立の章としては扱わない。自己注意の式と上の関係を押さえておけば、第18章第1節で扱う「大規模言語モデルの表現」の議論には十分である。


9. バックプロパゲーションは生物学的に妥当か

本章の締めくくりに、正面から問う。脳はバックプロパゲーションをやっているのか。

三つの問題

問題1:重み輸送

これがもっとも深刻である。

逆伝播の式を見返してほしい。

\boldsymbol{\delta}^{(\ell)} = \big(W^{(\ell+1)}\big)^\top\boldsymbol{\delta}^{(\ell+1)}\odot\varphi'

順伝播で使った W の転置が必要である。つまり、フィードバック経路が、フィードフォワード経路のシナプス強度を正確に知っていなければならない。

生物学的には、これは考えにくい。シナプスは局所的な情報しか使えない。A\to B のシナプスの強度を、B\to A のシナプスがどうやって知るのか。

問題2:位相の分離

バックプロパゲーションは、順伝播を完了してから逆伝播を始める。この二つの位相が、時間的にきれいに分かれている必要がある。皮質でそのような大域的な同期があるという証拠は乏しい。

問題3:誤差信号の運搬

出力層の誤差を、遠く離れた入力層まで正確に運ばねばならない。しかも活動そのものとは別の経路で。そんな専用の配線は見つかっていない。

提案されている解決策

これらに対して、いくつもの提案がある。

フィードバックアラインメント

Lillicrap らの驚くべき発見である。フィードバック経路の重みを、ランダムに固定したまま学習させても、ネットワークは学習できる。

なぜか—順伝播の重みが、ランダムなフィードバック重みと「揃う」方向に学習されるからである。正確な転置は要らない。おおよそ揃っていればよい。問題1がかなり緩和される。ただし万能ではない。深いネットワークや大規模な画像課題では、通常のバックプロパゲーションとの性能差が報告されている。

予測符号化による近似

第16章第1節で扱う予測符号化のネットワークが、適当な条件下でバックプロパゲーションを近似することが示されている。局所的な計算だけで、誤差信号に相当するものが自然に生じる。

ターゲット伝播

誤差ではなく「目標値」を逆向きに伝える。各層が自分の目標に近づくよう局所的に学習する。

ヘッブ則との対比

第3節で見たとおり、重みの更新は「前シナプス活動 × 後シナプス誤差」の形をしていた。ヘッブ則は「前シナプス活動 × 後シナプス活動」である。

違いは、後ろに来るのが「活動」か「誤差」かだけである。そして第7章の正相・負相を思い出してほしい。あれは「データを見せたときの相関」から「モデルを走らせたときの相関」を引く形だった。二つの位相の差が学習を駆動していた。

予測符号化も同じ構造を持つ。予測と実際の差—つまり誤差—が、局所的に計算されて学習を駆動する。つまり「誤差で学習する」こと自体は、生物学的に無理な要求ではない。問題は、その誤差をどうやって層をまたいで運ぶかである。

本書の立場

判定は下さない。だが本書の主題に照らして、一つ述べておきたい。同じ数学で書けることと、同じ機構であることは違う。

本書は「脳とAIを同じ数学で見る」ことを目指している。だがそれは「脳とAIが同じものだ」という主張ではない。畳み込みが両方に現れることは、両者が同じ制約(平行移動同変性)に従っているからであって、実装が同じだからではない。

バックプロパゲーションは、その区別がもっとも鮮明に見える例である。「勾配で学習する」という抽象的な水準では脳もそうかもしれない。だが「W^\top を掛けて誤差を運ぶ」という具体的な水準では、ほぼ確実に違う。

どの水準で似ていると言っているのか—この問いを持ち続けることが、この分野で誤解を避ける最良の方法である。そして第11章から第18章では、この問いがもっと精密な形で戻ってくる。

ノートコラム:皮質の可塑性

本文の「学習」が、脳では何によって実現されているのかを見ておく。

実体

学習の物理的な実体は、シナプス強度の変化だと考えられている。強まるのが長期増強(LTP)、弱まるのが長期抑圧(LTD)。LTP は海馬で1973年に詳しく報告され、その後、皮質でも確認された。代表的な機構では NMDA 受容体が鍵を握る。グルタミン酸の結合と後シナプスの脱分極が同時に成り立つときだけ開くので、前後の活動の同時性を検出する装置になっている—ヘッブ則の分子的な実装であり、第7章第1節の w_{ij}\propto \xi_i\xi_j に物理的な対応物が見つかったことになる。流れ込んだカルシウムが CaMKII—細胞内で他のタンパク質の働きを変える酵素—を活性化し、グルタミン酸を受け取って速い興奮性の伝達を担う AMPA 受容体が集まって伝達効率が上がる。ただし「重み w_{ij} の値」に対応する実体は一つの数ではなく、受容体の数と配置からなる状態である(Nicoll と Schulman 2023)。強化されたシナプスではスパイン(樹状突起の小さな突起)が膨らみ、その膨らみが前シナプス終末を機械的に押すこと自体が放出を促す(Ucar ら 2021、Kasai ら 2021)。

時間の窓

前後のスパイクの時間差が可塑性を決めるスパイクタイミング依存可塑性(STDP)は、長く標準的な学習則とされてきた。だが Inglebert ら (2020) は、ラット海馬の CA3–CA1 シナプスで、細胞外カルシウム濃度を生体に近い 1.3〜1.5 mM にすると、低頻度で繰り返す単発のスパイク対では可塑性が起きず、1.8 mM では抑圧になることを示した。古典的な実験は、これより高い濃度で行われている。1.8 mM ではバーストを使うと、1.3 mM でも反復頻度を上げると増強が戻るので STDP が無いという話ではないが、「前後数ミリ秒の時間差だけが重みを決める」とは言えない(Inglebert と Debanne 2021)。むしろ近年注目されているのは、もっと遅い規則である。Bittner ら (2017) は海馬 CA1 で、樹状突起の膜電位がしばらく高いまま保たれるプラトー電位の数秒前後に届いた入力が、一回の試行で強化されることを見出した。ミリ秒ではなく秒—行動と同じ時間スケールで、前後の同時性も要求しない。

大域信号との出会い方

ドーパミンは、神経細胞の応答やシナプスの変わりやすさを調節する神経伝達物質の一つである。これを放出する細胞は広範囲へ軸索を伸ばし、「うまくいったか」を届けうる(第10章)。ではスカラー信号が、どうやって特定のシナプスを選ぶのか。Yagishita ら (2014) は、行動選択や報酬に関わる線条体という領域の腹側部分、側坐核で調べた。その主要な細胞である中型有棘神経細胞は、樹状突起に多数のスパインを持つ。この細胞で、ドーパミンがスパインの拡大を促すのはグルタミン酸入力の 0.3〜2 秒後という狭い窓に限られることを示した。局所の活動が短時間だけ痕跡を残し、そこに修飾信号が重なったときだけ変化が確定する。時間のずれを埋めるために強化学習の理論が要求した仕掛けが、線条体のスパインで実装されていた—第10章第3節の適格度トレースに対応しうる姿である。ただし示されたのは三因子可塑性の時間窓であって、ドーパミンが TD 誤差を運ぶことまでではない。

なお可塑性の強さは生涯一定ではない。視覚野では生後の限られた時期(臨界期)に高く、この間に片眼からの視覚入力を遮ると、左右どちらの眼の入力によく応じるかという眼優位性が大きく偏る(Hubel と Wiesel)。経験が回路を形作ることを示した発見である。

分かっていないこと

以上の機構は、すべて局所的である。シナプスは、自分につながる前後の細胞の状態と、届いた修飾信号しか知らない。遠く離れた出力層の誤差を、層ごと・ユニットごとに区別して受け取る手段はない。では脳はどうやって「良い方向」を知るのか—未解決である。有力な候補は修飾物質による大域信号(第10章の報酬予測誤差)だが、それは一つのスカラーであって、層ごと・ユニットごとの誤差ベクトルではない。本文のフィードバックアラインメントや予測符号化による近似は隙間を埋める試みだが、決定的な実験的支持は得ていない。そもそも記憶の座がシナプスだけなのかも確定しておらず、細胞内の分子状態や細胞そのものの興奮性が担う可能性も整理されている(Abraham ら 2019)。教科書の図が与える印象より、ずっと動いている領域である。

出典 Bliss & Lømo (1973)、Bi & Poo (1998)、Inglebert et al. (2020)、Bittner et al. (2017)、Yagishita et al. (2014)、Ucar et al. (2021)、Nicoll & Schulman (2023)、Abraham et al. (2019)、Lillicrap et al. (2020)。

確認問題

  1. [導出]\mathcal{L}(\theta)=\frac{1}{2}\lambda\theta^2 に対する勾配降下法の収束条件を求めよ。多変数の場合、条件数が大きいと何が問題になるか。(第2節)

  2. [導出]誤差信号の漸化式 \boldsymbol{\delta}^{(\ell)} = (W^{(\ell+1)})^\top\boldsymbol{\delta}^{(\ell+1)}\odot\varphi' を導出せよ。(第3節)

  3. [導出]重みの勾配が \partial \mathcal{L}/\partial W_{ji} = \delta_j a_i となることを示せ。この形がヘッブ則とどう似ていて、どう違うかを述べよ。(第3節・第7章第1節)

  4. [導出]ソフトマックスと交差エントロピーを組み合わせたとき、\partial \mathcal{L}/\partial\mathbf{z} = \mathbf{p}-\mathbf{y} となることを導出せよ。(第4節)

  5. [導出]各層で活性の二乗平均を保つには、重みの初期分散をどう選べばよいか。ReLU の場合に係数が変わる理由を述べよ。(第6節)

  6. [導出]残差接続が勾配消失を緩和する理由を、\partial\mathbf{a}^{(\ell)}/\partial\mathbf{a}^{(\ell-1)} を計算して示せ。(第8節)

  7. [導出]現代版ホップフィールド・ネットワークのエネルギーの勾配から、自己注意の更新式が出ることを本文にならって再現せよ。\beta を小さくすると何が起きるか。(第8節・第7章第1節)

  8. [考える]「同じ数学で書けることと、同じ機構であることは違う」という主張を、バックプロパゲーションを例に説明せよ。(第9節・第1章第2節)


参考文献

  • Amari, S. (1967). A theory of adaptive pattern classifiers. IEEE Transactions on Electronic Computers, EC-16(3), 299–307. https://doi.org/10.1109/pgec.1967.264666 — 多層を確率的勾配降下法で学習させる最初の提案[3節・5節]
  • Rumelhart, D. E., Hinton, G. E., & Williams, R. J. (1986). Learning representations by back-propagating errors. Nature, 323(6088), 533–536. https://doi.org/10.1038/323533a0 — 「誤差逆伝播」の名を与え、広めた論文[3節]
  • 甘利俊一(2025)『脳・心・人工知能:数理で脳を解き明かす』講談社. — 上の二つの関係を当事者の側から述べている[3節]
  • Prince, S. J. D. (2023). Understanding Deep Learning. MIT Press. — 現代の標準的な教科書。無料で公開されている
  • Vaswani, A., et al. (2017). Attention is all you need. arXiv:1706.03762. — 自己注意の原典[8節]
  • Ramsauer, H., et al. (2021). Hopfield networks is all you need. arXiv:2008.02217. https://doi.org/10.48550/arxiv.2008.02217 — 本章第8節の導出の出典。自己注意と現代版ホップフィールドの同型。容量を指数的に上げる系譜は Krotov & Hopfield (2016)、Demircigil et al. (2017)[8節]
  • Lillicrap, T. P., et al. (2020). Backpropagation and the brain. Nature Reviews Neuroscience, 21(6), 335–346. https://doi.org/10.1038/s41583-020-0277-3 — 生物学的妥当性の総説[9節]。フィードバックアラインメントの原典は Lillicrap et al. (2016) Nat Commun
  • Bi, G., & Poo, M. (1998). Synaptic modifications in cultured hippocampal neurons: dependence on spike timing, synaptic strength, and postsynaptic cell type. The Journal of Neuroscience, 18(24), 10464–10472. https://doi.org/10.1523/jneurosci.18-24-10464.1998 / Markram, H., Lübke, J., Frotscher, M., & Sakmann, B. (1997). Regulation of synaptic efficacy by coincidence of postsynaptic APs and EPSPs. Science, 275(5297), 213–215. https://doi.org/10.1126/science.275.5297.213 — STDP の原典。ただし次の項と必ず合わせて読んでほしい[コラム C8]
  • Inglebert, Y., Aljadeff, J., Brunel, N., & Debanne, D. (2020). Synaptic plasticity rules with physiological calcium levels. Proceedings of the National Academy of Sciences, 117(52), 33639–33648. https://doi.org/10.1073/pnas.2013663117 / Inglebert, Y., & Debanne, D. (2021). Calcium and spike Timing-Dependent plasticity. Frontiers in Cellular Neuroscience, 15, 727336. https://doi.org/10.3389/fncel.2021.727336 / Bittner, K. C., et al. (2017). Behavioral time scale synaptic plasticity underlies CA1 place fields. Science, 357(6355), 1033–1036. https://doi.org/10.1126/science.aan3846 — STDP の見直しと、秒の時間スケールで働く可塑性。実験条件が結論を作っていた例として重い[コラム C8]
  • Nicoll, R. A., & Schulman, H. (2023). Synaptic memory and CaMKII. Physiological Reviews, 103(4), 2897–2945. https://doi.org/10.1152/physrev.00034.2022 / Abraham, W. C., Jones, O. D., & Glanzman, D. L. (2019). Is plasticity of synapses the mechanism of long-term memory storage? npj Science of Learning, 4(1), 9. https://doi.org/10.1038/s41539-019-0048-y — 分子機構の現在の筋書きと、記憶の座がシナプスだけなのかを疑う視点[コラム C8]
  • Kasai, H., et al. (2021). Spine dynamics in the brain, mental disorders and artificial neural networks. Nature Reviews Neuroscience, 22(7), 407–422. https://doi.org/10.1038/s41583-021-00467-3 / Ucar, H., et al. (2021). Mechanical actions of dendritic-spine enlargement on presynaptic exocytosis. Nature, 600(7890), 686–689. https://doi.org/10.1038/s41586-021-04125-7 / Yagishita, S., et al. (2014). A critical time window for dopamine actions on the structural plasticity of dendritic spines. Science, 345(6204), 1616–1620. https://doi.org/10.1126/science.1255514 — スパインの構造と力学、そして大域的な報酬信号が局所のシナプスを選ぶ仕組み[コラム C8・10章]