14  生成モデル I ── 見えない原因を推論する

第7章で、我々は壁にぶつかったまま先へ進んだ。

ボルツマンマシンの学習則は美しかった。正相から負相を引く。データの相関にモデルの相関を近づける。だが負相の計算に、すべての状態にわたる和が要る。ユニットが100個あれば 2^{100} 通り。宇宙の年齢をかけても終わらない。分配関数 Z という壁である。

第8章では、この壁を迂回した。エネルギー関数も分配関数も捨て、入力から出力への決定的な写像を作り、連鎖律で勾配を計算する—バックプロパゲーションである。うまくいった。だが捨てたものもある。ボルツマンマシンが持っていた「世界の確率的なモデルを内に持つ」という性格が失われた。生成できないのである。

本章はその壁に、正面から挑む。ただし壁を破るのではなく、別の登り方をする。

鍵となる発想はこうだ—真の事後分布が計算できないなら、計算できる分布で近似し、近似の良さを測る量を最大化すればよい。これを変分推論と呼ぶ。そしてこの発想が、ヘルムホルツマシンを経て VAE に至り、最終的には第16章の自由エネルギー原理そのものになる。

ヒント本章のガイド

第3節の導出が本章の心臓部である。たった数行で、対数尤度が「下界」と「KL ダイバージェンス」の和に分解される。この一本の式が、本章のすべてであり、そして第16章のすべてでもある。符号を反転させると変分自由エネルギーになる。ここだけは飛ばさないでほしい。

第1〜2節は準備、第4〜5節が歴史的な系譜(EM とヘルムホルツマシン)、第6〜8節が現代的な実装(VAE)である。

急ぐなら第3節と第6節だけでもよい。ただし第5節の Wake-Sleep は、第7章の正相・負相と対応しているので、そこの気持ちよさは味わってほしい。


1. 潜在変数モデル

見えるものと見えないもの

手元にデータ x がある。顔写真だとしよう。この写真がどう生成されたかを、我々はモデル化したい。

素朴には p(x) を直接モデル化すればよさそうだが、これは難しい。顔写真の空間は膨大で、その中で「顔らしい」画像が占める領域はごく一部の複雑な形をしている。それを直接書き下すのは無理がある。

発想を変える。顔写真の背後には、目に見えない要因があるはずだ。人物の同一性、表情、顔の向き、照明の方向。これらを潜在変数 z と呼ぼう。z が決まれば、そこから写真 x を生成するのは(比較的)易しい。

p_\theta(x) = \int p_\theta(x \mid z)\, p(z)\, dz

これが潜在変数モデルである。p(z) は潜在変数の事前分布(たとえば標準正規分布)、p_\theta(x\mid z) は生成過程(デコーダ)、\theta はパラメータである。

構造をよく見てほしい。単純な分布 p(z) を、写像 p_\theta(x\mid z) を通して押し出すことで、複雑な分布 p_\theta(x) を作っている。第15章で扱うフローも拡散モデルも、根っこは同じ発想である。

二つの向き

潜在変数モデルには、二つの方向がある。

生成(generation)—z から x を作る。p_\theta(x\mid z) で記述される。トップダウンの向きである。

認識(recognition)または推論(inference)—x から z を推定する。p_\theta(z \mid x) で記述される。ボトムアップの向きである。

そして脳の話をするなら、この二つが視覚皮質の二つの経路に対応する、という見立てが自然に出てくる。網膜から高次野へ向かうフィードフォワード経路が認識、高次野から低次野へ戻るフィードバック経路が生成—という対応である。第16章の予測符号化で、この見立てを具体的な回路として扱う。

なぜ難しいのか

さて、\theta を学習したい。最尤法でいくなら \log p_\theta(x) を最大化すればよい。

\log p_\theta(x) = \log \int p_\theta(x\mid z) p(z)\, dz

この積分が計算できない。z が高次元なら、数値積分は絶望的である。

ベイズの定理を使って事後分布を書くこともできる。

p_\theta(z \mid x) = \frac{p_\theta(x\mid z)\, p(z)}{p_\theta(x)}

だが分母に、まさに計算できない p_\theta(x) が出てくる。事後分布も計算できない。

第7章の分配関数 Z と、同じ構造の困難である。あのときも「すべての状態にわたる和」が壁になった。今度は「すべての潜在変数にわたる積分」が壁になっている。

