一句话:计算期望本质是计算积分,积分算不了就用采样均值代替,均匀采样浪费在无效区域导致方差大,重要性采样换一个"聪明的分布 q"集中采有效区域,再用权重 p/q 修正偏差,保证结果无偏且方差更小。
一、为什么需要重要性采样?
计算期望 = 计算积分
$$\mathbb{E}_p[f(x)] = \int f(x) \cdot p(x) , dx$$
很多场景这个积分没有解析解,无法直接用数学公式算:
- 高维积分:神经网络参数空间是几百万维,数值积分根本算不了
- 分布形状复杂:多峰分布、奇形怪状的后验分布,没有现成公式
- 采样代价高:强化学习里从新策略采样需要重新跑环境,代价极高
这时只能用蒙特卡洛方法:采样求均值代替积分。
二、蒙特卡洛:采样求均值
从分布 $p$ 采 $N$ 个样本,用样本均值估计期望:
$$\mathbb{E}p[f(x)] \approx \frac{1}{N} \sum{i=1}^{N} f(x_i), \quad x_i \sim p$$
问题:如果直接从 $p$ 采样很难(或代价高),或者均匀采样导致大量样本浪费在 $f(x) \approx 0$ 的区域,方差就会很大。
估算 P(x > 4),x ~ N(0,1):
均匀采样 100 万个点,平均只有 31 个落在 x>4
→ 99.997% 的样本对结果没有贡献,方差极大
三、重要性采样:换一个更好的分布
核心公式
从另一个容易采样的分布 $q$ 采样,用权重修正偏差:
$$\mathbb{E}_p[f(x)] = \mathbb{E}q\left[f(x) \cdot \frac{p(x)}{q(x)}\right] \approx \frac{1}{N} \sum{i=1}^{N} f(x_i) \cdot \frac{p(x_i)}{q(x_i)}, \quad x_i \sim q$$
其中 $\frac{p(x)}{q(x)}$ 是重要性权重,补偿"从错误分布采样"带来的偏差。
直觉
均匀采样(无脑撒点):大量样本在 f(x)≈0 的区域,对期望贡献为 0,浪费
重要性采样(聪明撒点):样本集中在 f(x) 大的区域,每个样本都有实质贡献
权重 p/q < 1 修正"采太频繁"带来的偏差,结果仍无偏
两个硬性要求
- 覆盖性:$q(x) > 0$ 的区域必须覆盖所有 $p(x) > 0$ 的区域,否则权重 $p/q = \infty$,估计崩掉
- 形状接近:$q$ 的形状越接近 $f(x) \cdot p(x)$,权重越接近常数,方差越小
四、常见疑问解答
Q1:为什么 p 分布不好采样,q 就容易采样?
两件事是独立的:
- 能算密度值 p(x):给定点 x,代入公式算出密度
- 能从分布采样:随机生成符合该分布的样本
有些分布能算密度但很难采样(复杂后验),有些分布采样极简单(正态分布直接调库)。重要性采样利用的正是这个不对称性:
p:能算密度值,但采样难/代价高
q:能算密度值,且采样容易(正态、均匀等)
权重 p(x)/q(x):两个密度值相除,直接得到
Q2:为什么不直接用数学公式算?
- 公式能算的情况(如 $P(x>4)$ 用误差函数)确实不需要采样
- 高维积分(1000 维)、无解析解的分布、归一化常数未知的后验——这些情况公式根本算不了
- 重要性采样针对的正是"公式算不了"的场景
Q3:必须知道 p 的分布吗?
是的,这是前提。想计算 $\mathbb{E}_p[f(x)]$,必须知道 $p$ 是什么,否则期望本身就没有定义。重要性采样额外要求的只是:p(x) 的密度值要能逐点计算(不需要能从 p 采样,不需要知道归一化常数)。
特殊情况:$p(x)$ 只知道未归一化形式 $\tilde{p}(x) = Z \cdot p(x)$,用自归一化重要性采样,$Z$ 在分子分母相消:
$$\mathbb{E}_p[f(x)] \approx \frac{\sum_i \tilde{w}_i f(x_i)}{\sum_i \tilde{w}_i}, \quad \tilde{w}_i = \frac{\tilde{p}(x_i)}{q(x_i)}$$
Q4:q 怎么选?
选 q 的原则:形状尽量接近被积函数 $f(x) \cdot p(x)$。
| q 的选择 | 适合场景 |
|---|---|
| 正态分布 | 被积函数有钟形峰值,最通用、最常用 |
| 均匀分布 | 被积函数较平坦,基础蒙特卡洛 |
| 指数分布 | 正半轴单调衰减的问题 |
| Gamma/Beta | 有特定形状峰值的问题 |
| 分布本身(如 BRDF) | 渲染/物理模拟,消掉被积函数的某一项 |
| 混合分布(MIS) | 没有单一最优 q 的复杂场景 |
正态分布最常用,因为灵活(调均值/方差)、易采样、覆盖广,但本质上是"形状匹配"问题。
五、代码示例:稀有事件估计
import numpy as np
from scipy import stats
np.random.seed(42)
N = 10000
true_prob = 1 - stats.norm.cdf(4) # 约 0.00003167
# 直接采样:几乎采不到 x>4 的样本
samples_direct = np.random.randn(N)
estimate_direct = (samples_direct > 4).mean()
print(f"直接采样估计: {estimate_direct:.8f}") # 大概率是 0.00000000
# 重要性采样:用 q = N(4.5, 1),集中在 x>4 附近
q_dist = stats.norm(loc=4.5, scale=1.0)
samples_q = q_dist.rvs(N)
f_x = (samples_q > 4).astype(float) # 指示函数
p_x = stats.norm.pdf(samples_q, 0, 1) # 目标分布 N(0,1) 的密度
q_x = q_dist.pdf(samples_q) # 提议分布 N(4.5,1) 的密度
weights = p_x / q_x # 重要性权重
estimate_is = (f_x * weights).mean()
print(f"重要性采样估计: {estimate_is:.8f}") # 约 0.00003167
print(f"真实概率: {true_prob:.8f}") # 约 0.00003167
print(f"误差: {abs(estimate_is - true_prob) / true_prob * 100:.2f}%")
# 方差对比(重复 200 次)
direct_results = [(np.random.randn(N) > 4).mean() for _ in range(200)]
is_results = []
for _ in range(200):
s = q_dist.rvs(N)
w = stats.norm.pdf(s, 0, 1) / q_dist.pdf(s)
is_results.append(((s > 4).astype(float) * w).mean())
print(f"直接采样方差: {np.var(direct_results):.2e}")
print(f"重要性采样方差: {np.var(is_results):.2e}")
# 重要性采样方差远小于直接采样
六、多重重要性采样(MIS)
为什么需要多个 q?
没有一个 q 在所有情况下都最优:
渲染场景:漫反射地板 + 小点光源
BRDF 采样(q ∝ f_r):漫反射各向均匀,极少打到小光源 → 噪点多
光源采样(q ∝ 朝向光源):直接光照准,但对高光材质估计差
→ 需要两个 q 互相补充
Balance Heuristic 权重
同时用 $K$ 个策略,每个策略的权重由各自的 pdf 决定:
$$w_k(\omega) = \frac{n_k \cdot q_k(\omega)}{\sum_{j=1}^{K} n_j \cdot q_j(\omega)}$$
直觉:谁更"擅长"采到这个方向(pdf 更大),谁就对这个样本负更多责任:
方向 ω 朝向光源:
q_光源(ω) 很大,q_BRDF(ω) 很小
→ w_光源 ≈ 1,w_BRDF ≈ 0 → 这个样本归光源策略负责
方向 ω 朝向高光反射方向:
q_BRDF(ω) 很大,q_光源(ω) 很小
→ w_BRDF ≈ 1,w_光源 ≈ 0 → 这个样本归 BRDF 策略负责
每个策略只在自己擅长的区域贡献,互相补充不重叠,整体方差比任何单一策略都小。
七、实际应用场景
离线渲染(Path Tracing)
渲染方程是对半球面的积分,被积函数 = BRDF × 入射光 × cosθ:
均匀半球采样:大量方向在掠射角(cosθ≈0),贡献为 0,浪费
余弦加权采样(q ∝ cosθ):消掉 cosθ 项,方差降低
BRDF 采样(q ∝ f_r):消掉 BRDF 项,高光材质方差极小
MIS(余弦 + 光源):两者互补,通用场景方差最小
强化学习(PPO)
旧策略 $\pi_{old}$ 采集数据,用重要性采样复用数据训练新策略 $\pi_{new}$:
$$\mathcal{L} = \mathbb{E}{\pi{old}}\left[\frac{\pi_{new}(a|s)}{\pi_{old}(a|s)} \cdot A(s,a)\right]$$
权重 $\pi_{new}/\pi_{old}$ 偏离 1 太多时(新旧策略差异大),PPO 用 clip 截断,保证估计可信。
大模型 RLHF
KL 散度惩罚项 $\mathbb{E}[\log(\pi_{new}/\pi_{ref})]$ 本质是控制重要性权重不偏离 1 太远,防止新模型偏离参考模型导致重要性采样失效。
八、核心要点速查
| 问题 | 答案 |
|---|---|
| 重要性采样解决什么问题? | 积分算不了时,用更好的采样分布降低蒙特卡洛的方差 |
| 核心公式是什么? | $\mathbb{E}_p[f] = \mathbb{E}_q[f \cdot p/q]$,权重 $p/q$ 修正偏差 |
| p/q 容易得到吗? | 容易,只需逐点算密度值,不需要从 p 采样 |
| 必须知道 p 吗? | 是,这是前提;不知道 p 期望本身就没有定义 |
| q 怎么选? | 形状尽量接近 $f(x) \cdot p(x)$,正态分布最通用 |
| q 的硬性要求? | q 的支撑集必须覆盖 p 的支撑集,否则权重无穷大 |
| MIS 是什么? | 多个 q 同时采样,Balance Heuristic 让每个样本由最擅长的策略负责 |
| 和均匀采样的区别? | 均匀采样是无脑撒点,重要性采样是聪明撒点 + 权重修正 |