最近一段时间对多模态很感兴趣,尤其是Stable Diffusion,安装了环境,圆了自己艺术家的梦想。看了这方面的一些论文,也给人讲过一些这方面的原理,写了一些文章,具体可以参考我的文章:
北方的郎:图文匹配:Clip模型介绍
北方的郎:VQGAN(Vector Quantized Generative Adversarial Network)模型简介
北方的郎:当倚天剑遇到屠龙刀 VQGAN-CLIP 介绍
不知道看文章的人怎么看,听我讲的人经常反应的就是听不明白。于是我又在网上找了一下,发现这篇文章讲的很好,算得上是深入浅出,可惜是英文的,就把它翻译了一下:
https://stable-diffusion-art.com/how-stable-diffusion-work/
在翻译的过程中,我增加了自己的一些东西,调整了一些内容。
Stable Diffusion是一种深度学习模型。我们将深入探讨Stable Diffusion是如何工作的。你为什么需要知道这部分内容?除了它本身就是一个引人入胜的主题之外,对内在机制的一些理解将使您成为更好的艺术家。您可以正确使用该工具以获得更高精度的结果。文本到图像(text-to-image)与图像到图像(image-to-image)有何不同?什么是CFG价值?什么是降噪强度?您将在本文中找到答案。
在最简单的形式中,Stable Diffusion是一种文本到图像模式。给它一个文本提示(Text Prompt)。 它将返回与文本匹配的图像。
Stable Diffusion将文本提示转换为图像。
Stable Diffusion属于一类称为扩散模型(diffusion model)的深度学习模型。它们是生成模型,这意味着它们的目的是生成类似于它们训练数据的新数据。对于Stable Diffusion来说,数据就是图像。
为什么叫扩散模型?因为它的数学看起来很像物理学中的扩散。让我们来解释这个理念。假设我训练了一个只有两种图像的扩散模型:猫和狗。在下图中,左边的两个山峰代表猫和狗这两组图像。
前向扩散将照片变成噪点。(图修改自本文)
前向扩散过程将噪声添加到训练图像中,逐渐将其转换为没有特点的噪声图像。前向过程会将任何猫或狗的图像变成噪声图像。最终,您将无法分辨它们最初是狗还是猫。就像一滴墨水掉进了一杯水里。墨滴在水中扩散。几分钟后,它会随机分布在整个水中。你再也分不清它最初是落在中心还是边缘附近。
下面是一个进行前向扩散的图像示例。猫的图像变成随机噪音。
猫图像的前向扩散。
现在是令人兴奋的部分。如果我们能逆转扩散呢?就像向后播放视频一样。时光倒流。我们将看到墨滴最初添加的位置。
反向扩散过程恢复图像。
从嘈杂、无意义的图像开始,反向扩散恢复了猫或狗的图像。这是主要思想。从技术上讲,每个扩散过程都有两部分:(1)漂移或定向运动和(2)随机运动。反向扩散向猫或狗的图像漂移,但两者之间没有任何变化。这就是为什么结果可以是猫或狗。
反向扩散的想法无疑是聪明而优雅的。但重要的问题是,“怎么能做到呢?为了反向扩散,我们需要知道图像中添加了多少噪声。答案是教神经网络模型来预测增加的噪声。它被称为Stable Diffusion中的噪声预测因子(noise predictor)。这是一个U-Net模型。培训如下。
噪声在每一步按顺序添加。噪声预测器估计每个步骤的总噪声加起来。
训练后,我们有一个噪声预测器,能够估计添加到图像中的噪声。
现在我们有了噪声预测器。要如何使用呢?
我们首先生成一个完全随机的图像,并要求噪声预测器告诉我们噪声。然后,我们从原始图像中减去这个估计的噪声。重复此过程几次。你会得到一只猫或一只狗的图像。
反向扩散的工作原理是从图像中连续减去预测的噪声。
您可能会注意到我们无法控制生成猫或狗的图像。当我们谈论条件反射时,我们将解决这个问题。目前,图像生成是无条件的。
译者:大家可以结合这张WebUi的界面看后面的内容,其实后面的内容很好的解释了这些参数的用途。
现在我需要告诉你一些坏消息:我们刚才谈论的不是Stable Diffusion的工作原理!原因是上述扩散过程是在图像空间中。它在计算上非常非常慢。 您甚至无法在任何单个GPU上运行,更不用说笔记本电脑上蹩脚的GPU了。
图像空间是巨大的。想一想:具有三个颜色通道(红色、绿色和蓝色)的 512×512 图像是一个 786,432 维的空间!
像谷歌的Imagen和Open AI的DALL-E这样的扩散模型都在像素空间中。他们使用了一些技巧来使模型更快,但仍然不够。
Stable Diffusion旨在解决速度问题。方法如下:
Stable Diffusion是一种在潜在空间扩散(latent diffusion)的模型。它不是在高维图像空间中操作,而是首先将图像压缩到潜空间(latent space)中。对比原像素空间,潜空间(latent space)小了 48 倍,因此它获得了处理更少数字的好处,这就是为什么它要快得多。
Stable Diffusion使用一种称为变分自编码器(Variational Autoencoder)的技术来实现图像潜空间压缩。这正是我们在使用Stable Diffusion时设置的VAE文件的内容,我稍后会详细说明。
变分自编码器(VAE:Variational Autoencoder)神经网络由两部分组成:(1)编码器和(2)解码器。编码器将图像压缩为潜在空间中的低维表示。解码器从潜在空间恢复图像。
Variational autoencoder transforms the image to and from the latent space.
Stable Diffusion模型的潜空间为4x64x64,比图像像素空间小48倍。我们谈到的所有正向和反向扩散实际上是在潜在空间中完成的。
因此,在训练过程中,它不会生成噪声图像,而是在潜在空间中生成随机张量(潜在噪声)。它不是用噪声破坏图像,而是用潜在噪声破坏图像在潜在空间中的表示。这样做的原因是它的速度要快得多,因为潜在空间更小。
图像分辨率反映在潜在图像张量的大小上。潜在图像的大小仅为 4x64x64,仅适用于 512×512 图像。对于 4×96 的纵向图像,它是 64x768x512。这就是为什么生成更大的图像需要更多的VRAM的原因。
由于Stable Diffusion v1 在 512×512 图像上进行了微调,因此生成大于 512×512 的图像可能会导致重复对象,例如臭名昭著的两个头部。如果必须,请将至少一侧保持在 512 像素,并使用 AI 升频器(AI upscaler)以获得更高的分辨率。
您可能想知道为什么VAE可以将图像压缩到更小的潜在空间而不会丢失信息。原因是,自然图像不是随机的。它们具有很高的规律性:面部遵循眼睛、鼻子、脸颊和嘴巴之间的特定空间关系。狗有 4 条腿,是一种特殊的形状。
换句话说,图像的高维性是伪影。自然图像可以很容易地压缩到更小的潜在空间中,而不会丢失任何信息。这在机器学习中被称为流形假设(manifold hypothesis)。
以下是Stable Diffusion中潜在反向扩散的工作原理。
VAE文件在Stable Diffusion v1中使用,以改善眼睛和面部的绘画效果。它们是我们刚刚谈到的自编码器的解码器。通过进一步微调解码器,模型可以绘制更精细的细节。
你可能会意识到我之前提到的一处内容并不完全正确。将图像压缩到潜在空间中确实会丢失信息,因为原始VAE无法恢复精细细节。相反,VAE解码器负责在解码的时候绘制精细的细节。
前面的说明仍然不完整,缺了最重要的一块拼图:文本提示(text prompt)在哪里注入到图片?没有这部分内容,Stable Diffusion就不是文本到图像(text-to-image)模型。你会随机得到一只猫或一只狗的图像,但你没法控制Stable Diffusion为你生成猫或者狗的图像。
这就是条件(conditioning)的用武之地。条件的目的是引导噪声预测器,以便预测的噪声在从图像中减去后会给出我们想要的东西。
下面概述了如何处理文本提示(Text Prompt)并将其输入噪声预测器。分词器(Tokenizer)首先将提示中的每个单词转换为称为标记(token)的数字。然后将每个标记转换为称为Embedding的 768 值向量。(是的,这与您在Web UI中使用的Embedding相同)然后,Embedding由文本转换器处理,并准备好供噪声预测器使用。
如何处理文本提示并将其馈送到噪声预测器中以引导图像生成。
现在让我们仔细看看每个部分的详细内容。如果上述概述对您来说已经够了,您可以跳到下一部分。
分词器。
文本提示首先由 CLIP 标记器进行标记化。CLIP是由Open AI开发的深度学习模型,用于生成任何图像的文本描述。Stable Diffusion v1使用CLIP的分词器。
令牌化(Tokenization)是计算机理解单词的方式。我们人类可以阅读单词,但计算机只能读取数字。这就是为什么文本提示中的单词首先转换为数字的原因。
分词器只能对它在训练期间看到的单词进行分词。例如,CLIP 模型中有“dream”和“beach”,但没有“dreambeach”。Tokenizer将“dreambeach”这个词分解为两个标记“dream”和“beach”。所以一个词并不总是意味着一个令牌!
另一个细则是空格字符也是令牌(token)的一部分。在上述情况下,短语“dream beach”产生两个标记“dream ”和“[空格]beach”。这些token与“dreambeach”产生的token不同,“dream beach”是“dream”和“beach”(beach前没有空格)。
Stable Diffusion模型仅限于在提示中使用 75 个令牌。(现在你知道它和75个字不一样了!)
嵌入/标签(Embedding)
嵌入。
Stable Diffusion v1 使用 Open AI 的 ViT-L/14 剪辑模型。嵌入是一个 768 个值的向量。每个令牌都有自己唯一的嵌入向量。嵌入由 CLIP 模型固定,该模型是在训练期间学习的。
为什么我们需要嵌入(Embedding)?这是因为有些词彼此密切相关。我们希望利用这些信息。例如,man、gentleman 和 guy 的嵌入几乎相同,因为它们可以互换使用。莫奈、马奈和德加都以印象派风格作画,但方式不同。这些名称具有接近但不相同的嵌入。
这与我们讨论的用于触发带有关键字的样式的嵌入相同。嵌入可以产生魔力。科学家们已经证明,找到合适的嵌入可以触发任意的对象和样式,这是一种称为文本反转的微调技术。
从嵌入到噪声预测器。
在馈入噪声预测器之前,文本转换器需要进一步处理嵌入。变压器就像一个用于调节的通用适配器。在这种情况下,它的输入是文本嵌入向量,但它也可以是其他东西,如类标签、图像和深度图。转换器不仅进一步处理数据,而且还提供了一种包含不同调节模式的机制。
文本转换器的输出由整个 U-Net 中的噪声预测器多次使用。U-Net通过交叉注意力机制消耗它。这就是提示与图像相遇的地方。
让我们以提示“蓝眼睛的男人”为例。Stable Diffusion将“蓝色”和“眼睛”这两个词配对在一起(提示中的自注意力机制),这样它就会生成一个蓝眼睛的男人,而不是一个蓝衬衫的男人。然后,它使用这些信息将反向扩散引导到包含蓝眼睛的图像。(提示/prompt和图像/image之间的交叉注意力机制)
旁注:
Hypernetwork是一种微调Stable Diffusion的技术,它通过干预交叉注意力网络来插入样式。
LoRA 模型修改交叉注意力模块的权重以更改样式。仅修改此模块就可以微调 Stabe Diffusion模型这一事实说明了该模块的重要性。
ControlNet 通过检测到的轮廓、人体姿势等来调节噪声预测器,并实现对图像生成的出色控制。
在文本到图像中,您向Stable Diffusion提供文本提示(prompt),它会返回一个图像。
第 1 步。Stable Diffusion在潜空间中生成随机张量。您可以通过设置随机数生成器的种子来控制此张量。如果将种子设置为某个值,您将始终获得相同的随机张量。这是你在潜在空间中的图像。但现在都是噪音。
随机张量在潜在空间中生成。
第 2 步。噪声预测器 U-Net 将潜在噪声图像和文本提示作为输入,并预测噪声,也在潜在空间(4x64x64 张量)中。
第 3 步。从潜在图像中减去潜在噪声。这将成为您的新潜在图像。
步骤 2 和 3 重复一定数量的采样步骤,例如 20 次。
第 4 步。最后,VAE的解码器将潜在图像转换回像素空间。这是运行Stable Diffusion后获得的图像。
下面介绍了如何在每个采样步骤中对映像演变进行成像。
每个采样步骤的图像。
噪音时间表(Noise schedule)
图像从嘈杂变为干净。您是否想知道噪声预测器在初始步骤中是否运行良好?实际上,这只是部分原因。真正的原因是我们试图在每个采样步骤中获得预期的噪声。这称为噪声时间表。下面是一个示例。
15 个采样步骤的噪声计划。
噪音时间表是我们定义的。我们可以选择在每一步减去相同数量的噪声。或者我们可以在开始时减去更多,就像上面一样。采样器在每个步骤中减去足够的噪声,以达到下一步中的预期噪声。这就是您在step-by-step图像中看到的内容。
图像到图像是SDEdit方法中首次提出的一种方法。SDEdit可以应用于任何扩散模型。所以我们有Stable Diffusion的图像到图像的功能。
输入图像和文本提示作为图像到图像的输入提供。生成的图像将由输入图像和文本提示调节。例如,使用这幅素人画和提示“photo of perfect green apple with stem, water droplets, dramatic lighting”作为输入,图像到图像可以将其变成专业绘图:
图像到图像
现在这是分步介绍:
第 1 步。输入图像被编码为潜在空间。
第 2 步。噪点被添加到潜在图像中。降噪强度控制添加的噪声量。如果为 0,则不添加噪声。如果为 1,则添加最大噪声量,以便潜在图像成为完整的随机张量。
第 3 步。噪声预测器 U-Net 将潜在噪声图像和文本提示作为输入,并预测潜在空间(4x64x64 张量)中的噪声。
第 4 步。从潜在图像中减去潜在噪声。这将成为您的新潜在图像。
步骤 3 和 4 重复一定数量的采样步骤,例如 20 次。
第5步。最后,VAE的解码器将潜在图像转换回像素空间。这是运行映像到映像后获得的图像。
所以现在你知道什么是图像到图像:它所做的只是设置带有一点噪声和一点输入图像的初始潜在图像。将去噪强度设置为 1 等效于文本到图像,因为初始潜在图像完全是随机噪声。
修复实际上只是图像到图像的一个特殊情况。杂色将添加到要上色的图像部分。噪声量同样由降噪强度控制。
Depth-to-image是对图像到图像的增强;它使用深度图生成具有附加条件的新图像。
第 1 步。输入图像被编码为潜在状态
第 2 步。MiDaS(AI深度模型)估计输入图像的深度图。
第 3 步。噪点被添加到潜在图像中。降噪强度控制添加的噪声量。如果降噪强度为 0,则不添加噪声。如果去噪强度为 1,则添加最大噪声,使潜在图像成为随机张量。
第 4 步。噪声预测器估计潜在空间的噪声,由文本提示和深度图调节。
步 5. 从潜在图像中减去潜在噪声。这将成为您的新潜在图像。
对采样步骤数重复步骤 4 和 5。
第 6 步。VAE的解码器对潜在图像进行解码。现在,您可以获得从深度到图像的最终图像。
如果不解释无分类器引导(Classifier-Free Guidance,CFG),这篇文章将是不完整的,这是AI艺术家每天调来调去的值。要了解它是什么,我们需要首先触及它的前身,分类器引导(Classifier Guidance)。
分类器引导是一种在扩散模型中合并图像标签的方法。您可以使用标签来指导扩散过程。例如,标签“猫”引导反向扩散过程生成猫的照片。
分类器指导强度(classifier guidance scale)是用于控制扩散过程应与标签保持多近的参数。
假设有 3 组带有标签“猫”、“狗”和“人类”的图像。如果扩散是无指导的,模型将从每个组的总数据中(译者:我觉得这里应该有“均匀”的意思)提取样本,但有时它可能会绘制适合两个标签的图像,例如男孩抚摸狗。
分类器指南。左:无指导。中:小引导尺度。右:大引导比例尺。
在高分类器指导下,扩散模型生成的图像将偏向极端或明确的例子。如果你向模型询问一只猫,它将返回一个明确的猫的图像,没有别的。
分类器指导强度(classifier guidance scale)控制遵循指导(guidance)的紧密程度。在上图中,右侧的采样具有比中间的分类器指导量表更高的分类器指导量表。实际上,此刻度值只是具有该标签的数据的漂移项的乘数。
尽管分类器指导实现了破纪录的性能,但它需要一个额外的模型来提供该指导。这给培训带来了一些困难。
用作者的话来说,无分类器指导是一种实现“没有分类器的分类器指导”的方法。他们没有使用类标签和单独的模型作为指导,而是建议使用图像标题并训练一个条件扩散模型,就像我们在文本到图像中讨论的那样。
他们将分类器部分作为噪声预测器U-Net的条件,在图像生成中实现所谓的“无分类器”(即没有单独的图像分类器)指导。
文本提示以文本到图像的形式提供此指导。
现在我们通过条件反射有一个无分类器的扩散过程,我们如何控制应该遵循多少指导?
无分类器引导 (CFG) 刻度是一个值,用于控制文本提示对扩散过程的调节程度。当图像生成设置为 0 时,图像生成是无条件的(即忽略提示)。较高的值将扩散引导向提示。
这已经是一篇很长的文章,但如果不比较 v1 和 v2 模型之间的差异,它就不完整。
Stable Diffusion v2 使用 OpenClip 进行文本嵌入。Stable Diffusion v1使用Open AI的CLIP ViT-L/14进行文本嵌入。此更改的原因是:
Stable Diffusion v1.4 训练使用
Stable Diffusion v2 训练
256x256punsafe=0.14.5
512x512>= 512x512
768x768
Stable Diffusion v2.1 在 v2.0 上进行了微调
punsafe=0.1
)punsafe=0.98
所以基本上,他们在最后的训练步骤中关闭了NSFW过滤器。
用户通常发现使用Stable Diffusion v2 来控制风格和生成名人更难。虽然稳定性 AI 没有明确过滤掉艺术家和名人的名字,但它们的效果在 v2 中要弱得多。这可能是由于训练数据的差异。Open AI的专有数据可能有更多的艺术品和名人照片。他们的数据可能经过高度过滤,因此所有内容和每个人都看起来很好,很漂亮。
感觉有帮助的朋友,欢迎赞同、关注、分享三连。^-^