ここがポイント

潜在変数モデルの困難は一点に集約される—周辺尤度 p_\theta(x) = \int p_\theta(x\mid z)p(z)dz が計算できない。だから事後分布 p_\theta(z\mid x) も計算できない。第7章の分配関数と同じ形の壁である。


2. 必要な数学:変分法の最小限

「変分」という言葉が出てくるので、最小限の説明をしておく。といっても、本章で必要なのは発想だけであって、変分法の技術はほとんど使わない。

汎関数と変分

普通の関数は、数を受け取って数を返す。f(x) = x^2 のように。

汎関数(functional)は、関数を受け取って数を返す。たとえば

H[q] = -\int q(z) \log q(z)\, dz

はエントロピーであり、確率密度関数 q を受け取って数を返す。[\;] で書くのは、引数が関数であることを示す慣習である。

普通の最適化では、f(x) を最小にする x を探す。変分法では、H[q] を最小(最大)にする関数 q を探す。これが「変分」の意味である。

本章での使い方

我々がやろうとしているのは、こうである。

真の事後分布 p_\theta(z\mid x) は計算できない。そこで扱いやすい分布の族(たとえばガウス分布の族)を用意し、その中でいちばん近いものを探す。「分布の族の中で最適なものを探す」—これが変分推論であり、関数を探しているから「変分」なのである。

技術的な変分法(オイラー・ラグランジュ方程式など)は使わない。実際には q をパラメータで表して(q_\phi と書く)、\phi について普通に微分するだけである。だから身構える必要はない。

イェンセンの不等式

一つだけ道具を思い出しておく。第5章で使ったイェンセンの不等式である。

f が凹関数のとき、

f\big(\mathbb{E}[X]\big) \ge \mathbb{E}\big[f(X)\big]

\log は凹関数だから、

\log \mathbb{E}[X] \ge \mathbb{E}[\log X]

「対数の期待値」を「期待値の対数」で上から抑えられる—逆に言えば、\log を期待値の中に入れると値が下がる。次節でこれを使う。


3. 変分下界(ELBO)の導出

導出そのものは数行で終わる。だが一行ずつ、何をしているかを確かめながら進みたい。

何をしたいか

計算できない \log p_\theta(x) を、計算できる何かで下から抑えたい。下界が手に入れば、それを代理の目的関数として最大化できる。届かない山の高さの代わりに、確実に届く足場の高さを上げていく—そういう戦略である。

ただし、下界を上げれば元の量も必ず上がる、というわけではない。 下界と本体の差(あとで見るとおり KL ダイバージェンスである)も同時に動くからだ。両者の関係は次項で厳密に書き下す。そこがこの節の要点になる。

そのために、任意の確率分布 q(z) を導入する。どんな分布でもよいというのが要点だ(後で「扱いやすい族」に制限するが、いまは任意である)。

導出その一 ── イェンセンを使う

\begin{aligned} \log p_\theta(x) &= \log \int p_\theta(x, z)\, dz &&\textsf{(同時分布で書いた)}\\ &= \log \int q(z)\, \frac{p_\theta(x,z)}{q(z)}\, dz &&\textsf{(} q(z) \textsf{ を掛けて割った。値は変わらない)}\\ &= \log\, \mathbb{E}_{q(z)}\!\left[ \frac{p_\theta(x,z)}{q(z)} \right] &&\textsf{(積分を } q \textsf{ による期待値と読む)}\\ &\ge \mathbb{E}_{q(z)}\!\left[ \log \frac{p_\theta(x,z)}{q(z)} \right] &&\textsf{(イェンセンの不等式。} \log \textsf{ を中に入れた)} \end{aligned}

最後の量を \mathcal{L}(q,\theta) と書き、変分下界(variational lower bound)あるいは ELBO(evidence lower bound)と呼ぶ。

\mathcal{L}(q, \theta) = \mathbb{E}_{q(z)}\!\left[ \log \frac{p_\theta(x,z)}{q(z)} \right]

第二行の操作に注目してほしい。q(z) を掛けて割るという、それ自体は何もしていない変形である。だがこれによって積分が期待値の形になり、イェンセンが使えるようになった。「何もしない操作」が道を開く—数学ではよくあることだ。

導出その二 ── 差を測る

