Mímisbrunnr知恵の泉

← ベイズ統計 一覧

🎓 レベル:発展 | 重要度:B(標準)

📎 前提:経験ベイズ | 関連:ハミルトニアンモンテカルロとNUTS収束診断

要点(BLUF)

1. 漏斗の幾何:なぜ首ができるのか

階層モデル θjN(μ,τ2)\theta_j\sim\mathcal N(\mu,\tau^2) では、群間ばらつき τ\tau も推定対象でした(階層モデルの構造)。τ\tauθj\theta_j の同時事後を見ると、τ\tau が小さいほど θj\theta_jμ\mu の周りに強く絞られ、τ\tau が大きいほど広く散らばる。この「τ\tau が下がると幅がすぼまる」形が、横から見ると漏斗になります。首の部分(小さい τ\tau・狭い θ\theta)は曲率が極端に強く、一定歩幅のサンプラーは——大きい歩幅では弾かれ、小さい歩幅では進めず——身動きが取れなくなります

この病理を抽出したのが Neal の漏斗vN(0,32)v\sim\mathcal N(0,3^2)xiN(0,ev)x_i\sim\mathcal N(0,e^{v})vvlogτ2\log\tau^2xix_i が群効果 θj\theta_j の役回りです。vv が負(τ\tau 小)だと xix_i は極端に狭く、首ができます。

2・3. 中心化の失敗と非中心化の処方

xiN(0,ev)中心化:幅が v 依存ziN(0,1), xi=ev/2zi非中心化:幅が一定\underbrace{x_i\sim\mathcal N(0,e^{v})}_{\text{中心化:幅が }v\text{ 依存}}\quad\Longleftrightarrow\quad \underbrace{z_i\sim\mathcal N(0,1),\ x_i=e^{v/2}z_i}_{\text{非中心化:幅が一定}}

両者を自作 MH(メトロポリスヘイスティングス)で回し、vv の周辺(真は N(0,32)\mathcal N(0,3^2)std=3\mathrm{std}=3)を回収できるか比べます。

import numpy as np

D = 9                                       # Neal の漏斗:x を 9 本
def mh(logpost, x0, step, N=80000, burn=15000, seed=0):
    rng = np.random.default_rng(seed)
    x = np.array(x0, float); lp = logpost(x); out = np.empty((N, len(x))); acc = 0
    for i in range(N):
        cand = x + rng.normal(0, step, len(x)); lc = logpost(cand)
        if np.log(rng.uniform()) < lc - lp: x, lp = cand, lc; acc += 1
        out[i] = x
    return out[burn:], acc/N

# 中心化:(v, x_1..x_D)。log p = -v²/18 - (D/2)v - ½Σx_i²/e^v
def logpost_centered(p):
    v, xs = p[0], p[1:]
    if v > 30: return -np.inf
    return -v**2/18 - 0.5*D*v - 0.5*np.sum(xs**2)/np.exp(v)

# 非中心化:(v, z_1..z_D)、x=e^{v/2}z → v と z は独立
def logpost_noncentered(p):
    v, z = p[0], p[1:]
    return -v**2/18 - 0.5*np.sum(z**2)

cen, ac = mh(logpost_centered,    [0.0]*(D+1), step=0.5)
non, an = mh(logpost_noncentered, [0.0]*(D+1), step=0.5)
print("真の周辺 v~N(0,3²):std(v)=3.000 を回収したい")
print(f"中心化  : 受容率={ac:.2f}  std(v)={cen[:,0].std():.3f}  v最小={cen[:,0].min():.1f}")
print(f"非中心化: 受容率={an:.2f}  std(v)={non[:,0].std():.3f}  v最小={non[:,0].min():.1f}")

出力:

真の周辺 v~N(0,3²):std(v)=3.000 を回収したい
中心化  : 受容率=0.36  std(v)=2.115  v最小=-3.5
非中心化: 受容率=0.47  std(v)=2.887  v最小=-10.3

出力の意味:中心化は vvstd\mathrm{std}2.122.12 と過小評価し、vv の最小も 3.5-3.5 までしか届きません——首(vv が負の領域)に入れず、分布の裾を丸ごと取りこぼしている。一方、非中心化は std=2.893\mathrm{std}=2.89\approx3 を回収し、v=10.3v=-10.3 まで深く首に入れています。同じサンプラー・同じ歩幅でも、書き方(パラメータ化)を変えるだけで結果が一変する。これは近似誤差ではなく、中心化では原理的に届かない領域があるためです。

flowchart LR
  C["中心化 θ_j ~ N(μ, τ²)<br/>幅が τ に依存 → 漏斗の首で詰まる"] --> P["再パラメータ化"]
  P --> N["非中心化 θ_j = μ + τ·z_j<br/>z_j ~ N(0,1)・幅一定 → 首が消える"]

4. 実務:発散・診断・PPL

⚠️ よくある誤解

まとめ(Phase 5)

第5章では、グループ構造を持つデータをまとめて扱う階層ベイズを学びました——3つのプーリングと部分プーリングの収縮(階層モデルの構造)、収縮がなぜ推定を改善するかのジェームズ–スタイン(収縮の数理)、事前をデータから決める経験ベイズ(経験ベイズ)、そして実装の落とし穴と非中心化(本ノート)。階層モデルは第4章の MCMC を計算エンジンに、第2章の共役を条件付きの部品にして組み上がる、ベイズの総合力が問われる領域です。次章では、事後を近似でもっと速く求める変分推論へ進みます。

関連ノート