第九部分 · 概率、统计与信息
采样与蒙特卡洛:当积分算不出来
前两课我们把目标写成了漂亮的期望和积分——熵是 𝔼[−log p],贝叶斯后验里全是积分。可漂亮归漂亮,绝大多数时候它们根本算不出来。这一课,我们用一个看似耍赖的办法绕过去:不去算积分,去掷骰子。这就是蒙特卡洛。
留下的问题:第 32 课的贝叶斯后验、本课的期望,写出来容易,真要算出那个数却几乎不可能——分布太复杂没有解析解(积不出原函数),维度一高连数值积分也彻底失效(要在每个维度铺格点,d 维就要 网格数ᵈ 个点,第 24 课的"维度灾难"在这里要人命)。式子写得出,数算不出,怎么办?
本课新增:蒙特卡洛方法——把"算积分/期望"偷换成"随机采样再取平均"。它的合法性,恰恰由第 10 课的大数定律担保;它和第 08 课的积分是同一枚硬币的两面。
困境:期望就是积分,可积分算不出来
先把上一课留下的痛点摆清楚。一个随机量 f(x) 的期望,定义就是一个加权和(或积分):
𝔼[f(x)] = ∑ p(x)·f(x) 或连续时 𝔼[f(x)] = ∫ p(x)·f(x) dx
读作"f 的期望,等于把 f(x) 按概率 p(x) 加权后全部加起来(或积起来)"。第 08 课讲过,积分 ∫ 就是"无穷细分再累加"。问题是:绝大多数积分写得出、却积不出来——找不到原函数,微积分基本定理这条捷径用不上。比如贝叶斯里那个分母 ∫ p(数据|θ)·p(θ) dθ(对所有可能参数 θ 积分),几乎从来没有解析解。
那退一步,用数值积分(把区间切成小格、逐格累加面积)行不行?低维可以。可一旦维度高,灾难来了:要在 d 维空间铺格点,每个维度切 100 格,总点数就是 100ᵈ——d = 10 就已是 10²⁰ 个点,宇宙的年龄都算不完。这正是第 24 课维度灾难的现身:高维空间大得没法用网格"填满"。而机器学习里的积分动辄成千上万维。网格的路,死了。
核心一招:期望 ≈ 样本平均
蒙特卡洛的想法朴素到像耍赖,却无比深刻:既然 𝔼[f(x)] 是"按分布 p 加权的平均",那我干脆从分布 p 里随机抽一大把样本,对它们求普通平均,不就估出来了吗?
𝔼[f(x)] ≈ (1/N)·∑ (i=1..N) f(xᵢ), 其中 x₁, x₂, …, x_N 是从 p 独立采样的
读作"f 的期望,约等于对 N 个采样点 f(xᵢ) 求算术平均"。注意这里我们完全不碰积分,只是抽样、代入、求平均。凭什么这么干是对的?凭第 10 课的大数定律:当样本数 N → ∞,样本平均必然收敛到真期望。当年大数定律说"掷得越多、正面比例越接近 0.5";这里我们把它反过来用——正因为样本平均会收敛到期望,我们就用样本平均去"反推"那个算不出来的期望。大数定律从一条关于频率的定理,摇身变成一台计算工具。
这一步是观念上的大转弯:把"做不出的解析计算"换成"做得到的随机实验"。它叫"蒙特卡洛",得名于摩纳哥的赌城——因为骨子里就是"靠掷骰子算数"。二战中冯·诺依曼、乌拉姆等人在研究中子扩散时把它发扬光大,如今它是科学计算与机器学习的主力。
看得见的例子:撒点估 π
最经典、也最直观的蒙特卡洛,是用随机点估圆周率 π。设想一个边长为 1 的正方形,里面嵌一个四分之一圆(半径 1,圆心在角上)。这两块的面积是:
正方形面积 = 1×1 = 1, 四分之一圆面积 = (1/4)·π·1² = π/4
所以"一个点落进四分之一圆"的概率正好是 π/4。现在往正方形里均匀随机撒 N 个点,数一数有多少个落在圆内(满足 x² + y² ≤ 1,读作"到圆心的距离不超过 1")。落入比例就是上面那个概率的估计:
落入比例 = 圆内点数 / N ≈ π/4 ⇒ π ≈ 4 × (圆内点数 / N)
这里发生的事,正是上一节那条公式的具身版:我们想算的"积分"是四分之一圆的面积,被换成了"撒点—数比例—乘 4"这个随机实验。点撒得越多,估计越准——这又是大数定律在兑现。下面就让你亲手撒,看 π 一点点浮现。
误差律:1/√N,且与维度无关
玩一会儿你会发现:误差降得很慢。要把精度提高 10 倍,得多撒 100 倍的点。这不是偶然,而是蒙特卡洛的铁律——估计的误差大致按 1/√N 缩小(读作"一除以根号 N"):
误差 ∝ 1/√N (读作"误差正比于 N 的平方根分之一")
慢是它的缺点。但请看这条律里少了什么——它里面没有维度 d!这才是蒙特卡洛真正的杀手锏:网格积分的代价随维度指数爆炸(网格数ᵈ),而蒙特卡洛的误差只看样本数 N,跟你在 3 维还是 30000 维里采样没关系。在低维,网格更准更快;可一旦维度高到机器学习那个量级,指数爆炸让网格彻底出局,而蒙特卡洛照常工作。它用"收敛慢"换来了"不怕高维"——这笔交易,在高维世界里稳赚。
真正的难点:怎么从复杂分布里采样
到这儿还藏着一个没说破的前提:我们一直假设"能从分布 p 里抽样"。从均匀分布、高斯分布采样很容易;可贝叶斯后验那种形状古怪、还只知道它正比于某个式子(连归一化常数都算不出)的分布,怎么抽?
这正是马尔可夫链蒙特卡洛(MCMC)要解决的。一句话直觉:与其一步到位地"抽",不如造一个随机游走——从当前点出发,随机提议一个邻近的新点,按"新点比旧点更可能"的程度决定接受还是退回。这样走出来的轨迹,会自动在概率高的区域多停留、概率低的区域少经过;走得够久,落脚点的分布就正好是目标分布 p。妙处在于:它只需要比较两点概率的比值,那个算不出来的归一化常数一约就没了。细节留给专门的课,这里只需记住:MCMC 让我们能对"几乎任何"分布做蒙特卡洛。
它在机器学习里无处不在
蒙特卡洛不是数值分析的角落里一个小技巧,而是现代 AI 的底层零件:
- 贝叶斯推断:第 32 课那个算不出的后验,靠 MCMC 或变分采样来近似——不去解析地求后验,而是从它里面采一堆样本,用样本去回答一切问题。
- 变分自编码器(VAE):训练目标里有个对隐变量的期望算不出来,就用一两个随机采样去估它("重参数化"让梯度还能传回去)。
- 扩散模型(见 扩散模型):整个生成过程本身就是一条随机采样链——从纯噪声出发,一步步随机去噪,本质是从数据分布里采样出一张新图。
- 强化学习(见 强化学习):回报的期望算不出,就让智能体真的去跑很多条轨迹(rollout),用这些样本的平均回报来估梯度。
常见误解
- "采样数翻倍,误差就减半。"不对。误差按 1/√N 走,翻倍样本只把误差缩到原来的 1/√2 ≈ 0.71。要减半误差得 4 倍样本,要降到 1/10 得 100 倍样本。蒙特卡洛收敛慢是它的本性,别指望线性提速。
- "蒙特卡洛是粗糙近似,能精确就别用它。"恰恰相反:在高维,它常常是唯一可行的办法。低维该用解析/网格就用,可一旦维度高到网格指数爆炸,蒙特卡洛是把"不可能"变成"可估"的救命稻草——它的对手不是"精确解",而是"根本算不出来"。
- "随机数那么任意,估出来的结果不可信。"它无偏(期望意义下是对的)且有明确的误差棒(∝ 1/√N),可以给出置信区间。多跑几次取平均、报告波动,结果完全可信、可复现(固定随机种子还能逐位重现)。
- "MCMC 走几步就能用。"不行。链需要"烧入期"(burn-in)才能忘掉起点、走到目标分布上;走得不够久、或相邻样本太相关,估计会有偏。判断它有没有"收敛"是 MCMC 实践里最讲究的环节。