下界であることは分かった。だがどれだけ緩い下界なのかが知りたい。等号はいつ成り立つのか。

そこで、別の道筋で同じ量に到達してみる。今度は不等式を使わない。

\begin{aligned} \log p_\theta(x) &= \int q(z) \log p_\theta(x)\, dz &&\textsf{(} \log p_\theta(x) \textsf{ は } z \textsf{ によらない定数。} \int q = 1 \textsf{ を使った)}\\ &= \int q(z) \log \frac{p_\theta(x,z)}{p_\theta(z\mid x)}\, dz &&\textsf{(ベイズの定理 } p_\theta(x) = p_\theta(x,z)/p_\theta(z\mid x)\textsf{)}\\ &= \int q(z) \log \frac{p_\theta(x,z)}{q(z)} \cdot \frac{q(z)}{p_\theta(z\mid x)}\, dz &&\textsf{(} q(z) \textsf{ を掛けて割った。また同じ手)}\\ &= \underbrace{\int q(z) \log \frac{p_\theta(x,z)}{q(z)}\, dz}_{= \,\mathcal{L}(q,\theta)} \;+\; \underbrace{\int q(z) \log \frac{q(z)}{p_\theta(z\mid x)}\, dz}_{= \,\mathrm{KL}\big(q(z) \,\|\, p_\theta(z\mid x)\big)} &&\textsf{(} \log \textsf{ の積を和に分けた)} \end{aligned}

きれいな形が出た。

\log p_\theta(x) = \mathcal{L}(q,\theta) + \mathrm{KL}\big(q(z) \,\|\, p_\theta(z \mid x)\big)

この関係を図にすると 図 1 になる。

図 1: 対数尤度が下界と KL ダイバージェンスの和に分かれる関係(模式)。天井の高さ log p(x) は近似分布 q の選び方によらず一定である。だから下界を押し上げることと、KL を小さくして事後分布への近似を良くすることは、同じ一つの作業になる。

この一行が語ること

しばらく眺めてほしい。この式は三つのことを同時に言っている。

第一に、なぜ \mathcal{L} が下界なのか。KL ダイバージェンスは常に 0 以上である。だから \log p_\theta(x) \ge \mathcal{L}。イェンセンを使わなくても下界性が出た。

第二に、緩みの正体。下界と真の値の差は、ちょうど「近似分布 q と真の事後分布 p_\theta(z\mid x) の KL ダイバージェンス」である。q が真の事後分布に一致すれば KL はゼロになり、等号が成り立つ。

第三に—これがいちばん大事なのだが—左辺は q に依存しない。

\log p_\theta(x) は、q をどう選ぼうと変わらない。\theta だけで決まる量である。すると右辺の二項は、q を動かしたとき足して一定でなければならない。つまり

\underbrace{\mathcal{L}\ \text{を上げる}}_{\textsf{下界を押し上げる}} \quad\Longleftrightarrow\quad \underbrace{\mathrm{KL}\ \text{が下がる}}_{\textsf{近似が良くなる}}

下界を最大化することは、事後分布の近似を良くすることと同じである。二つの目的—「尤度を上げたい」と「事後分布を近似したい」—が、一つの量 \mathcal{L} の最大化に統合された。これが変分推論の核心である。

ここがポイント

\log p_\theta(x) = \mathcal{L}(q,\theta) + \mathrm{KL}\big(q \,\|\, p_\theta(z\mid x)\big) 左辺は q によらない。だから \mathcal{L} を上げることと、事後分布への近似を良くすることは、同じ一つの作業である。そして q が真の事後分布に一致したとき、\mathcal{L}\log p_\theta(x) に等しくなる。

ELBO の二通りの書き方

実装のために、\mathcal{L} を分解しておく。p_\theta(x,z) = p_\theta(x\mid z)p(z) を代入すると、

\begin{aligned} \mathcal{L}(q,\theta) &= \mathbb{E}_{q}\left[\log \frac{p_\theta(x\mid z)\, p(z)}{q(z)}\right] \\ &= \mathbb{E}_{q}\big[\log p_\theta(x\mid z)\big] + \mathbb{E}_q\left[\log \frac{p(z)}{q(z)}\right] &&\textsf{(} \log \textsf{ の積を分けた)}\\ &= \underbrace{\mathbb{E}_{q}\big[\log p_\theta(x\mid z)\big]}_{\textsf{再構成項}} - \underbrace{\mathrm{KL}\big(q(z)\,\|\,p(z)\big)}_{\textsf{正則化項}} \end{aligned}

