7 エネルギーで学ぶ ── 連想記憶と確率的なネットワーク
第3章第6節で、我々は「アトラクター」という言葉を使った。系がある状態に引き寄せられ、そこに留まる。それが記憶の候補になる、と。
だが、あれは比喩だった。「谷に転がり落ちる」という描像を使ったが、谷とは何かを定義していない。何がその形を決めるのかも言っていない。
本章でその比喩に、正確な数学を与える。エネルギー関数である。
そして本章は、本書のナラティブの起点でもある。ここで立てるエネルギー関数という道具は、姿を変えながら本書の最後まで生き延びる。
- 第15章第7節 — 拡散モデルのスコア。\log を取ると分配関数が消える
- 第16章第2節 — 変分自由エネルギー。F = \mathbb{E}[E] - H という熱力学と同じ形になる
ホップフィールド(J. J. Hopfield)が1982年に提案した連想記憶から始めよう。そこから確率的な拡張(ボルツマンマシン)へ進み、そして壁にぶつかる。その壁を乗り越えるのが第14章の仕事になる。
ここから本書の背骨が始まる。第5節の学習則の導出が全体の要なので、ここは一行も飛ばさずに追ってほしい。
第1〜2節がホップフィールド・ネットワーク(決定的)、第3〜5節がボルツマンマシン(確率的)、第6〜8節が実用化の試みである。
第6節で我々は壁にぶつかる。そこで諦めた気持ちを覚えておいてほしい。第14章でその壁を迂回するとき、なぜあれほど手の込んだことをするのかが腑に落ちる。
Hinton の講義「Neural Networks for Machine Learning」の第11〜14回が、ちょうどこの章の内容にあたる。
1. 連想記憶とエネルギー関数
想起という問題
顔写真の一部が隠れていても、誰の顔か分かる。曲の断片を聞けば、続きが思い出せる。部分から全体を復元する—これが連想記憶(associative memory)である。
計算機の記憶とは性質が違う。計算機はアドレスを指定して読み出す。連想記憶は内容そのものを手がかりにする(content-addressable memory)。
ホップフィールド・ネットワーク
N 個のユニットからなるネットワークを考える。各ユニットの状態は s_i \in \{-1, +1\} とする。結合の重み w_{ij} には、次の二つを課す。
w_{ij} = w_{ji} \quad\textsf{(対称)}, \qquad w_{ii} = 0 \quad\textsf{(自己結合なし)}
対称性が決定的である。実際の脳の結合は対称でないので生物学的には不自然だが、これがあるおかげで次のエネルギー関数が定義できる。
E(\mathbf{s}) = -\frac{1}{2}\sum_{i,j} w_{ij} s_i s_j
更新規則は単純だ。ユニットを一つ選び、他のユニットからの入力の符号に合わせる。
s_i \leftarrow \mathrm{sgn}\left( \sum_j w_{ij} s_j \right)
エネルギーは必ず減る
定理。上の更新規則のもとで、E は減少するか、変わらないかのどちらかである。
証明。ユニット i を更新して、状態が s_i から s_i' に変わったとする。他のユニットは動かない。エネルギーの変化を計算する。
E の中で s_i を含む項だけを取り出そう。w_{ii} = 0 かつ w_{ij} = w_{ji} だから、s_i を含む項は -\frac{1}{2}\big(\sum_j w_{ij}s_i s_j + \sum_j w_{ji}s_j s_i\big) = -s_i \sum_j w_{ij}s_j である。したがって
\begin{aligned} \Delta E &= -\big(s_i' - s_i\big) \sum_j w_{ij}s_j &&\textsf{(} s_i \textsf{ を含む項の差)}\\ &= -\Delta s_i \cdot h_i, \qquad h_i \equiv \sum_j w_{ij}s_j &&\textsf{(局所場 } h_i \textsf{ と置いた)} \end{aligned}
ここで更新規則を使う。s_i' = \mathrm{sgn}(h_i) だから、s_i' と h_i は必ず同符号である。h_i = 0 のときは状態を変えない、と約束しておく(この約束がないと、エネルギーが変わらないまま状態が動き続けうる)。
- 状態が変わらなければ \Delta s_i = 0 で \Delta E = 0
- 状態が変われば、\Delta s_i = s_i' - s_i = 2s_i'(\pm 1 が反転するので)。すると \Delta E = -2 s_i' h_i < 0
どちらの場合も E は増えない。証明終わり。
E は有限個の状態しか取らず(2^N 通り)、しかも減り続けるのだから、有限回で止まる。止まった先が局所最小値である。
ここがポイント
対称結合のもとで、ホップフィールド・ネットワークの更新は必ずエネルギーを下げる。だから状態は必ずどこかの谷に落ちて止まる。第3章第6節の「アトラクターに落ちる」という比喩に、証明が与えられた。
記憶を埋め込む
では、覚えたいパターンを谷にするには、どう重みを決めればよいか。
覚えたいパターンを \boldsymbol{\xi}^{(1)}, \dots, \boldsymbol{\xi}^{(P)}(各成分は \pm 1)とする。ホップフィールドの提案は、ヘッブ則である。
w_{ij} = \frac{1}{N}\sum_{\mu=1}^{P} \xi_i^{(\mu)} \xi_j^{(\mu)}
「同じパターンで同符号のユニットどうしは、結合を強める」—一緒に発火する細胞は結びつく、というあの規則である。
なぜこれでうまくいくのか、確かめよう。パターン \boldsymbol{\xi}^{(1)} を初期状態にして、ユニット i への局所場を計算する。
\begin{aligned} h_i &= \sum_j w_{ij}\xi_j^{(1)} = \frac{1}{N}\sum_j \sum_\mu \xi_i^{(\mu)}\xi_j^{(\mu)}\xi_j^{(1)} \\ &= \underbrace{\frac{1}{N}\xi_i^{(1)}\sum_j \xi_j^{(1)}\xi_j^{(1)}}_{\mu=1 \textsf{ の項}} + \underbrace{\frac{1}{N}\sum_{\mu\ne1}\xi_i^{(\mu)}\sum_j \xi_j^{(\mu)}\xi_j^{(1)}}_{\textsf{クロストーク項}} \\ &= \xi_i^{(1)} + \textsf{(クロストーク)} &&\textsf{(} \xi_j^{(1)}\xi_j^{(1)}=1 \textsf{ が } N \textsf{ 個)} \end{aligned}
第一項が、覚えさせたパターンそのものである。クロストーク項が小さければ \mathrm{sgn}(h_i) = \xi_i^{(1)} となり、状態は変わらない—つまり \boldsymbol{\xi}^{(1)} は固定点である。
クロストーク項が問題になる。次節でこれを評価する。
この模型の来歴
ここで、名前について一言断っておきたい。
同じ構造は、ホップフィールドより十年ほど早く日本で提案されている。中野馨は1971〜72年にアソシアトロン(associatron)を発表した(Nakano 1972)。相互結合したしきい素子の集団にヘッブ則でパターンを刻み、部分から全体を想起させる—いま見た仕組みそのものである。ほぼ同時に甘利俊一が、しきい素子の自己組織的なネットワークとして同じ模型を定式化した(Amari 1972)。甘利の定式化はパターンの系列まで扱っており、静的なパターンの想起はその特別な場合になっている。
ではホップフィールド (1982) は何をしたのか。三つある。第一に、エネルギー関数を与えて想起を「谷へ落ちること」として捉え直した。第二に、記憶容量という量に着目し、記憶させるパターンをランダム化して容量を見積もった。第三に—これが波及の大きさとしては最大かもしれない—この定式化がスピングラスと同じ形をしていたために、多数の物理学者をこの分野に呼び込んだ。次節で見る 0.138N は、そうして入ってきた物理学者たちの手による結果である。
だから呼び名は一つに定まっていない。島崎 (2025) は甘利–ホップフィールドモデルと書く。英語圏でも先行性を認める議論は続いており、甘利自身が、物理学者アミットから「文献を調べた結果これは甘利–ホップフィールドのモデルと呼ぶべきだった」と詫びられた挿話を書き残している(甘利 2025)。
本書では、普及している「ホップフィールド・ネットワーク」「現代版ホップフィールド・ネットワーク」を使う。名前は検索と参照のための記号であって、功績の配分ではないからである。ただし誰が何をしたのかは、いま述べたとおりである。
2. 記憶容量
クロストークの見積もり
パターンがランダム(各成分が独立に \pm1 を等確率で取る)だとしよう。クロストーク項は
C_i = \frac{1}{N}\sum_{\mu\ne1}\xi_i^{(\mu)}\sum_j \xi_j^{(\mu)}\xi_j^{(1)}
内側の和 \sum_j \xi_j^{(\mu)}\xi_j^{(1)} は、独立な \pm1 を N 個足したものである。平均 0、分散 N のランダムウォークだ。
外側も同様に足し合わせると、C_i は平均 0、分散が
\mathrm{Var}[C_i] = \frac{1}{N^2}\cdot (P-1)\cdot N \approx \frac{P}{N}
となる。P 個のパターンを覚えるほど、クロストークが大きくなる。
誤りの確率
想起が失敗するのは、クロストークが第一項(大きさ 1)を打ち消すほど大きいときである。つまり C_i \xi_i^{(1)} < -1 のとき。
C_i が正規分布に近いとすれば、その確率は
P_{\text{error}} = \Phi\left(-\frac{1}{\sqrt{P/N}}\right) = \Phi\left(-\sqrt{\frac{N}{P}}\right)
\Phi は標準正規分布の累積分布関数である。
P/N が容量を決める。この比を負荷率 \alpha = P/N と呼ぶ。誤り率を 1% 以下に抑えたければ、標準正規分布の片側 1% 点が約 2.33 だから \sqrt{1/\alpha} \gtrsim 2.33、つまり \alpha \lesssim 0.185 となる。
相転移
より精密な解析(統計力学のレプリカ法による)では、臨界値 \alpha_c \approx 0.138 が知られている(Amit、Gutfreund、Sompolinsky 1985, 1987)。
そしてこの値の前後で、系の振る舞いが質的に変わる。
- \alpha < \alpha_c — 覚えたパターンの近くに安定な固定点がある。想起できる
- \alpha > \alpha_c — 固定点が壊れ、想起がまったくできなくなる
なだらかに劣化するのではなく、急激に壊れる。これは物理学でいう相転移である。
N = 1000 なら約138個。ユニット数に対して、覚えられるパターン数は思ったより少ない。一つのパターンが N ビットの情報を持つので、蓄えられるパターンの生のビット数は 0.138 N^2 程度—重みの数(N^2/2)と同じオーダーである。これは情報理論的な意味での厳密な容量ではなく、粗い見積もりである。
偽記憶
もう一つ厄介な問題がある。覚えさせていないパターンが、勝手に安定になる。
たとえば三つのパターンの「多数決」\mathrm{sgn}(\xi^{(1)} + \xi^{(2)} + \xi^{(3)}) は、しばしば安定な固定点になる。これを偽記憶(spurious memory)と呼ぶ。
エネルギー地形の言葉で言えば、覚えさせた谷の他に、意図しない谷ができてしまう。想起がそこに落ちると、見たことのないパターンが「思い出される」ことになる。
この問題は、次節以降の確率的な拡張への動機の一つになる。確率的に状態を更新すれば、浅い谷(偽記憶)からは抜け出せる可能性がある。
3. 必要な数学:ギブス分布と分配関数
決定的から確率的へ
ホップフィールド・ネットワークの更新は決定的だった。\mathrm{sgn}(h_i) で決まる。
これを確率的にする。局所場が正なら +1 になりやすいが、必ずそうなるとは限らない—という規則にする。
P(s_i = +1) = \sigma\left(\frac{2h_i}{T}\right) = \frac{1}{1 + e^{-2h_i/T}}
T は温度である。T \to 0 で決定的な規則に戻り、T \to \infty で完全にランダムになる。
なぜシグモイド関数なのか。天下りに見えるが、次に示すとおり、この形を選ぶと定常分布が美しい形になる。
ギブス分布
上の規則で長時間更新を続けると、状態の分布はどこへ落ち着くか。答えはギブス分布(ボルツマン分布)である。
p(\mathbf{s}) = \frac{1}{Z} e^{-E(\mathbf{s})/T}, \qquad Z = \sum_{\mathbf{s}'} e^{-E(\mathbf{s}')/T}
(以下、T = 1 と固定する。温度は E のスケールに吸収できる。)
確かめてみよう。詳細釣り合い(detailed balance)を示せばよい。状態 \mathbf{s} とそこからユニット i だけ反転した \mathbf{s}' の間で、
\frac{p(\mathbf{s}')}{p(\mathbf{s})} = e^{-(E(\mathbf{s}')-E(\mathbf{s}))} = e^{\Delta s_i \cdot h_i}
(第1節で \Delta E = -\Delta s_i h_i を示した。)一方、上の更新規則から遷移確率の比を計算すると、これと一致する。だからギブス分布が定常分布である。
読み方
p \propto e^{-E} という形を、言葉にしておこう。
エネルギーが低い状態ほど、出やすい。指数関数なので、エネルギーの差がわずかでも確率の比は大きく変わる。
そして逆に読むこともできる。分布が与えられたら、E = -\log p + \text{const} でエネルギーが定義できる。つまり「エネルギー関数を決めること」と「確率分布を決めること」は同じである。
この読み替えは、本書で三度使う。
- 本章 — ボルツマンマシンの定義
- 第15章第7節 — スコア \nabla_x\log p = -\nabla_x E。分配関数が微分で消える
- 第16章第2節 — 自由エネルギー F = \mathbb{E}_q[E] - H[q]
分配関数という厄介者
Z = \sum_{\mathbf{s}} e^{-E(\mathbf{s})} を分配関数と呼ぶ。確率の総和を 1 にするための規格化定数である。
そして、これが本章で我々を苦しめることになる。
N 個の二値ユニットなら、状態は 2^N 通りある。いまは「厄介そうだ」とだけ思っておいてほしい。
いまは「厄介そうだ」と思っておいてほしい。第6節で、これが具体的にどう学習を妨げるかを見る。
4. ボルツマンマシン
いま何をしようとしているかを、前節までとの関係で押さえておこう。第1〜2節のネットワークは決定的だった—更新規則に従って谷へ落ちる。第3節で温度を入れて確率的にした。ボルツマンマシンは、その確率版を「学習する生成モデル」として立て直したものである。島崎 (2025) の言い方を借りれば、ボルツマンマシンは連想記憶モデル(甘利–ホップフィールドモデル)を確率分布へ拡張したものにあたる。同じ結合行列 w_{ij} が、こんどは分布のパラメータとして働く。
表記をひとつ切り替える。第1〜2節では状態を s_i \in \{-1,+1\} と書いてきたが、本節以降のボルツマンマシンでは s_i \in \{0,1\} を使う。両者は s^{\pm} = 2s^{01}-1 で移り合うので中身は変わらないが、確率の式が簡潔になる。
隠れユニット
ホップフィールド・ネットワークでは、すべてのユニットが観測対象だった。ボルツマンマシンは、ここに隠れユニットを導入する。
\mathbf{s} = (\mathbf{v}, \mathbf{h})
\mathbf{v} が可視ユニット(データが入る)、\mathbf{h} が隠れユニット(自由に動く)である。
なぜ隠れユニットが要るのか。可視ユニットだけのモデルでは、エネルギー関数に二次の項(w_{ij}v_iv_j)しか置けないからである。誤解しやすいので補っておくと、これは「三次以上の相関がゼロになる」という意味ではない—二次の相互作用だけからでも高次のモーメントは生じる。制限されるのは分布の族のほうで、狙った高次の依存関係を柔軟に作ることができない。
隠れユニットを介せば、可視ユニット間に高次の相関を作れる。「h_1 が 1 のときは v_1, v_2, v_3 が揃う」というような構造が表現できる。
これは深層学習の「特徴」の原型である。隠れユニットは、データの背後にある要因を表す—第14章の潜在変数モデルへ、まっすぐつながる考え方だ。
モデルの定義
エネルギーはホップフィールドと同じ形で、状態を (\mathbf{v},\mathbf{h}) に広げる。
E(\mathbf{v},\mathbf{h}) = -\frac{1}{2}\sum_{i,j}w_{ij}s_i s_j - \sum_i b_i s_i
(バイアス項 b_i を加えた。)そして同時分布が
p(\mathbf{v},\mathbf{h}) = \frac{1}{Z}e^{-E(\mathbf{v},\mathbf{h})}
我々が興味あるのは可視ユニットの分布だから、隠れユニットを周辺化する。
p(\mathbf{v}) = \sum_{\mathbf{h}} p(\mathbf{v},\mathbf{h}) = \frac{1}{Z}\sum_{\mathbf{h}} e^{-E(\mathbf{v},\mathbf{h})}
第5章第1節で述べた「周辺化」がここに現れた。そして第14章では、この周辺化が計算できないことが変分推論の出発点になる。同じ困難が、形を変えて何度も現れる。
何を目指すのか
ボルツマンマシンの目標を、はっきりさせておこう。
データ \mathbf{v} が出やすくなるように、重み w_{ij} を調整する。つまり \log p(\mathbf{v}) を最大化する。
第5章第4節で見たとおり、これはモデル分布をデータ分布に KL の意味で近づけることと同じである。
\max_w \sum_{\mathbf{v}\in\text{data}} \log p_w(\mathbf{v}) \quad\Longleftrightarrow\quad \min_w\; \mathrm{KL}\big(p_{\text{data}} \,\|\, p_w\big)
どう調整するか。それが次節の主題である。
5. 学習則の導出 ── 正相と負相
さて、ボルツマンマシンという道具立てはできた。エネルギー E(s) を決めれば、状態 s の出る確率が p(s) = e^{-E(s)}/Z で決まる。だが肝心なことがまだできていない。重み w_{ij} をどう決めるのか。
やりたいことははっきりしている。手元にデータがある。そのデータが出やすくなるように重みを調整したい。つまり、データの対数尤度
\log p(s^{\text{data}}) = -E(s^{\text{data}}) - \log Z
を大きくする方向へ w_{ij} を動かせばよい。方針が立ったら、あとは微分するだけである。\partial/\partial w_{ij} を計算しよう。
右辺は2つの項に分かれている。第1項は易しく、第2項が厄介だ。順に片づける。
第1項。エネルギーは E(s) = -\frac{1}{2}\sum_{kl} w_{kl}s_k s_l だったから、w_{ij} で微分すれば s_i s_j が残るだけである。
-\frac{\partial E(s^{\text{data}})}{\partial w_{ij}} = s_i^{\text{data}} s_j^{\text{data}}
これは「データを見せたとき、ユニット i と j が同時に1になっているか」を表す量だ。頭の片隅に置いておいてほしい。後でここに戻ってくる。
第2項。Z = \sum_{s} e^{-E(s)} はすべての状態にわたる和だから、w_{ij} で微分すると全状態からの寄与が出てくる。慎重に追う。
\begin{aligned} -\frac{\partial \log Z}{\partial w_{ij}} &= -\frac{1}{Z}\frac{\partial Z}{\partial w_{ij}} &&\textsf{(}\log\textsf{ の微分)}\\ &= -\frac{1}{Z}\sum_{s} \frac{\partial}{\partial w_{ij}} e^{-E(s)} &&\textsf{(和と微分を入れ替え)}\\ &= -\frac{1}{Z}\sum_{s} e^{-E(s)}\left(-\frac{\partial E(s)}{\partial w_{ij}}\right) &&\textsf{(指数関数の微分)}\\ &= -\sum_{s} \underbrace{\frac{e^{-E(s)}}{Z}}_{=\,p(s)} \, s_i s_j &&\textsf{(第1項と同じ計算。そして }e^{-E(s)}/Z\textsf{ が現れた)}\\ &= -\big\langle s_i s_j \big\rangle_{\text{model}} &&\textsf{(}p(s)\textsf{ による期待値、と読める)} \end{aligned}
4行目で何が起きたかに注目してほしい。e^{-E(s)}/Z という組み合わせが、計算の途中でひとりでに現れた。これはまさにモデルが定める確率 p(s) である。だから最後の行は「s_i s_j をモデル自身の分布で平均したもの」と読める。\langle\cdot\rangle_{\text{model}} はその平均を表す記号だ。
2つを合わせると、学習則はこうなる。
\frac{\partial \log p(s^{\text{data}})}{\partial w_{ij}} = \underbrace{\big\langle s_i s_j \big\rangle_{\text{data}}}_{\textsf{正相}} - \underbrace{\big\langle s_i s_j \big\rangle_{\text{model}}}_{\textsf{負相}}
(データが複数あるときは、第1項をデータ全体で平均して \langle\cdot\rangle_{\text{data}} と書いた。)
ここがポイント
学習は「データを見せたときの相関」から「モデルが勝手に生み出す相関」を引いた差で進む。差がゼロになったら学習は止まる。つまりボルツマンマシンのゴールは、自分が生み出す世界の相関構造を、見せられた世界の相関構造に一致させることである。
この式の形を、しばらく眺めてほしい。第1項はヘッブ則そのものである。「一緒に発火する細胞は結合が強まる」—神経科学が経験的に見出した規則が、対数尤度を上げるという純粋に統計的な要求から出てきた。これは偶然ではない。第14章で自由エネルギーの話をするとき、同じ構造がもう一度現れる。
では第2項は何なのだろうか。データを見せずに、モデルを勝手に走らせたときの相関である。放っておくと勝手に強くなってしまう結合を引き算して抑える、いわば忘却の項だ。そしてこれが、次節で我々を苦しめることになる。
この学習則には、もう一つの読み方がある。ボルツマンマシンの確率分布は、s_i s_j を統計量とする指数型分布族である—第3節のギブス分布が、まさにその形をしていた。すると学習は「データが定める部分空間へ、モデルを射影する」操作として書ける。この見方を整えたのが Amari, Kurata & Nagaoka (1992) の情報幾何による定式化で、正相と負相は二種類の射影に対応する。本書では第11章で計量を、第16章で自由エネルギーを扱うが、そのどちらもここに根を持っている。いま導いた一本の式は、幾何の言葉に翻訳できる形をしていた、ということである。
ユニットが3個(s_1,s_2,s_3 \in \{0,1\})の小さなボルツマンマシンを考えよう。状態は 2^3 = 8 通りしかないので、Z を全部足せる。紙の上でもできるが、コードは コード/07_boltzmann.py にある。
w_{13}=w_{23}=0、バイアスもゼロにして、w_{12} だけを動かす。
import itertools
def moments(w12, w13=0.0, w23=0.0, b=(0.0, 0.0, 0.0)):
states = list(itertools.product([0, 1], repeat=3))
E = np.array([-(w12*s[0]*s[1] + w13*s[0]*s[2]
+ w23*s[1]*s[2] + b[0]*s[0]
+ b[1]*s[1] + b[2]*s[2])
for s in states])
p = np.exp(-E)
Z = p.sum() # 8項を全部足すだけ
p = p/Z
s1s2 = sum(pi*s[0]*s[1]
for pi, s in zip(p, states))
return Z, s1s2近似が一つも入っていないことに注目してほしい。状態が8通りしかないので、Z を定義どおり足せる。ユニットが100個あればこれが 2^{100} 項になり、第6節のサンプリングが要る。
| w_{12} | -2 | -1 | 0 | 1 | 2 | 3 | 5 |
|---|---|---|---|---|---|---|---|
| Z | 6.27 | 6.74 | 8.00 | 11.44 | 20.78 | 46.17 | 302.83 |
| \langle s_1 s_2\rangle_{\text{model}} | 0.043 | 0.109 | 0.250 | 0.475 | 0.711 | 0.870 | 0.980 |
w_{12}=0 のとき Z=8(2^3)で \langle s_1 s_2\rangle = 1/4—独立な公平コイン2枚である。当然の答えが出ることを、まず確かめてほしい。
そしてw_{12} を上げると \langle s_1 s_2\rangle は単調に増える。これが「学習が収束する」ことの保証になる理由を考えてほしい。学習則は \Delta w_{12} \propto \langle s_1 s_2\rangle_{\text{data}} - \langle s_1 s_2\rangle_{\text{model}} だった。目標より小さければ w が上がり、w が上がれば \langle s_1 s_2\rangle も上がる—負のフィードバックである。
6. なぜ難しいのか ── 分配関数という壁
前節で導いた学習則は美しかった。だが、計算できるだろうか。
正相は易しい
\langle s_i s_j\rangle_{\text{data}} は、データを見せたときの相関である。可視ユニットの値はデータで決まっているのだから、これは数えるだけで求まる。
隠れユニットがある場合は少し手間が増える。\langle s_i s_j\rangle_{\text{data}} は「可視ユニットをデータに固定したときの、隠れユニットの条件付き分布での期待値」になる。それでも可視ユニットが固定されているぶん、扱いやすい。
負相が計算できない
問題は \langle s_i s_j\rangle_{\text{model}} である。定義を書き下すと、
\big\langle s_i s_j \big\rangle_{\text{model}} = \sum_{\mathbf{s}} p(\mathbf{s})\, s_i s_j = \frac{1}{Z}\sum_{\mathbf{s}} e^{-E(\mathbf{s})} s_i s_j
すべての状態にわたる和である。N 個の二値ユニットなら 2^N 項。
数字を入れてみよう。N = 100 なら 2^{100} \approx 1.3\times 10^{30} 項。仮に1兆項を1秒で足せる計算機があっても、4\times10^{10} 年—宇宙の年齢より長い。
これが分配関数の壁である。
MCMC で近似する
厳密に足せないなら、サンプリングで近似すればよい。p(\mathbf{s}) から M 個サンプルして平均を取る。
\big\langle s_i s_j\big\rangle_{\text{model}} \approx \frac{1}{M}\sum_{m=1}^{M} s_i^{(m)} s_j^{(m)}
では p(\mathbf{s}) からどうやってサンプルするのか。Z が計算できないのに。
ここでマルコフ連鎖モンテカルロ法(MCMC)が使える。比が計算できれば十分だからである。第3節で見たとおり、
\frac{p(\mathbf{s}')}{p(\mathbf{s})} = e^{-(E(\mathbf{s}')-E(\mathbf{s}))}
Z が約分されて消えた。だから遷移確率を決めるのに Z は要らない。
ギブスサンプリングを使おう。ユニットを一つずつ選び、他のユニットの値を固定して条件付き分布からサンプルする。
P(s_i = 1 \mid \mathbf{s}_{-i}) = \sigma\!\left(\sum_j w_{ij}s_j + b_i\right)
これは第3節の確率的更新規則そのものである。十分長く回せば、ギブス分布からのサンプルが得られる。
それでも遅い
原理的には解決した。だが実用にならない。
問題は「十分長く」の部分である。マルコフ連鎖が定常分布に到達するまでの時間(緩和時間)は、エネルギー地形の形に依存する。
そして深い谷がいくつもある地形では、絶望的に遅くなる。一つの谷に落ちると、そこから抜け出すには高いエネルギー障壁を越えねばならず、その確率は e^{-\Delta E} で指数的に小さい。モードからモードへ移るのに、天文学的な時間がかかりうる。
そして学習の各ステップで、これをやり直さねばならない。重みが変わればエネルギー地形も変わるからだ。
ボルツマンマシンは、理論的には美しく、実用的には遅すぎた。1980年代に提案されながら、長く実用にならなかった理由がこれである。
ここがポイント
分配関数 Z は、比を取れば消える(MCMC が使える)。だが MCMC の収束が遅い。これがボルツマンマシンの実用化を阻んだ壁である。
この壁を覚えておいてほしい。第14章では、まったく違う方法—変分法による迂回—でこの困難に立ち向かうことになる。
7. 制限ボルツマンマシンと contrastive divergence
構造を制限する
Smolensky と Hinton らの解決策は、ネットワークの構造を制限することだった。
制限ボルツマンマシン(restricted Boltzmann machine, RBM)では、可視層内・隠れ層内の結合を禁止する。可視と隠れの間だけを結ぶ—二部グラフである。
E(\mathbf{v},\mathbf{h}) = -\sum_{i,j} v_i w_{ij} h_j - \sum_i a_i v_i - \sum_j b_j h_j
何が嬉しいのか
条件付き独立性が成り立つ。
可視ユニットを固定すると、隠れユニットどうしは直接つながっていないので、互いに独立になる。
p(\mathbf{h}\mid\mathbf{v}) = \prod_j p(h_j \mid \mathbf{v}), \qquad p(h_j = 1\mid \mathbf{v}) = \sigma\!\left(\sum_i v_i w_{ij} + b_j\right)
逆も同様である。
p(v_i = 1 \mid \mathbf{h}) = \sigma\!\left(\sum_j w_{ij}h_j + a_i\right)
これは大きい。一般のボルツマンマシンでは、ユニットを一つずつ更新するしかなかった。RBM なら層ごとに一斉に更新できる。ギブスサンプリングが劇的に速くなる。
\mathbf{v} \to \mathbf{h} \to \mathbf{v}' \to \mathbf{h}' \to \cdots
これを交互ギブスサンプリングと呼ぶ。
Contrastive Divergence
それでも、定常分布に到達するには何度も往復せねばならない。Hinton の提案は、大胆な近似だった。
1回だけ往復して、そこで打ち切る。
これが contrastive divergence(CD-1)である。
- データ \mathbf{v}^{(0)} から \mathbf{h}^{(0)} \sim p(\mathbf{h}\mid\mathbf{v}^{(0)}) をサンプル
- \mathbf{v}^{(1)} \sim p(\mathbf{v}\mid\mathbf{h}^{(0)}) をサンプル
- \mathbf{h}^{(1)} \sim p(\mathbf{h}\mid\mathbf{v}^{(1)}) をサンプル
- 更新: \Delta w_{ij} \propto \langle v_i h_j\rangle^{(0)} - \langle v_i h_j\rangle^{(1)}
正相は 0 ステップ目、負相は 1 ステップ目から取る。
なぜこれで動くのか
厳密には、これは対数尤度の勾配ではない。定常分布に達していないのだから、\langle\cdot\rangle^{(1)} \ne \langle\cdot\rangle_{\text{model}} である。
だが実用上はよく機能する。直感的な説明はこうだ—学習の目的は「データの相関」と「モデルの相関」を一致させることだった。ならば、データから1ステップ動かしたときに分布が変わらなければ、それは定常状態に近い。「動かしても変わらない」ことを目指せばよい。
CD が最小化しているのは、対数尤度ではなく別の量(二つの KL の差)だと解析されている。それでも、実務的には十分な近似だった。
ここには教訓がある。理論的に正当化しきれない近似でも、動くなら使う—深層学習の発展には、この種の判断が繰り返し現れる。理論が後から追いつくこともあれば、追いつかないこともある。
8. 深層信念ネットワーク
積み上げる
RBM が学習できるようになると、次の発想が出てくる。積み重ねたらどうか。
第一の RBM を、データ \mathbf{v} で学習する。すると隠れ層 \mathbf{h}^{(1)} が、データの特徴を表すようになる。
その \mathbf{h}^{(1)} を、次の RBM の「データ」として使う。そうして \mathbf{h}^{(2)} を学習する。以下同様。
これが貪欲層別事前学習(greedy layer-wise pretraining)であり、得られるのが深層信念ネットワーク(deep belief network, DBN)である。
なぜこれが重要だったか
2006年当時、深いネットワークを勾配降下法だけで学習することは困難だった。勾配消失の問題があったからである(第8章第6節)。層を深くすると、下層まで勾配が届かない。
DBN の事前学習は、この困難を回避した。
- まず教師なしで層ごとに RBM を学習し、重みを良い初期値に持っていく
- そのあと教師あり学習で全体を微調整(fine-tuning)する
この二段構えが、深いネットワークを実用的にした。Hinton らの2006年の一連の論文が、深層学習ブームの直接的な引き金になったと言ってよい。
そして役目を終える
ただし、この手法自体は現在ほとんど使われていない。
その後の展開—ReLU の導入、より良い初期化法(Xavier/He)、バッチ正規化、そして何より計算資源とデータ量の増大—によって、事前学習なしで深いネットワークが学習できるようになったからである。
歴史的な役割は大きかったが、技術としては置き換えられた。
何が残ったか
だが、DBN が残したものは二つある。
第一に、教師なし事前学習という発想。大量のラベルなしデータで表現を学び、少量のラベルつきデータで課題に適応させる—この構図は、現代の基盤モデルの事前学習と微調整に、そのまま生き延びている。
第二に、オートエンコーダへの道。RBM を「入力を圧縮して復元する」装置と見れば、それはオートエンコーダである。Hinton と Salakhutdinov (2006) は、積み上げた RBM で次元削減ができることを示した。そしてオートエンコーダは、第14章の VAE へまっすぐつながる。
次章と、その先へ
本章では、エネルギー関数という道具を立て、学習則を導き、そして分配関数の壁にぶつかった。
次章では、この壁を迂回する。エネルギー関数も分配関数も捨て、入力から出力への決定的な写像を作り、連鎖律で勾配を計算する—バックプロパゲーションである。うまくいく。だが捨てたものもある:世界の確率モデルを内に持つという性格である。
そして第14章で、我々はこの壁に正面から挑む。変分法という別の登り方で、確率モデルを保ったまま学習できるようにする。そのとき本章の正相・負相が、Wake 相・Sleep 相として姿を変えて再登場する。
本章の伏線は、そこまで届いている。
確認問題
[導出]ホップフィールド・ネットワークで、更新のたびにエネルギーが減少することを証明せよ。証明のどこで対称性 w_{ij}=w_{ji} が使われるか。(第1節)
[導出]ヘッブ則 w_{ij} = \frac{1}{N}\sum_\mu \xi_i^{(\mu)}\xi_j^{(\mu)} のもとで、記憶パターン \boldsymbol{\xi}^{(1)} が近似的に固定点になることを、局所場を計算して示せ。(第1節)
[導出]クロストーク項の分散が P/N 程度になることを見積もれ。(第2節)
[確認]ギブス分布 p \propto e^{-E} から、「エネルギーを決めること」と「確率分布を決めること」が同じである理由を述べよ。(第3節)
[確認]学習則の正相と負相のうち、なぜ負相だけが計算困難なのかを述べよ。(第5節・第6節)
[導出]制限ボルツマンマシンで、隠れユニットが条件付き独立になる理由を、エネルギー関数の形から説明せよ。(第7節)
[考える]Contrastive divergence が対数尤度の厳密な勾配でない理由と、それでも機能する直感的な説明を述べよ。(第7節)
[考える]深層信念ネットワークの貪欲層別事前学習が、2006年当時なぜ重要だったか。またなぜ現在は使われないか。(第8節)
参考文献
- Hopfield, J. J. (1982) Neural networks and physical systems with emergent collective computational abilities. PNAS — エネルギー関数と記憶容量[1節・2節]
- Nakano, K. (1972) Associatron—A model of associative memory. IEEE Trans Syst Man Cybern — 同じ連想記憶の、十年早い提案[1節]
- Amari, S.-I. (1972) Learning patterns and pattern sequences by self-organizing nets of threshold elements. IEEE Trans Comput — 同上。パターンの系列まで扱っている[1節]
- 甘利俊一 (2025)『脳・心・人工知能〈増補版〉』講談社 — 当事者による経緯[1節]。読み物として面白い
- 島崎秀昭 (2025) 高次相関をめぐる冒険:甘利俊一先生の京都賞受賞に寄せて.『日本神経回路学会誌』32(4) — 連想記憶からボルツマンマシンへの拡張を情報幾何から見通す[1節・4節]
- Amit, D. J., Gutfreund, H. & Sompolinsky, H. (1985, 1987) — 記憶容量 0.138N の出典[2節]。統計力学の道具が要る
- Ackley, D. H., Hinton, G. E. & Sejnowski, T. J. (1985) A learning algorithm for Boltzmann machines. Cogn Sci — 正相・負相の原典[5節]
- Amari, S.-I., Kurata, K. & Nagaoka, H. (1992) Information geometry of Boltzmann machines. IEEE Trans Neural Netw — 学習則を射影として読み直す[5節]。第11章・第16章への橋
- Hinton, G. E., Osindero, S. & Teh, Y.-W. (2006) A fast learning algorithm for deep belief nets. Neural Comput — 深層信念ネットワーク[8節]
- Hinton, G. E. Neural Networks for Machine Learning 講義 11–14 — スライドが分かりやすい
- Nakazawa, K. et al. (2002) Requirement for hippocampal CA3 NMDA receptors in associative memory recall. Science — パターン補完の実験[コラム C7]