Stable diffusion

Stable Diffusion是一个深度学习模型,在这篇文章中我们将会深入其内部了解其究竟是如何创作图像的。

为什么你一定要对其工作原理有所了解呢?除了其本身就是个非常值得了解的内容外,理解它的内部运作也将会使你成为一个更好的AI绘画艺术家。你将可以合理的运用这个工具来得到更加精确的图像。

text-to-image(文生图)与image-to-image(图生图)有什么区别?CFG值是什么意思?denosing strength (降噪强度)又意味着什么?以上这些问题你都将在这篇文章中获得答案。


Stable Diffusion

以最简单的形式来说,Stable Diffusion是一个文本到图像的生成模型。给它一个文本指令作为输入,它将返回给你一张与输入指令匹配的图像。
Stable diffusion_第1张图片

Stable diffusion将文本指令转化为图像

扩散模型(Diffusion Model)

稳定扩散模型(Stable Diffusion)属于深度学习模型中的一个大类,即扩散模型。它们属于生成式模型,这意味着它们是被设计用于根据学习内容来生成相似的新的数据的。对于稳定扩散模型而言,新的数据即为图像数据。

为什么称之为扩散模型?因为模型中使用的数学看起来与物理学中的扩散公式非常相似。我们来了解一下这个模型的理念。

假设我们只使用猫和狗这两类图像来训练这个稳定扩散模型。如下图所示,图中左侧曲线的两个峰值代表了猫与狗这两组图像。

Stable diffusion_第2张图片

前向扩散过程将图片变成噪声图

前向扩散(Forward diffusion )

所谓前向扩散(forward diffusion)过程就是向训练图像中不断地添加噪声,从而使其逐渐变为一张毫无意义的纯噪声图。在我们的例子中,前向扩散过程会将猫与狗的图片转变为噪声图。最终你将无法从得到的噪声图中分别出原来的图究竟是猫还是狗(这点很重要)。

这就好比往一杯水中滴入一滴墨水。墨滴将在水中扩散,在几分钟之后,它将随机均匀的遍布于整杯水中,你将再也无法从这杯水中看出原来的墨滴究竟是从杯子的中心还是边缘滴入的了。【译者注:此处呼叫水哥王昱珩】

下图演示了一张图像经由前向扩散逐渐变为纯噪声图的过程。

Stable diffusion_第3张图片

一张猫图的前向扩散过程

逆向扩散(Reverse diffusion)

现在来到神奇的部分了。如果我们能够逆转扩散的过程会怎样呢?就像影片倒带一样,在时间线上逆向移动,那我们最终将会看到墨滴最初是从哪里滴落的了。

Stable diffusion_第4张图片

逆向扩散过程将图片从噪声图中还原

从一张完全无意义的噪声图,逆向扩散过程使其还原为一张猫**【或】**狗的图像,这就是逆向扩散的核心理念。

从技术上来说,每个扩散过程都有两个分量:(1)漂移或引导的方向;(2)随机的方向。逆向扩散会将结果导向猫或者狗的图像,但并不会是二者之间的图像。这也是为什么我上面说,逆向扩散的结果将会是猫或者狗。


训练是是如何完成的

逆向扩散的理念是如此的高明与优雅,但是真正有价值的问题是,怎么来实现它呢?

为了将扩散过程逆转,我们需要知道到底有多少噪声被添加到了图像中。而这个问题的答案,将会由一个经过训练的神经网络模型来预测解答。在Stable Diffusion模型中,这个模块被称为噪声预测器(noise predictor)。训练的过程如下:

  1. 选择一张训练图片,比如一张狗或猫的图像
  2. 生成一个随机的噪声图
  3. 将这张噪声图像原始训练图片中添加特定次数,使图像变得嘈杂
  4. 以正确答案为基准,通过调试参数,训练噪声预测器最终能够识别出究竟有多少次噪声被添加到了这张图片中。【译者注:即一个标准的有判定的神经网络训练过程】

Stable diffusion_第5张图片

噪声是逐步添加到图像中的,噪声预测器将预估每一步中累计被添加噪声的总和

在训练完成后,我们将得到一个能够估计出有多少噪声被添加到了一张图像中的噪声预测器。

逆向扩散(Reverse diffusion)

现在我们有了一个噪声预测器,我们将怎样使用它呢?