この形が実装で使われる。二つの項には、はっきりした役割がある。

再構成項は「q から z をサンプルして x を再構成したとき、どれだけうまく再構成できるか」。大きいほどよい。

正則化項は「q が事前分布 p(z) からどれだけ離れているか」。離れすぎるとペナルティになる。

つまり ELBO の最大化とは、「よく再構成できて、かつ事前分布から離れすぎない q を探す」という作業である。オートエンコーダの目的関数に、正則化がついた形—第6節でこれがそのまま VAE になる。


4. EM アルゴリズム

変分下界の枠組みは、実は古くから知られていた特別な場合を含んでいる。EM アルゴリズムである。

二段階の交互最適化

\mathcal{L}(q,\theta)q\theta の二つの引数を持つ。ならば、片方を固定してもう片方を最適化する、を交互に繰り返せばよい。

E ステップ(expectation)— \theta を固定して、q について \mathcal{L} を最大化する。

前節で見たとおり、\mathcal{L} が最大になるのは \mathrm{KL}(q\|p_\theta(z\mid x)) = 0 のとき、つまり

q(z) = p_\theta(z \mid x)

のときである。事後分布が計算できるなら、E ステップの答えは「事後分布そのものを取る」という一手で終わる。

M ステップ(maximization)— q を固定して、\theta について \mathcal{L} を最大化する。

\mathcal{L} = \mathbb{E}_q[\log p_\theta(x,z)] + H[q] と書けて、第二項は \theta によらない。だから

\theta \leftarrow \arg\max_\theta\; \mathbb{E}_{q(z)}\big[\log p_\theta(x,z)\big]

を解けばよい。完全データ(xz が両方見えている状態)の対数尤度の期待値を最大化する、という形になっている。混合ガウスモデルなどでは、これが閉じた形で解ける。

なぜ収束するのか

E ステップでも M ステップでも \mathcal{L} は増加する(少なくとも減らない)。そして \mathcal{L} \le \log p_\theta(x) である。単調増加で上に有界だから収束する—EM の収束保証は、変分下界の枠組みから一行で出る。

E ステップの後は \mathcal{L} = \log p_\theta(x) なので、M ステップで \mathcal{L} を上げれば \log p_\theta(x) も上がる。だから対数尤度も単調に増加する。

EM が使えなくなるとき

E ステップの「事後分布そのものを取る」という一手は、事後分布が計算できるときにしか使えない。第1節で見たとおり、深層の非線形なモデルでは計算できない。

だから一般の場合には、q を「扱いやすい族」に制限して、その中で最善のものを探すことになる。KL はゼロにならないが、できるだけ小さくする。これが変分ベイズである。EM は「族が全分布のとき」の特別な場合だったわけだ。

そして次節から、この q の作り方をめぐる歴史が始まる。


5. ヘルムホルツマシンと Wake-Sleep

ヘルムホルツの発想

19世紀、ヘルムホルツは知覚について印象的な主張をした。知覚とは無意識的推論である(unbewusster Schluss)。

網膜に映るのは二次元の像にすぎない。だが我々は三次元の世界を見る。それは網膜像から世界を「推論」しているからだ、という考えである。錯視が起きるのは、その推論が(普段は正しいが、特殊な状況では)誤るからだ、と説明できる。

この見方を、前節までの言葉に翻訳しよう。世界の状態が z、感覚入力が x である。世界は p(z) に従い、そこから感覚が p(x\mid z) で生じる。知覚とは p(z\mid x) を求めることである。

つまりヘルムホルツは、150年前に潜在変数モデルの逆問題を提起していた。

ヘルムホルツマシン

Dayan、Hinton、Neal、Zemel (1995) は、この発想を計算モデルにした。ヘルムホルツマシンである。

アイデアは単純だが強力である。認識のためのネットワークを、別に用意してしまう。

  • 生成モデル p_\theta(x \mid z) — トップダウン結合。z から x を作る
  • 認識モデル q_\phi(z \mid x) — ボトムアップ結合。x から z を推定する

前節までの q は、データ点ごとに毎回最適化する対象だった。ヘルムホルツマシンでは、q をネットワークで表し、そのパラメータ \phi を学習する。一度学習してしまえば、新しい x に対しても一回のフォワード計算で q_\phi(z\mid x) が得られる。

