蒙特卡洛与 MCMC
很多问题最后都归结成一句"从这个分布里抽一批样本"——贝叶斯后验、统计物理的构型、组合优化的解空间。问题是,这些分布往往只知道形状不知道归一化常数,也没法直接抽。MCMC 的思路绕了一个大弯却出奇地好用:造一条以它为稳态的马尔可夫链,然后让链自己跑。
本页实验台
LAB 01
蒙特卡洛积分
用撒点算面积:误差按 1/√n 下降,与维数无关
问题
一个形状怪异的区域,面积怎么算?高维积分怎么办?确定性的网格法在维数一高就彻底失效(维数灾难),而随机撒点有一个惊人的性质:它的误差和维数没关系。
模型
用样本均值估期望,误差由中心极限定理给出。
I = ∫ f dx ≈ (V/n) Σi=1..n f(xi), 误差 ~ σ ⁄ √n
n 是撒点数,σ 是被积函数的标准差,V 是抽样区域体积。√n 里没有 d:这就是蒙特卡洛在高维里能用的全部理由。估计出来的球体积—
精确值—
相对误差—
落在球里的比例—
二维时这个方法好得惊人:一万个点就能把 π 估到小数点后两位。而且右边那条误差曲线的斜率精确地是 −1/2——误差按 1/√n 下降,和被积函数长什么样、和维数是多少都无关。这是蒙特卡洛最有名的优点:网格法在 d 维要 n^d 个点,蒙特卡洛永远是 1/√n。但现在把维数拖到 10,再拖到 20。命中率从 78.5%(2 维)掉到 0.249%(10 维),再掉到 0.0000025%(20 维)。20 维时撒两万个点,一个都落不进球里。误差率确实还是 1/√n,但"n 次里有几次有用"崩了。这就是维数灾难在采样上的样子:高维空间里,体积几乎全部集中在角落,一个内切球相对于外接立方体小到可以忽略。这正是为什么需要 MCMC。均匀撒点在高维里等于什么都不做,而 MCMC 从一个已经在"有意义区域"的点出发,一步一步在这个区域里挪——它从不去那些空着的角落。
LAB 02
拒绝采样
包络越松,扔掉的点越多——高维下为什么直接废掉
问题
想从一个只知道形状、不知道归一化常数的分布里抽样(贝叶斯后验就是这样),最直接的办法是套一个大的包络再扔掉多余的点。问题是:扔掉的比例有多高,以及维数一升会发生什么。
模型
拒绝采样:从 q 抽 x,以概率 p(x)/(M q(x)) 接受。
接受率 = 1 ⁄ M, M = supx p(x) ⁄ q(x)
M 是包络的松紧程度。高维下即使每一维只松一点点,M 也会随维数指数增长,接受率指数衰减——这就是拒绝采样在高维直接废掉的原因。接受率—
留下 / 尝试—
平均每得到一个样本要试几次—
同样的接受率在 10 维下会变成—
拒绝采样的想法朴素得不能再朴素:在目标密度上面罩一个好抽的盒子,往盒子里均匀撒点,落在曲线下面的留下,落在上面的扔掉。留下的点恰好服从目标分布——不需要知道归一化常数,不需要求逆函数,只要能算出密度的值就行。问题全在接受率上。把包络高度从 105% 拖到 400%,看红点怎么淹没绿点:包络越松,浪费越多,接受率大致按 1/M 掉。这在一维还能忍——接受率 25% 意味着平均试四次得一个样本。但看最后一行读数。如果十个维度各自独立地有这个接受率,总接受率就是它的十次方:25% 变成 0.0001%。拒绝采样在高维下不是"慢一点",是完全不能用。这也解释了为什么它在教科书里出现得早、在实践中用得少:它只在低维、且你能构造出很紧的包络时才划算。再试试偏态分布:密度在左边挤成一个尖峰、右边拖一条长尾,矩形包络会在长尾那一大片近乎全部拒绝——包络的形状和目标越不像,浪费得越厉害。
LAB 03
Metropolis 算法
步长太小走不动,太大全被拒绝,中间那个最优接受率是多少
问题
既然独立抽样在高维行不通,那就退一步:造一条马尔可夫链,让它的稳态分布正好是我们要的那个分布。这是二十世纪最有影响的算法之一,贝叶斯统计、统计物理、机器学习都靠它。
模型
Metropolis:提议 x′ ~ N(x, s²),以下面的概率接受。细致平衡保证稳态就是 π。
α = min( 1, π(x′) ⁄ π(x) ), 细致平衡:π(x) P(x→x′) = π(x′) P(x′→x)
s 是步长。注意 α 里 π 只以比值出现——归一化常数被约掉了,这正是 MCMC 能处理后验分布的关键。接受率—
自相关时间 τ—
有效样本量 ESS—
样本均值(真值 0)—
Metropolis 只有一行核心代码:随便往旁边挪一步,如果新位置的密度更高就一定接受,如果更低就以密度之比的概率接受。就这样,链的稳态分布恰好是目标分布——而且因为只用到密度之比,归一化常数被约掉了。这是它比拒绝采样强大的根本原因。现在把步长从 0.05 一路拖到 20,盯住接受率和 ESS。步长 0.05:接受率 98%,看起来很成功,但轨迹图上是一条缓慢蠕动的曲线,自相关时间 740,一万六千次迭代只值 22 个独立样本。步长 20:接受率只剩 10%,链大部分时间卡在原地不动,ESS 834。步长 4 附近最好:接受率 40%,ESS 2724——比两个极端高一百倍。这个结果非常稳健:理论上多维高斯目标的最优接受率约 23%,一维时约 44%,实践中把它调到 20%–50% 之间就对了。记住那句判断标准:接受率高不代表好。真正该看的是轨迹图像不像一条毛毛虫,以及 ESS 有多大。(双峰目标还有一个额外的坑:步长太小时链可能一辈子困在一个峰里,样本均值会明显偏离 0——把步长拖到 0.2 看看那一行读数。)
LAB 04
收敛诊断
多条链、轨迹图、自相关:怎么判断"烧机"够了没有
问题
MCMC 给的样本不是独立的,而且开头一段还带着初值的影响。那么问题就变成:跑多久才算够?扔掉前面多少才算干净?这是所有实际使用 MCMC 的人真正头疼的地方。
模型
用多条链的"链间方差 / 链内方差"作收敛判据,用自相关折算有效样本量。
R̂ = √( V̂ ⁄ W ), ESS = n ⁄ ( 1 + 2 Σk≥1 ρk )
W 是链内方差,V̂ 是把链间差异也算进去的方差估计;ρk 是滞后 k 的自相关。经验判据是 R̂ < 1.01 且 ESS 足够大。最终的 R̂—
有效样本量—
自相关时间 τ—
R̂ 首次降到 1.01 以下需要的迭代数—
只跑一条链,你永远不知道它是收敛了还是卡住了。这就是多链诊断的全部动机:让几条链从分得很开的地方出发,如果它们最后混在一起分不出谁是谁,就有理由相信收敛了。R̂ 把这句话变成了一个数——它比较"链之间的方差"和"链内部的方差",两者相当时 R̂ 趋近 1。把起点分散程度拖大,看 R̂ 一开始有多高,再看它要花多少次迭代才掉到 1.01 以下。前面那一段就是烧机期,应该整段丢掉。把步长调到很小(比如 0.1)再看:R̂ 会长时间停在 1 以上不动——因为每条链都困在自己起点附近的那个峰里,链间方差始终大于链内方差。这正是 R̂ 最有价值的场景:它能识别出"每条链自己看起来都很平稳、但它们彼此不一致"。单看一条轨迹图是发现不了的。最后提醒一句常见误用:R̂ ≈ 1 是收敛的必要条件,不是充分条件。如果所有链都从同一个点出发,或者步长小到谁也跳不出去,R̂ 也会很快接近 1 —— 它们只是一起错了。
这一页想说的
这一页把采样从最朴素走到了最常用。蒙特卡洛的误差按 1/√n 下降且与维数无关,但"有效样本"在高维会被维数灾难吃掉;拒绝采样正确却在高维下彻底失效;MCMC 用一条链绕开了这两个问题,代价是样本之间相关,于是有了三件必须做的事:调步长(把接受率放进 20%–50%)、丢掉烧机段、用多链 R̂ 和 ESS 检查结果。