我们将首先生成一张完全随机的图像,并让噪声预测器告诉我们这张图像中被添加了哪些噪声。随后我们就可以将噪声预测器给出的噪声图像从原始图像中剔除出去【译注:即反向的图像叠加操作】。重复以上步骤几次,我们即可以得到一张猫或是狗的图像了。

Stable diffusion_第6张图片

逆向扩散通过将预测的每一步的噪声逐渐从图中减去,最终得以还原图像

你可能注意到了,按上面的描述,我们所实现的逆向扩散过程没法控制最终结果是一个猫还是狗的图像。在后面的“调节”章节中我们会着重来论述这一点。就目前我们所介绍的内容来说,图像的生成是无条件的(unconditioned)


稳定扩散模型(Stable Diffusion Model)

现在,我将告诉你一些坏消息:以上我们所描述的过程,并不是Stable Diffusion模型的工作机制!原因是,以上所描述的扩散过程都是在图像(像素)空间(image space)进行的。它的计算量是非常非常巨大的,因而生成的速度会非常的慢。而且你不可能在任何一个单一的GPU中跑通这个过程,更别说那些笔记本电脑上的垃圾GPU了。

图像的像素空间是非常巨大的。想象有一张512x512大小RBG三通道的彩色图片,这将是一个768,432(512x512x3)维度的空间。(意味着为了生成一张图,你需要确定768,432个值)

扩散模型如谷歌的 Imagen 或者Open AI的 DALL-E 都是在像素空间上运行的,它们使用了一些技巧去使模型的计算速度得以提升,但总的来说提升的并不够。

潜空间扩散模型(Latent diffusion model)

稳定扩散模型(Stable Diffusion)的设计目的,就是要解决速度的问题。它是这么做的:

Stable Diffusion模型实际上是在潜空间中的扩散模型。为避免在高维度的图像空间中操作,它首先将图像压缩到了一个称作潜空间的区域中。潜空间相较于像素空间小了48倍【译者注:你可以简单的理解将图像压缩了48倍】。也就是说,模型所处理的计算数据相比之下少了许多,也因此它比标准的扩散模型快了非常多。

变分自动编码器 (Variational Autoencode)

实现图像潜空间压缩的技术叫做变分自动编码器,是的,就是那个你在SD工具中需要设置的VAE文件,我这里会说的更详尽一点。

变分自动编码器(VAE)神经网络有两个部分:(1)编码器;(2)解码器。编码器将图像压缩至潜空间这个低维度的表达形式,而解码器则是将潜空间的数据还原为原始的图像。

Stable diffusion_第7张图片

变分自动编码器将图像转入以及转出潜空间

Stable Diffusion所使用的是一个4x64x64的潜空间,相较于图像的像素空间【译注:512x512的图像】而言小了48倍。所有我们上一章节所描述的前向扩散与逆向扩散的过程都实际是在这个空间中完成的。

训练的过程也是一样的,训练流程中生成的并不是噪声图像,而是潜空间中的张量(即一个4x64x64的噪声图)。训练中像潜空间的图像添加潜空间的噪声,而不是像素图添加像素噪声。这样做的原因都是因为由于潜空间较小从而可以使整个过程的执行速度得到大幅的提升。

为什么图像能压缩至潜空间(latent space)?

你可能震惊于为什么VAE可以将图像压缩到如此小的空间之中而不损失信息。原因很简单:自然图像并不是纯随机的。它们有着很高的规律性:一张脸上的五官总是有着特定的空间关系,一只狗总是有着4条腿以及总体的一类特征形状。

换句话说,图像的高维度是人为刻意产生的,而自然图像可以很容易地压缩到更小的潜在空间中而不会丢失任何信息。 这在机器学习中被称为 流形假设。

在潜空间中做逆向扩散

我们来整理一下在Stable Diffusion模型中,逆向扩散如何在潜空间中进行的

  1. 一个随机的潜空间矩阵被生成(4x64x64维)
  2. 噪声预测器预测出一个潜空间噪声,其在前向扩散过程中被作用在了这个潜空间噪声矩阵上
  3. 从原始潜空间噪声中减去预测出的噪声
  4. 重复2到3步指定的采样次数(sampling steps)
  5. VAE的解码器(decoder)将得到到的潜空间矩阵数据还原为最终的像素图像。

什么是VAE文件?

VAE文件 在 Stable Diffusion一代中用于提升眼睛与面部的绘画结果。正如前面讲的,它们是自动编码器所对应的解码器。通过对解码器进行调教,Stable Diffusion模型的生成图像可以拥有更好的细节表现。

