全面理解Stable Diffusion采样器

news2024/11/16 21:49:03

全面理解Stable Diffusion采样器

原文:Stable Diffusion Samplers: A Comprehensive Guide

在 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 的对比。

总步数1530
noise schedule在这里插入图片描述在这里插入图片描述

采样器总览

到本文写作时,SD webui 共支持 19 中采样器,而且随着时间的推移越来越多。那么,不同的采样器之间有何区别呢?

目前为止,SD webui 支持的采样器:

Euler a、Euler、LMS、Heun、DPM2、DPM2 a、DPM++ 2S a、DPM++2M、DPM++ SDE、DPM fast、DPM adaptive、LMS Karras、DPM2 Karras、DPM2 a、Karras、DPM++2S a Karras、DPM++ 2M Karras、DPM++ SDE Karras、DDIM、PLMS。

本文后半部分会详细介绍,技术上细节很多。所以这里先提供一个总览的视角,帮助大家对各种采样器有一个大致的了解。

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 中,接近终点附近的的几步值会更小,他们发现这种策略会有更好的生图质量。

在这里插入图片描述

默认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 步的基准结果。

在这里插入图片描述

Euler, DDIM, PLMS, LMS Karras and Heun 采样结果收敛性对比 (越低越好)

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

在对比了各个采样器在多个维度的表现之后,推荐如下:

  1. 如果想要速度快、收敛性好、质量也不错,且想试试新东西的话,最好选择:
    • DPM++ 2M Karras、20-30 步
    • UniPC、20-30 步
  2. 如果想要比较好的质量,同时不在意是否收敛的话,可以选择:
    • DPM++ SDE Karras、10-15 步 (注意该采样器比较慢)
    • DDIM、10-15 步
  3. 如果想要稳定、可复现的结果,不要用任何带有随机性的采样器,比如祖先采样器
  4. 如果想生成一些简单的结果,可以用 Euler 或 Heun。在使用 Heun 时,可以调低一些步数来节省时间。

采样器简介

SD webui 中有各种采样器的相关信息。这些采样器的内部工作原理需要大量数学知识来理解。这里将详细解释一下最简单的 Euler,简略介绍其他采样器,它们也与 Euler 有许多共通点、

Euler

Euler 可能是最直接的采样器,其数学本质就是用于解决常微分方程的欧拉方法。Euler 采样器是完全确定的,也就是说,在采样过程中不会引入任何的随机噪声。

以下是逐步拆解采样过程:

  1. 第一步:在隐层空间中,噪声预测器估计出图像中的噪声
  2. 第二步:根据 noise schedule,计算出需要被减掉的噪声系数,这在每一步是不同的
  3. 第三步:将第一步的噪声与第二步的系数乘起来,从隐层图片中减掉的该噪声量

重复上述步骤,直到 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) 是最先被提出的扩散模型采样器之一。它的核心想法是每一步的图片可以通过添加以下三个东西来近似:

  1. 最终的图片
  2. 图像方向指向当前步骤的图像
  3. 随机噪声

可是在抵达最后一步之前,我们怎么知道最终的图片呢?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 评论 对采样器进行了很好的总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1339090.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

.NET CORE 无法调试 当前不会命中断点

多个项目直接可以设置项目的属性->生成->输出的配置文件输出地址 然后路径统一输入该项目的bib/debug/.netcorex.x就可以了

Pandas教程(二)—— 不同格式的数据读取

前言:几种常用数据格式的介绍 csv文件 1. 逗号分隔值文件,以纯文本形式(记事本)存储表格数据 2. 它是一种平面文件:即只存储数据和文字,不能存储公式、图表等 3. 更适合存储大数据,一般用来批…

如何解决msvcr100.dll丢失问题,深度解析5种靠谱的方法

在计算机的世界里,我们常常会遇到一些看似微不足道的问题,但它们却可能引发一系列的困扰。其中之一就是“msvcr100.dll丢失”。这个问题可能会导致某些程序无法正常运行。本文将介绍5种解决msvcr100.dll丢失问题的方法。 msvcr100.dll是什么 msvcr100.d…

NXP S32K358 davinci cfg can驱动配置

NXP S32K358一共有8路can,都支持Can FD和Classical Can。其中FlexCan0-2是增强型CAN,支持8byte的mailbox 96个。FlexCan3-7支持8byte的mailbox 64个。 1.增强型Can和普通Can波特率采样点设置区别 在NXP S32K358中增强CAN的波特率采样点的寄存器和普通C…

新手为什么跟着大型机构交易?fpmarkets总结理由

正所谓方向不对努力白费,这也就是为什么fpmarkets建议新手在刚开始的时候,跟着大型机构进行交易。 这些大型机构包括中央银行、巨额对冲基金、投资和保险公司等等,首先fpmarkets认为这些大型机构的交易量巨大,能够影响市场的走势。…

2023年12月27日学习记录_加入噪声

