推荐基于稳定扩散(stable diffusion) AI 模型开发的自动纹理工具: DreamTexture.js自动纹理化开发包 - NSDT
Stable Diffusion 用途广泛,因为它可以以多种不同的方式使用。首先,让我们关注仅从文本 (text2img) 生成图像。上图显示了一个示例文本输入和生成的图像(实际的完整提示在这里)。除了文本到图像之外,使用它的另一种主要方法是让它改变图像(因此输入是文本 + 图像)。
让我们开始了解一下,因为这有助于解释组件、它们如何交互以及图像生成选项/参数的含义。
Stable Diffusion 是一个由多个组件和模型组成的系统。它不是一个整体模型。
当我们深入研究时,我们可以做出的第一个观察是,有一个文本理解组件,它将文本信息转换为数字表示,以捕捉文本中的想法。
我们从高级视图开始,本文稍后将详细介绍机器学习。但是,我们可以说这个文本编码器是一种特殊的 Transformer 语言模型(技术上是:CLIP 模型的文本编码器)。它接受输入文本并输出一个数字列表,表示文本中的每个单词/标记(每个标记一个向量)。
然后将该信息呈现给图像生成器,该生成器本身由几个组件组成。
图像生成器经历两个阶段:
这个组件是Stable Diffusion的秘诀。与以前的型号相比,这是实现大量性能提升的地方。
此组件运行多个步骤以生成图像信息。这是 Stable Diffusion 接口和库中的 steps 参数,通常默认为 50 或 100。
图像信息创建者完全在图像信息空间(或潜在空间)中工作。我们将在后面的帖子中详细讨论这意味着什么。此属性使其比以前在像素空间中工作的扩散模型更快。从技术上讲,该组件由 UNet 神经网络和调度算法组成。
“扩散”一词描述了该组件中发生的情况。正是对信息的逐步处理最终生成了高质量的图像(由下一个组件,图像解码器)。
图像解码器根据从信息创建者那里获得的信息绘制图片。它仅在过程结束时运行一次以生成最终像素图像。
至此,我们看到了构成 Stable Diffusion 的三个主要组件(每个组件都有自己的神经网络):
扩散是发生在粉红色“图像信息创建者”组件内部的过程。通过表示输入文本的标记嵌入和随机起始图像信息数组(也称为潜在图像),该过程会生成一个信息数组,图像解码器使用该数组来绘制最终图像。
此过程以循序渐进的方式进行。每个步骤都会添加更多相关信息。为了获得对过程的直觉,我们可以检查随机潜伏数组,并看到它转化为视觉噪声。在这种情况下,目视检查是通过图像解码器。
扩散分多个步骤进行,每个步骤对输入的潜在数组进行操作,并生成另一个潜在数组,该数组更类似于输入文本和模型从模型训练的所有图像中获取的所有视觉信息。
我们可以可视化一组这些潜伏物,看看每一步都添加了哪些信息。
这个过程令人叹为观止。
在这种情况下,在步骤 2 和 4 之间发生了一些特别有趣的事情。就好像轮廓从噪音中浮现出来一样。
使用扩散模型生成图像的中心思想依赖于我们拥有强大的计算机视觉模型这一事实。给定足够大的数据集,这些模型可以学习复杂的操作。扩散模型通过构建如下问题来生成图像:
假设我们有一个图像,我们产生一些噪点,并将其添加到图像中。
现在可以将其视为一个训练示例。我们可以使用相同的公式来创建大量训练示例,以训练图像生成模型的核心组件。
虽然此示例显示了从图像(量 0,无噪声)到总噪声(量 4,总噪声)的几个噪声量值,但我们可以轻松控制要添加到图像中的噪声量,因此我们可以将其分布在数十个步骤中,为训练数据集中的所有图像创建每个图像数十个训练示例。
有了这个数据集,我们可以训练噪声预测器,并最终得到一个伟大的噪声预测器,当在特定配置下运行时,它实际上会创建图像。如果您接触过 ML,则训练步骤应该看起来很熟悉:
现在让我们看看它如何生成图像。
训练有素的噪声预测器可以拍摄噪声图像和去噪步骤的数量,并能够预测一片噪声。
对采样噪声进行预测,因此,如果我们从图像中减去它,我们得到的图像更接近模型训练的图像(不是确切的图像本身,而是分布 - 像素排列的世界,天空通常是蓝色的,高于地面,人有两只眼睛,猫看起来有某种方式 - 尖尖的耳朵,显然不为所动)。
如果训练数据集是美观的图像(例如,训练 Stable Diffusion 的 LAION Aesthetics),那么生成的图像往往在美观上令人愉悦。如果我们在徽标图像上对其进行训练,我们最终会得到一个徽标生成模型。
到此结束,对扩散模型生成图像的描述主要如去噪扩散概率模型中所述。现在你已经有了这种扩散的直觉,你不仅知道了 Stable Diffusion 的主要组件,还知道了 Dall-E 2 和 Google 的 Imagen。
请注意,到目前为止,我们描述的扩散过程在不使用任何文本数据的情况下生成图像。因此,如果我们部署这个模型,它会生成漂亮的图像,但我们无法控制它是金字塔、猫或其他任何东西的图像。在接下来的部分中,我们将介绍如何将文本合并到流程中,以控制模型生成的图像类型。
为了加快图像生成过程,Stable Diffusion 论文不是在像素图像本身上运行扩散过程,而是在图像的压缩版本上运行扩散过程。
这种压缩(以及后来的解压缩/绘画)是通过自动编码器完成的。自动编码器使用其编码器将图像压缩到潜在空间中,然后使用解码器仅使用压缩信息重建图像。
现在,前向扩散过程是在压缩潜伏物上完成的。噪声切片是应用于这些潜在粒子的噪声,而不是应用于像素图像的噪声。因此,噪声预测器实际上经过训练,可以预测压缩表示(潜在空间)中的噪声。
正向过程(使用自动编码器的编码器)是我们生成数据来训练噪声预测器的方式。训练完成后,我们可以通过运行反向过程(使用自动编码器的解码器)来生成图像。
LDM/Stable Diffusion 论文的图 3 中显示了这两种流:
该图还显示了“条件反射”组件,在本例中是描述模型应生成的图像的文本提示。因此,让我们深入研究文本组件。
Transformer 语言模型用作语言理解组件,该组件采用文本提示并生成令牌嵌入。已发布的 Stable Diffusion 模型使用 ClipText(基于 GPT 的模型),而论文使用 BERT。
Imagen的论文表明,语言模型的选择是一个重要的选择。与较大的图像生成组件相比,在较大的语言模型中交换对生成的图像质量的影响更大。
更大/更好的语言模型对图像生成模型的质量有显著影响。
早期的 Stable Diffusion 模型只是插入了 OpenAI 发布的预训练 ClipText 模型。未来的型号可能会切换到新发布的、更大的 CLIP OpenCLIP 变体(2022 年 2 月更新:没错,Stable Diffusion V354 使用 OpenClip)。这个新批次包括大小不超过 63M 参数的文本模型,而不是 ClipText 中的 <>M 参数。
CLIP 是在图像及其标题数据集上训练的。想象一个数据集看起来像这样,只有 400 亿张图像及其标题:
图像及其标题的数据集。
实际上,CLIP是根据从网络上抓取的图像及其“alt”标签进行训练的。
CLIP 是图像编码器和文本编码器的组合。它的训练过程可以简化为考虑拍摄图像及其标题。我们分别使用图像和文本编码器对它们进行编码。
然后,我们使用余弦相似度比较得到的嵌入。当我们开始训练过程时,即使文本正确地描述了图像,相似度也会很低。
我们更新了这两个模型,以便下次嵌入它们时,生成的嵌入是相似的。
通过在整个数据集中重复此操作,并且具有较大的批量大小,我们最终使编码器能够生成嵌入,其中狗的图像和句子“狗的图片”相似。就像在 word2vec 中一样,训练过程还需要包括不匹配的图像和标题的负面示例,并且模型需要为它们分配低相似度分数。
为了使文本成为图像生成过程的一部分,我们必须调整噪声预测器以使用文本作为输入。
我们的数据集现在包括编码的文本。由于我们在潜在空间中操作,因此输入图像和预测的噪声都在潜在空间中。
为了更好地了解文本标记在 Unet 中的使用方式,让我们更深入地了解 Unet。
让我们首先看一个不使用文本的扩散 Unet。它的输入和输出如下所示:
在里面,我们看到:
现在让我们看看如何改变这个系统,以包括对文本的关注。
我们需要对系统添加对文本输入的支持(技术术语:文本调节)的主要变化是在 ResNet 块之间添加一个注意力层。
请注意,ResNet 块不直接查看文本。但是注意力层将这些文本表示合并到潜在中。现在,下一个 ResNet 可以在其处理中利用该合并的文本信息。
我希望这能让您对 Stable Diffusion 的工作原理有一个很好的初步直觉。还涉及许多其他概念,但我相信一旦您熟悉了上面的构建块,它们就更容易理解了。