Skip to content

采样方法

采样(Sampling)是从复杂概率分布中生成随机样本的技术——当分布太复杂、无法直接解析计算时,采样是数值求解的唯一出路。从蒙特卡洛积分到 MCMC、从重要性采样到扩散模型,采样方法贯穿了统计推断、贝叶斯计算和生成式 AI 的全部脉络。前置阅读:蒙特卡洛方法、数值优化与数学基础。

把概率分布想象成一片地形——平坦处概率高(样本密集),陡峭处概率低(样本稀疏)。采样就是在这片地形上”撒豆子”,让豆子按概率密度自然分布:

  • 均匀采样= 闭眼在这片地上随机撒豆子。简单,但豆子不会按概率密度分布,平坦和陡峭处一样多。
  • 逆变换采样= 先看这张地形的”等高线图”(累积分布函数 CDF),然后均匀地画横线,反推出每个豆子该落在哪。保证豆子密度恰好等于概率密度。
  • 拒绝采样= 用一个更容易撒豆子的”大方盒”罩住地形,均匀撒豆子后扔掉掉在地形外面(盒子比地形高的部分)的豆子。留下的豆子自然按地形分布。简单,但如果盒子太大,浪费率极高。
  • 重要性采样= 不真的撒豆子,而是用另一个容易采样的分布来撒,然后给每个豆子加权——落在该密的地方加权大,落在该稀的地方加权小。算期望特别高效。
  • MCMC(马尔可夫链蒙特卡洛)= 像在山地散步的醉汉:每一步只看当前位置决定下一步往哪走,走得多了,停留时间就自然按地形分布了。最强大也最通用,但需要”走够久”才能稳定。

一个贯穿全程的关键概念:我们关心的目标分布 p(x)p(x) 通常只差一个常数因子——在贝叶斯推断中我们知道未归一化的后验 {~p}(θ∣{data})=p({data}∣θ) p(θ)\tilde\{p\}(\theta \mid \text\{data\}) = p(\text\{data\} \mid \theta)\,p(\theta),但无法算出归一化常数 Z=∫{~p} dθZ = \int \tilde\{p\}\,d\theta(高维积分无解析解)。后面会看到,MCMC 和重要性采样的一大优势恰恰是不需要知道 ZZ 就能采样或估计期望。

设目标分布的累积分布函数为 {CDF}(x)=P(X≤x)\text\{CDF\}(x) = P(X \le x),它把 xx 映射到 [0,1][0,1] 区间,且单调递增。逆变换采样的核心定理:

若 U∼{Uniform}(0,1)U \sim \text\{Uniform\}(0,1),则 X={CDF}{−1}(U)X = \text\{CDF\}^\{-1\}(U) 服从目标分布。

推导(为什么这能行):记 F(x)={CDF}(x)F(x) = \text\{CDF\}(x),我们需要证明 P({CDF}{−1}(U)≤x)=F(x)P(\text\{CDF\}^\{-1\}(U) \le x) = F(x)。因为 FF 单调递增:

P(F{−1}(U)≤x)=P(U≤F(x))=F(x)P(F^\{-1\}(U) \le x) = P(U \le F(x)) = F(x)

最后一步用到均匀分布的性质:P(U≤u)=uP(U \le u) = u。于是 F{−1}(U)F^\{-1\}(U) 的 CDF 恰好是 FF,证毕。

步骤:

  1. 从 {Uniform}(0,1)\text\{Uniform\}(0,1) 采样一个 uu。
  2. 计算 x={CDF}{−1}(u)x = \text\{CDF\}^\{-1\}(u)。
  3. xx 即为服从目标分布的样本。

前提是 CDF 的逆函数能解析求出。对于指数分布 {Exp}(λ)\text\{Exp\}(\lambda),{CDF}(x)=1−e{−λx}\text\{CDF\}(x) = 1 - e^\{-\lambda x\},求逆得 x=−{1}{λ}ln⁡(1−u)x = -\frac\{1\}\{\lambda\}\ln(1-u)——可以直接用。但对高斯分布等,{CDF}\text\{CDF\} 没有闭式逆函数,此时需用 Box-Muller 变换等专门技巧,或者改用其他采样方法。