目录 1、今日计划学习内容2、今日学习内容1、add noise to audio clipssignal to noise ratio(SNR)加入 additive white gaussian noise(AWGN)加入 real world noises 2、使用kaggel上的一个小demo:CNN模型运行时出现的问题调整采样率时出现bug 3、明确90dB下能否声…

hadoop hive spark flink 安装

下载地址 Index of /dist ubuntu安装hadoop集群 准备 IP地址主机名称192.168.1.21node1192.168.1.22node2192.168.1.23node3 上传 hadoop-3.3.5.tar.gz、jdk-8u391-linux-x64.tar.gz JDK环境 node1、node2、node3三个节点 解压 tar -zxvf jdk-8u391-linux-x64.tar.gz…

Git系统有哪些优势

在现在的这个软件开发领域,版本控制是一项非常重要的工作。Git作为比较流行的分布式版本控制系统,他有着独特的优势成为了很多开发者们的首选。那Git系统都有哪些优势呢,下面我以自己的理解简单的介绍一下。 分布式版本控制的优势 Git用的是…

003、一起来玩猜数游戏吧!

1. 上篇补充 在项目 hello_world 中,有一些文件。这里提一下每个文件的用途,了解一下即可,暂时不用深究,后面用到会详细讨论。 1. src :这个文件夹里主要用于存放源代码文件。Rust 项目的源代码文件通常以 .rs 为后缀&…

给typora更换字体

给typora更换字体 1.字体推荐(程序员) JetBrains MonoFira CodeCascadia Code 如果你不知道用哪个,把所有字体都装上。 2.安装字体 以 JetBrainsMono-1.0.3 为例,打开 ttf 文件夹,选择字体,右键 安装 3.设置typora的字体 文…

three.js 模型 居中

物体不居中 模型的几何中心位置不对, 设置偏离物体实际几何中心,当设置position(0,0,0)时就会出现偏离。 解决方案 此处有两种解决方案 建模师处理模型,将模型的几何中心移动到(0, 0&#…

【Linux】进程查看|fork函数|进程状态

🦄 个人主页——🎐开着拖拉机回家_Linux,大数据运维-CSDN博客 🎐✨🍁 🪁🍁🪁🍁🪁🍁🪁🍁 🪁🍁🪁&am…

Java日期工具类时间校验

Java日期工具类时间校验 嘚吧嘚正则表达式版本一版本二版本三 SimpleDateFormat工具类 嘚吧嘚 时间校验这个问题,我在网上找了很多资料,有用正则表达式的、有用格式工具类的。🤨 其实都能实现时间校验,既然两种方式都能实现&…

Vue3-25-路由-路由的基本使用

对路由的理解 路由 : 就是前端对页面路径的拦截,根据不同的路径渲染不同的组件, 从而实现单页应用中的页面局部刷新的功能。安装路由依赖 根据使用的不同的包管理工具采用不同的命令, 常见的三种包管理工具和对应的命令如下&…

Hex文件介绍及制作

Hex文件介绍 一、文件格式介绍数据格式Hex文件例子常见类型字段 二、CRC校验计算eg.地址文件CRC计算:020000040127D2:0200000400FFFB eg.数据文件计算 三、生成hex文件用Excel生成 一、文件格式介绍 Hex文件是一种十六进制文件格式,可由notpad打开或者HexView app打…

【Hive_05】企业调优1(资源配置、explain、join优化)

1、 计算资源配置1.1 Yarn资源配置1.2 MapReduce资源配置 2、 Explain查看执行计划(重点)2.1 Explain执行计划概述2.2 基本语法2.3 案例实操 3、分组聚合优化3.1 优化说明(1)map-side 聚合相关的参数 3.2 优化案例 4、join优化4.1…

vivado 快速到慢速时钟之间的多循环

快速到慢速时钟之间的多循环 在下面的场景中,启动时钟CLK1是快速时钟,捕获时钟CLK2是慢时钟。如下图所示。 在下一示例中,启动时钟CLK1是快速时钟。捕获时钟CLK2较慢时钟假设CLK1是CLK2的频率的三(3)倍。如下图所示。…

docker小白第七天

docker小白第七天 tomcat安装 docker hub上面查找tomcat镜像 点进tomcat,可以看到下载镜像的命令。但是因为文件太大,并且是国外下载镜像很慢,所以我们从前期配置好的阿里云镜像仓库下载。 docker search tomcat docker pull tomcatdocker…

后端主流框架-SpringMvc-day2

Java中的文件下载 2 文件下载 文件下载:就是将服务器(表现在浏览器中)中的资源下载(复制)到本地磁盘; 2.1 前台代码 前台使用超链接,超链接转到后台控制器,在控制器通过流的方式…

Intel FPGA 技术开放日

概要 时间:2023.11.14 全天 ( 9:00 - 16: 20) 地点:北京望京. 凯悦酒店 主题内容:分享交流了Intel FPGA 产品技术优势和落地实践方案。 会议的议程 开场致词: FPGA业务,是几年前intel收购而…