你可能注意到了我前面有一处描述并不是完全正确的。将图片压缩至潜空间是会丢失原始图像的信息的,因为原始的VAE并不能对细节进行恢复。因此VAE解码器将负责在解码过程中绘制那些精细的细节内容。


调节(Conditioning)

以上关于模型的描述仍然是不完整的:当我们使用SD时所传入的文字指令是如何生效的呢?没有指令的存在,SD并不是一个完整的text-to-image模型。你没有办法控制SD最终为你生成一张猫的图片还是一张狗的图片。

这时候我们就需要引入“调节(Conditioning)”了。调节的目的是引导噪声预测器,以便预测的噪声在从图像中减去后,会使图像朝着我们想要的结果演变。

文本指引 (text-to-image)

下图展现了文字指令(Text Prompt)如何经过处理并送入噪声预测器的过程。分词器(Tokenizer)首先将指令中的每个单词转化为一个数字表示的词元(token)。每个词元随后将转换为一个包含768个数值的向量,我们称之为标签(Embedding)(是的,就是那个你在SD GUI工具中所使用的Embedding)。这些标签随后传递给文本Transformer模型【译注:可理解为一个通用的神经网络模型】,并经过其处理后交由噪声预测器使用。

Stable diffusion_第8张图片

文本指令被处理并送入噪声预测器以控制图像生成的过程

到这里我们其实已经给出了一个完整的SD运作机制的概述,如果你认为这已经足够了,那可以跳过后面的内容。接下来,我们会将以上步骤拆解的更为详细一些。

分词器(tokenizer)

Stable diffusion_第9张图片

文本指令将会首先被一个CLIP分词器分解为一组词元。CLIP是一个由OpenAI开发的深度学习模型,被用于生成对任意图像的文本描述。Stable Diffusion第一代版本使用的是CLIP分词器。

将文本词元化,是使其可以被计算机所理解的第一步。我们人类可以阅读文字,但是计算机只能阅读数字,这就是文本指令处理过程中首先被转换成一组词元所对应的数字的原因。

一个分词器只能对其在训练过程中见到过的词汇进行分词。比如说,在CLIP模型中有“dream“和”beach“这两个词元,但是并没有”dreambeach“这个词元。分词器在处理时会将dreambeach这个单词拆分为”dream”和“beach”这两个它所认识的词元·。因此,一个单词并不一定只对应一个词元!

另一个细则是,空格也是词元的一部分。“dream beach"这个单词将会生成两个词元“dream“与”[空格]beach"。这些词元实际上与上个例子中由“dreambeach”解析出来的两个词元是不一样的(前面例子中的词元是不带空格的)。

Stable Diffusion模型所使用的指令长度被限制为75个词元。(现在你知道了这并不等同于75个单词)【译注:作者这里说的75个词元限制是针对于基础的SD模型,而SD工具通过对指令进行拆分处理,再合并的方式让你可以输入任意长度的指令】

标签(Embedding)

Stable diffusion_第10张图片

Stable Diffusion一代版本使用的是OpenAI的ViT-L/14 CLIP模型。在这个模型中标签向量的长度是768。每个词元都有其唯一对应的标签向量。这些标签向量的值在CLIP模型中是固定的,通过训练所得到的。

我们为什么需要标签?这是因为不同的单词之间可能会有很强的关联性。我们需要使用到这种关联性的信息。举例来说,man(男人), gentleman(绅士), guy(男的)这几个词对应的标签值几乎是一样的,因为这些单词在文字中大多情况是可以相互替换的。Monet,Manet与Degas都是印象派的画家,但各自风格又有显著区别,所以这几个名字所对应的标签向量有相近的部分,但又不完全一样。

这里我们所讨论的标签(Embedding),与在使用SD时所用于调教模型的标签是一个东西。标签的使用是有魔法的。科学家们已经证明了,在SD中找到一个合适的标签向量即可以触发任意物体与风格要素,这种模型调教技术被称作逆向构建(Textual Inversion)。

将标签(embeddings)喂给噪声预测器(noise predictor)

Stable diffusion_第11张图片

文本输入数据由标签转为噪声预测器输入

上一步得到的那些标签在传入噪声预测器前,还需要先交由文本Transformer做进一步处理。Transformer模型类似于一个通用的调节因子适配器。在现在的情况中,输入给Transformer的是标签向量,但实际上也可以将其他种类的数据如:类型标签、图像、深度图等作为输入传入这个模型中。Transformer存在的意义,不仅仅是需要其作为数据处理的一个环节,更在于它可以提供一个能包含不同调节方式的数据处理机制。

