原文:揭秘稳定扩散的神奇魔力 - 让您轻松理解StableDiffusion原理 - 2023.03.27

作者: 大鱼

出处:机器之门 - 微信公众号

了解Stable Diffusion的工作原理,理解它的内部运作,可以更好地运用这个工具来生成更加精确的图像。

文生图和图生图是两种不同的生成模型。文生图是指将文本转换为图像的过程,而图生图是指将图像转换为图像的过程。这两种模型都是Stable Diffusion技术的应用。

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

Stable Diffusion 能做什么

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

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

扩散模型(Diffusion Model)

扩散模型(Stable Diffusion)是深度学习模型中的一种,属于生成模型的一类。生成模型的主要作用是根据学习内容生成相似的新数据,而扩散模型是专为生成图像数据而设计的。

为什么称之为扩散模型呢?因为这个模型中所使用的数学方法看起来与物理学中的扩散公式非常相似。

深入了解一下这个模型的理念。假设只使用猫和狗这两类图像来训练这个稳定扩散模型。如下图所示,图中左侧曲线的两个峰值代表了猫和狗这两组图像数据。

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

前向扩散(Forward diffusion)

所谓前向扩散(forward diffusion)过程是指不断向训练图像中添加随机噪声,使其逐渐变成一张完全没有意义的纯噪声图像。在我们的例子中,前向扩散过程会将猫和狗的图片转变为噪声图像。最终,你将无法从得到的噪声图像中分辨出原始图像到底是猫还是狗(这一点非常重要)。

这类似于将一滴墨水滴入一杯水中。墨水将在水中扩散,在几分钟之后,它将随机均匀地分布于整个水杯中,你将无法再从这杯水中看出墨水最初是从杯子的中心还是边缘滴入的。

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

图:一张猫图的前向扩散过程

逆向扩散(Reverse diffusion)

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

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

逆向扩散的核心理念是将一张完全没有意义的噪声图像,通过逆向的扩散过程还原为一张猫或狗的图像。

技术上说,每个扩散过程都包含两个分量:漂移或引导的方向以及随机的方向。逆向扩散将结果指向猫或狗的图像,而不是介于二者之间的图像。这也解释了为什么逆向扩散的结果会是猫或狗图像。

训练是如何完成的

逆向扩散的理念非常优雅和高明,但真正有价值的问题是如何实现它。

噪声预测器(noise predictor)

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

图:选择一张训练图片,比如一张狗或猫的图像生成一个随机的噪声图将这张噪声图像原始训练图片中添加特定次数,使图像变得嘈杂

经过调试参数,噪声预测器的训练会以正确答案为基准,最终能够识别出图像中究竟添加了多少次噪声。

噪声是逐步添加到图像中的,噪声预测器将预测每一步中添加的累计噪声总量。在训练完成后,将得到一个噪声预测器,它能够估计一张图像中添加了多少噪声。

逆向扩散(Reverse diffusion)

现在已经有了噪声预测器,那么该如何使用它呢?

首先生成一张完全随机的图像,然后用噪声预测器告诉我们这张图像中添加了哪些噪声。接下来,将使用噪声预测器给出的噪声图像从原始图像中消除噪声。重复以上步骤几次,就可以生成一张猫或狗的图像了。

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

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

稳定扩散模型(Stable Diffusion Model)

以上描述的过程并不是Stable Diffusion模型的工作机制。

原因是,以上扩散过程都是在图像空间进行的。这将导致计算量非常巨大,生成速度非常缓慢。可能无法在任何单个GPU中运行此过程,更不用说那些笔记本电脑上的低性能GPU了。

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

谷歌的Imagen或Open AI的DALL-E等扩散模型都是在像素空间上运行的,它们使用了一些技巧来加速模型计算速度,但总体而言,加速并不够。

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

稳定扩散模型(Stable Diffusion)的设计目的是解决速度问题。为此,Stable Diffusion模型实际上是在潜空间中进行扩散模型。

为了避免在高维图像空间中操作,它首先将图像压缩到称为潜空间的区域中。潜空间大小比像素空间小了48倍。因此,模型所处理的计算数据量少得多,也因此比标准扩散模型快得多。

实现图像潜空间压缩的技术称为变分自动编码器(VAE),这也是在SD工具中需要设置的VAE文件。

变分自动编码器(VAE)神经网络由两部分组成:编码器和解码器。编码器将图像压缩成潜在空间的低维表达形式,而解码器则将潜在空间的数据还原为原始图像。

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

Stable Diffusion使用的是一个4x64x64的潜空间,比图像的像素空间小了48倍。所有前向扩散和逆向扩散的步骤都是在这个空间中完成的。

训练过程也是一样的,生成的不是噪声图像,而是潜空间中的张量(即一个4x64x64的噪声图)。在训练中,向潜空间的图像添加潜空间的噪声,而不是像素空间添加像素噪声。这样做的原因是潜空间较小,可以大幅提高整个过程的速度。

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

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

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

在潜空间中做逆向扩散

梳理一下Stable Diffusion模型中逆向扩散的过程:

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