引入一个容易采样的”提议分布” q(x)q(x) 和一个常数 MM,使得对所有 xx,M⋅q(x)≥p(x)M \cdot q(x) \ge p(x)(目标分布)。几何上,M⋅q(x)M \cdot q(x) 就像一块”包装纸”把目标密度 p(x)p(x) 完全罩住。

步骤:

  1. 从 q(x)q(x) 采样一个候选点 xx。
  2. 从 {Uniform}(0,1)\text\{Uniform\}(0,1) 采样 uu。
  3. 若 u≤{p(x)}{M⋅q(x)}u \le \frac\{p(x)\}\{M \cdot q(x)\},接受 xx;否则拒绝,回到步骤 1。

为什么接受率恰好让留下的样本服从 p(x)p(x)?候选点落在 [x,x+dx][x, x+dx] 的概率是 q(x) dxq(x)\,dx;被接受的概率是 {p(x)}{M⋅q(x)}\frac\{p(x)\}\{M \cdot q(x)\}。两者相乘,留下来的密度正比于 p(x) dxp(x)\,dx。全局接受率为 ∫{p(x)}{M⋅q(x)} q(x) dx={1}{M}\int \frac\{p(x)\}\{M \cdot q(x)\}\,q(x)\,dx = \frac\{1\}\{M\}(当 pp 归一化时)——MM 越接近 1,效率越高。

问题在于高维空间:即使 qq 和 pp 看起来差不多,要保证处处 M⋅q≥pM \cdot q \ge p,MM 仍会随维度指数增长(因为”罩住”要在每个方向同时成立),接受率 {1}{M}\frac\{1\}\{M\} 趋零——这就是维度灾难。因此拒绝采样只适用于低维(一般 ≤10\le 10 维)。

不生成服从 p(x)p(x) 的样本,而是从提议分布 q(x)q(x) 中采样,然后用权重修正。目标:计算函数 f(x)f(x) 在分布 p(x)p(x) 下的期望 {E}p[f(x)]\mathbb\{E\}_p[f(x)]。推导链:

{E}p[f(x)]=∫f(x) p(x) dx=∫f(x) {p(x)}{q(x)} q(x) dx={E}q ⁣[f(x) {p(x)}{q(x)}]\mathbb\{E\}_p[f(x)] = \int f(x)\,p(x)\,dx = \int f(x)\,\frac\{p(x)\}\{q(x)\}\,q(x)\,dx = \mathbb\{E\}_q\!\left[f(x)\,\frac\{p(x)\}\{q(x)\}\right]

用蒙特卡洛近似最后一个期望:

{E}p[f(x)]≈{1}{N}∑{i=1}{N}f(xi) wi,xi∼q(x),wi={p(xi)}{q(xi)}\mathbb\{E\}_p[f(x)] \approx \frac\{1\}\{N\}\sum_\{i=1\}^\{N\} f(x_i)\,w_i, \quad x_i \sim q(x), \quad w_i = \frac\{p(x_i)\}\{q(x_i)\}

其中 wi={p(xi)}{q(xi)}w_i = \frac\{p(x_i)\}\{q(x_i)\} 称为重要性权重(importance weight)。关键技巧:选择 q(x)q(x) 使其在 f(x)⋅p(x)f(x) \cdot p(x) 较大的区域采样更多——这样估计方差最小。这也是”重要性”的含义:把采样资源集中在重要区域。

自归一化重要性采样(Self-normalized IS):当只能得到未归一化密度 {~p}(x)=Zp⋅p(x)\tilde\{p\}(x) = Z_p \cdot p(x) 时(ZpZ_p 未知),权重变为 \tilde\{w\}_i = \frac\{\tilde\{p\}(x_i)\}\{q(x_i)\},估计量修正为 {^{E}}={∑{~w}if(xi)}{∑{~w}i}\hat\{\mathbb\{E\}\} = \frac\{\sum \tilde\{w\}_i f(x_i)\}\{\sum \tilde\{w\}_i\}。这是实际中最常用的形式,因为它绕开了归一化常数。