经由Transformer模型输出的数据,将在后面的U-Net神经网络中被噪声预测器多次使用。而U-Net使用一种叫做交叉注意力(cross-attention)的机制来使用这些数据。正是这个机制使得在前面步骤中被拆散的单词指令能够被正确的组合关联起来。举例来说:指令“A man with blue eyes"需要在“blue”与“eyes”之间形成交叉注意力,这样Stable Diffusion才能知道需要绘制的是一个有蓝色眼睛的男人,而不是一个有眼睛的蓝色男人。

其他类型的指引

文本指令并不是唯一能够调节Stable Diffusion的方式。

在depth-to-image功能中,文本与深度图都可以作为调节参数来使用。

ControlNet通过轮廓线、人物姿态等来控制噪声预测器,在对于生成图像的控制上取得了非常卓越的效果。


Stable Diffusion 101

现在,你已经知晓了Stable Diffusion全部的运作机制了,接下来我们继续逐一详述下Stable Diffusion的各个功能的实际运作过程。

文本生成图像(Text-to-image)

在使用文本到图像功能时,你通过给SD传入一个文本指令,使其返回一张图像。

**第一步,**Stable Diffusion生成一个潜空间的随机张量。这个随机张量的生成是受你在SD中设置的随机种子(seed)的值所控制的。如果你将随机种子设置成了一个固定值,那SD将始终使用同样的初始随机张量。不要忘了,这个随机张量就是你图像在潜空间中的表达形式,只不过目前他还只是完全的噪声。

Stable diffusion_第12张图片

在潜空间生成一个随机的张量(即一组随机数)

**第二步,**噪声预测器的U-Net网络会将这个初始随机张量与文本指令作为输入传入其中,并预测出应移除的噪声,当然其也是个潜空间的张量。

Stable diffusion_第13张图片

**第三步,**将这个潜空间噪声从潜空间初始图像中减去,得到潜空间中新的图像。

Stable diffusion_第14张图片

第二步与第三步将根据你设置的采样步数(sampling steps)重复特定次数,比如20次。

**第四步,**VAE解码器将最后得到的潜空间图像恢复为像素空间的图像,这也是你在Stable Diffusion工具中最终得到的图像。

Stable diffusion_第15张图片

这里展示了图像经过每一次去噪步骤后的变化情况。

作者:Sparrowfc
链接:https://zhuanlan.zhihu.com/p/616195288
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

图生图(Image-to-image)

图生图方法首先是由 SDEdit 所提出的。SDEdit可以应用于任何的扩散模型。因此我们在Stable Diffusion中也有了图生图的功能。

图生图功能使用一张图片与一段文字指令共同作为输入。生成的图像将受到这两个输入的共同调节作用。比如,使用下面这张初级草图以及一段指令 ”photo of perfect green apple with stem, water droplets, dramatic lighting" 作为输入,图生图功能会将其转化为一张很专业的绘画:

Stable diffusion_第16张图片

下面介绍其具体生成的过程。

**第一步,**输入的图片会被编码至潜空间中

Stable diffusion_第17张图片

**第二步,**我们会向其添加噪声。通过在SD工具中设置降噪强度(Denoising strength)可以控制究竟要添加多少噪声到原始输入图像中去(在潜空间)。如果这个值设置为0,不会有任何噪声添加进去,如果是1则会向其添加最大量的噪声以使其成为一个在潜空间中完全随机的张量。

Stable diffusion_第18张图片

**第三步,**噪声预测器将上一步处理后的潜空间图像与文字指令作为输入传入其U-Net网络,并给出预测应减去的潜空间噪声张量。

Stable diffusion_第19张图片

**第四步,**将这个潜空间噪声从潜空间初始图像中减去,得到潜空间中新的图像。

Stable diffusion_第20张图片

第三步与第四步将根据你设置的采样步数(sampling steps)重复特定次数,比如20次。

**第五步,**VAE解码器将最后得到的潜空间图像恢复为像素空间的图像,这也是你在image-to-image工具中最终得到的图像。

Stable diffusion_第21张图片

所以现在你知道图生图究竟是什么了,他所做的就是将初始的潜空间图像设置为输入图片与一些噪声的混合。如果你将降噪强度(denoising strength)设置为1,那你获得的图片其实就等价于纯粹使用文本指令运行文本生成图片工具所得到的结果,因为此时这两种功能使用的初始潜空间图像都是一个完全随机的噪声图。