什么是VAE文件?

在Stable Diffusion 1.x 中,VAE文件用于提升眼睛与面部的绘画结果。这些文件是与自动编码器对应的解码器。通过对解码器进行调整,Stable Diffusion模型生成的图像可以展现更好的细节表现。

将图像压缩为潜空间会导致信息的丢失,因为原始的VAE无法恢复详细的细节内容。因此,VAE解码器在解码过程中扮演了关键角色,能够绘制出那些精致的细节。

调节(Conditioning)

上述对于模型的描述并不完整,因为Stable Diffusion在生成图像时需要指令进行指导,否则它就不是一个完整的text-to-image模型。如果没有指令,将无法控制Stable Diffusion生成的是猫的图像还是狗的图像。

这时,需要引入“调节(Conditioning)”的概念。调节的目的是引导噪声预测器,使其能够预测出合适的噪声,以便从图像中减去后,生成的图像朝着想要的方向演变。

文本指引 (text-to-image)

下图展示了文字指令(Text Prompt)如何被处理并输入噪声预测器的过程。

首先,分词器(Tokenizer)将指令中的每个单词转化为一个数字代表的词元(token)。

接着,每个词元被转换为一个包含768个数值的向量,我们称之为标签(Embedding),这些标签传递给文本Transformer模型。之后,文本Transformer模型对标签进行处理,并传递处理过的标签给噪声预测器使用。

需要注意的是,文本Transformer模型是一个通用的神经网络模型。

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

分词器(tokenizer)

文本指令经过CLIP分词器处理后,会被分解为一组词元。CLIP是由OpenAI开发的深度学习模型,用于生成对任意图像的文本描述,Stable Diffusion 1.x 版本使用的是CLIP分词器。

将文本进行词元化是使其可被计算机所理解的第一步。人类可以阅读文字,但计算机只能阅读数字,因此将文本转换成一组数字所对应的词元是必要的。

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

此外,空格也是词元的一部分。“dream beach”这个单词会生成两个词元“dream”和“[空格]beach”。这些词元与上个例子中由“dreambeach”解析出的两个词元不同,因为前例中的词元是不含有空格的。

Stable Diffusion模型的指令长度被限制为75个词元。需要注意的是,作者所提到的75个词元限制是基于基础版本的SD模型的,而SD工具允许通过拆分和合并文本的方式输入任意长度的指令。

标签(Embedding)

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

标签的使用是因为不同的单词可能之间有强烈的相关性需要利用这些信息。举例来说,man(男人)、gentleman(绅士)和guy(男的)这几个词所对应的标签向量几乎是一样的,因为这些单词在文本中通常可以相互替换。Monet,Manet和Degas都是印象派的画家,但各自的绘画风格有显著的区别,因此它们所对应的标签向量有相似的部分,但不完全相同。

需要注意的是,此处的标签向量(Embedding)与在SD模型调教中使用的标签不是同一个概念。标签的使用有着神奇的效果。研究人员已经证明,在SD中找到一个适当的标签向量可以激活任何对象与风格元素,这种技术被称为逆向构建(Textual Inversion)

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

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

传入噪声预测器前,上一步得到的那些标签还需要经过文本Transformer进一步处理。Transformer模型类似于一个通用的适配器,用于调节因子。

在这种情况下,标签向量被输入到Transformer中进行处理,但实际上,也可以将其他类型的数据,如类型标签、图像、深度图等作为输入传递给此模型。Transformer模型的作用不仅在于需要它作为数据处理的一环,更重要的是,它提供了一个能够包含不同调节方式的数据处理机制。

Transformer模型输出的数据将在后面的U-Net神经网络中被噪声预测器多次利用。U-Net使用一种被称为交叉注意力(cross-attention)的机制来处理这些数据。

正是这个机制使得在前面被拆分的单词指令能够被正确地组合和关联起来。例如,指令“一个蓝眼睛的男人”需要在“蓝色”和“眼睛”之间形成交叉注意力。这样,Stable Diffusion才能知道需要绘制的是一个有蓝色眼睛的男人,而不是一个有眼睛的蓝色男人。

其他类型的指引

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

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

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

Stable Diffusion

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

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

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

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

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

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

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

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

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

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

图生图(Image-to-image)

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

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

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

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

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

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

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

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

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

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

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

Depth-to-image

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

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

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

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

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

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

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

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

CFG值(Classifier-Free Guidance)

关于Stable Diffusion还有一个重要的概念需要介绍,那就是无分类器引导(Classifier-Free Guidance,CFG)。

为了能够较好的理解这个概念,先来介绍一下它的前身,即分类器引导(Classifier Guidance)。

分类器引导(Classifier Guidance)

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

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

如下图示例。假设有三组图片分别具有”猫“,”狗“以及”人“的标签,如果扩散过程是无引导的,扩散模型在绘图过程中会在这三个组中均匀采样。这会导致它有时候输出的图像会包含两个标签的内容,比如一个男孩牵着一条狗。

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

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

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

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

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

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

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

CFG值

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

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

Last modification:March 29th, 2023 at 02:13 pm