请求Hamiltonian Monte Carlo傻瓜式分步工作原理详细解释
咱先把晦涩的术语全扔一边,用「找山谷里的宝藏」来类比,一步步搞懂HMC到底在干啥——毕竟HMC的本质,就是帮我们在概率分布这个「地形」里,高效找到那些概率最高的区域(就像山谷最深处的宝藏)。
第一步:把概率分布变成「能量地形」
首先,我们有个目标概率分布P(x)(比如我们要采样的模型后验分布),先把它转换成能量函数:U(x) = -ln(P(x))。
这一步相当于把概率地图换成了地形:
- 概率越高的地方(我们需要的样本)= 地形里的山谷(能量
U(x)越低) - 概率越低的地方 = 地形里的山峰(能量越高)
HMC的任务就是在这个地形里逛,尽量多待在山谷,少爬没用的山峰。
第二步:给采样点加个「动量」
普通采样方法(比如Metropolis-Hastings)就像盲人在地形里瞎摸,走一步算一步,很容易陷在小土坑里出不来。HMC不一样,它给当前的位置x(也就是我们手里的样本)配一个随机动量p——就像给你一个随机的初始速度,你带着这个速度在地形里跑。
这个动量是从正态分布里抽的:p ~ N(0, M),这里的M可以理解成你的「体重」,体重越大,惯性越强,跑起来越不容易被坡度影响。
第三步:算一下当前的「总能量」
现在我们有了位置x和动量p,总能量用哈密顿量表示:H(x,p) = U(x) + K(p)。
U(x)是势能(就是刚才的地形能量,位置越高势能越大)K(p)是动能,公式是K(p) = p²/(2M),和物理里的动能公式一模一样——动量越大、体重越小,动能越高。
在理想的无摩擦环境里,总能量是守恒的:你跑的时候不会凭空获得或失去能量,只会在同一个能量水平的等高线上移动,不会随便爬到高能量的山峰(对应概率极低的区域)。
第四步:用「跳步法」在地形里跑一段
这是HMC最核心的一步!我们用Leapfrog跳步法来模拟你在地形里的运动,更新位置和动量:
- 先给动量「加个力」:
p = p - (ε/2) * ∇U(x)
这里ε是你每一步的步长,∇U(x)是势能的梯度(也就是地形的坡度)——下坡时坡度向下,你会加速;上坡时坡度向上,你会减速。这一步相当于先调整速度,再开始移动。 - 用更新后的动量移动位置:
x = x + ε * (p/M)
顺着动量的方向走一步,步长由你的动量和体重决定——动量越大、体重越小,走得越远。 - 再给动量加一次力:
p = p - (ε/2) * ∇U(x)
这一步是为了让整个运动更准确,保证总能量近似守恒,避免因为步长问题导致能量漂移。
把上面三步重复N次(N是预设的步数),你就会跑到一个新的位置x',同时有了新的动量p'。
第五步:决定要不要留下这个新位置
跑完一段后,我们有了新状态(x', p')和旧状态(x,p),现在用Metropolis准则判断要不要把x'作为新样本:
计算接受概率:α = min(1, exp(H(x,p) - H(x',p')))
- 如果新的总能量
H(x',p')比旧的H(x,p)低(也就是新位置概率更高),α=1,100%接受这个新位置; - 如果新能量更高(跑到了山坡上),就按
α的概率决定要不要接受——偶尔爬爬山,能避免我们一直陷在同一个小山谷里,错过更大的宝藏。
注意:不管接不接受,跑完后我们都会丢弃当前的动量,下次采样重新抽新的动量,所以不用管动量的方向,只关心位置x'就行。
第六步:循环往复,收集样本
把上面的步骤重复成千上万次:
每次从当前样本x出发 → 抽随机动量p → 用Leapfrog跑一段得到x' → 用Metropolis判断是否接受 → 接受就把x'作为下一个样本,不接受就继续用x。
最后收集到的这一串样本,就是来自目标概率分布P(x)的有效样本啦!
为啥HMC比普通采样方法好用?
普通MH就像瞎逛,要么步长太小走得慢,半天出不了小区域;要么步长太大,一下子跳到山峰上被拒绝。HMC因为用了动量和物理运动,能沿着等概率的等高线移动,一下子就能跨越大片区域,而且总能量近似守恒,被拒绝的概率极低,采样效率高太多了!
内容的提问来源于stack exchange,提问作者user188529

