采样理论深度基础
1 引言
采样(Sampling)是现代机器学习和统计推断的基石技术。从贝叶斯后验推断到扩散模型生成,采样方法无处不在。本章系统介绍采样理论的深度基础,包括蒙特卡洛方法的理论基础、方差缩减技术、以及粒子方法的现代进展。
2 蒙特卡洛方法理论基础
2.1 基本原理
蒙特卡洛方法(Monte Carlo Method)的核心思想是通过随机采样来估计数学期望。1
问题设定:计算期望
蒙特卡洛估计:
2.2 收敛性分析
大数定律
设 为独立同分布随机变量,,则:
意义:随着样本数增加,蒙特卡洛估计几乎必然收敛到真实值。
中心极限定理
其中 为方差。
置信区间:
2.3 误差分析
蒙特卡洛方法的标准误差为:
关键洞察:
- 误差与 成正比
- 精度翻倍需要4倍样本量
- 与问题维度无关(这是蒙特卡洛相比数值积分的优势)
2.4 偏差-方差分解
蒙特卡洛估计的均方误差:
对于简单蒙特卡洛估计:
- 无偏性:
- 方差:
3 方差缩减技术
方差缩减是提高蒙特卡洛效率的核心技术。2 基本思想是构造控制变量,在保持无偏性的同时降低方差。
3.1 重要性采样(Importance Sampling)
基本原理
从提议分布 采样,重加权以修正偏差:
重要性采样估计:
权重归一化
实践中常使用归一化权重:
方差分析
重要性采样的方差:
最优提议分布(重要性采样方差最小):
这正是方差为零的理论最优(若 )。
自适应重要性采样
import numpy as np
def adaptive_importance_sampling(f, p, q_init, n_iter=10, n_samples=1000):
"""
自适应重要性采样
f: 被积函数
p: 目标分布(未归一化)
q_init: 初始提议分布
"""
q = q_init
for iteration in range(n_iter):
# 从当前提议分布采样
x = q.sample(n_samples)
# 计算权重
w = p(x) / q.pdf(x)
# 估计积分
I_est = np.mean(w * f(x))
# 自适应更新提议分布(基于样本加权)
# 这里使用简单的均值移动
weighted_mean = np.sum(w * x) / np.sum(w)
weighted_std = np.sqrt(np.sum(w * (x - weighted_mean)**2) / np.sum(w))
q = GaussianDistribution(mean=weighted_mean, std=weighted_std)
return I_est存在的问题
- 权重退化:当提议分布与目标分布差异大时
- 方差爆炸:当 的尾部差异大时
解决方案:多重重要性采样、减方差采样
3.2 拒绝采样(Rejection Sampling)
基本原理
通过拒绝不合符目标的样本,从复杂分布采样。
算法:
- 从提议分布 采样
- 计算接受率
- 以概率 接受 ,否则拒绝
- 重复直到接受
其中 是接受常数。
收敛性
接受率 ,平均需要 次提议才能接受一次。
最优策略:选择 接近 以最小化拒绝率。
自适应拒绝采样(Adaptive Rejection Sampling)
当 对数凹时,可以使用自适应拒绝采样,自动调整包络函数。
def rejection_sampling(p_tilde, q, M, n_samples):
"""
拒绝采样
p_tilde: 未归一化的目标分布
q: 提议分布
M: 接受上界
"""
samples = []
while len(samples) < n_samples:
x = q.sample()
u = np.random.uniform(0, 1)
if u < p_tilde(x) / (M * q.pdf(x)):
samples.append(x)
return np.array(samples)3.3 分层采样(Stratified Sampling)
基本原理
将积分区域划分为互不相交的层,分别在每层采样:
方差缩减
设每层采样 个样本,则:
其中 是第 层内的方差。
最优分配(Neyman分配):
3.4 控制变量法(Control Variates)
基本原理
利用已知期望的控制变量 来修正估计:
最优系数
最优系数 使方差最小:
方差缩减量
其中 是 和 的相关系数。
3.5 对偶变量法(Antithetic Variates)
基本原理
利用负相关的样本对:
当 是单调函数时, 和 负相关,从而降低方差。
3.6 方差缩减技术对比
| 方法 | 原理 | 适用场景 | 实现难度 |
|---|---|---|---|
| 重要性采样 | 改变采样分布 | 难以直接采样 | 中等 |
| 拒绝采样 | 接受-拒绝机制 | 有上界可计算 | 简单 |
| 分层采样 | 分区域控制 | 可分层的问题 | 简单 |
| 控制变量 | 相关性利用 | 有已知期望的关联变量 | 中等 |
| 对偶变量 | 负相关对 | 单调函数 | 简单 |
4 序贯重要性采样(Sequential Importance Sampling)
4.1 基本框架
序贯重要性采样(SIS)是重要性采样在序列问题上的扩展。3
问题设定:估计序列分布
递归形式:
4.2 重要性权重递归
提议分布分解:
权重递归:
4.3 粒子滤波器(SIR)
SIS的主要问题是权重退化。粒子滤波器通过重采样解决。
def particle_filter(y_obs, n_particles, p_transition, p_emission, q_proposal):
"""
粒子滤波器(序贯重要重采样)
y_obs: 观测序列
n_particles: 粒子数
"""
T = len(y_obs)
particles = [] # 存储所有时刻的粒子
weights = []
# 初始化
x = q_proposal.sample(n_particles)
w = np.ones(n_particles) / n_particles
particles.append(x)
weights.append(w)
for t in range(1, T):
# 重要性采样
x_new = q_proposal.sample(particles[-1], y_obs[t])
# 计算权重
w_new = weights[-1] * p_emission(y_obs[t], x_new) * p_transition(x_new, particles[-1])
w_new /= np.sum(w_new) # 归一化
# 重采样
indices = np.random.choice(n_particles, size=n_particles, p=w_new)
x_resampled = x_new[indices]
w_resampled = np.ones(n_particles) / n_particles
particles.append(x_resampled)
weights.append(w_resampled)
return particles, weights4.4 重采样技术
多重重采样方法:
- 多项式采样:简单但方差大
- 分层采样:方差更小
- 系统采样:推荐使用
- 残差采样:计算高效
def systematic_resample(weights, n_samples):
"""系统重采样"""
# 分层
u0 = np.random.uniform(0, 1/n_samples)
u = (u0 + np.arange(n_samples)) / n_samples
# 累积权重
cumsum = np.cumsum(weights)
# 选择
indices = np.searchsorted(cumsum, u)
return indices5 蒙特卡洛方法的现代进展
5.1 拉丁超立方体采样
拉丁超立方体采样(Latin Hypercube Sampling, LHS)在高维空间中更均匀地覆盖采样区域。
性质:
- 边缘分布在每维上均匀
- 相关性可控制
- 方差通常比简单随机采样小
def latin_hypercube(n_samples, dim):
"""拉丁超立方体采样"""
# 每维划分为n_samples个区间
intervals = np.linspace(0, 1, n_samples + 1)
# 每维随机选择区间
samples = np.zeros((n_samples, dim))
for d in range(dim):
# 打乱区间顺序
perm = np.random.permutation(n_samples)
# 在每个区间内均匀采样
lower = intervals[perm]
upper = intervals[perm + 1]
samples[:, d] = np.random.uniform(lower, upper)
return samples5.2 拟蒙特卡洛方法
拟蒙特卡洛(Quasi-Monte Carlo, QMC)使用确定性序列,具有更均匀的覆盖。
常用序列:
- Halton序列
- Sobol序列
- Niederreiter序列
低差异序列:这些序列的点分布比随机采样更均匀。
5.3 桥式采样(Bridge Sampling)
用于计算两个分布之间的归一化常数比:
估计量:
其中 , , 是辅助分布。
6 与相关内容的联系
6.1 与变分推断的关系
采样方法和变分推断是近似后验推断的两大范式:
| 方面 | 采样方法 | 变分推断 |
|---|---|---|
| 精度 | 渐近无偏 | 有偏但方差小 |
| 计算 | 通常昂贵 | 可微分、可扩展 |
| 表达能力 | 灵活 | 受限于近似族 |
详见 variational-inference-deep-dive。
6.2 与MCMC的联系
SIS/粒子滤波是序贯MCMC的基础。完整的MCMC理论见:
- mcmc-methods — 基础MCMC方法
- mcmc-advanced — NUTS、切片采样
6.3 在贝叶斯深度学习中的应用
采样方法是贝叶斯神经网络的理论基础:
- bayesian-neural-networks — 贝叶斯神经网络基础
- bayesian-last-layer-deep-learning — BNN的最后一层贝叶斯化
7 实践指南
7.1 方法选择流程
开始
│
├─ 能否直接采样? ──是──> 简单蒙特卡洛
│
└─ 否
│
├─ 有建议分布 ──是──> 重要性采样
│ (检查方差)
│
├─ 可计算上界 ──是──> 拒绝采样
│
└─ 其他情况
│
├─ 序列问题 ──> 粒子滤波器
│
└─ 静态问题 ──> MCMC方法
7.2 常见问题与解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 权重退化 | 提议分布偏离目标 | 重采样、自适应提议 |
| 高拒绝率 | 上界M太大 | 改进提议分布 |
| 高方差 | 采样不均匀 | 方差缩减技术 |
| 维度灾难 | 空间稀疏性 | 降维、MCMC |
7.3 软件实现推荐
- NumPyro:基于JAX的灵活概率编程
- PyMC:成熟的贝叶斯建模工具
- TensorFlow Probability:深度学习集成
- Stan:高效的MCMC实现
8 总结
本章系统介绍了采样理论的深度基础:
- 蒙特卡洛方法的理论基础:大数定律、中心极限定理、收敛性分析
- 方差缩减技术:重要性采样、拒绝采样、分层采样、控制变量法
- 序贯重要性采样:粒子滤波器的理论基础和实现
- 现代进展:QMC、拉丁超立方体、桥式采样
这些技术是现代机器学习中近似推断和生成建模的核心工具。
参考文献
Footnotes
-
Robert, C.P. & Casella, G. (2004). Monte Carlo Statistical Methods. Springer. ↩
-
Owen, A.B. (2013). Monte Carlo Theory, Methods and Examples. ↩
-
Doucet, A., Godsill, S., & Andrieu, C. (2000). On sequential Monte Carlo sampling methods for Bayesian filtering. Statistics and Computing, 10(3), 197-208. ↩