稳定扩散能做什么?
在最简单的形式中,Stable Diffusion 是一种文本到图像模型。给它一个文本提示。它将返回与文本匹配的图像。
稳定扩散将文本提示变成图像。
扩散模型
Stable Diffusion 属于一类称为扩散模型的深度学习模型。它们是生成模型,这意味着它们旨在生成类似于他们在训练中看到的新数据。在稳定扩散的情况下,数据是图像。
为什么叫扩散模型呢?因为它的数学看起来很像物理学中的扩散。让我们来看看这个想法。
假设我训练了一个只有两种图像的扩散模型:猫和狗。在下图中,左边的两个峰代表猫和狗图像组。
正向扩散
正向扩散将照片变成噪声。(图改自本文)
前向扩散过程会向训练图像添加噪声,逐渐将其变成异常噪声图像。前向过程会将任何猫或狗图像变成噪声图像。最终,您将无法分辨它们最初是狗还是猫。(这个很重要)
就像一滴墨水滴入一杯水中。墨滴在水中扩散。几分钟后,它随机分布在整个水中。你再也无法判断它最初是落在中心还是靠近边缘。
下面是一个图像正向扩散的例子。猫的图像变成了随机噪声。
猫图像的前向扩散。
反向扩散
现在是激动人心的部分。如果我们可以逆转扩散呢?就像向后播放视频一样。时光倒流。我们将看到最初添加墨滴的位置。
反向扩散过程恢复图像。
从嘈杂、无意义的图像开始,反向扩散恢复了猫或狗的图像。这是主要思想。
从技术上讲,每个扩散过程都有两个部分:(1) 漂移或定向运动和 (2) 随机运动。反向扩散漂移到猫或狗的图像,但没有介于两者之间的图像。这就是为什么结果可以是猫或狗的原因。
培训是如何进行的
反向扩散的想法无疑是巧妙而优雅的。但最重要的问题是,“如何才能做到?”
要反转扩散,我们需要知道图像中添加了多少噪声。答案是教授神经网络模型来预测添加的噪声。它在 Stable Diffusion 中被称为噪声预测器。它是一个 U-Net 模型。训练过程如下。
- 选择一张训练图像,比如一张猫的照片。
- 生成随机噪声图像。
- 通过将这个嘈杂的图像添加到一定数量的步骤来破坏训练图像。
- 教噪声预测器告诉我们添加了多少噪声。这是通过调整其权重并向其显示正确答案来完成的。
在每个步骤中依次添加噪声。噪声预测器估计添加到每个步骤的总噪声。
训练后,我们有一个噪声预测器能够估计添加到图像中的噪声。
反向扩散
现在我们有了噪声预测器。如何使用它?
我们首先生成一个完全随机的图像,并要求噪声预测器告诉我们噪声。然后我们从原始图像中减去估计的噪声。重复这个过程几次。您将获得猫或狗的图像。
反向扩散通过从图像中连续减去预测噪声来工作。
您可能会注意到我们无法控制生成猫或狗的图像。当我们谈论调节时,我们将解决这个问题。目前,图像生成是无条件的。
您可以在本文中阅读有关反向扩散采样和采样器的更多信息。
稳定扩散模型
现在我要告诉你一些坏消息:我们刚才谈论的不是稳定扩散的工作原理!原因是上述扩散过程是在图像空间中进行的。它在计算上非常非常慢。您将无法在任何单个 GPU 上运行,更不用说笔记本电脑上糟糕的 GPU 了。
图像空间是巨大的。想一想:具有三个颜色通道(红、绿、蓝)的 512×512 图像是一个 786,432 维空间!(您需要为一个图像指定那么多值。)
Google 的 Imagen 和 Open AI 的 DALL-E 等扩散模型都在像素空间中。他们使用了一些技巧来使模型更快,但仍然不够。
潜在扩散模型
Stable Diffusion 旨在解决速度问题。就是这样。
稳定扩散是一种潜在的扩散模型。它不是在高维图像空间中操作,而是首先将图像压缩到潜在空间中。潜在空间小了 48 倍,因此它获得了处理更少数字的好处。这就是为什么它要快得多。
变分自动编码器
它是使用一种称为变分自动编码器的技术完成的。是的,这正是 VAE 文件的内容,但我稍后会讲得很清楚。
变分自动编码器 (VAE) 神经网络有两部分:(1) 编码器和 (2) 解码器。编码器将图像压缩为潜在空间中的低维表示。解码器从潜在空间恢复图像。
变分自动编码器将图像与潜在空间进行转换。
Stable Diffusion 模型的潜在空间为 4x64x64,比图像像素空间小 48 倍。我们讲的所有正向和反向扩散实际上都是在潜在空间中完成的。
因此在训练期间,它不会生成噪声图像,而是在潜在空间(潜在噪声)中生成随机张量。它不是用噪声破坏图像,而是用潜在噪声破坏图像在潜在空间中的表示。这样做的原因是它更快,因为潜在空间更小。
图像分辨率
图像分辨率反映在潜像张量的大小上。仅对于 512×512 图像,潜像的大小为 4x64x64。对于 768×512 的肖像图像,它是 4x96x64。这就是为什么需要更长和更多的 VRAM 才能生成更大的图像。
由于 Stable Diffusion v1 在 512×512 图像上进行了微调,因此生成大于 512×512 的图像可能会导致重复对象,例如臭名昭著的两个头。如果必须,请至少将一侧保留为 512 像素,并使用 AI 升频器以获得更高的分辨率。
为什么潜在空间是可能的?
您可能想知道为什么 VAE 可以在不丢失信息的情况下将图像压缩到更小的潜在空间中。不出所料,原因是自然图像不是随机的。它们具有很高的规律性:一张脸遵循眼睛、鼻子、脸颊和嘴巴之间的特定空间关系。一只狗有 4 条腿,是一种特殊的形状。
换句话说,图像的高维度是人为的。自然图像可以很容易地压缩到更小的潜在空间中而不会丢失任何信息。这在机器学习中被称为流形假设。
潜在空间中的反向扩散
以下是 Stable Diffusion 中潜在反向扩散的工作原理。
- 生成随机潜在空间矩阵。
- 噪声预测器估计潜在矩阵的噪声。
- 然后从潜在矩阵中减去估计的噪声。
- 重复步骤 2 和 3 直到特定的采样步骤。
- VAE 的解码器将潜在矩阵转换为最终图像。
什么是 .vae 文件?
VAE 文件在 Stable Diffusion v1 中用于改善眼睛和面部。它们就是我们刚才讲的自动编码器的解码器。通过进一步微调解码器,模型可以绘制更精细的细节。
你可能意识到我之前提到的并不完全正确。将图像压缩到潜在空间中确实会丢失信息,因为原始 VAE 无法恢复细节。相反,VAE 解码器负责绘制精细的细节。
调理
我们的理解是不完整的:文字提示是从哪里进入图片的?没有它,Stable Diffusion 就不是文本到图像模型。您将获得猫或狗的图像,而无法控制它。
这就是调理的用武之地。调理的目的是控制噪声预测器,以便预测的噪声在从图像中减去后会给出我们想要的结果。
文本调节(文本到图像)
下面概述了如何处理文本提示并将其输入噪声预测器。Tokenizer 首先将提示中的每个单词转换为称为标记的数字。然后将每个标记转换为一个 768 值向量,称为嵌入。(是的,这与您在 AUTOMATIC1111 中使用的嵌入相同)嵌入随后由文本转换器处理,并准备好由噪声预测器使用。
如何处理文本提示并将其输入噪声预测器以控制图像生成。
现在让我们仔细看看每个部分。如果上面的高级概述对您来说足够好,您可以跳到下一节。
使用此笔记本检查任何提示的标记和嵌入。
分词器
分词器。
文本提示首先由 CLIP 分词器分词。CLIP 是 Open AI 开发的深度学习模型,用于生成任何图像的文本描述。Stable Diffusion v1 使用 CLIP 的分词器。
标记化是计算机理解单词的方式。我们人类可以阅读文字,但计算机只能阅读数字。这就是文本提示中的单词首先转换为数字的原因。
分词器只能分词它在训练中看到的单词。例如,CLIP 模型中有“dream”和“beach”,但没有“dreambeach”。Tokenizer 会将单词“dreambeach”分解为两个标记“dream”和“beach”。所以一个词并不总是意味着一个令牌!
另一个细则是空格字符也是令牌的一部分。在上面的例子中,短语“dream beach”产生了两个标记“dream”和“[space]beach”。这些令牌与“dreambeach”产生的令牌不同,“dreambeach”是“dream”和“beach”(海滩前没有空格)。
稳定扩散模型仅限于在提示中使用 75 个标记。(现在你知道它和 75 个单词不一样了!)
嵌入
嵌入。
Stable diffusion v1 使用 Open AI 的 ViT-L/14 Clip 模型。嵌入是一个 768 值向量。每个标记都有自己独特的嵌入向量。嵌入由 CLIP 模型固定,这是在训练期间学习的。
为什么我们需要嵌入?这是因为有些词彼此密切相关。我们想利用这些信息。例如,man、gentleman和guy的嵌入几乎相同,因为它们可以互换使用。莫奈、马奈和德加都以印象派风格作画,但方式不同。名称具有接近但不相同的嵌入。
这与我们讨论的使用关键字触发样式的嵌入相同。嵌入可以变魔术。科学家们已经表明,找到合适的嵌入可以触发任意对象和样式,这是一种称为文本反转的微调技术。
将嵌入提供给噪声预测器
从嵌入到噪声预测器。
在输入噪声预测器之前,嵌入需要由文本转换器进一步处理。变压器就像一个用于调节的通用适配器。在这种情况下,它的输入是文本嵌入向量,但它也可以是类标签、图像和深度图等其他东西。转换器不仅进一步处理数据,而且还提供了一种机制来包含不同的调节模式。
交叉注意力
整个 U-Net 中的噪声预测器多次使用文本转换器的输出。U-Net 通过交叉注意力机制使用它。这就是提示与图像相交的地方。
让我们以提示“A man with blue eyes”为例。Stable Diffusion 将“blue”和“eyes”这两个词配对在一起(提示中的自我注意),因此它会生成一个蓝眼睛的人,而不是一个穿蓝衬衫的人。然后它使用此信息将反向漫反射转向包含蓝眼睛的图像。(提示和图像之间的交叉注意力)
旁注:Hypernetwork 是一种微调稳定扩散模型的技术,它劫持交叉注意力网络以插入样式。LoRA 模型通过修改交叉注意力模块的权重来改变样式。仅修改此模块就可以微调 Stabe Diffusion 模型这一事实告诉您此模块的重要性。
其他调理
文本提示不是可以调节稳定扩散模型的唯一方式。
文本提示和深度图像都用于调节深度到图像模型。
ControlNet 使用检测到的轮廓、人体姿势等条件来调节噪声预测器,并实现对图像生成的出色控制。
逐步稳定扩散
现在您了解了 Stable Diffusion 的所有内部机制,让我们通过一些示例来了解幕后发生的事情。
文本到图像
在文本到图像中,您给 Stable Diffusion 一个文本提示,它返回一个图像。
步骤 1. 稳定扩散在潜在空间中生成随机张量。您可以通过设置随机数生成器的种子来控制此张量。如果您将种子设置为某个值,您将始终获得相同的随机张量。这是你在潜在空间中的形象。但现在都是噪音。
在潜在空间中生成随机张量。
第 2 步。噪声预测器 U-Net 将潜在的噪声图像和文本提示作为输入并预测噪声,也在潜在空间(4x64x64 张量)中。
步骤 3. 从潜像中减去潜噪声。这将成为您的新潜像。
重复步骤 2 和 3 进行一定数量的采样步骤,例如 20 次。
第四步。最后,VAE 的解码器将潜像转换回像素空间。这是运行 Stable Diffusion 后得到的图像。
以下是图像在每个采样步骤中的演变方式。
每个采样步骤的图像。
噪音时间表
图像从嘈杂变为干净。你想知道噪声预测器是否在初始步骤中工作不正常吗?实际上,这只是部分正确。真正的原因是我们试图在每个采样步骤中获得预期的噪声。这称为噪声时间表。下面是一个例子。
15 个采样步骤的噪声时间表。
噪声时间表是我们定义的。我们可以选择在每一步减去相同数量的噪声。或者我们可以像上面那样在一开始就减去更多。采样器在每个步骤中减去刚好足以在下一步中达到预期噪声的噪声。这就是您在分步图像中看到的内容。
图像到图像
Image-to-image是SDEdit方法中最先提出的一种方法。SDEdit 可以应用于任何扩散模型。所以我们有稳定扩散的图像到图像(潜在扩散模型)。
输入图像和文本提示作为图像到图像的输入提供。生成的图像将以输入图像和文本提示为条件。例如,使用这张业余绘图和提示“带有茎、水滴、戏剧性灯光的完美青苹果照片”作为输入,图像到图像可以将其变成专业绘图:
图像到图像
现在这是分步过程。
步骤 1. 输入图像被编码到潜在空间。
步骤 2. 将噪声添加到潜像中。去噪强度控制添加多少噪声。如果为 0,则不添加噪声。如果为1,则加入最大量的噪声,使潜像成为完全随机张量。
步骤 3. 噪声预测器 U-Net 将潜在的噪声图像和文本提示作为输入,并预测潜在空间(4x64x64 张量)中的噪声。
步骤 4. 从潜像中减去潜噪声。这将成为您的新潜像。
对于一定数量的采样步骤,例如20次,重复步骤3和4。
Step 5. 最后,VAE 的解码器将潜像转换回像素空间。这是运行图像到图像后得到的图像。
所以现在你知道图像到图像是什么了:它所做的就是用一点噪声和一点输入图像设置初始潜像。将去噪强度设置为 1 相当于文本到图像,因为初始潜在图像完全是随机噪声。
修复
修复实际上只是图像到图像的一个特例。噪声会添加到您想要修复的图像部分。噪声量同样由去噪强度控制。
图像深度
Depth-to-image是image-to-image的增强;它使用深度图生成带有附加条件的新图像。
步骤 1. 输入图像被编码为潜在状态
步骤 2. MiDaS(一种 AI 深度模型)根据输入图像估计深度图。
步骤 3. 将噪声添加到潜像中。去噪强度控制添加多少噪声。如果去噪强度为 0,则不添加噪声。如果去噪强度为1,则加入最大噪声,使潜像成为随机张量。
第 4 步。噪声预测器估计潜在空间的噪声,以文本提示和深度图为条件。
步骤 5. 从潜像中减去潜噪声。这将成为您的新潜像。
对于采样步骤的数量,重复步骤 4 和 5。
步骤 6. VAE 的解码器对潜像进行解码。现在你得到了从深度到图像的最终图像。
什么是CFG值?
如果不解释无分类器指导 (CFG),这篇文章将是不完整的,这是 AI 艺术家每天都在修补的价值。要了解它是什么,我们需要先了解它的前身,分类器指导……
分类指导
分类器指导是一种将图像标签合并到扩散模型中的方法。您可以使用标签来指导扩散过程。例如,标签“猫”引导反向扩散过程生成猫的照片。
分类器指导尺度是一个参数,用于控制扩散过程应遵循标签的紧密程度。
下面是我从本文中窃取的示例。假设有 3 组图像,标签分别为“猫”、“狗”和“人”。如果传播不受引导,该模型将从每个组的总人口中抽取样本,但有时它可能会绘制适合两个标签的图像,例如男孩抚摸狗。
分类器指导。左:无引导。中间:小指导规模。右:大指导规模。
在高分类器指导下,扩散模型产生的图像将偏向于极端或明确的例子。如果你向模型询问一只猫,它会返回一张明确是猫的图像,除此之外别无其他。
分类器指导量表控制遵循指导的紧密程度。在上图中,右边的样本比中间的样本具有更高的分类器指导尺度。实际上,这个比例值只是漂移项向带有该标签的数据的乘数。
无分类器指导
尽管分类器指导取得了破纪录的性能,但它需要一个额外的模型来提供该指导。这给训练带来了一些困难。
Classifier-free guidance,用其作者的话说,是一种实现“无分类器的分类器指导”的方法。他们建议使用图像说明并训练条件扩散模型,而不是使用类标签和单独的模型进行指导,就像我们在文本到图像中讨论的模型一样。
他们将分类器部分作为噪声预测器 U-Net 的条件,在图像生成中实现了所谓的“无分类器”(即没有单独的图像分类器)指导。
文本提示以文本到图像的形式提供此指导。
CFG值
现在我们有了一个通过调节的无分类器扩散过程,我们如何控制应该遵循多少指导?
无分类器指导 (CFG) 尺度是一个值,它控制文本提示对扩散过程的影响程度。当它设置为 0 时,图像生成是无条件的(即忽略提示)。较高的值将扩散转向提示。
稳定扩散 v1 与 v2
这已经是一篇很长的文章了,但如果不比较 v1 和 v2 模型之间的差异,这篇文章就不完整。
型号差异
Stable Diffusion v2 使用 OpenClip 进行文本嵌入。Stable Diffusion v1 使用 Open AI 的 CLIP ViT-L/14 进行文本嵌入。这种变化的原因是
- OpenClip 增长了五倍。更大的文本编码器模型提高了图像质量。
- 尽管 Open AI 的 CLIP 模型是开源的,但这些模型是使用专有数据训练的。切换到 OpenClip 模型使研究人员在研究和优化模型时更加透明。更利于长远发展。
训练数据差异
Stable Diffusion v1.4 训练有
- 在 laion2B-en 数据集上以 256×256 分辨率进行 237k 步。
- 194k 步,分辨率 512×512,高分辨率。
- 在“laion-aesthetics v2 5+”上以 512×512 分辨率执行 225k 步,文本条件下降 10%。
Stable Diffusion v2 训练有
- 在 LAION-5B 的一个子集上以 550k 步的分辨率过滤
256x256
了明确的色情内容,使用了 LAION-NSFW 分类器punsafe=0.1
和麻醉分数>=4.5
。 - 在分辨率
512x512
为 的图像上,在同一数据集上的分辨率为850k 步>= 512x512
。 - 在同一数据集上使用 av-objective 的 150k 步。
- 在图像上恢复了另外 140k 步
768x768
。
Stable Diffusion v2.1 在 v2.0 上进行了微调
- 同一数据集上的额外 55k 步(带有
punsafe=0.1
) - 另外 155k 额外的步骤
punsafe=0.98
所以基本上,他们在最后的训练步骤中关闭了 NSFW 过滤器。
结果差异
用户普遍发现使用 Stable Diffusion v2 来控制风格和产生名人更难。虽然 Stability AI 没有明确过滤掉艺术家和名人的名字,但它们的效果在 v2 中要弱得多。这可能是由于训练数据的差异。Open AI 的专有数据可能有更多的艺术品和名人照片。他们的数据可能经过高度过滤,因此一切事物和每个人看起来都非常漂亮。
一些有趣的读物
- 稳定扩散 v1.4 新闻稿
- 稳定扩散 v2 新闻稿
- 稳定扩散 v2.1 新闻稿
- 具有潜在扩散模型的高分辨率图像合成——介绍稳定扩散的研究论文
- 图解稳定扩散——模型架构中的一些很好的细节
- Stable Diffusion 2 – 官方模型页面
- 扩散模型在图像合成上击败 GAN——介绍分类器指导的研究论文
- Classifier-Free Diffusion Guidance——介绍无分类器指导的研究论文
- 使用非平衡热力学的深度无监督学习——反向扩散过程