
搞采样的人看到这个标题应该会先停一下。Reverse Diffusion 是扩散模型里那个把噪声一步步还原成数据的逆向过程Sequential Monte Carlo 是贝叶斯计算里处理复杂分布的老牌工具箱这两者凑到一起乍一听有点跨界但只要盯住它们各自在解决什么问题就会发现这个结合其实非常自然。扩散模型擅长学习数据的分布结构SMC 擅长在分布之间做桥梁式的采样两者的共同底层问题只有一个——如何从复杂分布里高效采样。NIPS 2025 出现这个方向说明社区已经不满足于拿扩散模型只做生成而是开始把它当成一个通用的采样引擎来使。这篇文章我会把这条技术路线的来龙去脉拆开讲清楚为什么需要它、核心机制是什么、实际做起来有哪些关键选择和坑以及我在复现和试验这类方法时积累的一些朴素经验。内容会默认读者了解基础的概率论和一点机器学习但我会尽量把每个为什么这么做都讲明白新手可以按顺序读老手可以直接跳到第三节的算法细节和第四节的排查部分。1. 这条路线到底在解决什么问题1.1 采样问题是一切推断的底色机器学习里有一类问题绕不开给定一个分布 π(x)你没法直接算出它的归一化常数却要从里面采样。贝叶斯后验就是最典型的例子分子是似然乘先验分母是积分绝大多数情况下这个积分没有解析解。于是所有推断任务都转化成一个问题——你能不能从这个只知其形状、不知其总面积的分布里抽出足够多样的样本。传统解法分几个派别。MCMC 靠构造一条马尔可夫链让链的稳态分布等于目标分布代表方法是 Metropolis-Hastings 和 Hamiltonian Monte Carlo变分派把采样转化成优化问题用一族简单分布去逼近目标SMC 走的是另一条路它不直接对着目标分布硬刚而是构造一串中间分布 π_0, π_1, ..., π_T从容易采的 π_0 出发一步步挪到目标 π_T每一步维护一组加权粒子。SMC 的长处是很稳对多峰分布、模式切换这类问题比单链 MCMC 天然更有优势因为粒子是并行铺开的。1.2 扩散模型让路径这件事有了新解法SMC 的一个老大难问题就是中间分布序列怎么选。最朴素的做法是温度退火也就是把目标分布的幂次从 0 平滑地升到 1配合 MCMC 核来让粒子在各温度之间过渡。但温度路径有两个毛病一是高维空间里温度间隔稍微拉大相邻两个分布的支撑集就基本不重叠重要性权重立刻退化二是这个路径完全没用到数据分布的结构等于在盲人摸象。扩散模型的出现给了一条完全不同的路径。扩散模型的逆向过程本身就定义了一个从高斯噪声逐步过渡到数据分布的时间序列每一步的转移核是由神经网络学出来的。这条路径不是人为设计出来的而是从真实数据分布出发通过正向加噪过程数据的结构信息反推出来的它天然契合数据的几何特征。也就是说扩散模型本质上提供了一个可学习的、带结构的分布间桥梁而这恰恰是 SMC 最需要的东西。1.3 一句话概括这个工作把扩散模型的逆向过程当作 SMC 的中间分布序列和粒子更新机制用 SMC 的重采样与重要性加权来纠正扩散模型本身的逼近误差从而得到一个既能利用数据先验、又能保证样本无偏性的采样器。这个定位很有意思。扩散模型单独用的时候生成质量很高但它的采样过程本质上是在做概率流的离散近似每一步都有累计算误差最终样本的分布与真实数据分布之间是有偏差的。SMC 单独用的时候理论保证好但中间路径的设计过于通用高维下效率上不去。两者结合等于用扩散模型的学习能力给 SMC 提供了一条高质量路径再用 SMC 的框架来兜底纠偏。2. 核心机制拆解两边是怎么咬合上的2.1 先把逆向扩散的数学结构看明白扩散模型的标准框架是这样的。正向过程把数据 x_0 逐步加噪成 x_1, ..., x_T每一步近似于 x_t √(α_t) x_{t-1} √(1-α_t) ε其中 ε 是标准高斯噪声α_t 是一个预定义的衰减系数序列。到 T 足够大的时候x_T 基本就是纯噪声。逆向过程则是反过来学一个神经网络去预测每一步的噪声或数据训练目标是让模型学的转移核 p_θ(x_{t-1}|x_t) 逼近真实逆向转移 q(x_{t-1}|x_t)。这里有一个容易被忽略的细节逆向转移核 p_θ 实际上是一个高斯分布它的均值和方差都由神经网络给出。所以扩散模型的推理过程本质上是沿着 T 个高斯转移核一步一步往前推。这个性质对 SMC 至关重要因为高斯转移核天然适合做重要性采样和 MCMC 提议分布你可以精确地计算每一步的接受概率或重要性权重不需要引入额外近似。2.2 SMC 的骨架重要性加权加重采样SMC 的核心循环是这样的初始化 N 个粒子从 π_0 采样然后循环执行两步——第一步用中间分布的 MCMC 核或提议分布把粒子往前推第二步重新计算每个粒子的权重并做重采样把权重低的粒子淘汰、权重高的粒子复制。这个机制保证了粒子群始终集中在高概率区域同时保持足够的多样性。把扩散模型嵌进去之后中间的每一层分布就是扩散时间步 t 的边际分布粒子按时间从 tT 往 t0 走对应从噪声走向数据。每一步的提议分布直接用 p_θ(x_{t-1}|x_t) 就行因为它是学出来的和真实的中间分布很接近所以粒子的权重不会像温度退火那样快速退化。理论上当扩散模型训练得足够好、步数足够多的时候重要性权重会趋近于 1这时 SMC 退化成一个普通的扩散采样过程而当扩散模型有偏差的时候SMC 的加权与重采样机制会自动帮你纠正回来。2.3 为什么非要用 SMC 兜底有人可能会问扩散模型自己已经能生成很好的样本了为什么还要多此一举套一个 SMC 框架这个问题指向的核心其实是无偏性和稳态分布。扩散模型采样用的是学习到的逆向转移核 p_θ它与真实逆向转移核 q 之间存在误差。这个误差来源很复杂神经网络容量有限、训练数据覆盖不足、离散化步数有限从连续随机微分方程到离散马尔可夫链的数值误差每一项都会导致最终样本分布偏离目标分布。对纯生成任务来说这个偏差肉眼很难分辨但在科学计算场景里是致命的——比如你要用采样结果去估计某个物理量的期望样本分布哪怕只有几个百分点的系统性偏差算出来的期望就不可信了。SMC 的框架价值就在于此。重要性权重在理论上是能够完全纠正提议分布和目标分布之间偏差的只要权重退化问题控制得住。于是这个组合就有了一种相互兜底的美感扩散模型把路径修得很好权重退化问题被大大缓解SMC 保证即使路径有偏差最终得到的粒子权重也能让估计保持近似无偏。3. 实操落地从算法骨架到具体配置3.1 一个可直接参考的算法流程我复现这类方法的时候整体流程大致是这样的。先训练或加载一个现成的扩散模型然后把 SMC 套在逆向采样过程上逐时间步推进粒子。以下是一份我用的 Python 伪代码结构去掉了具体框架的细节核心逻辑一目了然import torch def reverse_diffusion_smc(model, x_T, steps, num_particles): model: 扩散模型需提供预测噪声或均值的接口 x_T: 初始噪声粒子形状 [N, D] steps: 逆向过程的时间步列表从大到小排列 num_particles: 粒子数 N particles x_T log_weights torch.zeros(num_particles) for idx in range(len(steps) - 1): t_curr steps[idx] t_next steps[idx 1] # 1. 用模型的转移核做提议每个粒子前进到下一时间步 # 这里假设模型的输出是均值方差用固定调度表 pred model(particles, t_curr) mean pred # 具体形式取决于模型定义 std schedule_std(t_curr, t_next) proposed mean std * torch.randn_like(particles) # 2. 计算重要性权重目标分布与提议分布的密度比 # 实际场景中利用扩散模型的性质做简化计算 log_target evaluate_target_logdensity(proposed) log_proposal evaluate_proposal_logdensity( proposed, particles, t_curr, t_next) log_weights log_weights log_target - log_proposal # 3. 归一化权重并做重采样 log_weights log_weights - torch.logsumexp(log_weights, dim0) weights torch.exp(log_weights) if effective_sample_size(weights) num_particles / 2: indices resample(weights) # 系统重采样或多项重采样 particles proposed[indices] log_weights torch.zeros(num_particles) # 最后一步必要时再做一次 MCMC 核来消除重采样带来的相关 return particles有几个地方需要额外说明。第一重采样阈值设成有效样本量低于 N/2 是一个比较稳妥的默认值太早重采样浪费信息太晚重采样会让粒子退化到只有几个不同状态。第二最后加一步 MCMC 核几乎是必须的因为重采样会引入粒子间的相关性一个轻量的 HMC 或 Langevin 调节能显著改善样本质量。3.2 关键设计选择步数、粒子数、重采样策略从实际使用感受来说有三个参数的权衡是最值得花时间调的。第一个是时间步数 T。步数越多每步的转移方差越小重要性权重越均匀但计算成本线性上升。实验里我常用 50 到 200 步具体看目标分布的复杂度和扩散模型的训练质量。如果模型训练得很好50 步就够如果模型有明显偏差200 步反而会让 SMC 的纠偏机制更从容。第二个是粒子数 N。这是最直接的计算开销因素但它的影响方式反直觉粒子数不是越多越好关键是和维度 D 的比例关系。经验上 N 取 D 的 5 到 10 倍就能支撑一个像样的估计再往上提升的是方差而不是偏差边际收益递减明显。高维任务里与其堆粒子不如多花心思调重采样策略。第三个是重采样策略。我测试过多项式重采样、残差重采样和系统重采样实际差异在最终估计精度上不大但系统重采样的方差最小且在并行环境下更好实现。有个容易踩的坑是重采样之后立刻进行下一步提议这会让复制出来的粒子在下一步又快速分开看起来多样性够了实际已经丢掉了不少原始信息。正确的做法是重采样之后立刻跟上几个 MCMC 调节步让复制粒子先各自跑开再继续推进。3.3 训练推理分离时要注意的细节这个方法一个很实际的好处是扩散模型可以直接复用现成的预训练权重不需要重新训练。但这里有个隐蔽的问题大多数扩散模型的训练目标是噪声预测或分数匹配输出并不直接等价于 SMC 需要的提议分布参数。你需要根据模型的具体参数化方式把输出转换成每个时间步的转移均值或方差。不同参数化方式对应的转换公式我在表里整理了一下方便直接对照模型输出类型含义转换到 x_{t-1} 均值注意事项预测噪声 ε_θ正向加的噪声(x_t - √(1-α_t) ε_θ) / √α_t最常用注意噪声尺度预测数据 x_0去噪后的数据直接作为均值梯度会更平滑预测 v 参数速度参数按 v-prediction 公式换算需要先转成 x_0 再转均值分数函数 s_θ对数密度的梯度x_t σ_t² s_θ常见于 score-based 模型我踩过最典型的坑就是把噪声预测的输出直接当成均值用了结果粒子轨迹发散得毫无悬念。转换关系必须和训练时的加噪调度严格对应张量形状、时间步索引、方差调度表都要对齐差一点都不行。4. 常见问题与排查技巧实录4.1 权重退化压不住这是 SMC 的祖传问题套在扩散模型上也躲不掉。我在实验里遇到的权重退化主要有三个症状有效样本量在几步之内从 N 掉到个位数、重采样之后粒子多样性快速消失、最终估计的方差比 MCMC 方法还大。排查顺序我一般这样来先看提议分布和目标分布的匹配度方法是画一张每个时间步 log-weight 的直方图如果一步之内就出现几个绝对值突出的离群点说明这一步的转移核和目标分布偏差太大可以把这附近的步长加密如果直方图整体漂移而不是零星离群那问题多半在全局可能时间步数不够或者扩散模型本身质量不行。还有一种隐蔽情况是数值精度问题重要性权重在指数空间里算时间步一多容易下溢务必全程在 log 空间计算只在重采样的时候再取指数。4.2 重采样后翻车重采样策略看起来简单实际调试起来最折磨人。我遇到过一种很典型的现象不加重采样时估计结果是稳定的加上重采样之后反而出现周期性的大跳变。查到最后是系统重采样的索引排序方式导致的——它本质上是有序抽样当粒子分布存在周期性结构时系统重采样会放大这种结构性的偏差。解决办法是不要死守某一种重采样算法我在代码里保留了一个策略开关默认用系统重采样一旦发现异常就切到残差重采样对比。另一个经验是重采样之后立刻做一轮局部 MCMC 调节这个操作能把因为复制粒子带来的瞬时相关性打散效果比任何花哨的重采样策略都明显。4.3 目标分布与数据分布不一致时的处理这类方法最常见的应用场景其实不是从训练数据分布采样而是从某个后验分布采样比如逆问题的后验。这时候目标的密度 π(x) 和扩散模型学的数据分布 p_data(x) 不是一回事中间分布序列就不能只靠扩散模型的逆向路径了需要在每一步引入额外的似然项。处理手法是在每一步的重要性权重里乘上一个条件似然的占比因子相当于在扩散路径上叠加贝叶斯更新的力度。这里有一个我需要反复提醒的理论点每一步只加一部分似然最后的总权重才对一次性把整个似然项塞进某一步权重退化会瞬间爆炸。怎么分配似然强度最优本身可以做成一个自动调度的问题但目前手动配置还是主流按逆温退火的配方每步均分是最好上手的起点。4.4 莫名其妙的维度不匹配这类方法工程实现的时候维度相关的 bug 是最隐蔽的。扩散模型训练时通常处理的是图像或张量数据内部有组归一化、卷积层、时间嵌入而 SMC 粒子在数学上是一个 [N, D] 的矩阵实际操作时会变成 [N, C, H, W]。把模型输出 reshape 回粒子矩阵的时候一旦通道顺序或者 batch 维注意力搞错程序不报错、结果全是垃圾。针对这个问题我养成了一个习惯在搭建原型时先固定一个两维的 toy target比如混合高斯跑通了再去处理真正的张量数据。Toy 数据的优势是你能精确算出真实分布的各种统计量任何维度处理上的偏差都会立刻在数值上暴露出来不用像盲人摸象一样到处猜。5. 落地经验与实践体会5.1 和现有采样方法对比时的效率观察我拿这个方法和几个主流基线在同任务上横向比过体会最深的是它的性价比曲线和别的算法不一样。HMC 和 NUTS 在小规模问题上表现稳健但维度一上去步长和路径长度就要精细调节稍有不慎链就变慢普通扩散采样器速度快但如前所述有系统性偏差。Reverse Diffusion SMC 的起步成本最高——要先有一个训练好的扩散模型、储出整套时间步调度、维护粒子群——但一旦跑起来它在高维、多峰、复杂几何的场景下体现出明显优势。这里有个值得注意的分布差异如果目标分布恰好和扩散模型学的数据分布高度一致SMC 带来的增益很有限因为你本来就能直接很好地采样真正体现价值的是目标分布与数据分布相关但不完全一致的场景比如加了约束条件、部分观测、似然修正的后验。给自己选一个甲之蜜糖乙之砒霜的问题很重要否则你会得出这个方法没有必要的错误结论。5.2 几个值得复用的工程小技巧调试这类算法的过程中我积累了几个不试不知道的小技巧。第一日志里记录的不应该是最终样本的均值方差而是每一时间步的有效样本量和最大重要性权重比这两个量的曲线是你调试的罗盘。有效样本量曲线如果平稳下滑再小幅回升说明路径设计基本健康如果是断崖式下跌问题在局部转移核如果全程贴着 N/2 以下走那就得重新审视整个分布序列的合理性。第二扩散模型的时间步调度原本是加速采样的设计不要默守成规直接用它。一个好的调度是让相邻两步分布之间的差异保持均匀具体到实现里就是让每一步的期望对数权重变化量大致相等。这个可以用一次前向试探跑完统计每步的 log-weight 方差再反向修正调度。第三如果目标的最终估计量需要多批次的高精度结果SMC 的粒子在末期会有一定的正相关直接取独立多轮结果会低估方差。建议做一轮小规模的 bootstrap 重采样来校准置信区间这个成本不高但对结论的可靠性帮助很大。5.3 这个方向后续还能往哪走从 NIPS 2025 这个工作出发我看到几个自然延伸的方向已经在孕育。一是把 SMC 的纠偏能力引入到扩散模型的蒸馏加速流程中用更少的时间步搭配 SMC 的加权来恢复精度二是对目标分布存在多模态不确定性的场景用扩散模型学到的混合结构来指导 SMC 的粒子初始化解决传统方法初始粒子分布偏差导致的模式丢失三是把整个流程写成自动微分的可微分版本让中间分布的配置本身也成为可学习的参数。这些方向每一个都还有大量工程细节待解决但也正因如此这个方向还远没有到天花板。我个人在实际操作中的体会是这个方法的入门门槛其实比想象中低最难的不是理解算法而是动手把两个原本独立框架里的概念一一对应起来比如时间步和中间分布、噪声调度和重要性权重、模型输出和提议参数。一旦这些对应关系在代码里清晰了整套机制就会运转得相当顺滑多跑几个实验你对路径设计和纠偏逻辑会有远比读论文更深刻的理解。如果你正在处理高维复杂分布的采样问题或者觉得纯扩散生成没法满足你的精度需求这个方向值得你投入一个周末去复现一下。