扩散模型之(二十)Stable Diffusion的运作原理

1. 概述

Stable Diffusion作为 Latent Diffusion的继承与发展,它的发布是这一发展历程中的一个重要里程碑,因为它将高性能模型带给了大众(性能体现在图像质量、速度以及相对较低的资源/内存需求等方面)。本文对Stable Diffusion的工作原理与发展过程技术演进进行对比。

2. Stable Diffusion 的模块结构

Stable Diffusion 用途广泛,可以用于多种不同的场景。但是在AIGC领域,通常重点关注的是两个方面:

其一 是文生图,仅从文本生成图像(text2img)的功能。下图展示了一个文本输入示例及其生成的图像,对应的文本提示词 prompt 是 paradise cosmic beach。

图 1. Stable Diffusion根据提示词实现文生图

另一个主要用途是修改图像(即输入文本+图像),下图展示的是在原有图像上+提示词:Pirate ship,生成一张改写的图,实现对原图的修改效果。

图 2. Stable Diffusion根据提示词对原图实现像素级修改

Stable Diffusion(下文简称SD)是一个由多个组件和模型构成的系统,它并非单一的整体模型。而是一个由多个模块和模型组成的系统架构,具体来说,它由三大核心部件组成,每个组件都是一个大型神经网络模块,也称为三大基础模型。

  • CLIPText
  • U-Net + Scheduler
  • AutoEncoder Decoder

下面对上述三个模块组件具体展开说明。

2.1 CLIPText

CLIPText是一个文本理解组件,用于文本编码,该组件将文本信息转换为数字表示,从而捕捉文本中的想法。

图 3. 文本理解组件 Text Understander (蓝色模块)本质上是一个编码器 Encoder

这个文本编码器是一个特殊的Transformer语言模型(严格来说:它是CLIP模型的文本编码器)。它接收输入文本,并输出一个数字列表,每个数字代表文本中的每个token,也就是词元(每个词元对应一个向量)。也就是用 Embedding 的方式来表达prompt中一连串文本中的每个 token,每个 token 对应一个 Embedding 向量(768维),一连串的 token 组合到一起就形成了一个 Embedding 的矩阵,下图中间的矩形蓝色网格来表示这个"矩阵"。

图 4. 文本编码器 Text Encoder对输入文本编码后形成Embedding 矩阵(蓝色网格)

然后,上述 Embedding 信息被提供给图像生成器,进行下一步处理。

2.2 Image Generator

图像生成器(Image Generator )本身由两个组件构成。图像生成器会经历两个阶段: Image information creator 与 Image Decoder。

2.2.1 图像信息创建器(Image information creator)

这个组件是SD 技术的核心所在。它带来了比以往模型更高的性能提升。该组件运行多个步骤以生成图像信息。这是SD接口和库中的步骤参数,通常默认值为 50 或 100。图像信息生成器完全在图像信息空间(或潜空间)中运行。我们将在本文后面详细讨论其含义。这一特性使其速度比以往在像素空间中运行的扩散模型更快。从技术角度来说,该组件由一个 UNet 神经网络和一个调度算法组成。

"扩散"一词描述了该组件中发生的变化。它是对信息进行逐步处理的过程,最终(由下一个组件,即图像解码器)生成高质量的图像。

图 5. Image information creator在潜空间处理图像信息

2.2.2 图像解码器(Image Decoder )

图像解码器根据从信息创建器获取的信息绘制图像。它仅在流程结束时运行一次,以生成最终的像素图像。

图 6. Image Decoder解码处理后输出的信息,还原为图像