修图(Inpainting)

修图其实只是图生图的一种特殊形式。噪声将仅被添加到图中你希望修改的部分。噪声的添加量同样是使用降噪强度这个参数来控制。

Depth-to-image

Depth-to-image是image-to-image的增强;它使用深度图生成具有附加条件的新图像。

**第一步,**输入图像被编码到潜空间

Stable diffusion_第22张图片

第二步, MiDaS (一个AI模型) 根据输入图像来分析其深度信息。

Stable diffusion_第23张图片

**第三步,**我们会向潜空间的原始输出图像添加噪声。通过在SD工具中设置降噪强度(Denoising strength)可以控制究竟要添加多少噪声到原始输入图像中去(在潜空间)。如果这个值设置为0,不会有任何噪声添加进去,如果是1则会向其添加最大量的噪声以使其成为一个在潜空间中完全随机的张量。

Stable diffusion_第24张图片

**第四步,**噪声预测器将预估应移除的潜空间噪声,并受到文本提示输入和深度图输入的共同调节。

Stable diffusion_第25张图片

**第五步,**将这个潜空间噪声从潜空间初始图像中减去,得到潜空间中新的图像。

Stable diffusion_第26张图片

第四步与第五步将根据你设置的采样步数(sampling steps)重复特定次数,比如20次。

**第六步,**VAE解码器将最后得到的潜空间图像恢复为像素空间的图像,这也是你在depth-to-image工具中最终得到的图像。

Stable diffusion_第27张图片


CFG值是什么?

关于Stable Diffusion还有一个重要的概念需要介绍,那就是无分类器引导(Classifier-Free Guidance,CFG)。这个参数相信是每个使用SD的美术每天都在不停调试的值。为了能够较好的理解这个概念,我们先来介绍一下它的前身,即分类器引导(Classifier Guidance)。【译注:尽管我都翻译了,但这部分对于非专业人士来说,理解起来还是比较困难,推荐只看最后一节总结就行了】

分类器引导(Classifier Guidance)

分类器引导是一种能够将图像标签(label)信息包含于Stable Diffusion模型中的方法。你可以使用一个标签来引导扩散过程。举个例子,“猫”这个标签可以引导逆向扩散过程使其生成一张关于猫的图像。

分类器引导强度(classifier guidance scale)是一个用于控制扩散过程应该多贴近于给定标签的一个变量。

下图是一个我从 这篇论文 中偷来的示例。假设有三组图片分别具有”猫“,”狗“以及”人“的标签,如果扩散过程是无引导的,扩散模型在绘图过程中会在这三个组中均匀采样【译注:这句话是按自己理解写的,直接翻译读不懂,如有错误欢迎指正】。这会导致它有时候输出的图像会包含两个标签的内容,比如一个男孩牵着一条狗。

Stable diffusion_第28张图片

分类器引导。左:无引导。中间:低强度引导。右:高强度引导。

在分类器的高强度作用下,扩散模型产生的图像将偏向于某一标签类别中极端或明确的那些示例。如果你要求模型绘制一个猫,它将返回一张确切无疑是猫的图像并且不包含任何其他内容。

分类器引导强度(classifier guidance scale)控制扩散过程与指导目标的贴近程度。 在上图中,右边的样本比中间的样本具有更高的分类器引导强度。 实际上,这个比例值只是扩散模型计算中的一个漂移变量的乘数。

无分类器引导(Classifier-free Guidance)

尽管分类器指导为扩散模型带来了突破性的效果提升,但它需要一个额外的模型来提供该指导。这给整个模型的训练带来了一些困难。

无分类器引导(Classifier-free Guidance),用其作者的话来说,是一种可以获得分类器引导结果而不需要分类器的方法。不同于前面所说使用标签和一个单独模型用于引导,他提出使用图像的描述信息并训练一个带条件的扩散模型(conditional diffusion model)。

在text-to-image功能中,这种引导就由文本指令来提供。

【译注:再用我自己的理解翻译一遍,如果不对欢迎指正:无分类器引导就是不以图像+标签作为训练内容,而是以图像+其文字概述作为训练内容,因此不需要再额外训练一个判断图像与标签匹配度的分类器,来额外较正图像生成模型。而直接训练生成图像与图像+文字描述的匹配度,从而得到的就是一个具有text-to-image功能的整体的图像生成模型】

