拒绝采样模拟器 返回
数理与统计模拟器

拒绝采样模拟器 — 蒙特卡罗样本生成

当目标 p(x) 难以直接抽样时,用更易处理的 q(x) 缩放 M 倍覆盖之,再按概率 p(x)/(M·q(x)) 接受候选。可在 Beta(2,5) 与双峰混合分布上观察散布、直方图与受理率 1/M。

参数设置
试行数 N
包络系数 M
目标分布

0: Beta(2,5) 单峰非对称 / 1: 双峰混合 难以采样

提案高斯宽度 σ(type=1 用)

随机数采用 LCG(固定 seed=42)为确定性。重新采样会更新 seed。

计算结果
试行数 N
受理样本数
受理率
理论最大效率 1/M
目标 p(x) 与包络 M·q(x)・受理/拒绝点

蓝实线=目标 p(x)/绿虚线=包络 M·q(x)/绿点=受理点/红叉=拒绝点

受理样本直方图与 p(x)

蓝色柱=受理点的直方图(归一化)/白线=目标 p(x)

理论与主要公式

拒绝采样选择提案 q(x) 与常数 M ≥ sup p(x)/q(x),生成 X ~ q(x)、U ~ U(0,1),按 U < p(X)/(M·q(X)) 判定接受。

任一试行的受理概率:

$$P(\text{accept}) = \int \frac{p(x)}{M\,q(x)}\,q(x)\,dx = \frac{1}{M}\int p(x)\,dx = \frac{1}{M}$$

被受理样本的条件分布:

$$f_{X\,|\,\text{accept}}(x) = p(x)$$

期望的受理样本数:

$$\mathbb{E}[N_{\text{accept}}] = \frac{N}{M}$$

M 越大包络越厚越安全,但受理率按 1/M 比例下降,计算量随之增加。

什么是拒绝采样模拟器

🙋
从概率分布 p(x) 取样的时候,计算机直接生成随机数不就行了吗?为什么还需要「拒绝」这种操作?
🎓
好问题。像均匀或正态这种「逆函数能解出来的分布」可以直接采样,但贝叶斯统计中的后验分布常常归一化常数未知、形状又复杂,无法直接生成。拒绝采样的思路是:套一个易于采样的提案 q(x),只挑「中标」的样本。上方模拟器默认就是用均匀分布覆盖 Beta(2,5)。
🙋
绿色虚线是「M·q(x)」、蓝色实线是目标,对吗?为什么要乘 M?
🎓
因为必须在所有 x 上满足 M·q(x) ≥ p(x),也就是把提案抬高成一个「天花板」完全盖住蓝色的山。Beta(2,5) 的最大值在 x=0.2 约为 2.458,所以 q=1(均匀)时需要 M≥2.458。默认 M=3.0 是安全侧的取值。把 M 降到 2 看看,蓝线会冲破绿色虚线,方法就崩了。
🙋
受理率显示约 33%,正好等于 1/M。这是巧合吗?
🎓
不是巧合,这正是拒绝采样的核心定理。对受理概率积分得 ∫p(x)/(M·q(x))·q(x)dx = (1/M)∫p(x)dx = 1/M。所以 2000 次试行约受理 666 个,率约 33%。M=5 时降到 20%,M=10 降到 10%,效率严格按 1/M 线性下降。把模拟器里「理论最大效率 1/M」与「受理率」两张卡片对比一下,几乎完全一致。
🙋
我把「目标分布」切到 1(双峰),受理率猛降!
🎓
对,双峰或复杂形状下,用高斯提案要安全覆盖就必须取很大的 M。提案宽度 σ 太小则尾部覆盖不足,太大则浪费在空区域。实务中这是大问题——高维下受理率指数趋零,即「维度灾难」。所以才发展出 MCMC、哈密顿蒙特卡罗等更聪明的方法。拒绝采样既是这条路的起点,也教会我们它自身的极限。

常见问题