この工夫を償却推論(amortized inference)と呼ぶ。推論のコストを、事前の学習に「前払い」しておくわけである。

Wake-Sleep アルゴリズム

では \theta\phi をどう学習するか。Hinton, Dayan, Frey, Neal (1995) の Wake-Sleep アルゴリズムは、二つの相を交互に回す。

Wake 相(覚醒)。実データ x を取ってくる。認識モデルで z \sim q_\phi(z\mid x) をサンプルする。そして生成モデル \theta を更新する—\log p_\theta(x\mid z) を上げる方向へ。

「見たものを、自分でも作れるようになる」段階である。

Sleep 相(睡眠)。今度は実データを使わない。生成モデルから夢を見るz \sim p(z)x \sim p_\theta(x\mid z) とサンプルする。この (x, z) のペアは、z が既知である。だから認識モデル \phi を教師あり学習で更新できる—\log q_\phi(z\mid x) を上げる方向へ。

「自分が作ったものを、正しく認識できるようになる」段階である。

第7章との対応

ここで、第7章第5節を思い出してほしい。ボルツマンマシンの学習則はこうだった。

\frac{\partial \log p}{\partial w_{ij}} = \underbrace{\langle s_i s_j\rangle_{\text{data}}}_{\textsf{正相}} - \underbrace{\langle s_i s_j\rangle_{\text{model}}}_{\textsf{負相}}

正相はデータを見せたときの相関、負相はモデルを自由に走らせたときの相関だった。

Wake-Sleep を並べてみよう。

第7章:ボルツマンマシン 本節:ヘルムホルツマシン
データを見る 正相 \langle\cdot\rangle_{\text{data}} Wake 相
モデルを走らせる 負相 \langle\cdot\rangle_{\text{model}} Sleep 相

同じ構造である。「外界を見る段階」と「内部モデルを自走させる段階」を交互に回す—これが、生成モデルを学習するときに繰り返し現れる形なのだ。

そして両者とも、睡眠との類比を誘う。第7章では負相を「睡眠中の自発活動」と読む見方を紹介した。ヘルムホルツマシンでは、その相の名前がそのまま Sleep である。睡眠中に脳が自発的な活動パターンを生成することの計算論的な意味—これは魅力的な仮説だが、実証は容易でない。

そしてもう一点、書き留めておきたい。本節のヘルムホルツマシンは、自由エネルギー原理の直接の祖先である。フリストンが最小化する量は、ここで最大化している \mathcal{L} の符号を反転しただけのものだ。系譜は第16章第2節で辿る。

Wake-Sleep の難点

Wake-Sleep には理論的な弱点がある。Sleep 相が最小化しているのは、\mathrm{KL}(p \| q) であって \mathrm{KL}(q \| p) ではない。

第3節で見たとおり、ELBO の緩みは \mathrm{KL}(q \| p_\theta(z\mid x)) である。だから本来はこちらを下げたい。だが Sleep 相はモデルからサンプルするので、逆向きの KL を下げてしまう。つまり Wake-Sleep は、単一の目的関数を最適化していない。収束の保証がないのである。

この難点を解消したのが、次節の VAE である。


6. 変分オートエンコーダ

Kingma と Welling (2014) の変分オートエンコーダ(VAE)は、ヘルムホルツマシンの構成を受け継ぎつつ、ELBO という単一の目的関数を、勾配降下法で直接最適化する。

何が問題だったか

やりたいのは、ELBO を \theta\phi の両方について最大化することである。

\mathcal{L}(\theta,\phi; x) = \mathbb{E}_{q_\phi(z\mid x)}\big[\log p_\theta(x\mid z)\big] - \mathrm{KL}\big(q_\phi(z\mid x)\,\|\,p(z)\big)

\theta については問題ない。期待値の中身だけが \theta に依存するので、サンプルして微分すればよい。

\phi が問題である。\phi は期待値を取る分布のほうに入っている。

\nabla_\phi\, \mathbb{E}_{q_\phi(z\mid x)}\big[\, f(z) \,\big] = \;?

サンプリングという操作は微分できない。乱数を引くところで勾配が途切れてしまう。

再パラメータ化トリック