CFG值

现在我们有了一个可调节的无分类器的扩散过程,我们要如何控制扩散过程遵循指导到什么程度?

无分类器引导 (CFG) 强度是一个值,它控制文本指令(prompt)对扩散过程的影响程度。 当将其设置为 0 时,图像生成是无引导的(即忽略提示),而较高的值会使扩散过程更贴近于文本指令。


StableDiffusion一代版本与二代版本的比较

这已经是一篇很长的文章了,但如果不比较 v1 和 v2 模型之间的差异,这篇文章就不算完整。

模型差异

Stable Diffusion v2 使用 OpenClip 进行文本数据处理(text embedding)。 Stable Diffusion v1 使用 Open AI 的 CLIP ViT-L/14 进行文本处理。这种变化的原因是:

  • OpenClip 模型大小是原来的5倍。更大的文本编码器模型提高了图像质量。
  • 尽管 Open AI 的 CLIP 模型是开源的,但这些模型是使用专有数据训练的。切换到 OpenClip 模型使研究人员在研究和优化模型时更加透明。更利于长远发展。

训练数据差异

Stable Diffusion v1.4 使用如下数据集进行训练

  • 237k steps at resolution 256×256 on laion2B-en dataset.
  • 194k steps at resolution 512×512 on laion-high-resolution.
  • 225k steps at 512×512 on “laion-aesthetics v2 5+“, with 10% dropping of text conditioning.

Stable Diffusion v2 使用如下训练集训练:

  • 在256x256分辨率下训练550k步,使用 LAION-5B图像数据集,并使用了 punsafe=0.1 以及 aesthetic score >= 4.5 两个条件参数从中筛除了“不和谐”图片。【译注:punsafe=0.1即表明训练数据集中出现“不和谐”图片的概率低于10%】
  • 在 512x512分辨率下训练850k步,使用同样的数据集,筛选条件是分辨率大于或等于512x512的
  • 再使用一种叫 v-object 方式在同样数据集上再训练150k步
  • 在768x768分辨率下再训练140k步。

Stable Diffusion v2.1 基于v2版本进一步优化:

  • 在同样数据集上再训练 55k 步
  • 另外再在数据集筛选条件punsafe=0.98的结果中再训练155k 步

所以基本上,他们在后面的训练步骤中关闭了 NSFW (Not suitable for work) 过滤器【译注:也就是说v2.1也可以出涩图】。

输出结果差异

用户普遍发现使用 Stable Diffusion v2 来控制风格和生成名人更难。 虽然 Stability AI 【译注:基础模型发布团队】没有明确过滤掉艺术家和名人的名字,但它们的效果在 v2 中要弱得多。 这可能是由于训练数据的差异。 Open AI 的专有数据可能有更多的艺术品和名人照片。 他们的数据可能经过高度过滤,因此一切事物和每个人看起来都非常漂亮。

SD模型的四种微调方法

原视频链接:https://www.youtube.com/watch?v=dVjMiJsuR5o

本视频介绍目前四种主流的优化(Fine Tuning) Stable Diffusion模型的方法(Dreambooth, LoRA, Textual Inversion, Hypernetwork)。通过这部视频,你将对模型训练的原理与过程有个基础的认知、了解这四种训练模型的优缺点,最终你将知道如何选用最适合你需求的SD优化模型。文中的理论面向外行人,可能并不准确但十分浅显易懂,如果你在阅读完还是不能完全理解,建议再阅读这篇 Stable Diffusion工作原理 文章,保证你在使用SD工具时不再彷徨。

Dreambooth

Stable diffusion_第29张图片

Dreambooth通过直接修改整个原始模型来对模型输出结果进行调校

训练内容主要是两个输入

  1. 你要训练的"概念"(Concept)。

在图中的示例里,我们有一张柯基犬的图片。在实际训练时,我们需要给出关于这只柯基狗的更多的图片, 以此才能训练模型对这个”柯基犬“的图像有认知。

  1. 与这个“概念”相关联的关键词。

在图中的示例里,这个关键词是SKS。

Dreambooth所训练的事情,就是将柯基犬的图片与关键词SKS建立起关联关系来。

