我最早用 Stable Diffusion 的时候,每次出图都老老实实把步数拉到 50,心理上觉得“步数越多,画得越仔细”。直到有一天赶时间,随手降到 20 步,结果生成的图几乎一模一样。我盯着两张图来回切,硬是没看出 50 步在哪儿多画了一笔。这让我特别困惑,于是开始翻论文、看源码,想把这件事彻底搞清楚。后来发现,这个问题的答案比我想象的更有意思——它藏在扩散模型去噪过程的数学里,也藏在采样器的设计哲学里。

一张图是怎么从噪声里“浮”出来的
要理解步数,得先知道扩散模型怎么画画。它不是一笔一笔描,而是从一张纯噪声图开始,一步步“去噪”,每步去掉一点点噪声,同时让图像结构逐渐浮现出来。这个过程的原始版本(DDPM,Denoising Diffusion Probabilistic Models)需要 1000 步。每一步,模型预测当前画面中的噪声,然后减去一小部分,得到一张噪声稍少的图,再送进下一步。你可以想象成:把一张照片反复叠上一层层半透明噪声,叠 1000 次后完全看不清;反过来,一张一张揭掉这些噪声层,最后照片还原。但 1000 步实在太慢了,出一张图要跑好几分钟。
后来研究者的思路变了:能不能不揭 1000 次,只揭 20 次,但每次揭得聪明一点?这就引出了采样器的革命。
从 1000 步到 20 步,采样器在偷偷“跳步”
关键突破来自 2021 年的 DDIM(Denoising Diffusion Implicit Models)。它发现扩散模型去噪的过程在数学上可以看成一个常微分方程(ODE),而解这个方程不需要一步步老老实实走,可以大步跳。简单说,DDIM 把 1000 步的序列压缩成 50 步或更少,每一大步直接估算中间状态,结果和原版几乎一样。这就像你从北京开车到上海,原版路线是每个服务区都停,DDIM 是直接走高速,中间只停几个大站,到达时间一样,目的地也一样。
后来更快的采样器出现了,比如 DPM-Solver(DPM-Solver)和它的变体 DPM++ 2M。它们把 ODE 的数值解法优化到极致,用 10-15 步就能达到接近 50 步 DDIM 的质量。这些采样器在 Stable Diffusion 社区里被疯狂使用,因为每省一步就省一秒,批量出图时差距巨大。
为什么 20 步和 50 步看起来一样?关键时刻在头几步
这就回到了我最初的困惑。我后来用 X/Y 图对比各种步数,发现一个规律:步数增加带来的画面变化集中在最初的 10-15 步,后面几乎只是在微调边缘和极细微的纹理。(Stable Diffusion Art 上有大量对比图可以验证)
扩散模型在去噪的早期阶段(高噪声阶段)决定了图像的全局构图——主体在哪儿、大色块怎么分布。如果这几步稳定了,后面的步数只是在细化局部,比如头发丝的走向、布料褶皱的锐度。而人类视觉对整体构图更敏感,一旦构图一致,后面细节的微小差异我们很难一眼看出,特别是当图像被缩小到社交媒体的尺寸时。
另一个更根本的原因:很多现代采样器在设计上就是为了“收敛快”。比如 DPM++ 2M Karras,它用了一种叫 Karras 噪声调度的方法,让去噪步长在早期更大、后期更小,恰好匹配了图像生成的自然规律。所以它在 20 步时,已经非常接近该采样器能达到的“上限”了,再加到 50 步,也只是在极小的数值误差上反复打磨,肉眼分辨不出。
不同采样器,步数的影响天差地别
不是所有采样器都这么“省步”。下表是我实测和参考社区讨论(AUTOMATIC1111 Wiki)整理出的对比,能帮你看清步数到底该怎么选:
| 采样器 | 最低可用步数 | 推荐步数 | 超过推荐后的变化 |
|---|---|---|---|
| Euler a | 15 | 20-30 | 构图可能轻微漂移,细节随机变化(因为 a 代表 ancestral,每一步注入噪声) |
| Euler | 15 | 20-30 | 几乎无变化,收敛极快 |
| DDIM | 20 | 30-50 | 逐步收敛,但 50 步以上收益极低 |
| DPM++ 2M Karras | 10 | 15-25 | 极微,20 步后基本锁死 |
| DPM++ SDE Karras | 10 | 15-25 | 收敛快,但 SDE 随机性会带来细微纹理变化 |
| LMS | 20 | 30-40 | 缓慢收敛,需要更多步 |
注意 Euler a 这种带“a”的采样器,它在每一步会重新添加少量随机噪声,所以即使步数很高,画面也不是完全收敛,而是会持续产生微小的构图和细节变化。这有时被用来创造“多样性”,但如果你想稳定复现结果,就不要用 ancestral 采样器,或者把步数降到 20-30 并固定种子。
步数多到一定程度,反而可能“画脏”
有一个反直觉的事实:无限增加步数并不会让图像无限变好。 因为扩散模型在去噪到极低噪声水平时,数值误差会开始累积,模型预测的微小噪声可能不够准确,导致画面出现奇怪的纹理或噪点,这在肖像画中尤其明显,皮肤会莫名出现颗粒感。
另外,步数过多也会放大 CFG(Classifier-Free Guidance)带来的副作用。CFG 值越高,模型越倾向于生成“符合提示词”的内容,但也会让图像对比度过高、色彩溢出。当步数很多时,CFG 的这种“过驱动”效应会被反复叠加,最终生成一张塑料感很强、饱和度爆炸的图。所以有时候 20 步看着比 50 步更自然,这不是错觉,是 CFG 在捣乱。
什么时候你才需要更多步数?
虽然结论是 20 步大多够用,但有两种情况我会主动拉到 40-50 步:
- 极高分辨率(比如 2048×2048 以上直接生成,不用 upscale)。高分辨率意味着每个像素去噪需要更精细的控制,步数太少容易留下块状噪声。
- 需要极其精细的纹理,比如皮革、木纹、复杂织物,而且你打算放大 100% 检查。这时候多步数带来的细微差异能被看出来。
除此之外,日常出图我都在 20-25 步,省下的时间多跑几张图,往往比抠那一点步数收益大得多。
关于步数的常见误解
步数越多,显存占用越大?
不会。步数只影响生成时间,不影响显存。每一步的模型推理占用是固定的,步数多了只是重复跑多次,显存不变。
步数和 CFG 值怎么配合?
高 CFG(>10)时,步数不宜过高,否则容易过饱和;低 CFG 时,可以适当增加步数来提升细节,但依旧不必超过 30。我的习惯是:CFG 7-9 配 20-25 步,CFG 4-6 配 25-30 步。
用 SDXL 和 SD1.5 步数一样吗?
原则相同,但 SDXL 常用的 DPM++ 2M Karras 在 15 步就能出很好效果,可以更省。具体可参考社区测试。
为什么有些采样器最低步数标 10,但 10 步画出来很糊?
最低步数只是“能跑”,不代表质量好。通常需要比最低步数多 5-10 步才能达到可接受的质量。
我的选择:别纠结步数,先选对采样器
折腾了这么久,我最大的体会是:采样器选错,步数再多也救不回来;采样器选对,20 步就够。 如果你刚开始用 Stable Diffusion,建议直接锁定 DPM++ 2M Karras 或 Euler a,步数设 20-25,然后忘掉这个参数,去调整 prompt 和 seed 更实在。等你对画面细节有极致要求的那一天,再来细扣步数——到那时候,这篇文章的每一个字你都会自己验证一遍。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/106.html