Kingma と Welling の解決策は、驚くほど単純である。乱数を引く場所を、パラメータに依存しないところへ移す。

q_\phi(z\mid x) をガウス分布 \mathcal{N}\big(\mu_\phi(x), \mathrm{diag}(\sigma_\phi(x)^2)\big) とする。\mu_\phi\sigma_\phi はニューラルネットの出力である。

このとき、z を次のように書ける。

z = \mu_\phi(x) + \sigma_\phi(x) \odot \epsilon, \qquad \epsilon \sim \mathcal{N}(0, I)

確かめよう。\epsilon が標準正規に従うなら、\sigma \odot \epsilon は平均 0・標準偏差 \sigma の正規分布に従う。それに \mu を足せば平均が \mu になる。たしかに z \sim \mathcal{N}(\mu_\phi, \sigma_\phi^2) である。分布としてはまったく同じものだ。

だが計算グラフの形が違う。

  • 元の書き方 — \phi → 分布 → (サンプリング)→ z。サンプリングで勾配が途切れる
  • 新しい書き方 — \epsilon\phi に依存しない外部からの乱数。z\mu_\phi, \sigma_\phi決定的な関数である。だから \partial z/\partial \phi が計算できる

これが再パラメータ化トリック(reparameterization trick)である。乱数を「外から注入されるノイズ」として扱うことで、微分可能な経路を確保した。

期待値も書き換わる。

\mathbb{E}_{q_\phi(z\mid x)}\big[f(z)\big] = \mathbb{E}_{\epsilon \sim \mathcal{N}(0,I)}\Big[ f\big(\mu_\phi(x) + \sigma_\phi(x)\odot\epsilon\big) \Big]

右辺は \phi によらない分布での期待値だから、微分と期待値を交換できる。あとはサンプルを一つ引いて、普通にバックプロパゲーションするだけである。

ここがポイント

再パラメータ化トリックの要点は、乱数の発生源をパラメータから切り離すことにある。z = \mu_\phi + \sigma_\phi \odot \epsilon と書けば、\epsilon は外部からのノイズ、z\phi の決定的な関数になる。だから勾配が通る。

KL 項は解析的に計算できる

ELBO の第二項、\mathrm{KL}(q_\phi(z\mid x)\|p(z)) は、両方がガウス分布なら閉じた形で書ける。p(z) = \mathcal{N}(0,I)q_\phi = \mathcal{N}(\mu, \mathrm{diag}(\sigma^2)) のとき、

\mathrm{KL} = \frac{1}{2}\sum_{j=1}^{d}\Big( \mu_j^2 + \sigma_j^2 - \log \sigma_j^2 - 1 \Big)

サンプリングが要らないので、こちらは分散なく計算できる。

各項の意味を読んでおこう。\mu_j^2 は「原点から離れるな」、\sigma_j^2 - \log\sigma_j^2 - 1\sigma_j = 1 で最小になる項で「分散を1に保て」。つまり KL 項は、潜在表現を標準正規分布の形に整えようとする力である。

全体像

まとめると、VAE の一回の更新はこうなる。

  1. データ x を取る
  2. エンコーダに通して \mu_\phi(x), \sigma_\phi(x) を得る
  3. \epsilon \sim \mathcal{N}(0,I) を引き、z = \mu_\phi + \sigma_\phi\odot\epsilon とする
  4. デコーダに通して p_\theta(x\mid z) を得る
  5. 再構成項 \log p_\theta(x\mid z) と KL 項を計算し、ELBO を作る
  6. -\mathcal{L} を損失としてバックプロパゲーション

ヘルムホルツマシンの構成(生成+認識の二本立て)に、ELBO という単一の目的関数と、それを微分可能にする仕掛けを与えたもの—それが VAE である。Wake-Sleep が二つの相で別々の目的を追っていたのに対し、VAE は一つの量を上げ続ける。

ヒント手を動かす

再パラメータ化トリックの効き目を、数値で確かめよう。コードは コード/14_reparam.py にある。

q_\phi(z) = \mathcal{N}(\phi,1)(一次元、平均だけがパラメータ)とし、f(z)=z^2 の期待値の \phi 微分を推定する。真の値は \mathbb{E}[z^2] = \phi^2+1 だから、微分は 2\phi である。\phi = 1、1回あたり100サンプル、それを1000回繰り返した。

