Mímisbrunnr知恵の泉

← ベイズ統計 一覧

🎓 レベル:発展 | 重要度:A(必須)

📎 前提:収束診断 | 関連:事前・尤度・事後・周辺尤度オートエンコーダとVAE(機械学習)

要点(BLUF)

1. 発想:推論を最適化問題にする

MCMC は事後からサンプルを取りました。変分推論はまったく違うアプローチを取ります——事後分布そのものを、扱いやすい分布 q(θ)q(\theta) で近似し、qq を事後に近づける最適化問題として解きます。

近さの尺度には KL ダイバージェンス KL(qp(θD))=Eq[logq(θ)logp(θD)]\mathrm{KL}(q\,\|\,p(\theta\mid D))=\mathbb E_q[\log q(\theta)-\log p(\theta\mid D)] を使い、これを最小化する qq を探します。ところが KL の中に未知の事後 p(θD)=p(D,θ)/p(D)p(\theta\mid D)=p(D,\theta)/p(D) が入っていて、正規化定数 p(D)p(D) が邪魔です。ここで ELBO が効きます。

2. ELBO の導出:log p(D) = ELBO + KL

任意の q(θ)q(\theta) について、対数周辺尤度を変形します(イェンセンの不等式)。

logp(D)=logp(D,θ)dθ=logq(θ)p(D,θ)q(θ)dθ  Eq ⁣[logp(D,θ)q(θ)]ELBO(q)\log p(D)=\log\int p(D,\theta)\,d\theta=\log\int q(\theta)\frac{p(D,\theta)}{q(\theta)}\,d\theta\ \ge\ \underbrace{\mathbb E_q\!\Big[\log\frac{p(D,\theta)}{q(\theta)}\Big]}_{\mathrm{ELBO}(q)}

この下界が ELBO(Evidence Lower BOund, 証拠下界)。さらに厳密に差を取ると、

logp(D)ELBO(q)=Eq ⁣[logq(θ)p(θD)]=KL(qp(θD))\log p(D)-\mathrm{ELBO}(q)=\mathbb E_q\!\Big[\log\frac{q(\theta)}{p(\theta\mid D)}\Big]=\mathrm{KL}\big(q\,\|\,p(\theta\mid D)\big)

すなわち

 logp(D)=ELBO(q)+KL(qp(θD)) \boxed{\ \log p(D)=\mathrm{ELBO}(q)+\mathrm{KL}\big(q\,\|\,p(\theta\mid D)\big)\ }

logp(D)\log p(D)qq に依らない定数。KL 0\ge0 なので ELBOlogp(D)\mathrm{ELBO}\le\log p(D) で、ELBO を最大化することは KL を最小化することと完全に等価です。しかも ELBO は Eq[logp(D,θ)logq(θ)]\mathbb E_q[\log p(D,\theta)-\log q(\theta)]——計算できる同時分布 p(D,θ)=p(Dθ)p(θ)p(D,\theta)=p(D\mid\theta)p(\theta)qq だけで書け、厄介な p(D)p(D) が要りません。これが なぜサンプリングか の正規化定数の壁を、VI が越える仕組みです。

3. コードで log p(D) = ELBO + KL を確かめる

共役な正規モデル(θN(0,1)\theta\sim\mathcal N(0,1)yiN(θ,σ2)y_i\sim\mathcal N(\theta,\sigma^2))で、閉形式の事後と logp(D)\log p(D) を真値に、ガウス変分 q=N(m,s2)q=\mathcal N(m,s^2) の ELBO が logp(D)KL\log p(D)-\mathrm{KL} になることを確かめます。

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

出力の意味qq を事後そのもの N(1.024,0.3332)\mathcal N(1.024,0.333^2) にすると、ELBO = logp(D)=10.28\log p(D)=-10.28(KL =0=0、ギャップ 00)——下界が周辺尤度に到達します。qq を事後からずらすほど ELBO は下がり、その下がり幅がちょうど KL(q事後)\mathrm{KL}(q\,\|\,\text{事後}) に一致します(分散をずらすと 0.2190.219、平均をずらすと 1.131.13、事前のままだと 7.627.62)。だから「ELBO を上げる=事後に近づける」。これが変分推論の最適化が目指すものです。

4. MCMC との対比

MCMC(第4章)変分推論
やること事後からサンプル事後を qq近似(最適化)
精度漸近的に厳密qq の表現力まで(近似)
速度遅い(高次元・大規模で重い)速い(勾配最適化・ミニバッチ可)
不確実性正しく出るしばしば過小評価(mode-seeking)

KL(qp)\mathrm{KL}(q\,\|\,p) を最小化する VI は、qq が事後の一つの峰に集中しがちで、分散を過小評価する傾向があります(平均場近似と座標上昇法 で実例)。速度と精度のトレードオフで、MCMC と使い分けます。次節から、qq をどう構成して最適化するか(平均場・CAVI、確率的 VI・再パラメータ化)を具体化します。

⚠️ よくある誤解

関連ノート