稳定扩散是一种深度学习模型。我们将深入了解稳定扩散在内部是如何运作的。
为什么你需要了解这个?除了本身是一个迷人的主题外,对内部机制的一定了解将使您成为更好的艺术家。您可以正确使用这个工具,以获得更高精度的结果。
文本到图像与图像到图像有什么不同?什么是 CFG 值?什么是去噪强度?您将在本文中找到答案。
让我们深入了解。
简单来说,Stable diffusion是一种文本到图像的模型。给它一个文本提示,它将返回与文本匹配的图像。
Stable Diffusion属于一类被称为扩散模型的深度学习模型。它们是生成模型,意味着它们被设计用来生成与训练数据相似的新数据。在稳定扩散的情况下,这些数据是图像。 为什么称之为扩散模型?因为其数学形式与物理中的扩散非常相似。让我们来了解这个思路。 假设我用两种图像来训练扩散模型:猫和狗。在下图中,左侧的两个峰代表猫和狗图像的两组。
正向扩散过程向训练图像添加噪声,逐渐将其变为不具特征的噪声图像。正向过程会将任何猫或狗的图像变成噪声图像。最终,您无法判断它们最初是狗还是猫(这一点很重要)。
这就像一滴墨水掉进了一杯水里。墨水在水中扩散。几分钟后,它在水中随机分布。你无法再分辨它最初是掉在中心还是靠近边缘。
下面是一个图像经历正向扩散的例子。猫的图像变成了随机噪声。
现在来到了令人兴奋的部分。如果我们可以逆转扩散过程呢?就像倒放视频一样。回到过去。我们将看到墨水滴最初是在哪里添加的。
从一个嘈杂、无意义的图像开始,反向扩散恢复成猫或狗的图像。这就是主要思路。 从技术上讲,每个扩散过程都有两部分:(1)漂移或有向运动和(2)随机运动。反向扩散朝着猫或狗的图像漂移,但不包括中间的任何东西。这就是为什么结果可以是猫或狗。
毫无疑问,反向扩散的想法既巧妙又优雅。但百万美元的问题是,“如何实现它?”
为了逆转扩散,我们需要知道图像中添加了多少噪声。答案是教一个神经网络模型预测添加的噪声。在稳定扩散中,它被称为noise predictor(NP)。它是一个 U-Net 模型。训练过程如下。
选择一个训练图像,如一张猫的照片。 生成一个随机噪声图像。 通过在一定数量的步骤中加入这个嘈杂的图像来破坏训练图像。 教noise predictor告诉我们添加了多少噪声。这是通过调整其权重并向其展示正确答案来完成的。
经过训练后,我们有了一个能够估计图像中添加噪声的噪声预测器。
现在我们有了noise predictor。如何使用它?
我们首先生成一个完全随机的图像,并请noise predictor告诉我们噪声。然后我们从原始图像中减去这个估计的噪声。重复这个过程几次。你将得到一张猫或狗的图像。
您可能注意到我们无法控制生成猫或狗的图像。当我们讨论条件化时,我们将解决这个问题。目前,图像生成是无条件的。
您可以在这篇文章中阅读更多关于反向扩散采样和采样器的内容。
现在我需要告诉你一些坏消息:我们刚刚讨论的并不是稳定扩散的工作原理!原因是上述扩散过程是在图像空间中进行的。它在计算上非常非常慢。你无法在任何单个GPU上运行,更不用说你笔记本电脑上糟糕的GPU了。
图像空间非常庞大。想想看:一个512×512的图像有三个颜色通道(红、绿和蓝),是一个786,432维的空间!(你需要为一个图像指定这么多值。)
像谷歌的 Imagen 和 OpenAI 的 DALL-E 这样的扩散模型位于像素空间。它们使用了一些技巧来加快模型的速度,但仍然不够。
稳定扩散旨在解决速度问题。方法如下。
稳定扩散是一种潜在扩散模型。它不是在高维图像空间中操作,而是首先将图像压缩到潜在空间。潜在空间小了48倍,因此它获得了大量减少数字计算的好处。这就是为什么它要快得多。
这是使用一种称为 variational autoencoder 的技术来实现的。是的,这正是 VAE 文件的含义,但我稍后会让它变得非常清晰。
变分自编码器(VAE)神经网络有两部分:(1)encoder(编码器)和(2)decoder(解码器)。encoder将图像压缩为潜在空间中的低维表示。decoder从潜在空间恢复图像。
稳定扩散模型的潜在空间是 4x64x64,比图像像素空间小48倍。我们讨论过的所有正向和反向扩散实际上都是在潜在空间中完成的。
因此,在训练过程中,它不是生成一个嘈杂的图像,而是在潜在空间中生成一个随机张量(潜在噪声)。它不是用噪声破坏图像,而是用潜在噪声破坏潜在空间中的图像表示。这样做的原因是,由于潜在空间较小,速度要快得多。
图像分辨率体现在潜在图像张量的大小。对于512×512的图像,潜在图像的大小仅为4x64x64。对于768×512的人像图像,大小为4x96x64。这就是为什么生成更大的图像需要更长的时间和更多的显存。由于稳定扩散 v1 是在512×512图像上进行微调的,生成大于512×512的图像可能会导致重复的物体,例如,臭名昭著的双头。如果你必须这样做,请至少将一边保持在512像素,并使用AI upscaler 进行更高分辨率。
您可能会想知道为什么VAE可以在不丢失信息的情况下将图像压缩到更小的潜在空间。原因是,自然图像并非随机的,它们具有很高的规律性:脸部遵循眼睛、鼻子、脸颊和嘴巴之间特定的空间关系。狗有4条腿,形状特定。
换句话说,图像的高维度是人为的。自然图像可以轻松压缩到更小的潜在空间,而不会丢失任何信息。这在机器学习中被称为 manifold hypothesis 。
以下是稳定扩散中潜在反向扩散的工作原理: 1.生成一个随机的潜在空间矩阵。 2.噪声预测器估计潜在矩阵的噪声。 3.从潜在矩阵中减去估计的噪声。 4.重复步骤2和3,直到特定的采样步骤。 5.VAE的解码器将潜在矩阵转换为最终图像。
什么是VAE文件?VAE文件 用于稳定扩散v1中改进眼睛和面部。它们是我们刚才讨论过的自编码器的解码器。通过进一步微调解码器,模型可以绘制更精细的细节。
您可能意识到我之前提到的并不完全正确。将图像压缩到潜在空间确实会丢失信息,因为原始的VAE无法恢复细节。相反,VAE解码器负责绘制细节。
我们的理解是不完整的:文本提示在哪里进入图片?没有它,稳定扩散就不是一个文本到图像的模型。你只会得到一张猫或狗的图像,而无法控制它。
这就是 Conditioning 的作用。 Conditioning 的目的是引导噪声预测器,使预测的噪声在从图像中减去后能给我们想要的结果。
下面是一个关于如何处理文本提示并将其输入噪声预测器的概述。首先,分词器将提示中的每个单词转换为一个称为标记的数字。然后,每个标记被转换为一个768值的向量,称为嵌入。(是的,这就是您在AUTOMATIC1111中使用的相同的 embedding )嵌入接着由文本转换器处理,准备好供噪声预测器使用。
现在让我们更深入地了解每个部分。如果上面的高级概述对您来说已经足够了,您可以跳到下一节。
您可以使用 这个笔记本 查看任何提示的标记和嵌入。
文本提示首先由 CLIP分词器 进行分词。CLIP是由OpenAI开发的深度学习模型,用于为任何图像生成文本描述。稳定扩散v1使用了CLIP的分词器。
分词是计算机理解单词的方式。我们人类可以阅读单词,但计算机只能阅读数字。这就是为什么文本提示中的单词首先需要转换成数字。
分词器只能分词它在训练过程中见过的单词。例如,CLIP模型中有“dream”和“beach”,但没有“dreambeach”。分词器会将“dreambeach”这个词拆分为两个标记:“dream”和“beach”。所以一个单词并不总是意味着一个标记!
另一个细节是空格字符也是标记的一部分。在上述情况下,“dream beach”这个短语产生了两个标记:“dream”和“[space]beach”。这些标记与由“dreambeach”产生的标记“dream”和“beach”(在beach前面没有空格)不同。
稳定扩散模型在一个提示中最多只能使用75个标记。(现在你知道它并不等同于75个单词!)
稳定扩散v1使用了OpenAI的 ViT-L/14 Clip模型。嵌入是一个具有768个值的向量。每个标记都有其唯一的嵌入向量。嵌入是由在训练过程中学习的CLIP模型固定的。
我们为什么需要嵌入?这是因为某些单词之间有密切的联系。我们希望利用这些信息。例如,man、gentleman和guy的嵌入几乎是相同的,因为它们可以互换使用。莫奈、马奈和德加都以印象派风格绘画,但方式各异。这些名字具有相近但不完全相同的嵌入。
这就是我们讨论过的用关键词触发风格的相同 embedding 。嵌入可以创造奇迹。科学家已经证明,找到合适的嵌入可以触发任意的对象和风格,这是一种名为 textual inversion 的微调技术。
嵌入需要通过文本转换器进一步处理,然后输入噪声预测器。转换器就像是一个通用的适配器,用于调节。在这种情况下,它的输入是文本嵌入向量,但它也可以是其他东西,如类标签、图像和 深度图 。转换器不仅进一步处理数据,还提供了一种包含不同调节模态的机制。
文本转换器的输出在整个U-Net中被噪声预测器多次使用。U-Net通过交叉注意力机制来消耗它。这就是提示与图像相遇的地方。
以提示“一个有蓝眼睛的男人”为例。稳定扩散将“蓝”和“眼睛”两个词组合在一起(提示内的自注意力),这样它就生成了一个有蓝眼睛的男人,而不是一个穿着蓝色衬衫的男人。然后,它使用这些信息来引导逆扩散朝向包含蓝色眼睛的图像。(提示和图像之间的交叉注意力)
附注:Hypernetwork是一种用于微调稳定扩散模型的技术,它劫持交叉注意力网络以插入样式。 LoRA模型 修改交叉注意力模块的权重以改变样式。仅修改这个模块就可以微调Stabe扩散模型的事实告诉你这个模块有多重要。
文本提示不是稳定扩散模型唯一可以进行调节的方式。
深度到图像 模型使用文本提示和深度图像对条件进行调节。
ControlNet 通过检测到的轮廓、人体姿态等对噪声预测器进行调节,并在图像生成方面取得了出色的控制效果。
现在你已经了解了Stable Diffusion的所有内部机制,让我们通过一些示例了解一下底层发生了什么。
在文本到图像中,您给Stable Diffusion一个文本提示,它会返回一个图像。
步骤1. Stable Diffusion在潜在空间中生成一个随机张量。您可以通过设置随机数生成器的 种子 来控制这个张量。如果您将种子设置为某个特定值,您将始终获得相同的随机张量。这是您在潜在空间中的图像。但目前它还是噪音。
步骤2. 噪声预测器U-Net将潜在噪声图像和文本提示作为输入,并在潜在空间中预测噪声(一个4x64x64张量)。
步骤3. 从潜在图像中减去潜在噪声。这将成为您的新潜在图像。
步骤2和3将重复进行一定次数的采样步骤,例如,重复20次。
步骤4. 最后,VAE的解码器将潜在图像转换回像素空间。这就是在运行稳定扩散后得到的图像。
图像从嘈杂变得清晰。你是否想知道在初始步骤中噪声预测器是否不太有效?事实上,这只是部分正确。真正的原因是我们试图在每个采样步骤中获得预期的噪声。这被称为噪声计划。以下是一个例子。
噪声计划是我们定义的内容。我们可以选择在每一步减去相同数量的噪声。或者我们可以在开始时减去更多的噪声,就像上面那样。采样器在每一步中减去足够的噪声,以达到下一步的预期噪声。这就是您在逐步的图像中看到的内容。
图像到图像(Image-to-image)是首次在 SDEdit 方法中提出的一种方法。SDEdit可以应用于任何扩散模型。因此,我们有稳定扩散(潜在扩散模型)的图像到图像方法。
图像到图像中的输入包括输入图像和文本提示。生成的图像将受输入图像和文本提示的共同约束。例如,使用这个业余绘画作品和提示“带茎、水滴、戏剧性光线的完美绿色苹果照片”作为输入,图像到图像可以将其转换为专业绘画:
现在是逐步的过程。
步骤1. 将输入图像编码到潜在空间。
步骤2. 向潜在图像添加噪声。 去噪强度 控制添加的噪声量。如果为0,则不添加噪声。如果为1,则添加最大量的噪声,使潜在图像变成一个完全随机的张量。
步骤3. 噪声预测器U-Net将潜在嘈杂图像和文本提示作为输入,并预测潜在空间中的噪声(一个4x64x64的张量)。
步骤4. 从潜在图像中减去潜在噪声。这将成为您的新潜在图像。
步骤3和4将重复进行一定次数的采样步骤,例如,重复20次。
步骤5. 最后,VAE的解码器将潜在图像转换回像素空间。这是运行图像到图像后获得的图像。
所以现在你知道了什么是图像到图像:它所做的一切就是用一点噪声和一点输入图像来设置初始潜在图像。将去噪强度设置为1相当于将文本转换为图像,因为初始潜在图像完全是随机噪声。
图像修复实际上只是图像到图像的一个特殊情况。噪声被添加到您想要修复的图像部分。噪声量同样受去噪强度控制。
深度到图像 是对图像到图像的增强;它使用深度图为条件生成新的图像。 步骤1. 将输入图像编码为潜在状态
步骤2. MiDaS(一种AI深度模型)从输入图像估算深度图。
步骤3. 向潜在图像添加噪声。去噪强度控制添加的噪声量。如果去噪强度为0,则不添加噪声。如果去噪强度为1,则添加最大噪声,使潜在图像变成一个随机张量。
步骤4. 噪声预测器估计潜在空间的噪声,条件是文本提示和深度图。
步骤5. 从潜在图像中减去潜在噪声。这将成为您的新潜在图像。
步骤4和5将重复进行采样步骤的次数。
步骤6. VAE的解码器解码潜在图像。现在您从深度到图像得到最终图像。
在解释无分类器引导(Classifier-Free Guidance,CFG)之前,本文将不完整。CFG是AI艺术家每天都在调整的一个值。为了理解它是什么,我们首先需要了解其前身,分类器引导(Classifier guidance)…
分类器引导 是一种将图像标签纳入扩散模型的方法。您可以使用标签引导扩散过程。例如,标签“猫”引导反向扩散过程生成猫的照片。 分类器引导比例是一个用于控制扩散过程应如何紧密遵循标签的参数。
以下是一个我从这篇 论文 中偷来的例子。假设有3组带有标签“猫”、“狗”和“人”的图像。如果扩散是无引导的,模型将从每个组的总人口中抽取样本,但有时它可能绘制适合两个标签的图像,例如一个男孩抚摸一条狗。
在高分类器引导下,扩散模型生成的图像将偏向极端或明确的示例。如果您要求模型生成一只猫,它将返回一张明确地只是一只猫的图像,而没有其他内容。
分类器引导比例控制了遵循引导的紧密程度。在上图中,右侧的采样具有比中间更高的分类器引导比例。在实践中,这个比例值只是朝向具有该标签数据的漂移项的乘法器。
尽管分类器引导取得了破纪录的性能,但它需要额外的模型来提供引导。这在训练过程中带来了一些困难。
无分类器引导,用其作者的话来说,是一种实现“无分类器的分类器引导”的方法。他们建议使用图像标题并训练一个条件扩散模型,而不是使用类别标签和单独的模型进行引导,就像我们在文本到图像中 讨论 的那样。
他们将分类器部分作为噪声预测器U-Net的条件,实现了所谓的“无分类器”(即没有单独的图像分类器)引导的图像生成。
文本提示在文本到图像中提供了这种引导。
现在我们通过条件化实现了无分类器的扩散过程,那么我们如何控制应该遵循多少引导呢?
无分类器引导(CFG)比例是一个值,用于控制文本提示对扩散过程的约束程度。当它设置为0时,图像生成是无条件的(即忽略提示)。较高的值使扩散朝着提示进行。
这已经是一篇很长的文章了,但如果不比较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-5B 子集上进行 256x256 分辨率的 550k 步训练,该子集使用 LAION-NSFW 分类器(punsafe=0.1)过滤了明确的色情内容,并使用 aesthetic score >= 4.5。
在同一数据集上分辨率 >= 512x512 的图像上进行 512x512 分辨率的 850k 步训练。
在同一数据集上使用 v-objective 进行 150k 步训练。
在 768x768 图像上恢复另外 140k 步训练。
Stable Diffusion v2.1 是在 v2.0 上进行微调的:
在相同数据集上进行额外的 55k 步训练(punsafe=0.1)
使用 punsafe=0.98 进行额外的 155k 步训练
基本上,他们在最后的训练步骤中关闭了 NSFW 过滤器。
用户通常发现使用 Stable Diffusion v2 控制风格和生成名人更加困难。尽管 Stability AI 并没有明确过滤掉艺术家和名人的名字,但在 v2 中,它们的影响要弱得多。这可能是由于训练数据的差异。Open AI 的专有数据可能包含更多的艺术品和名人照片。他们的数据可能经过高度过滤,以使所有事物和人物看起来都很好看和漂亮。
作者:Andrew ,翻译:亦束
点击此处跳转到原文