PHI, M, REP = 1.0, 100, 1000  # φ、サンプル数、繰り返し

score, reparam = [], []
for _ in range(REP):
    eps = rng.standard_normal(M)
    z = PHI + eps
    # 1. スコア関数推定量: ∂_φ log q = (z - φ)
    score.append(np.mean(z**2 * (z - PHI)))
    # 2. 再パラメータ化: ∂_φ f(φ + ε) = 2(φ + ε)
    reparam.append(np.mean(2 * z))

score = np.array(score); reparam = np.array(reparam)
print(score.std(), reparam.std())

二つの行を見比べてほしい。上は f(z)=z^2を使い、下は f傾き 2z を使っている。差はそれだけである。

平均 標準偏差
スコア関数推定量 1.992 0.552
再パラメータ化 1.998 0.209

どちらも不偏である(平均が真の値 2 に近い)。だがばらつきが 2.6 倍違う。

なぜ差が出るのか。スコア関数推定量は f(z) の値そのものを重みに使い、再パラメータ化は f の傾きを使う。前者は f が大きい場所のサンプルに引きずられるが、後者は f の局所的な情報しか使わない。勾配を求めたいのだから傾きを使うほうが素直である—そう言われれば当たり前だが、この差が VAE を実用にした。


7. 生成モデルと認識モデルの関係

VAE では、エンコーダとデコーダを独立なネットワークとして持った。だが素朴には、こう思いたくなる—認識は生成の逆なのだから、片方から他方が決まるのではないか。

この直感は、線形の場合には正しく、非線形では正しくない。確かめておこう。

線形の場合

生成過程が線形ガウスだとする。

z \sim \mathcal{N}(0, I), \qquad x = Wz + \varepsilon, \quad \varepsilon\sim\mathcal{N}(0,\sigma^2 I)

これは確率的主成分分析(probabilistic PCA)と呼ばれるモデルである。このとき事後分布は解析的に求まり、やはりガウス分布になる。

p(z\mid x) = \mathcal{N}\big(M^{-1}W^\top x,\; \sigma^2 M^{-1}\big), \qquad M = W^\top W + \sigma^2 I

認識の重みが M^{-1}W^\top、つまり生成の重み W から決まっている。\sigma \to 0 の極限では M^{-1}W^\top \to (W^\top W)^{-1}W^\top = W^+(擬似逆行列)である。まさに「逆」だ。

非線形では壊れる

生成過程が x = g_\theta(z) + \varepsilon という非線形写像だとどうなるか。事後分布は

p(z\mid x) \propto p(z)\, \exp\!\left(-\frac{\|x - g_\theta(z)\|^2}{2\sigma^2}\right)

この分布は、一般にガウス分布ではない。多峰性を持つこともある。g_\theta が単射でなければ、複数の z が同じ x を生む—そのとき事後分布は複数の峰を持つ。

そして「認識モデルの重みが生成モデルの重みの逆行列」といった単純な関係は、まったく成り立たない。非線形写像の逆は、一般に閉じた形で書けないからである。

だから VAE では、エンコーダを独立なネットワークとして用意し、学習で近似させる。「逆」は与えられるものではなく、学習するものになった。

設計で対称性を入れる

とはいえ、両者を完全に独立にするのは冗長でもある。実務では対称性を明示的に設計することがある。

  • 重み結合(tied weights)— デコーダの重みをエンコーダの重みの転置に取る。オートエンコーダで古くから使われる
  • アーキテクチャの鏡像化 — エンコーダとデコーダを層構成が対称になるように設計する

そして脳の側でも同じ問いが立つ。フィードフォワード結合とフィードバック結合は、互いの転置になっているのか。

解剖学的には、皮質の領野間結合はおおむね相反的である(A から B へ投射があれば、B から A へも投射がある)。だがシナプスの重みが数学的な意味で転置になっている保証はどこにもない。第8章で扱った重み輸送問題—バックプロパゲーションが生物学的に妥当でない理由の一つ—と、同じ論点がここにも現れる。


8. 離散潜在変数

最後に、第7章との接続をもう一つ確認しておく。

ボルツマンマシンと VAE の対比

両者とも潜在変数モデルである。だが潜在変数の性格が違う。

ボルツマンマシン VAE
潜在変数 離散\{0,1\} の二値) 連続(実ベクトル)
推論 MCMC(重い) 償却推論(一回のフォワード)
学習 正相 − 負相 ELBO の勾配
困難の所在 分配関数 Z 事後分布の近似