理论最优为 M = sup_x p(x)/q(x),此时受理率最大化。Beta(2,5) 与均匀提案下,p 的众数 x=0.2 处比值为 2.458,所以 M=2.458 最优。实现中可解析地求 p 与 q 的导数得到上界,或用细网格评估近似。形状未知时建议采用自适应拒绝采样 (ARS),它在采样过程中动态构造并更新包络。
可以。若 p(x) = p̃(x)/Z 而 Z 未知,将 M 取为 sup p̃(x)/q(x) 并用 p̃(x)/(M·q(x)) 比较即可,得到的样本仍严格服从 p(x)。这在贝叶斯后验(似然×先验、Z 未知)中尤其有用,也是 Metropolis-Hastings 方法的概念种子。
高维下 p(x) 的质量集中在极薄的区域,让易处理的 q(x) 与之匹配极其困难。比 p/q 的上确界随维度 d 呈指数增长,受理率 1/M 也按指数衰减。例如用一个均值略有偏移的高斯去覆盖 10 维高斯目标,M 就会爆炸到天文数字。高维下必须改用 MCMC、变分推断或 HMC。
把条件分布写出来即可证明。给定受理事件,X ~ q 且 U < p(X)/(M·q(X)),则 X 的条件密度为 q(x)·[p(x)/(M·q(x))] / (1/M) = p(x),正好是目标。M·q(x) ≥ p(x) 这一条件保证了「在包络下均匀散布的随机点」的几何解释,沿垂直方向切片后正好得到 p(x)。

实际应用

贝叶斯统计与概率建模:后验分布 p(θ|D) ∝ p(D|θ)p(θ) 通常没有解析的归一化常数,因此用拒绝采样生成参数 θ 的样本。在低到中维模型以及更高级 MCMC 的预热中广泛使用,是贝叶斯推断的基础构件。

计算物理与分子模拟:在用概率分布采样来评估宏观物理量的加权蒙特卡罗法中,从玻尔兹曼分布 p(x) ∝ exp(-E(x)/kT) 生成样本时使用拒绝采样。能量地形简单时有效,并是 Metropolis 类算法的理论背景之一。

CAE 与可靠性分析:产品可靠性评估中,从输入参数(材料强度、尺寸公差)的分布生成样本,再用有限元法求响应,进行概率论设计。输入分布非标准型时用拒绝采样生成样本,从所得响应分布估计破坏概率。

机器学习与生成模型:用于概率模型归一化常数评估、从基于能量的模型采样、稀有事件估计等。GAN 和扩散模型的理论分析中也会出现拒绝采样的概念,对理解现代生成模型不可或缺。

常见误解与注意事项

最常见的误解是认为「只要能拿到样本,受理率多低质量都一样」。被受理的样本理论上确实严格服从 p(x),但若受理率 1/M 极低,得到目标数量的样本就要付出巨大计算成本。Beta(2,5) 例子中取 M=10 时受理率为 10%,相比 M=2.458 大约需要 4 倍的试行次数。基本原则是把 M 取到尽量贴近上确界的值;在模拟器里拖动 M 滑块同时看「受理率」卡片,就能体会到甜点位置。

其次常见的错误是轻视提案分布 q(x) 的选择。q 与 p 形状差异大时,即使满足 M·q(x) ≥ p(x),大部分提案也会落在远离 p 山峰的「无用区域」而被拒绝。把模拟器目标设为 1(双峰)、提案宽度设为 0.5 试试看:提案集中在中央,两峰样本严重不足。好的 q 是「形状贴近 p、尾部至少与 p 一样宽」。

最后请理解条件 M·q(x) ≥ p(x) 被违反时的后果。该不等式必须对所有 x 成立;只要有一点违反,该处的受理概率就会超过 1,得到的样本就会从 p(x) 系统性偏离。在模拟器中把目标设为 Beta(2,5) 且 M=2,蓝线就会在峰附近冲破绿色虚线,直方图在峰附近明显被低估。实现中应在细网格或数值优化下评估 sup p/q,再乘以安全系数后再定 M。