训练的过程:

  1. 给训练图片添加n步噪声,使其变成较为嘈杂的图片(测试图左侧的噪声图)。【即正向Diffusion过程,详见Stable Diffusion原理简介
  2. 另外再给训练图片添加较少一点的噪声(n-1),使其成为一张校准图片(测试图右侧的图片)。
  3. 然后我们来训练SD模型以左侧较嘈杂的图片作为输入,再加上特殊关键词指令的输入,能输出右侧较为清晰的图片。
  4. 一开始,由于模型可能根本就不识别新增的特殊关键词SKS,他可能输出了一个不是很好的结果。此时我们将该结果与目标图片(右侧较少噪声的图片)进行比较,得出一个loss结果,用以描述生成图像与目标图像的差异程度。
  5. 接着Dreambooth会做一步被称为Gradient Update的事情。有关Gradient Update的事情实在是过于复杂了,你可以简单理解为,如果Loss高的话它将惩罚模型,如果Loss低的话它将奖励模型。
  6. 当训练重复了一段时间后,整个模型会逐渐认识到:当它收到SKS的词语输入时,生成的结果应该看起来比较像训练者所提供的柯基犬的图片,由此我们便完成了对模型的调校。

Dreambooth最核心的一点,就是它将训练出一个完整的新模型出来。因此从效果上来说,他是用于将一个新的概念添加到SD模型中最合适的训练方案。当然这也意味着它将占据相当大的存储空间,不过总体来说,Dreambooth还是最好的。

Textual Inversion

Stable diffusion_第30张图片

示例中我们仍然是训练柯基犬图像与SKS关键词的关联,整个过程的大部分步骤都与Dreambooth是一样的。

唯一的区别是,在比较训练结果后,Gradient Update将作用于SKS在语言处理模型中对应的参数向量(Embedding Vector)。

参数向量简单来说就是关键词SKS经过语言模型处理后所得到的一个向量数据,后续的Diffusion Model将使用这些由输入指令“A photo of SKS”转换而来的一组向量数据作为实际的输入参数,来影响并指导Diffusion生成图像的过程。

通过训练,Textual Inversion为SKS关键词找到了一个最合适的向量*【训练前,如果语言模型原本不认识SKS的话会给他分配一个唯一的新向量,如果认识的话会有一个固定的唯一向量】*,使用该向量即可指导原始的Diffusion模型输出与柯基犬所匹配的图像。

仅仅通过调整一个向量的值就能产生这种效果可能令你难以置信,但是其背后确实是有理论依据的。想要更深入的理解其原因,以及所谓Embedding Vector究竟是什么,可以参阅 这篇文章 获取更详细的说明。

另外由于Textual Inversion本身并没有修改原始的Diffusion模型,它并不能教会Diffusion模型渲染其没有见过的图像内容。你可以更形象地将其训练结果理解成一个单词(SKS)向一个指令(A photo of Corgi Dog)的映射。

Textual Inversion所训练出来的结果实际上就是一个单词与其对应向量的映射记录,是一个非常非常小的数据,一般只有十几K。

Textual Inversion非常的轻量化,也非常的酷,它以一种易于理解的方式来为你的图像增加特定的元素或风格,不过从总体效果上来说Dreambooth还是更好一些。

LoRA

Stable diffusion_第31张图片

全称Low Rank Adaption,想要理解它的原理首先非常非常概括的介绍下AI模型的内部实现。

现今AI模型所使用的神经网络结构大多是由许多的计算层叠加而成的。你的输入输出首先传入第一层,经过其计算,生成一组新的数据,再作为数据传入第二层,依次计算传递,最终由最后一层给出结果。随着层数的叠加,整个模型逐渐的能够理解你所输出数据的含义并最终给出期望的结果,这就是神经网络的一个大致的描述。

Stable diffusion_第32张图片

LoRA并不是AI绘画专有的技术,其原本是针对于LLM(大语言模型)所开发的技术,旨在解决避免将整个模型参数拷贝下来才能对模型进行调校的问题。(相较于SD,LLM的模型参数量完全是另外一个级别的了,比如ChatGPT3据说有1750亿参数,如果每次修改都要拷贝整个模型出来,那就有点太难以调校了)

LoRA采用的方式是向原有的模型中插入新的数据处理层,这样就避免了去修改原有的模型参数,从而避免将整个模型进行拷贝的情况,同时其也优化了插入层的参数量,最终实现了一种很轻量化的模型调校方法。

Stable diffusion_第33张图片

因此,与前面方法一样,通过训练,我们最终将训练出一整套新数据处理层的参数,而这些参数插入进原有的SD模型中,将会使输出结果与SKS产生我们所期望的关联关系,即SKS - 柯基犬图像。