再パラメータ化トリックが使えるのは、潜在変数が連続だからである。z = \mu + \sigma\odot\epsilon という書き換えは、z が連続値でなければ意味をなさない。離散変数に対しては、\epsilon を少し動かしても z が動かない(あるいは飛ぶ)ので、勾配が定義できない。

これが、VAE が連続潜在変数を使う理由である。逆に言えば、離散的な潜在表現がほしいときには工夫が要る。

VQ-VAE

離散潜在変数を扱う代表的な方法が VQ-VAE(vector quantized VAE)である。

エンコーダの出力を、あらかじめ用意した有限個のベクトル(コードブック)のうちいちばん近いものに置き換える(量子化する)。これで潜在表現が離散的になる。

z_q = \arg\min_{e_k \in \mathcal{C}} \| z_e - e_k \|

だが \arg\min は微分できない。ここでの工夫が straight-through 推定量である—順伝播では量子化した値を使い、逆伝播では量子化がなかったことにして勾配をそのまま通す。数学的には正当化しづらい近似だが、実用上はよく機能する。

離散表現には利点がある。表現が有限個の「記号」になるので、その上で自己回帰モデルを学習できる。画像を離散トークンの列として扱い、言語モデルと同じ手法で生成する—近年の画像生成の一つの潮流は、この道筋にある。

次章へ

本章では、分配関数の壁を変分法で迂回し、VAE という実装まで辿り着いた。単純な分布 p(z) を写像で押し出して複雑な分布を作るという発想が、その根底にあった。

次章では、この発想を別の方向へ展開する。

  • 尤度を諦め、サンプルの質だけを追うとどうなるか(GAN)
  • 写像を可逆に制限すると、尤度が厳密に計算できる(正規化フロー)
  • 写像を少しずつにすると、驚くほど安定に学習できる(拡散モデル)

そして正規化フローのところで、第5章第2節の変数変換の公式—|\det J| が密度を歪めるという話—が、いよいよ主役になる。

確認問題

  1. [確認]潜在変数モデル p_\theta(x) = \int p_\theta(x\mid z)p(z)\,dz において、最尤推定が困難になる理由を述べよ。またそれが第7章の分配関数の問題とどう似ているかを説明せよ。(第1節・第7章第6節)

  2. [導出]\log p_\theta(x) = \mathcal{L}(q,\theta) + \mathrm{KL}(q\|p_\theta(z\mid x)) を導出せよ。(第3節)

  3. [考える]上の等式の左辺が q に依存しないことから、何が結論できるか。二つ述べよ。(第3節)

  4. [導出]EM アルゴリズムの E ステップが「事後分布そのものを取る」ことになる理由を、第3節の等式から説明せよ。(第4節)

  5. [確認]Wake 相と Sleep 相が、第7章の正相・負相とそれぞれどう対応するかを述べよ。(第5節・第7章第5節)

  6. [考える]Wake-Sleep アルゴリズムの理論的な難点を述べよ。(第5節)

  7. [導出]p(z) = \mathcal{N}(0,I)q = \mathcal{N}(\mu, \mathrm{diag}(\sigma^2)) のときの KL 項の各項が、\mu\sigma に何を要求しているかを読み取れ。(第6節)

  8. [考える]「認識モデルは生成モデルの逆である」という主張が、線形の場合には成り立ち、非線形では成り立たない理由を述べよ。(第7節)


参考文献

  • Dayan, P., Hinton, G. E., Neal, R. M. & Zemel, R. S. (1995) The Helmholtz machine. Neural Comput — 本章第5節の原典。第16章の系譜の出発点
  • Hinton, G. E. et al. (1995) The wake-sleep algorithm for unsupervised neural networks. Science[5節]
  • Neal, R. M. & Hinton, G. E. (1998) A view of the EM algorithm that justifies incremental, sparse, and other variants — EM を自由エネルギーで書き直した仕事。第16章第2節の系譜で効いてくる[4節]
  • Kingma, D. P. & Welling, M. (2014) Auto-encoding variational Bayes — VAE の原典[6節]
  • Bishop, C. M. (2006) Pattern Recognition and Machine Learning ch.9–10 — EM と変分推論の教科書的な扱い