🎓 レベル:発展 | 重要度:A(必須)
📎 前提:収束診断 | 関連:事前・尤度・事後・周辺尤度・オートエンコーダとVAE(機械学習)
要点(BLUF)
- **変分推論(VI)**は、事後を解く代わりに、扱いやすい分布族 の中で事後に最も近いものを最適化で探す。MCMC(第4章)より速いが、近似です。
- ELBO(証拠下界)の最大化=事後との KL ダイバージェンス最小化。恒等式 から、 で、等号は 事後のとき。
- ELBO は正規化定数 を知らずに計算できる( の下での期待値だけ)。実装で を実証します。
1. 発想:推論を最適化問題にする
MCMC は事後からサンプルを取りました。変分推論はまったく違うアプローチを取ります——事後分布そのものを、扱いやすい分布 で近似し、 を事後に近づける最適化問題として解きます。
- サンプリングではなく最適化なので、速い(大規模データ・高次元で有利)。
- 代わりに近似( の表現力が足りなければ真の事後とずれる)。
近さの尺度には KL ダイバージェンス を使い、これを最小化する を探します。ところが KL の中に未知の事後 が入っていて、正規化定数 が邪魔です。ここで ELBO が効きます。
2. ELBO の導出:log p(D) = ELBO + KL
任意の について、対数周辺尤度を変形します(イェンセンの不等式)。
この下界が ELBO(Evidence Lower BOund, 証拠下界)。さらに厳密に差を取ると、
すなわち
は に依らない定数。KL なので で、ELBO を最大化することは KL を最小化することと完全に等価です。しかも ELBO は ——計算できる同時分布 と だけで書け、厄介な が要りません。これが なぜサンプリングか の正規化定数の壁を、VI が越える仕組みです。
3. コードで log p(D) = ELBO + KL を確かめる
共役な正規モデル(、)で、閉形式の事後と を真値に、ガウス変分 の ELBO が になることを確かめます。
import numpy as np
from scipy import stats
from scipy.integrate import trapezoid # numpy 2.0+ で np.trapz は廃止
rng = np.random.default_rng(0)
sigma = 1.0
y = rng.normal(0.8, sigma, size=8); n = len(y); ybar = y.mean()
# 閉形式の事後 N(mu_n, s_n²)(正規-正規)
prec_n = 1.0 + n/sigma**2 # 事前精度1 + データ精度
mu_n = (n/sigma**2 * ybar)/prec_n; s_n = np.sqrt(1/prec_n)
# 真の log 周辺尤度(グリッド数値積分)
th = np.linspace(-5, 5, 20000)
loglik = -0.5*np.sum((y[:,None]-th[None,:])**2,axis=0)/sigma**2 - n*0.5*np.log(2*np.pi*sigma**2)
logprior = stats.norm(0,1).logpdf(th)
log_pD = np.log(trapezoid(np.exp(loglik+logprior), th))
print(f"事後 N({mu_n:.4f},{s_n:.4f}²), log p(D)={log_pD:.4f}\n")
def elbo_mc(m, s, N=400000): # ELBO を q からのサンプルで近似
z = rng.normal(m, s, N)
ll = -0.5*np.sum((y[:,None]-z[None,:])**2,axis=0)/sigma**2 - n*0.5*np.log(2*np.pi*sigma**2)
return np.mean(ll + stats.norm(0,1).logpdf(z) - stats.norm(m,s).logpdf(z))
def kl_gauss(m, s): # KL(N(m,s²) || 事後 N(mu_n,s_n²))
return np.log(s_n/s) + (s**2 + (m-mu_n)**2)/(2*s_n**2) - 0.5
print(f"{'q=N(m,s)':<16}{'ELBO':>10}{'logp(D)-ELBO':>14}{'KL(q||post)':>13}")
for (m, s) in [(mu_n, s_n), (mu_n, s_n*1.5), (mu_n+0.5, s_n), (0.0, 1.0)]:
e = elbo_mc(m, s)
print(f"({m:.3f},{s:.3f}) {e:>10.4f}{log_pD-e:>14.4f}{kl_gauss(m,s):>13.4f}")
出力:
事後 N(1.0240,0.3333²), log p(D)=-10.2791
q=N(m,s) ELBO logp(D)-ELBO KL(q||post)
(1.024,0.333) -10.2791 0.0000 0.0000
(1.024,0.500) -10.4980 0.2189 0.2195
(1.524,0.333) -11.4048 1.1257 1.1250
(0.000,1.000) -17.8946 7.6155 7.6199
出力の意味: を事後そのもの にすると、ELBO = (KL 、ギャップ )——下界が周辺尤度に到達します。 を事後からずらすほど ELBO は下がり、その下がり幅がちょうど に一致します(分散をずらすと 、平均をずらすと 、事前のままだと )。だから「ELBO を上げる=事後に近づける」。これが変分推論の最適化が目指すものです。
4. MCMC との対比
| MCMC(第4章) | 変分推論 | |
|---|---|---|
| やること | 事後からサンプル | 事後を で近似(最適化) |
| 精度 | 漸近的に厳密 | の表現力まで(近似) |
| 速度 | 遅い(高次元・大規模で重い) | 速い(勾配最適化・ミニバッチ可) |
| 不確実性 | 正しく出る | しばしば過小評価(mode-seeking) |
を最小化する VI は、 が事後の一つの峰に集中しがちで、分散を過小評価する傾向があります(平均場近似と座標上昇法 で実例)。速度と精度のトレードオフで、MCMC と使い分けます。次節から、 をどう構成して最適化するか(平均場・CAVI、確率的 VI・再パラメータ化)を具体化します。
⚠️ よくある誤解
- 「ELBO は適当な下界」ではない: という厳密な等式。ELBO 最大化は KL 最小化そのもの。
- 「VI は MCMC の劣化版」ではない:速度が要る大規模・高次元では VI が現実的。精度が要れば MCMC。目的で選ぶ道具です。
- 「ELBO が高いほど真のモデルが良い」ではない:ELBO は周辺尤度の下界で、 の質にも依存します。モデル比較に使うときは注意(情報量規準WAICとDIC)。
- 「KL は対称」ではない:VI が使う は mode-seeking(過小分散)、逆向き は mass-covering で性質が違います。
関連ノート
- 収束診断
- 平均場近似と座標上昇法(次のトピック・q を分解して最適化)
- 事前・尤度・事後・周辺尤度(周辺尤度 p(D)=ELBOが下から近づく対象)
- VAEとELBOの共通構造(同じ ELBO が VAE の目的関数)
- オートエンコーダとVAE(機械学習・VAE の変分下界)
- 第6章 変分推論 目次
- ベイズ統計テキスト 全体目次