LoRA训练相较于Dreambooth更快且使用更少的VRAM,其数据大小相较于完整模型要小很多(150M左右)。

Hypernetwork

Stable diffusion_第34张图片

Hypernetwork的训练原理与LoRA差不多,目前其并没有官方的文档说明*【据传其来源于被泄密的代码】*。视频作者通过阅读AUTOMATIC1111 WebUI中使用的Hypernetwork插件代码来分析其作用原理。

与LoRA不同的是,Hypernetwork是一个单独的神经网络模型,该模型用于输出可以插入到原始Diffusion模型的中间层。

因此通过训练,我们将得到一个新的神经网络模型,该模型能够向原始Diffusion模型中插入合适的中间层及对应的参数,从而使输出图像与输入指令SKS之间产生柯基犬概念的关联关系。【按这种说法,可以将其简单理解为间接版的LoRA】

视频作者认为Hypernetwork实质上是个破产版的LoRA,但LoRA技术的背后其实是有很深的数学理论做支撑的,对于如何最优化其训练速度及参数量都有着详实的研究理论及数据支撑,而通过训练一个神经网络去再去生成LoRA的参数这种间接方式,可能最终得到的结果并不是最有效或最优的。

从训练产出上来说,Hypernetwork的训练结果同LoRA一样,也就是一个大概150M左右的小模型,非常便于传输与分享

技术比较

四种训练方式的基准数据:【实际取决于你的设备和训练参数,这块视频作者并没有给出,但是可以作为相对值进行参考】

训练方式 输出大小(MB) 所需最小显存(GB) 训练用时(分钟)
Dreambooth 2000 8.0 45
Hypernetwork 114 8.0 70
Textual Inversion 0.0013 8.0 60
LoRA 145 7.0 15

CivitAI上对这四种模型的偏好程度:

类型 平均下载量 平均评分 平均点赞数 平均评分 同类中Top100数量
Checkpoint 5,156.47 9.82 291.37 4.92 100
hypernetwork 426.96 1.32 39.01 2.71 73
textual-inversion 1,127.58 2.75 86.42 86.42 100
LoRA 181.45 1.18 20.73 2.70 11

【注意视频发布于2023/1/15,现在的统计应该不是这样了,仍然是做相对参考。Checkpoint是完整模型的文件格式,可以理解为其等价于Dreambooth】

  • 可以看出Dreambooth是目前使用最广泛的优化模型,他的下载量、喜好与评分都是排名第一,这虽然并不一定意味着他就是最好的优化方式,但这证明了其目前拥有最活跃的使用群体。当你想要尝试自己调整模型时,你可以较为轻易的找到很多与Dreambooth相关的使用与技术文章。
  • Textual Inversion排名第二,其在用户喜好上甚至略高于Dreambooth。
  • LoRA的数据不太好,不过由于其是一个很新的技术*【作者视频发布与2023/1/15】*,在统计中只有11个LoRA模型,所以其效果还有待于观察。
  • Hypernetwork可以说是表现很糟糕了,无论从技术层面还是实际数据来看,可能你都不应该考虑使用他。

最终作者还是推荐使用Dreambooth,无论从原理还是实际用户反馈来看,他所获得的效果都是最好的。

另外作者推荐多尝试LoRA,他的优点在于其训练速度快,通常训练一个模型都是需要进行多次迭代的,其在速度上的优势会使其的训练迭代过程可以更多,更便于调整。【从视频作者给出的原理分析来说,LoRA的发展潜力会更大,而且Hypernetwork应该会被直接取代。而如果我们像ChatGPT一样给SD添加出超过某一阈值的天量参数网络出来,其结果会不会再次震惊到我们?】

更深入的技术参考文章

  • Stable Diffusion v1.4 press release
  • Stable Diffusion v2 press release
  • Stable Diffusion v2.1 press release
  • High-Resolution Image Synthesis with Latent Diffusion Models – 介绍Stable Diffusion的研究论文
  • The Illustrated Stable Diffusion – 有关模型更细节的介绍
  • Stable Diffusion 2 – v2版本模型官网
  • Diffusion Models Beat GANs on Image Synthesis – 分类器引导论文
  • Classifier-Free Diffusion Guidance](Classifier-Free Diffusion Guidance – 无分类器引导论文
  • Deep Unsupervised Learning using Nonequilibrium Thermodynamics – 逆扩散过程介绍

你可能感兴趣的:(stable,diffusion)