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