你正在用 Stable Diffusion 画一张赛博朋克猫,提示词没变,模型没变,种子没变,只是把采样器从 Euler 换成了 DDIM——猫的姿势、光影、甚至背景里的霓虹灯位置全变了。这感觉就像用同一张底片,换了个显影液,照片里的人物突然换了衣服。我曾经以为采样器只是“速度与质量”的取舍,结果发现它连构图都能改。后来啃了几篇论文才想通:采样器之争,本质是 逆向扩散过程的近似求解方法之争。不同的求解器,走了不同的路径,终点自然不一样。

从去噪到反向过程——扩散模型在做什么
扩散模型的核心思想很像把一滴墨水滴进清水,然后看着它慢慢扩散,直到整杯水变成均匀的灰色。正向过程就是不断给图片加噪声,直到变成纯噪声;逆向过程则需要从噪声中“猜”出原来的图片,这需要模型学会去除噪声。 DDPM 把正向过程定义为一个马尔可夫链,每一步添加一点高斯噪声,最终得到纯噪声。逆向过程则训练一个神经网络来预测每一步添加的噪声,然后一步步减去。
但问题来了:从纯噪声恢复图片,理论上需要求解一个随机微分方程(SDE)的逆过程,这需要无穷多步。实际中我们只能走有限步,每一步的近似误差都会累积,最终影响生成的图片。这就是为什么换采样器会改变结果——不同的采样器,就是不同的近似求解策略。
DDPM:一步一步随机走,慢但稳
DDPM 是始祖,它严格遵循正向过程的逆过程,每一步都加入一点点随机性(从预测的噪声中采样)。用 1000 步生成一张图,每一步都带一个随机噪声项,所以即使固定种子,如果采样器是随机的,每次结果也可能不同(除非设置固定的随机性)。DDPM 的好处是理论扎实,生成的图像细节丰富,但太慢了——1000 步,一张图要等几分钟。而且你可能会想:“既然每一步都加随机噪声,那是不是可以少走几步,把随机性放大?” 不行,直接跳步会导致图像崩溃,因为步长太大,近似误差爆炸。
DDIM:跳过随机性,大步快跑
DDIM 的论文 Denoising Diffusion Implicit Models 做了一个关键洞察:既然正向过程是固定的,逆向过程其实可以被看作一个 非马尔可夫的确定性过程。也就是说,不需要每一步都加随机噪声,可以设计一个“隐式”的概率路径,直接从噪声跳到干净图像。这个路径是确定的,只要固定种子,生成的图像完全一致。
更妙的是,DDIM 允许“跳步”——你可以原本要 1000 步,现在只走 50 步,甚至 20 步,它通过调整去噪公式中的系数来补偿跳步带来的误差。这就是为什么 DDIM 在低步数下依然能产生可辨认的图像,而 DDPM 会直接糊掉。我一开始以为 DDIM 是 DDPM 的加速版,后来发现它改变了生成过程的本质:从随机游走变成了确定性的轨迹。这解释了为什么换用 DDIM 后,同一张图的构图可能完全不同——它走的是一条不同的“去噪路径”。
从 SDE 到 ODE:为什么能加速
2021 年,Song 等人提出了一个统一的框架 Score-Based Generative Modeling through Stochastic Differential Equations,指出扩散模型的逆向过程既可以看作一个 SDE,也可以看作一个与之对应的常微分方程(ODE)。SDE 的路径有随机性,而 ODE 的路径是确定的。DDPM 遵循 SDE 路径,DDIM 则暗中遵循了 ODE 路径。这个发现开启了采样器加速的大门:既然 ODE 有成熟的数值求解方法,为什么不用那些高效的方法呢?
于是,Euler 和 DPM++ 这些名字登场了。它们不是为扩散模型发明的,而是数值分析中求解 ODE 的经典工具,只是被借过来用在去噪过程上。
Euler 和 DPM++:求解 ODE 的数学工具
Euler 方法是最简单的 ODE 求解器:用当前点的导数(也就是模型预测的去噪方向)乘以一个步长,线性外推下一步。在扩散模型中,每步去噪的过程正好可以用 Euler 方法迭代。Euler 采样器步数少时容易产生模糊,因为一阶近似误差大。但它的优点是简单、快,且兼容性好。
DPM++ 则是一系列高阶求解器的统称,源自 DPM-Solver 论文。它利用扩散模型去噪过程的半线性结构,将每步预测分解为“线性部分”和“非线性部分”,然后对非线性部分使用高阶近似(如 Runge-Kutta 方法)。DPM++ 2M 就是二阶多步方法,能在 20 步以内生成高质量图像,收敛速度吊打 Euler。我实测过,DPM++ 2M Karras 在 15 步时就能生成清晰的人脸,而 Euler 同样步数下脸还是糊的。
Karras 等人在 Elucidating the Design Space of Diffusion Models 中进一步优化了噪声调度,提出了带“Karras”后缀的采样器,通过调整每一步的噪声水平,让模型在关键阶段更精细地处理细节。所以你会看到 DPM++ 2M Karras 在社区中备受推崇。
| 采样器 | 类型 | 随机性 | 典型步数 | 特点 |
|---|---|---|---|---|
| DDPM | SDE 求解 | 随机 | 500-1000 | 细节丰富,极慢,步数少崩溃 |
| DDIM | ODE 隐式 | 确定 | 20-50 | 稳定,可重现,构图路径独特 |
| Euler | ODE 一阶 | 确定 | 20-50 | 简单快速,低步数模糊 |
| DPM++ 2M | ODE 高阶 | 确定 | 10-25 | 收敛极快,质量高,推荐 |
| DPM++ SDE | SDE 高阶 | 随机 | 10-25 | 保留随机性,细节更丰富 |
为什么换采样器图片就变了?——路径依赖与收敛性
到这里,你应该能回答标题的问题了。扩散模型生成图片,本质是在一个高维空间里从噪声点出发,按照一定的“去噪轨迹”走到一幅图像。不同的采样器,划出的轨迹不同。即使都收敛到同一个“干净图像”的分布,由于步数有限,近似误差会让不同轨迹停在不同终点,导致构图、光影、细节的差异。而且,ODE 采样器是确定性的,给定种子和步数,轨迹唯一;SDE 采样器则引入随机性,每次走的路都不同。
我踩过一个坑:用 DDIM 20 步生成一张满意的图,想用 DPM++ 2M 20 步复现,结果完全不对。后来才明白,DDIM 的跳步策略和 DPM++ 的求解路径差异巨大,即使步数相同,它们对噪声的加权方式不同,所以需要重新调整提示词和种子来适应新采样器。
如何选择采样器?
没有绝对最优,只有权衡。如果你追求稳定可复现,用 DDIM 或 Euler(确定性)。如果你想要快速高质量,DPM++ 2M Karras 是当前社区公认的甜点,15-20 步即可。如果你需要丰富的随机细节(比如画自然纹理),DPM++ SDE 或 DDPM 在足够步数下表现更好。在 AUTOMATIC1111 的 WebUI 里,采样器列表很长,但多数是上述变体。
为什么 DDIM 在低步数下比 Euler 清晰?
因为 DDIM 的跳步公式是专门为扩散模型推导的,利用了对噪声的预测误差的补偿;Euler 只是一阶线性外推,没有利用扩散过程的特殊结构,所以步长一大就漂移。
DPM++ 2M 和 DPM++ 2S 有什么区别?
2M 是多步方法,复用上一步的导数信息,计算更高效;2S 是单步方法,每一步独立计算,步数多时更稳定但稍慢。通常 2M 就够了。
换采样器需要重新调参吗?
需要。不同采样器的最优步数、CFG 强度、甚至种子都可能不通用。建议固定一种采样器,调好 prompt 后再尝试切换看效果。
采样器之争,争的不是“谁对谁错”,而是在有限计算资源下,如何最逼近真实的去噪路径。理解它们背后的数学,你就能从“凭感觉瞎换”变成“按需选择”。下次看到图片突变,别慌,那是采样器在告诉你:它走了一条不同的路。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/100.html