重要性采样在强化学习的离策略(Off-policy)评估、贝叶斯模型证据计算中有核心应用。要注意:如果 qq 在 pp 有显著概率密度的区域概率很低,权重 wiw_i 方差会爆炸,估计极不可靠——监控有效样本大小 {ESS}={(∑wi)2}{∑wi2}\text\{ESS\} = \frac\{(\sum w_i)^2\}\{\sum w_i^2\} 是实践中的必备操作。

MCMC(Markov Chain Monte Carlo,马尔可夫链蒙特卡洛)构造一条马尔可夫链,使其平稳分布恰好是目标分布 p(x)p(x)。马尔可夫链的精髓:下一步去哪只取决于当前在哪(无记忆性)。当链走得足够久后,其所处位置的分布就趋近于 p(x)p(x)——这就是采样的来源。

Metropolis-Hastings 是最基础的 MCMC 算法:

  1. 从当前状态 xx,用提议分布 q(x′∣x)q(x' \mid x) 生成候选 x′x'。
  2. 计算接受概率 α=min⁡ ⁣(1,  {p(x′) q(x∣x′)}{p(x) q(x′∣x)})\alpha = \min\!\left(1,\; \frac\{p(x')\,q(x \mid x')\}\{p(x)\,q(x' \mid x)\}\right)。
  3. 从 {Uniform}(0,1)\text\{Uniform\}(0,1) 采样 uu。
  4. 若 u<αu < \alpha,接受 x′x'(链转移到 x′x');否则留在 xx。

接受概率的直觉:比值 {p(x′)}{p(x)}\frac\{p(x')\}\{p(x)\} 衡量候选点”有多好”——如果候选点概率更高(上坡),分子 ≥\ge 分母,α=1\alpha = 1,一定接受;如果候选点概率更低(下坡),以概率 {p(x′)}{p(x)}\frac\{p(x')\}\{p(x)\} 接受,既允许探索低概率区又防止一头扎进谷底出不来。{q(x∣x′)}{q(x′∣x)}\frac\{q(x \mid x')\}\{q(x' \mid x)\} 是”可逆性修正”,当提议分布不对称时(比如总是往右走多一点),修正这个偏差。

细致平衡条件(Detailed Balance):MCMC 收敛的数学保证是 π(x) T(x→x′)=π(x′) T(x′→x)\pi(x)\,T(x \to x') = \pi(x')\,T(x' \to x),即从 xx 到 x′x' 的流量等于反向流量。Metropolis-Hastings 的接受概率正是为此精心设计的。满足细致平衡的马尔可夫链,其平稳分布必为 p(x)p(x)。

关键优势:只需要知道 p(x)p(x) 的未归一化形式(不需要归一化常数 ZZ)——因为比值 {p(x′)}{p(x)}\frac\{p(x')\}\{p(x)\} 中 ZZ 被约掉了。这对贝叶斯后验 p(θ∣{data})∝p({data}∣θ) p(θ)p(\theta \mid \text\{data\}) \propto p(\text\{data\} \mid \theta)\,p(\theta) 至关重要,ZZ 通常无法解析计算。

Gibbs 采样是 Metropolis-Hastings 的特例,适用于多维分布 p(x1,x2,…,xd)p(x_1, x_2, \ldots, x_d)。每次只更新一个维度,条件于其他所有维度的当前值:

x1(t+1)∼p(x1∣x2(t),x3(t),…,xd(t))x2(t+1)∼p(x2∣x1(t+1),x3(t),…,xd(t))⋮xd(t+1)∼p(xd∣x1(t+1),x2(t+1),…,xd−1(t+1))x_1^{(t+1)} \sim p(x_1 \mid x_2^{(t)}, x_3^{(t)}, \ldots, x_d^{(t)}) \\ x_2^{(t+1)} \sim p(x_2 \mid x_1^{(t+1)}, x_3^{(t)}, \ldots, x_d^{(t)}) \\ \vdots \\ x_d^{(t+1)} \sim p(x_d \mid x_1^{(t+1)}, x_2^{(t+1)}, \ldots, x_{d-1}^{(t+1)})

每个条件分布的采样通常比联合分布容易得多。可以证明 Gibbs 采样是 MH 的特例,其接受率始终为 1(永远不拒绝)——因为从精确条件分布采样天然满足细致平衡。Gibbs 采样是概率图模型和贝叶斯推断的主力工具。详见概率图模型。

HMC(Hamiltonian Monte Carlo)利用目标分布的梯度信息,将采样问题转化为物理模拟。核心想法:把负对数概率 −ln⁡p(x)-\ln p(x) 看作”势能”(potential energy)——概率高的地方势能低(山谷),概率低的地方势能高(山峰)。再引入辅助的”动量”变量 vv,让虚拟粒子在这片势能景观上按哈密顿动力学运动:

H(x,v)={⏟−ln⁡p(x)}{{势能}U(x)}+{⏟{1}{2} vTM{−1}v}{{动能}K(v)}H(x, v) = \underbrace\{-\ln p(x)\}_\{\text\{势能 \} U(x)\} + \underbrace\{\tfrac\{1\}\{2\}\,v^T M^\{-1\} v\}_\{\text\{动能 \} K(v)\}

粒子沿等高线滑动,能高效穿越高维空间,不像普通 MCMC 那样在原地”随机游走”(random walk)。HMC 需要梯度 ∇xln⁡p(x)\nabla_x \ln p(x)——在现代深度学习框架中由 autograd(自动微分引擎,即自动计算梯度的系统)轻松获得。

NUTS(No-U-Turn Sampler)是 HMC 的自适应版本:它自动决定轨迹长度(走到”该回头”为止),并自动调节步长,无需手动调参。NUTS 是 Stan 和 PyMC 的默认采样器。近年(2023-2025)JAX 生态催生了新一代高性能库——BlackJAX(Google/DeepMind)和 NumPyro(Google/Uber)——它们将 HMC/NUTS 跑在 GPU/TPU 上,对大规模层次模型可实现数十倍加速,逐渐成为贝叶斯计算的新标准。

扩散模型(Diffusion Model)的采样过程本质是反向随机微分方程(Reverse SDE)的数值求解——从纯高斯噪声出发,逐步去噪还原数据。数学上,扩散过程定义了前向 SDE dx=f(x,t) dt+g(t) dwdx = f(x,t)\,dt + g(t)\,dw,其逆向时间 SDE 在 Tweedie’s formula 下可解析表达,但需要数值积分。DDPM、DDIM、DPM-Solver 都是该方程的不同离散化方案。

2023-2025 年间,采样方法在生成式 AI 领域经历了爆发式创新:

  • DPM-Solver / DPM-Solver++(2022-2023):利用扩散 ODE 是指数积分的数学结构,设计专用高阶求解器,将采样步数从 1000 压缩到 10-20 步,质量几乎无损。
  • Flow Matching(2022-2025):抛弃传统高斯扩散框架,直接学习两个分布之间的连续流(continuous normalizing flow)。Stable Diffusion 3 和 Black Forest Labs 的 Flux 模型均采用 Flow Matching(具体为 Rectified Flow 变体),在图像质量与文本对齐上刷新了 SOTA。
  • Consistency Models(2023-2025):OpenAI 提出,训练一个单步映射网络直接从噪声生成数据,推理时无需迭代求解 ODE——把”采样”压缩成一次前向传播。2024 年的改进版本(Consistency Training v2)进一步逼近多步扩散器的质量。
  • 一致性轨迹模型(Consistency Trajectory Model, CTM)和超快速蒸馏采样器(如 SDXL Turbo、LCM-LoRA)将扩散采样压缩到 1-4 步,使实时生成成为可能。

详见扩散模型。

numpy 手写逆变换采样、拒绝采样与 MCMC

Section titled “numpy 手写逆变换采样、拒绝采样与 MCMC”
import numpy as np
import matplotlib.pyplot as plt
# ============================================================
# 1. 逆变换采样: 从指数分布 Exp(λ) 采样
# ============================================================
# Exp(λ) 的 CDF 为 F(x) = 1 - exp(-λx),逆函数 F⁻¹(u) = -ln(1-u)/λ
lam = 2.0
u = np.random.uniform(0, 1, 10000) # 均匀随机数
x_inv = -np.log(1 - u) / lam # CDF 求逆 → 服从 Exp(λ) 的样本
# ============================================================
# 2. 拒绝采样: 从标准正态 N(0,1) 采样
# ============================================================
# 提议分布 q(x) = Uniform(-5, 5),密度 1/10
# 目标 p(x) = 标准正态密度,最大值约 0.399(在 x=0 处)
# 上界 M·q(x) 需 ≥ max p(x),取 M·q = 0.4 → M = 4.0
def target_pdf(x):
"""标准正态分布的概率密度函数"""
return np.exp(-x**2 / 2) / np.sqrt(2 * np.pi)
upper_bound = 0.4 # M * q(x) 的常数上界
samples_rej = []
attempts = 0
while len(samples_rej) < 5000:
x_cand = np.random.uniform(-5, 5) # 从均匀提议分布采样
u = np.random.uniform(0, 1)
attempts += 1
if u < target_pdf(x_cand) / upper_bound: # 接受准则
samples_rej.append(x_cand)
accept_rate = len(samples_rej) / attempts
print(f"拒绝采样: 收集 {len(samples_rej)} 个样本, "
f"接受率={accept_rate:.2%}, 均值={np.mean(samples_rej):.3f}")
# ============================================================
# 3. Metropolis-Hastings: 从目标分布 p(x) ∝ exp(-x⁴/4) 采样
# (这是一个非标准分布,没有现成采样器)
# ============================================================
def log_target(x):
"""未归一化目标分布的对数密度: p(x) ∝ exp(-x⁴/4)"""
return -x**4 / 4.0
def metropolis_hastings(log_prob, x0, n_samples, proposal_std=1.0):
"""
Metropolis-Hastings 采样器(对称随机游走提议)。
- log_prob: 未归一化对数目标密度(只需正比即可)
- x0: 初始状态
- proposal_std: 高斯提议分布的标准差
"""
samples = np.zeros(n_samples)
x = x0
log_p = log_prob(x)
n_accept = 0
for i in range(n_samples):
x_prop = x + np.random.normal(0, proposal_std) # 对称提议
log_p_prop = log_prob(x_prop)
# 接受概率 α = min(1, exp(log_p_prop - log_p))
# 对数域计算更稳定,避免溢出
if np.log(np.random.uniform()) < (log_p_prop - log_p):
x, log_p = x_prop, log_p_prop
n_accept += 1
samples[i] = x
return samples, n_accept / n_samples
samples_mh, acc_rate = metropolis_hastings(log_target, x0=0.0, n_samples=20000)
# 丢弃前 5000 个样本作为 burn-in(预热),只保留后半段
samples_mh_kept = samples_mh[5000:]
print(f"MH 采样: 接受率={acc_rate:.2%}, "
f"保留样本均值={np.mean(samples_mh_kept):.3f}, "
f"方差={np.var(samples_mh_kept):.3f}")
# ============================================================
# 4. 可视化三种方法的采样结果
# ============================================================
fig, axes = plt.subplots(1, 3, figsize=(15, 4))
axes[0].hist(x_inv, bins=80, density=True, alpha=0.7, color='steelblue')
axes[0].set_title('逆变换采样: Exp(λ=2)')
axes[1].hist(samples_rej, bins=80, density=True, alpha=0.7, color='green')
x_grid = np.linspace(-4, 4, 200)
axes[1].plot(x_grid, target_pdf(x_grid), 'r-', lw=2, label='理论 PDF')
axes[1].set_title(f'拒绝采样: N(0,1) 接受率 {accept_rate:.1%}')
axes[1].legend()
axes[2].hist(samples_mh_kept, bins=80, density=True, alpha=0.7, color='purple')
x_grid2 = np.linspace(-3, 3, 200)
# 理论密度(归一化常数 ≈ 1.81,数值积分近似)
unnorm = np.exp(-x_grid2**4 / 4)
axes[2].plot(x_grid2, unnorm / np.trapz(unnorm, x_grid2), 'r-', lw=2, label='理论 PDF')
axes[2].set_title(f'MH 采样: exp(-x⁴/4) 接受率 {acc_rate:.1%}')
axes[2].legend()
plt.tight_layout()
plt.savefig('sampling_comparison.png', dpi=150)
print("图表已保存到 sampling_comparison.png")

三种采样方法结果对比:逆变换采样、拒绝采样与 Metropolis-Hastings

import numpy as np
# ============================================================
# 用重要性采样估计 P(X > 5) where X ~ N(0,1)
# 直接蒙特卡洛需要 ~10⁷ 个样本才能看到几次(概率 ≈ 2.87e-7)
# 重要性采样用偏移的提议分布大幅降低方差
# ============================================================
def importance_sampling_rare_event(n_samples=100000, threshold=5.0):
"""
用重要性采样估计标准正态的尾部概率 P(X > threshold)。
提议分布 q 选为 N(threshold, 1)——把采样资源集中到尾部。
"""
# 提议分布: 均值偏移到 threshold
proposals = np.random.normal(threshold, 1.0, n_samples)
# 未归一化权重 w = p(x)/q(x),用对数域计算更稳定
# log p(x) = -x²/2 - 0.5·log(2π)
# log q(x) = -(x-threshold)²/2 - 0.5·log(2π)
log_w = -proposals**2 / 2 + (proposals - threshold)**2 / 2
# 指示函数 f(x) = 1{x > threshold}
indicator = (proposals > threshold).astype(float)
# 自归一化重要性采样估计
weights = np.exp(log_w - log_w.max()) # 数值稳定化
estimate = np.sum(indicator * weights) / np.sum(weights)
# 理论值: 1 - Φ(threshold)
from scipy.stats import norm
theoretical = 1 - norm.cdf(threshold)
return estimate, theoretical
est, truth = importance_sampling_rare_event(n_samples=100000)
print(f"重要性采样估计 P(X>5) = {est:.6e}")
print(f"理论值 = {truth:.6e}")
print(f"相对误差 = {abs(est - truth) / truth:.2%}")
# 只需 10⁵ 个样本,IS 就能高精度估计 ~10⁻⁷ 的概率
import numpy as np
import pymc as pm
import arviz as az # 贝叶斯诊断可视化库
# ============================================================
# 贝叶斯线性回归: y = a·x + b + noise
# 用 NUTS 采样器自动推断后验分布 p(a, b, σ | data)
# ============================================================
rng = np.random.default_rng(42)
true_a, true_b, true_sigma = 2.5, 1.0, 1.0
x = np.linspace(0, 10, 50)
y = true_a * x + true_b + rng.normal(0, true_sigma, 50)
with pm.Model() as linear_model:
# 先验分布(先验 encode 我们在看到数据之前的信念)
a = pm.Normal("a", mu=0, sigma=10) # 斜率先验:宽泛的正态
b = pm.Normal("b", mu=0, sigma=10) # 截距先验
sigma = pm.HalfNormal("sigma", sigma=1) # 噪声标准差先验(半正态保证为正)
# 线性模型与似然函数
mu = a * x + b
pm.Normal("obs", mu=mu, sigma=sigma, observed=y) # 似然
# NUTS 采样器自动推断后验
# tune=500: 前 500 步用于调节步长(预热),不保留
# chains=2: 跑两条独立链,用于 R-hat 收敛诊断
trace = pm.sample(1000, tune=500, chains=2, progressbar=False)
# 后验摘要与收敛诊断
summary = az.summary(trace, hdi_prob=0.94) # HDI = 最高密度区间
print(summary)
# R-hat ≈ 1.000 且 ESS > 400 表示链已充分收敛,结果可信
print(f"\n斜率 a: 后验均值 = {trace.posterior['a'].mean():.2f} (真值 {true_a})")
print(f"截距 b: 后验均值 = {trace.posterior['b'].mean():.2f} (真值 {true_b})")
print(f"σ: 后验均值 = {trace.posterior['sigma'].mean():.2f} (真值 {true_sigma})")
  • 能用解析方法就别采样:如果分布的归一化常数、期望、边缘分布都能解析计算(如高斯、狄利克雷),直接用公式,不需要采样。采样是”最后手段”。
  • 低维用拒绝/逆变换,高维用 MCMC:拒绝采样在高维因接受率暴跌而不可用。逆变换需要 CDF 可逆,高维几乎不可能。高维分布几乎只能用 MCMC 或变分推断。
  • 关注收敛诊断:MCMC 需要预热(burn-in,丢弃前若干样本)和收敛检验(如 R-hat 统计量、有效样本数 ESS)。R-hat 接近 1.0 说明链已收敛;大于 1.1 则需要更多迭代或重新调参。ArviZ 库提供一键诊断(az.summary、az.plot_trace)。
  • NUTS 是贝叶斯推断首选:NUTS 自动调节步长和轨迹长度,无需手动调参,PyMC 和 Stan 默认使用。经典 Metropolis-Hastings 只在梯度不可得时使用。如果追求速度,可以尝试 JAX 后端的 NumPyro 或 BlackJAX——它们支持 GPU 加速,适合大规模模型。
  • 重要性采样注意方差:如果提议分布 q(x)q(x) 和目标分布 p(x)p(x) 不匹配(权重方差极大),估计会有巨大方差。实践中需要监控有效样本大小({ESS}={(∑wi)2}{∑wi2}\text\{ESS\} = \frac\{(\sum w_i)^2\}\{\sum w_i^2\})。ESS 远小于实际样本数时,说明权重退化(weight degeneracy),估计不可靠。
  • 变分推断是采样的替代方案:当 MCMC 太慢时,用变分推断(VI,Variational Inference)把采样问题转化为优化问题——用一个参数化分布族逼近目标分布,速度极快但精度不如 MCMC(有偏估计)。VI 是大规模主题模型(如 LDA)和大语言模型训练中近似后验的主力。详见蒙特卡洛方法。
  • 扩散模型的采样是特殊的逆问题:扩散采样的”质量-速度权衡”在 2023-2025 年被大幅推进——从 1000 步的 DDPM 到 4 步的 LCM(Latent Consistency Model),核心是对反向 SDE/ODE 的更好数值离散化与蒸馏。选采样器时,DPM-Solver++(20 步)和 Flow Matching 的 Euler 采样器(30-50 步)是目前质量与速度的甜点。
  • 贝叶斯推断:计算后验分布 p(θ∣{data})p(\theta \mid \text\{data\}) 的期望、credible interval(可信区间,即贝叶斯版的置信区间)。PyMC、Stan、NumPyro 是工业级 MCMC 工具。详见EM 算法。
  • 蒙特卡洛积分:高维定积分的数值求解,如物理模拟中的路径积分、金融衍生品定价。详见蒙特卡洛方法。
  • 扩散模型采样:DDPM、DDIM、DPM-Solver、Flow Matching 本质是反向 SDE 的数值采样过程。2024-2025 年的 Consistency Model 和蒸馏采样器将其压缩到 1-4 步。详见扩散模型。
  • 强化学习中的策略评估:重要性采样用于 Off-policy 评估——用旧策略收集的数据评估新策略的期望回报,无需重新交互。
  • 概率图模型推理:Gibbs 采样用于贝叶斯网络和马尔可夫随机场的近似推理,尤其适合高维离散分布。详见概率图模型。
  • 稀有事件模拟:金融风险中的尾部事件(如 VaR、 Expected Shortfall 计算)用重要性采样集中在极端区域,方差可比朴素蒙特卡洛降低数个量级。
类库语言说明
numpy.randomPython基础随机数生成:均匀、正态、指数等标准分布
scipy.statsPython连续/离散分布的 PDF、CDF、rvs(采样)完整工具链
PyMCPythonPython 贝叶斯统计建模库,内置 NUTS、Metropolis 等采样器(v5+ 支持 JAX 后端)
Stan (CmdStanPy)C++/Python高性能贝叶斯推断引擎,NUTS 采样器的标杆实现
NumPyroPython基于 JAX 的概率编程库,GPU/TPU 加速的 NUTS 和 HMC
BlackJAXPythonDeepMind 出品的 JAX 原生 MCMC 库,模块化设计,含 HMC/NUTS/ADVI
emceePython天文学常用的仿射不变 MCMC 采样器(Ensemble sampler)
ArviZPython贝叶斯后验诊断与可视化(R-hat、ESS、trace plot)
TensorFlow ProbabilityPythonGoogle 的概率编程库,含 HMC、VI 等完整采样工具
术语英文解释
采样Sampling从概率分布中生成随机样本的过程
逆变换采样Inverse Transform Sampling利用 CDF 的逆函数将均匀分布样本转换为目标分布样本
拒绝采样Rejection Sampling用提议分布和接受/拒绝机制生成目标分布样本
重要性采样Importance Sampling从提议分布采样并用权重修正来估计目标分布下的期望
马尔可夫链蒙特卡洛MCMC构造平稳分布为目标分布的马尔可夫链来进行采样
细致平衡Detailed Balanceπ(x)T(x→x′)=π(x′)T(x′→x)\pi(x)T(x\to x')=\pi(x')T(x'\to x),保证平稳分布的充分条件
Metropolis-HastingsMetropolis-Hastings最通用的 MCMC 算法,通过接受/拒绝机制保证收敛到目标分布
Gibbs 采样Gibbs Sampling逐维度从条件分布采样的 MCMC 方法,适用于多维分布
哈密顿蒙特卡洛HMC利用梯度信息和物理动力学加速高维采样的 MCMC 方法
预热Burn-in丢弃 MCMC 链初始阶段未收敛的样本
有效样本大小ESS衡量 MCMC 样本独立性等效于独立样本的数量
归一化常数Normalizing Constant / Partition Function使概率密度积分为 1 的常数因子 ZZ,高维下通常不可解析计算
反向 SDEReverse SDE扩散模型中从噪声还原数据的逆向随机微分方程
Flow MatchingFlow Matching通过匹配连续概率流来训练生成模型的方法,Stable Diffusion 3 / Flux 的基础
  • Robert & Casella,「Monte Carlo Statistical Methods」(2004):采样方法的权威教材,从逆变换到 MCMC 到粒子滤波,推导完备。
  • Hastings,「Monte Carlo Sampling Methods Using Markov Chains and Their Applications」(1970):Metropolis-Hastings 算法的奠基论文,定义了现代 MCMC 的框架。
  • Hoffman & Gelman,「The No-U-Turn Sampler」(JMLR 2014):NUTS 论文,自适应调节 HMC 参数,是 Stan/PyMC 默认采样器的来源。
  • Neal,「MCMC using Hamiltonian Dynamics」(2011):HMC 的最佳入门综述,从物理直觉到实现细节讲解透彻。
  • Andrieu et al.,「An Introduction to MCMC for Machine Learning」(2003):面向机器学习读者的 MCMC 教程,50 页覆盖核心算法与应用场景。
  • Lu et al.,「DPM-Solver: A Fast ODE Solver for Diffusion Models」(NeurIPS 2022, ICLR 2023):将扩散 ODE 视为指数积分,设计专用高阶求解器,10-20 步即可生成高质量样本。
  • Lipman et al.,「Flow Matching for Generative Modeling」(ICLR 2023):Flow Matching 的奠基论文,提出通过匹配向量场训练连续归一化流,成为 2024-2025 年主流生成框架。
  • Song et al.,「Consistency Models」(ICML 2023):OpenAI 的单步生成模型,将扩散采样压缩到一次前向传播,后续 Consistency Distillation 和 CTM 持续改进。
  • BlackJAX 文档 (blackjax-devs.github.io/blackjax):2023-2025 年活跃开发的 JAX 原生 MCMC 库,适合追求 GPU 加速和可组合性的研究者。
  • ArviZ 生态系统 (https://python.arviz.org/):贝叶斯后验分析与诊断的标准工具,支持 PyMC、NumPyro、Stan 等多种后端,是 MCMC 收敛诊断的必备。