由此我们可以看出构成 SD 的三个主要组成部分(每个部分都有自己的神经网络):

  • ClipText 用于文本编码。

    输入:文本(prompt)

    输出:77 个词嵌入向量,每个token向量的维度为 768。

  • UNet + 调度器 用于逐步处理/扩散信息(潜在信息)空间中的信息

    输入:文本嵌入和一个由噪声组成的初始多维数组(结构化数字列表,也称为张量

    输出:处理后的信息数组

  • 自编码器解码器 使用处理后的信息数组绘制最终图像。

    输入:处理后的信息数组(维度:(4, 64, 64));

    输出:生成的图像(维度:(3, 512, 512),分别代表(红/绿/蓝,宽度,高度))。

三个主要组件 CLIPText、U-Net、AutoEncoder Decoder的整体结构如下图所示。

图 7. 三个主要组件 CLIPText、U-Net、AutoEncoder Decoder

3. Diffusion的扩散过程具体实现

首先,SD中的Diffusion 也就是扩散究竟是指什么?详见 扩散模型之(一)去噪扩散模型 DDPM

以下图为例,扩散是发生在粉色"图像信息生成器"组件内部的过程。该过程利用代表输入文本经CLIP编码器输出的的Token embeddings 词嵌入矩阵(下图蓝色网格) 和一个随机的初始图像信息数组(也称为潜在信息,下图中透明网格),经过图像信息生成器生成一个信息数组,图像解码器使用该信息数组来绘制最终图像。

图 8. Diffusion实现框架图

上述这个过程是逐步进行的。每一步都会添加更多相关信息。为了直观地理解这个过程,我们可以检查随机潜在变量数组,并发现它最终会转化为视觉噪声。这里的视觉检查指的是将图像通过图像解码器进行解码(实际可以在中间指定迭代步数或最终迭代结束后解码查看)。

图 9. 图像生成过程(反向过程)原理图

同时,扩散过程分多个步骤进行,每个步骤都对输入的潜在数组进行操作,并生成另一个潜在数组,该数组更类似于输入文本以及模型从训练该模型的所有图像中获取的所有视觉信息。

这里当"Diffusion 扩散"的反向生图过程发生时,每迭代一步就引入一个 U-Net 预测噪点矩阵,并用之前一步包含噪点的图片矩阵减去这个预测噪点矩阵,产生一个"更接近结果、噪点更少的图片。经过50或100步迭代后,便最终生成出了结果,一个不带任何噪点的图片从潜空间矩阵中被解码出来。

这里"更接近结果"的含义是指,这个图片更接近预先训练好的大模型中抽取出的所有与输入文本语义相关的图像在潜空间中的表达,也就是无噪点真实图片的潜空间表达。

图 10. Image Information Creator 模块内部由至少是 50 个U-Net 组成的迭代串联模块组合

我们可以将一组这些潜在变量可视化,以查看每一步添加了哪些信息。比如在第 1、2、4、5、10、30、50 步等中间步骤后查看,就会发现,它呈现如下图中的状态。

图 11. 50步中取 1、2、4、5、10、30、50 步后设置检查点,解码查看运行中的效果

3.1 扩散模型前向训练过程

利用扩散模型生成图像的核心思想在于我们拥有强大的计算机视觉模型。给定足够大的数据集,这些模型可以学习复杂的运算。扩散模型通过将问题表述如下来处理图像生成:

假设我们有一张图像,我们生成一些噪声,并将其添加到图像中。

图 12. U-Net 的一次典型样本的训练过程

现在,我们可以将此视为一个训练样本。我们可以使用相同的公式创建大量训练样本,以训练图像生成模型的核心组件。

图 13. U-Net 另一次典型样本的训练过程

虽然这个例子展示了从图像(数量 0,无噪声)到完全噪声(数量 4,完全噪声)的几个噪声量值,但我们可以轻松控制向图像添加多少噪声,因此我们可以将其分散到几十个步骤中,为训练数据集中的所有图像创建几十个训练样本。

图 14. Input 数据集为大量不同噪点强度级别的图像,Output(Label 标注结果)数据集为大量不同的纯噪点图,以对U-Net进行训练(监督学习)

利用这个数据集,我们可以训练噪声预测器,最终得到一个优秀的噪声预测器,它在特定配置下运行时能够生成图像。如果您接触过机器学习,那么训练步骤应该会很熟悉:

图 4. 文本编码器 Text Encoder对输入文本编码后形成Embedding 矩阵(蓝色网格)

现在让我们看看它是如何生成图像的。

3.2 扩散模型反向过程(去噪声生成图像)

训练好的噪声预测器可以接收一张噪声图像,并根据去噪步骤的数量,预测出噪声切片。

图 4. 文本编码器 Text Encoder对输入文本编码后形成Embedding 矩阵(蓝色网格)

预测采样噪声,以便从图像中减去它,我们就能得到一幅更接近模型训练所用图像的图像(不是确切的图像本身,而是分布------像素排列的世界,其中天空通常是蓝色的,在地面之上,人有两只眼睛,猫看起来是某种样子------尖耳朵,显然不为所动)。

图 4. 文本编码器 Text Encoder对输入文本编码后形成Embedding 矩阵(蓝色网格)

如果训练数据集包含美观的图像(例如,稳定扩散模型所用的LAION Aesthetics 数据集),那么生成的图像也往往会很美观。如果我们用 logo 图像来训练模型,最终得到的就是一个生成 logo 的模型。

图 4. 文本编码器 Text Encoder对输入文本编码后形成Embedding 矩阵(蓝色网格)

至此,关于扩散模型图像生成的描述就结束了,其内容主要与《去噪扩散概率模型》一文中所述一致。现在,你已经对扩散有了初步的了解,不仅掌握了稳定扩散模型的主要组成部分,也了解了Dall-E 2模型和谷歌Imagen模型的主要组成部分。

请注意,我们目前描述的扩散过程是在不使用任何文本数据的情况下生成图像的。因此,如果我们部署此模型,它会生成精美的图像,但我们无法控制图像的内容是金字塔、猫还是其他任何事物。在接下来的章节中,我们将介绍如何将文本融入到该过程中,以便控制模型生成的图像类型。

3.3 速度提升:对压缩(潜在)数据而非像素图像进行扩散

为了加快图像生成过程,《稳定扩散》论文并没有直接在像素图像上运行扩散过程,而是在图像的压缩版本上运行。该论文将此过程称为"向潜在空间的转换"。

这种压缩(以及后续的解压缩/绘制)是通过自编码器完成的。自编码器使用其编码器将图像压缩到潜在空间,然后仅使用解码器利用压缩后的信息重建图像。

现在,前向扩散过程是在压缩后的潜在变量上进行的。噪声切片是应用于这些潜在变量的噪声,而不是应用于像素图像的噪声。因此,噪声预测器实际上是训练来预测压缩表示(潜在空间)中的噪声。

图 4. 文本编码器 Text Encoder对输入文本编码后形成Embedding 矩阵(蓝色网格)

前向过程(使用自编码器的编码器)用于生成数据,以便训练噪声预测器。训练完成后,我们可以通过运行反向过程(使用自编码器的解码器)来生成图像。

图 4. 文本编码器 Text Encoder对输入文本编码后形成Embedding 矩阵(蓝色网格)

LDM/稳定扩散论文的图 3 显示了这两种流动:

图 4. 文本编码器 Text Encoder对输入文本编码后形成Embedding 矩阵(蓝色网格)

这张图还展示了"条件"组件,在本例中指的是描述模型应该生成什么图像的文本提示。接下来,我们深入探讨一下这些文本组件。

3.4 文本编码器:一种Transformer语言模型

Transformer 语言模型被用作语言理解组件,它接收文本提示并生成词元嵌入。已发布的稳定扩散模型使用了 ClipText(一种基于 GPT 的模型),而论文中使用的是BERT

Imagen论文表明,语言模型的选择至关重要。与更大的图像生成组件相比,替换为更大的语言模型对生成图像质量的影响更大。

图 4. 文本编码器 Text Encoder对输入文本编码后形成Embedding 矩阵(蓝色网格)

早期的稳定扩散模型直接使用了 OpenAI 发布的预训练 ClipText 模型。未来的模型可能会切换到新发布的、规模更大的OpenCLIP版本(2022 年 11 月更新:确实如此,稳定扩散 V2 使用了 OpenCLIP)。新一批模型包含参数量高达 3.54 亿的文本模型,而 ClipText 的参数量仅为 6300 万。

3.5 CLIP是如何训练的

CLIP 使用包含图像及其说明文字的数据集进行训练。想象一下,这个数据集看起来像这样,只是包含 4 亿张图像及其说明文字:

图 4. 文本编码器 Text Encoder对输入文本编码后形成Embedding 矩阵(蓝色网格)

实际上,CLIP 使用从网络抓取的图像及其"alt"标签进行训练。

CLIP 是图像编码器和文本编码器的组合。它的训练过程可以简化为:给定一张图片及其描述文字,我们分别使用图像编码器和文本编码器对它们进行编码。

然后我们使用余弦相似度比较得到的嵌入向量。在训练过程开始时,即使文本能够正确描述图像,相似度也会很低。

我们更新这两个模型,以便下次嵌入它们时,得到的嵌入结果相似。

通过在整个数据集上重复此操作并使用较大的批次大小,最终编码器能够生成相似度较高的词嵌入,使得狗的图片和句子"一张狗的图片"能够相互关联。与word2vec类似,训练过程也需要包含不匹配的图片和描述作为负样本,模型需要为它们分配较低的相似度分数。

3.6 将文本信息输入图像生成过程

为了使文本成为图像生成过程的一部分,我们必须调整噪声预测器,使其使用文本作为输入。

我们的数据集现在包含了编码后的文本。由于我们是在潜在空间中进行操作,因此输入图像和预测噪声都位于潜在空间中。

为了更好地了解文本标记在 Unet 中的使用方式,让我们深入了解 Unet 的内部结构。

Unet噪声预测器的各层(不含文本)

我们首先来看一个不使用文本的扩散型 Unet。它的输入和输出如下所示:

在里面,我们看到:

  • Unet 是一系列用于转换潜在数组的层。
  • 每一层都对前一层的输出进行操作。
  • 部分输出(通过残余连接)被送入网络中后续的处理环节。
  • 时间步长被转换成时间步长嵌入向量,而这正是各层所使用的信息。

UNET噪声预测器的层(带文本)

现在让我们来看看如何修改这个系统,使其能够关注文本。

为了支持文本输入(技术术语:文本条件化),我们需要对系统进行的主要更改是在 ResNet 块之间添加一个注意力层。

请注意,ResNet模块并不直接处理文本。但注意力层会将这些文本表征合并到潜在变量中。然后,下一个ResNet模块就可以利用这些合并后的文本信息进行处理。

4. Stable Diffusion 3.x

stable diffusion作为一个较大的发展,下面的内容具体介绍其各个模块和组件的具体改进。

5. 结论

6.参考资料

illustrated-stable-diffusion

High-Resolution Image Synthesis with Latent Diffusion Models

stable-diffusion-3-text-to-image-model

相关推荐
YuanDaima20482 小时前
解决Conda环境下RTX 50系列显卡PyTorch+Transformers+PEFT微调报错
人工智能·pytorch·笔记·python·深度学习·机器学习·conda
适应规律3 小时前
深度学习第四版
人工智能·深度学习
xingyuzhisuan3 小时前
怎么快速在云上部署一个Stable Diffusion环境?(实操落地版)
人工智能·stable diffusion·ai绘画·gpu算力
八角Z3 小时前
从行为惯性到正向认同:留守问题青年在数字社群中的风险机制与干预策略研究
科技·深度学习·创业创新
枫叶林FYL3 小时前
MCP 实现深度技术报告
人工智能·深度学习
iiiiii113 小时前
【LLM学习笔记】Batch Normalization vs Layer Normalization,为什么 NLP 中使用 LN 而非 BN
笔记·深度学习·学习·语言模型·大模型·llm·transformer
Elastic 中国社区官方博客3 小时前
从判断列表到训练好的 Learning to Rank( LTR )模型
大数据·数据库·人工智能·深度学习·elasticsearch·搜索引擎·全文检索
卡梅德生物科技小能手3 小时前
深度解析先天免疫核心受体:TLR2(CD282)的分子机制、信号通路与药物研发技术路径
经验分享·深度学习·生活
HyperAI超神经3 小时前
在线教程丨华中科大与小红书 hi lab开源dots.mocr,SOTA级OCR模型完美还原文档结构,图形也能转 SVG
人工智能·深度学习·学习·机器学习·gpu·orc·vllm