🎓 レベル:発展 | 重要度:B(標準)
📎 前提:経験ベイズ | 関連:ハミルトニアンモンテカルロとNUTS・収束診断
要点(BLUF)
- 階層モデルの事後は漏斗(funnel)型になりやすい:群間ばらつき が小さい領域で群効果 が狭く絞られ、サンプラーが首(neck)に入れません。
- 中心化パラメータ化( を直接サンプル)は首で詰まります。非中心化()にすると幾何が真っ直ぐになり、よく混ざります。
- Neal の漏斗で再現すると、中心化は分布の裾を取りこぼし( 過小)、非中心化が真の周辺 を回収します。
1. 漏斗の幾何:なぜ首ができるのか
階層モデル では、群間ばらつき も推定対象でした(階層モデルの構造)。 と の同時事後を見ると、 が小さいほど は の周りに強く絞られ、 が大きいほど広く散らばる。この「 が下がると幅がすぼまる」形が、横から見ると漏斗になります。首の部分(小さい ・狭い )は曲率が極端に強く、一定歩幅のサンプラーは——大きい歩幅では弾かれ、小さい歩幅では進めず——身動きが取れなくなります。
この病理を抽出したのが Neal の漏斗:、。 が 、 が群効果 の役回りです。 が負( 小)だと は極端に狭く、首ができます。
2・3. 中心化の失敗と非中心化の処方
- 中心化:パラメータを のまま扱う。 の幅が に依存するので、首で詰まる。
- 非中心化: と書き換え、 をサンプル。すると と が独立になり、漏斗が消えて素直な形に。サンプリング後に で戻します。
両者を自作 MH(メトロポリスヘイスティングス)で回し、 の周辺(真は 、)を回収できるか比べます。
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
出力の意味:中心化は の を と過小評価し、 の最小も までしか届きません——首( が負の領域)に入れず、分布の裾を丸ごと取りこぼしている。一方、非中心化は を回収し、 まで深く首に入れています。同じサンプラー・同じ歩幅でも、書き方(パラメータ化)を変えるだけで結果が一変する。これは近似誤差ではなく、中心化では原理的に届かない領域があるためです。
flowchart LR C["中心化 θ_j ~ N(μ, τ²)<br/>幅が τ に依存 → 漏斗の首で詰まる"] --> P["再パラメータ化"] P --> N["非中心化 θ_j = μ + τ·z_j<br/>z_j ~ N(0,1)・幅一定 → 首が消える"]
4. 実務:発散・診断・PPL
- 発散(divergence):HMC/NUTS(ハミルトニアンモンテカルロとNUTS)は首の強い曲率で軌道が破綻し「発散」を報告します。発散が多発したらまず非中心化を疑うのが定石。
- 診断:中心化の失敗は、 の悪化・ 付近の低 ESS・トレースの張り付きに表れます(収束診断)。1本のチェーンだけ見ると「収束した」と誤認しがち。
- PPL での扱い:PyMC・Stan・NumPyro では
pm.Normal("theta", mu, tau)を非中心化形(mu + tau * z、z = pm.Normal("z",0,1))に書き換えるのが定番。ライブラリによっては非中心化のヘルパもあります(API・既定は更新が速く要最新確認。PPL 概観は 確率的プログラミング概観)。 - 使い分け:データが多くグループが情報豊富なら中心化が良いこともあります(首が浅くなる)。データが少なく が小さくなりがちな問題ほど非中心化が効きます。
⚠️ よくある誤解
- 「サンプラーが悪いだけ」ではない:漏斗は事後の幾何の問題。再パラメータ化(モデルの書き換え)が本質的な処方で、サンプラー変更だけでは限界があります。
- 「中心化と非中心化は別モデル」ではない:同じ事後の書き方違い。変数変換で完全に等価です(戻せば一致)。
- 「非中心化が常に最良」ではない:データが豊富で群効果が強い場合は中心化が有利なことも。問題に応じて選びます。
- 「 なら漏斗は大丈夫」ではない:全チェーンが首を避ければ は良く見えても裾を取りこぼします。発散の有無・ 付近の ESS も確認(収束診断)。
まとめ(Phase 5)
第5章では、グループ構造を持つデータをまとめて扱う階層ベイズを学びました——3つのプーリングと部分プーリングの収縮(階層モデルの構造)、収縮がなぜ推定を改善するかのジェームズ–スタイン(収縮の数理)、事前をデータから決める経験ベイズ(経験ベイズ)、そして実装の落とし穴と非中心化(本ノート)。階層モデルは第4章の MCMC を計算エンジンに、第2章の共役を条件付きの部品にして組み上がる、ベイズの総合力が問われる領域です。次章では、事後を近似でもっと速く求める変分推論へ進みます。
関連ノート
- 経験ベイズ
- 階層モデルの構造
- ハミルトニアンモンテカルロとNUTS(発散と勾配ベースのサンプラー)
- 収束診断(漏斗の失敗を検出する)
- 確率的プログラミング概観(PPL での非中心化・要最新確認)
- 第5章 階層ベイズモデル 目次
- ベイズ統計テキスト 全体目次