全面理解stable diffusion采样器
在 automatic1111 的 sd webui 中,有许多采样器(sampler),如 euler a,heun,ddim,… 什么是采样器?他们如何工作?他们之间的区别是什么?我们应该用哪种采样器?本文将带给你答案。
什么是采样?
在生成图片时,stable diffusion 会先在隐层空间(latent space)中生成一张完全的噪声图。噪声预测器会预测图片的噪声,将预测出的噪声从图片中减去,就完成了一步。重复该过程,最终将会得到清晰的图片。
由于 stable diffusion 在每一步都会产生一个新的图像样本,因此去噪的过程被也被称为采样。采样过程所使用的方法被称为采样方法或采样器。
采样只是 stable diffusion 模型中的一部分。如果想理解完整的 stable diffusion,推荐阅读 how does stable diffusion work? 。
下面是一个采样过程的动态展示,采样器逐渐地产生越来越干净、清晰的图像。
虽然整体框架是相同的,但是有许多不同的方法来执行具体的去噪过程。这通常需要速度和准确度之间两相权衡。
noise schedule
我们已经介绍过,在 stable diffusion 中,噪声图像是每步减去模型预测出的噪声,一点一点变成干净图像的。noise schedule 就是用来控制在每个采样步中噪声的强度的。噪声在第一步最大,慢慢降低,直到最后一步降为0。
在每一步中,采样器的工作就是根据 noise schedule 中对应的该步的噪声强度,减去对应的噪声,来产生该步的去噪图像。如果我们增大采样步数会有什么影响呢?每一步噪声下降的会更少,这有助于减少采样过程中的截断误差。
下面是 15 步和 30 步的 noise schedule 的对比。
总步数 | 15 | 30 |
---|---|---|
noise schedule | ![]() | ![]() |
采样器总览
到本文写作时,sd webui 共支持 19 中采样器,而且随着时间的推移越来越多。那么,不同的采样器之间有何区别呢?
本文后半部分会详细介绍,技术上细节很多。所以这里先提供一个总览的视角,帮助大家对各种采样器有一个大致的了解。
old-school ode solvers
我们先来看最简单的一类,这些采样器中的发明时间都已经超过一百年了,它们是就老式的常微分方程(ode)求解器(solver)。
- euler:最简单的求解器;
- heun:比 euler 更准确,但也更慢
- lms(linear multi-step method):和 euler 一样快,但(应该会)更准确
ancestor samplers
你是否注意到某些采样器名字里带了一个字母 a
?
- euler a
- dpm2 a
- dpm++ 2s a
- dpm++ 2s a karras
他们就是祖先采样器。祖先采样器会在每个采样步对图像添加噪声。祖先采样器都是随机(stochastic)采样器,因为他们的采样结果具有随机性。但是,注意也有其他的名字中不带 a
随机采样器。
祖先采样器有一个缺点,就是其采样结果图片不会收敛。以下是 euler 和 euler a 的采样过程对比:
采样器 | euler 采样结果收敛 | euler a 采样结果不收敛 |
---|---|---|
采样过程实例 | ![]() | ![]() |
可以看到,euler a 的采样结果不收敛,而 euler 的采样结果收敛得很好。考虑到可复现性,我们通常更喜欢可以收敛的结果。当然,如果想要稍微有些变化,可以使用 variational seed。
karras noise schedule
名字中带有 karras
的采样器,是使用了 karras 的论文中推荐的 noise schedule。如果仔细观察可以发现,karras 推荐的 noise schedule 中,接近终点附近的的几步值会更小,他们发现这种策略会有更好的生图质量。
ddim和plms
ddim (denoising diffusion implicit model) 和 plms (pseudo linear multi-step method) 是 sdv1 带的两种采样器。ddim 是第一批转为扩散模型设计的采样器之一,而 plms 是 ddim 更新、更快的版本。
这两种采样器现在看来已经有些过时了,一般不再广泛使用。
dpm和dpm++
dpm (diffusion probabilistic model solver) and dpm++ 是一系列发布于 2022 年的新型扩散模型采样器。他们代表了一些具有类似结构的求解器。
dpm 和 dpm2 很类似,但是 dpm2 是二阶的,更准确但是更慢。
dpm++ 是 dpm 的优化版本。
dpm adaptive 可以自适应地调整每一步的值。它可能会非常慢,因为他并不确保扩散过程在某个确定的采样步数内能完成。
unipc
unipc (unified predictor-corrector) 是一种发布于 2023 年的新型采样器。灵感来自于 ode 求解器中的 predictor-corrector 方法,可以在 5-10 步采样出高质量的图片。
k-diffusion
最后,你可能听说过 k-diffusion 并好奇这是什么东西。它其实就是指 katherine crowson 的 github 仓库: k-diffusion,该仓库实现了 karras 论文中提到的诸多采样器。
实际上,sd webui 中除了 ddim、plms 和 unipc 外的其他所有采样器都是使用的 k-diffusion 仓库的实现。
评估采样器
如何选择采样器?本节将会进行一些客观的对比,来帮助你选择。
image convergence
本小节将会使用不同的采样器生成相同的图片,最大采样步数为 40。在第 40 步的最后一张图片将作为参考,来评估采样器收敛的速度。euler 将作为参照。
euler, ddim, plms, lms karras and heun
首先我们看一下 euler, ddim, plms, lms karras and heun 这几个采样器,他们是老式的 ode 求解器或者是扩散模型原始的求解器。
可以看到,ddim 与 euler 的收敛步数差不多,但是变动更大,这是因为 ddim 会在采样步中注入随机噪声。
plms 在本次测试中表现不佳,收敛性最差。
heun 收敛得很快,但采样速度实际要慢两倍,因为它是一种二阶的方法。所以我们应该对比 heun 第 30 步的结果与 euler 第 15 步的基准结果。
ancestral samplers
如果你的目标是产生稳定、可复现的采样结果,那么你不应该使用祖先采样器。因为他们都带有随机性,且不会收敛。
dpm and dpm2
在 dpm 系列采样器中,dpm fast 无法很好地收敛,dpm2 和 dpm2 karras 的收敛性看起来比 euler 要好,但别忘了,它们也是二阶的方法,速度要慢两倍。
dpm adaptive 看起来很好,但他是用的自己的自适应步数,实际可能非常慢。
dpm++ solvers
dpm++ sde 和 dpm++ sde karras 与祖先采样器有相同的问题,他们不仅不收敛,而且随着步数的变化,图片质量也会波动。
dpm++ 2m and dpm++ 2m karras 收敛性不错。 在步数足够大时,karras 的策略会收敛得很快。
unipc
unipc 收敛得比 euler 稍慢,但也还不错。
speed
虽然前面看到,dpm adaptive 收敛性很不错,但速度这里可以明显看到他是最慢的。
除了 dpm adaptive 外,可以看到剩下的采样器分为了两组。分别差不多是一倍时间和两倍时间。这反映出的是求解器的阶次,一阶求解器更快,二阶求解器更准确,但是速度要慢两倍,因为需要过两遍去噪 unet 模型。
quality
当然,如果生成图片的质量看起来很矬,收敛性和速度都没有意义。以下是不同采样器结果的对比:
采样器 | 采样结果 |
---|---|
euler、heun、ddim | ![]() |
plms、lms karras、euler a | ![]() |
dpm2、dpm2 a、dpm2 a karras | ![]() |
dpm2 karras、dpm++ 2m karras、dpm++ 2s a karras | ![]() |
dpm++ 2s a、dpm++ adaptive、dpm++ fast | ![]() |
dpm++ sde、karras、dpm++ sde、unipc | ![]() |
从结果来看,dpm++ fast 是明显质量稍差的。另外,各个祖先采样器没有收敛到其他采样器收敛的结果。祖先采样器收到一致 kitten,而其他采样器收敛到一只 cat。
生成结果的主观感知这里没有明显的哪个比哪个好,自己看着好就行。
perceptual quality
即使没有收敛,生成图像的质量也可能已经不错了。这节我们看一下各个采样器需要多少步能够得到高质量的生成结果。
这里我们采用的指标是 brisque (blind/referenceless image spatial quality evaluator),它反映了自然图像的质量,数值越低,图像质量越高。
在第一组中,ddim 这里表现得出乎意料的好,只需要 8 步,就生成了质量最高的图像。
第二组对比的是祖先采样器的结果,除了一两个例外之外,大多数祖先采样器的质量与 euler类似。
dpm2 采样器系列比 euler 稍好。
在本节的生成质量对比中,dpm++ sde and dpm++ sde karras 的表现最好。
unipc 在小步数时比 euler 稍差,在大步数时差不多。
so … which one is the best
在对比了各个采样器在多个维度的表现之后,推荐如下:
- 如果想要速度快、收敛性好、质量也不错,且想试试新东西的话,最好选择:
- dpm++ 2m karras、20-30 步
- unipc、20-30 步
- 如果想要比较好的质量,同时不在意是否收敛的话,可以选择:
- dpm++ sde karras、10-15 步 (注意该采样器比较慢)
- ddim、10-15 步
- 如果想要稳定、可复现的结果,不要用任何带有随机性的采样器,比如祖先采样器
- 如果想生成一些简单的结果,可以用 euler 或 heun。在使用 heun 时,可以调低一些步数来节省时间。
采样器简介
sd webui 中有各种采样器的相关信息。这些采样器的内部工作原理需要大量数学知识来理解。这里将详细解释一下最简单的 euler,简略介绍其他采样器,它们也与 euler 有许多共通点、
euler
euler 可能是最直接的采样器,其数学本质就是用于解决常微分方程的欧拉方法。euler 采样器是完全确定的,也就是说,在采样过程中不会引入任何的随机噪声。
以下是逐步拆解采样过程:
- 第一步:在隐层空间中,噪声预测器估计出图像中的噪声
- 第二步:根据 noise schedule,计算出需要被减掉的噪声系数,这在每一步是不同的
- 第三步:将第一步的噪声与第二步的系数乘起来,从隐层图片中减掉的该噪声量
重复上述步骤,直到 noise schedule 结束。
但是我们怎么知道每一步的噪声系数应该是多少呢?实际上,这就是我们需要告诉采样器的 noise schedule。
noise schedule 告诉采样器每一步的噪声应该是多少。噪声预测器根据应该存在的噪声总量来估计隐层图像中的噪声。
在第一步的噪声量是最高的,然后噪声会随着步数的增加不断降低,直到在最后一步降至 0。改变采样步数,就会对应的改变 noise schedule。比如我们增大采样步数,那么每一步噪声下降的会更少,这有助于减少采样过程中的截断误差。
为什么确定性的 ode 求解器能够求解随机采样问题呢?这称为概率流(probability flow),我们不是解决样本如何演化(evolve),而是解决其概率分布的演化。也就是说,求解随机过程中的概率分布而不是样本轨迹。
与漂移过程(drift process)对照,ode 求解器的对应关系如下:
- time → noise
- time quantization → noise schedule
- position → latent image
- velocity → predicted noise
- initial position → initial random latent image
- final position → final clear latent image
采样示例
下面是使用 euler 采样进行文生图的一个示例。noise schedule 指示了每一步中的噪声强度。采样器的工作就是在每一步中,根据 noise schedule 的设定,和 unet 噪声预测网络的输出,从噪声图中减掉适量的噪声,直到最终噪声为 0。
euler a
euler ancestral (euler a) 采样器与 euler 采样器类似。区别在于,euler a 会在每一步减掉更多的噪声,然后它会在采样一些随机噪声加回到噪声图中,这样与 noise schedule 中设定的噪声强度匹配。euler a 中的去噪图与之前的步数中加入了什么样的噪声有关,因此它被称为祖先采样器(ancestral sampler )。由于在过程中加入了额外的噪声,所以祖先采样器两次的采样结果会是不同的。
ddim
denoising diffusion implicit models (ddim) 是最先被提出的扩散模型采样器之一。它的核心想法是每一步的图片可以通过添加以下三个东西来近似:
- 最终的图片
- 图像方向指向当前步骤的图像
- 随机噪声
可是在抵达最后一步之前,我们怎么知道最终的图片呢?ddim 采样器是使用去噪图片来对最终图片进行估计。类似的,图片的方向也是通过噪声预测器预测出的噪声来近似。
lms and lms karras
与 euler 方法类似,linear multistep method (lms) 方法也是用于解决 ode 的一种标准方法。他通过巧妙利用之前时间步的值来提升准确度。sd webui 默认使用至多前 4 步的值。
lms karras 使用了 karras 的 noise schedule。
heun
heun’s method 比 euler 方法更准确,但是它在每步需要预测两次噪声,所以它比 euler 慢两倍。
dpm solvers
diffusion probabilistic model solvers (dpm-solvers) 是一系列新提出的扩散模型求解器。在 sd webui 中,包含以下几种:dpm2,dpm2 karras,dpm2 a,dpm2 a karras,dpm fast,dpm adaptive,dpm karras。
dpm2 就是 dpm-solver 论文中的 dpm-solver-2 (algorithm 1),是一种精确到二阶求解器。
dpm2 karras 和 dpm2 基本相同,但是使用了 karras 的 noise schedule。
dpm2 a 也与 dpm2 基本相同,但是作为一种祖先采样器,它在每一步添加了额外的噪声。
dpm2 a karras 是在 dpm2 a 的基础上再使用了 karras 的 noise schedule。
dpm fast 的 noise schedule 是均匀的。它精确到一阶,比 dpm2 系列快两倍。
dpm adaptive 也是一阶的 dpm solver,其 noise schedule 是自适应的,它会无视我们设置的去噪步数,并自适应地自行决定步数。
dpm++ 采样器是 dpm 的优化版本。
unipc
unipc (unified predictor corrector method) 是 2023 年新提出的一种采样器。它包含两部分:
- unified predictor (unip)
- unified corrector (unic)
它支持任何求解器,任何噪声预测器。
延伸阅读
- k-diffusion github page – katherine crowson 的 diffusion 库. 许多 sd webui 中的采样器就是使用的这个库中的实现
- elucidating the design space of diffusion-based generative models (karras 2022) – k-diffusion 中实现的采样器就是根据该论文的描述
- progressive distillation for fast sampling of diffusion models – fast sampling progressive distillation can generate images in as few as 4 steps. it needs model-level training.
- pseudo numerical methods for diffusion models on manifolds (liu 2022) – plms 论文.
- dpm-solver: a fast ode solver for diffusion probabilistic model sampling in around 10 steps (lu 2022) – dpm 和 dpm2 求解器论文.
- dpm-solver++: fast solver for guided sampling of diffusion probabilistic models (lu 2022) – dpm++ 求解器论文.
- denoising diffusion implicit models (song 2020) – ddim 论文.
- score-based generative modeling through stochastic differential equations (song 2020) – 提出 reverse diffusion. 我们现在能使用 ode 求解器就是由于作者在该论文中提出的替代概率流公式。
- pseudo numerical methods for diffusion models on manifolds (liu 2022) – plms 采样器论文.
- 这个 reddit 评论 对采样器进行了很好的总结
发表评论