1953年就有的MCMC算法现在居然还在给AI撑腰
最离谱的是,大多数开发者可能听过这个词,但基本没搞懂。因为很多教材把这东西讲反了,上来就跟你扯什么“详细平衡”、“遍历性”和“平稳分布”,在这种学术名词的轰炸下,大部分人还没看到核心逻辑就直接把网页标签给关了。
其实把MCMC拆开来看,就是两个极其简单的想法强行拼在一起的。
第一个想法是:你可以通过“乱扔东西”来测量一个量。

举个例子,如果你想算 $\pi$ 的值,但手头没计算器,怎么搞?你可以在纸上画一个边长为 2R 的正方形,里面画一个半径为 R 的圆。然后你闭上眼,往正方形里随机扔飞镖。
飞镖落在圆里的概率,正好就是圆面积和正方形面积的比值,也就是 $\pi R^2 / 4R^2 = \pi / 4$。所以,只要你扔的飞镖足够多,数数落在圆里的次数,乘以 4,就能算出 $\pi$。这就是蒙特卡洛方法的精髓:用随机采样来逼近确定性的结果。
用 Python 跑这个逻辑其实简单得要命,也就五行代码:

import random
# 扔一千万次飞镖
hits = sum(1 for _ in range(10_000_000)
if random.random()**2 + random.random()**2 <= 1)
# 结果乘以4就接近 pi 了
print(4 * hits / 10_000_000)
但问题来了,如果我们要测量的区域不是一个简单的圆,而是一个极其复杂、维度极高的分布(比如在AI模型中估计参数分布),随机乱扔飞镖的效率就低到令人发指。绝大多数飞镖都会落在“没用”的区域,你可能得扔几亿次才能抓到几个有效样本。
这时候,第二个想法——马尔可夫链(Markov Chain)就出场了。
它不再让你盲目乱扔,而是让你“在分布里散步”。
想象你在一个起伏的山峦(概率分布)中行走。你现在的位置是 A,随机选一个附近的点 B。如果 B 比 A 高(概率更大),你直接走过去;如果 B 比 A 低,你不是绝对不走,而是抛个硬币决定走不走。
这样一来,你大部分时间会留在高概率区域,但偶尔也会去低概率区域转转,保证了样本的覆盖面。经过一段时间的“散步”(这就是所谓的 Burn-in 阶段),你停留位置的频率分布,正好就是你要找的那个概率分布。
虽然逻辑简单,但实际操作时有个坑能让你掉进去好几天,那就是 step_size(步长)。
这玩意儿绝对不是一个简单的调优参数,它直接决定了你的结果是真实的还是在骗你。
- 步长太小: 每次移动的距离极短,虽然绝大多数步骤都被接受了,但你像蜗牛一样在分布上爬行,需要数百万个样本才能走完整个分布,效率低得惊人。
- 步长太大: 你每次跳跃都像在蹦极,很容易直接跳到概率极低的“荒漠”区域,导致绝大多数提议都被拒绝。结果就是你的采样点长时间停留在同一个位置,完全没能覆盖真实的分布。
所以,玩 MCMC 的人其实大部分时间都在跟这个步长死磕,试图在“走得太慢”和“跳得太离谱”之间找一个平衡点。
说到底,AI 领域现在追求的很多复杂采样技巧,其实都是在给这个 70 年前的老算法打补丁。这种用随机性去对抗复杂性的思维,比很多所谓的“前沿架构”要硬核得多。
