Stable Diffusion稳定扩散模型一文详解
1. Stable Diffusion简介

Stable Diffusion是一种基于深度学习的文本到图像生成模型,由Stability AI、CompVis和LAION等团队合作开发。它是一种潜在扩散模型(Latent Diffusion Model),能够在给定文本描述的情况下生成高质量的图像。其核心功能包括:
文本到图像生成:根据用户输入的文本描述,生成与之匹配的图像。例如,输入“一只在森林中漫步的白色独角兽”,模型可以生成相应的图像。
图像修复与编辑:对已有图像进行修复或编辑,如去除图像中的瑕疵、添加新的元素等。
风格迁移:将一种艺术风格应用到图像上,比如将普通照片转换为梵高风格的绘画。 Stable Diffusion的生成能力强大,能够处理多种复杂的图像生成任务,生成的图像质量和细节表现力都非常出色。
2. Stable Diffusion整体架构
2.1 核心组件构成
Stable Diffusion的整体架构由多个核心组件构成,这些组件协同工作,实现了从文本到图像的高效生成。以下是其主要核心组件:
变分自编码器(VAE):VAE是Stable Diffusion架构中的关键组件之一,负责将图像数据从像素空间压缩到低维的潜在空间,同时在生成过程中将潜在空间的表示解码回像素空间。通过这种压缩和解码机制,VAE大大降低了计算成本,提高了模型的运行效率。例如,对于一张512×512像素的图像,VAE可以将其压缩到一个低维的潜在向量,从而在潜在空间中进行高效的处理。
U-Net:U-Net是Stable Diffusion的核心网络结构,用于实现扩散模型的去噪过程。它接收来自VAE的潜在表示,并结合文本编码器提供的语义信息,逐步去除噪声,生成与文本描述匹配的图像。U-Net采用了类似U型的网络结构,通过编码器和解码器的结合,能够有效地捕捉图像的细节和语义信息。在每个去噪步骤中,U-Net都会根据文本条件对潜在表示进行调整,从而逐步生成高质量的图像。
文本编码器(CLIP Text Encoder):文本编码器的作用是将用户输入的文本描述转换为模型可以理解的语义向量。Stable Diffusion采用了预训练的CLIP文本编码器,能够将文本中的语义信息提取出来,并将其传递给U-Net。这些语义向量作为条件输入,指导U-Net在去噪过程中生成符合文本描述的图像。例如,当用户输入“一只在森林中漫步的白色独角兽”时,文本编码器会将这句话的语义信息编码为一个向量,为图像生成提供指导。
采样器(Scheduler):采样器是Stable Diffusion中用于控制扩散过程的算法。它定义了如何在扩散模型的前向和逆向过程中添加和去除噪声。不同的采样器算法会对生成图像的质量和速度产生影响。例如,DDIM(Denoising Diffusion Implicit Model)采样器通过减少采样步骤,提高了生成速度,但可能会牺牲一些图像质量;而PLMS(Probabilistic Latent Diffusion Model with Score Matching)采样器则在保证图像质量的同时,具有较高的采样效率。用户可以根据具体需求选择合适的采样器,以达到最佳的生成效果。
2.2 各组件协同机制
Stable Diffusion的各个核心组件通过紧密的协同机制,实现了从文本到图像的高效生成过程。以下是其协同机制的具体描述:
文本编码与图像生成的结合:当用户输入文本描述时,文本编码器首先将文本转换为语义向量。这些语义向量作为条件输入,传递给U-Net。在去噪过程中,U-Net根据这些语义向量逐步调整潜在表示,使其逐渐符合文本描述的内容。例如,在生成“一只在森林中漫步的白色独角兽”图像时,文本编码器提取的语义向量会指导U-Net在去噪过程中生成白色独角兽的形状、森林的背景等细节,最终生成与文本描述匹配的图像。
VAE与U-Net的压缩与解码:VAE将输入图像压缩到低维的潜在空间,降低了计算成本。U-Net在潜在空间中进行去噪操作,生成与文本描述匹配的潜在表示。最后,VAE的解码器将生成的潜在表示解码回像素空间,得到最终的图像。这种压缩与解码机制不仅提高了模型的运行效率,还使得模型能够处理更高分辨率的图像。例如,对于一张1024×1024像素的图像,VAE可以将其压缩到一个低维的潜在向量,U-Net在潜在空间中进行高效的去噪处理,然后通过解码器生成高质量的图像。
采样器对扩散过程的控制:采样器定义了扩散模型的前向和逆向过程,控制噪声的添加和去除。在生成图像时,采样器根据预设的算法和参数,逐步引导U-Net进行去噪操作。不同的采样器算法会对生成过程产生不同的影响。
3. Stable Diffusion工作流程
3.1 输入处理阶段
在Stable Diffusion的工作流程中,输入处理阶段是整个图像生成过程的起点,这一阶段的核心任务是将用户的文本描述转化为模型可以理解和处理的格式,同时为后续的图像生成做好准备。

文本编码:用户输入的文本描述首先被送入文本编码器(CLIP Text Encoder)。文本编码器的作用是将自然语言文本转换为语义向量。例如,当用户输入“一只在森林中漫步的白色独角兽”时,文本编码器会将这句话中的关键信息,如“白色独角兽”“森林”“漫步”等语义特征提取出来,并将其编码为一个高维的语义向量。这个语义向量能够准确地表示输入文本的语义内容,为后续的图像生成提供指导信息。

初始化潜在表示:与此同时,变分自编码器(VAE)的编码器部分会生成一个初始的潜在表示。这个潜在表示是一个低维的向量,它在潜在空间中代表了一张噪声图像。在生成图像的过程中,这个初始的潜在表示将作为U-Net网络的输入,用于后续的去噪操作。通过在潜在空间中进行操作,模型能够在较低的维度上高效地处理图像信息,从而提高计算效率。
3.2 扩散与去噪阶段
扩散与去噪阶段是Stable Diffusion工作流程的核心部分,这一阶段的主要任务是通过一系列的去噪步骤,逐步将初始的噪声图像转化为与文本描述匹配的图像。

扩散是“图像信息创建器”(也就是那个粉色的部分)里的核心过程。它从代表输入文本的标记嵌入和一个随机的起始图像信息数组(这些数组也被称为潜在向量)开始,逐步生成一个信息数组。这个数组会被图像解码器用来绘制最终的图像。

如下图,这个过程是逐步完成的,每一步都会添加更多相关的信息。为了更直观地理解它,我们可以观察随机潜在向量数组,会发现它本质上是一种视觉噪声。而要真正“看到”它,我们需要把它传递给图像解码器。

我们可以通过可视化这些潜在向量(latents),来看看每一步中增加了哪些信息。

前向扩散过程
在扩散模型中,前向扩散过程是一个将图像逐渐加噪的过程。
假设我们有一张图片(图1),并生成了一些随机噪点(图2)。接着,从多个噪点强度中选择一个特定级别(图3),将该强度的噪点添加到图片的潜空间数据矩阵中(图4),从而完成一次样本训练。需注意,噪点并非直接作用于像素维度,而是在潜空间中添加,此处的噪点图仅用于辅助理解。

这就可以当作一个训练样本了。我们可以通过同样的方法生成海量的训练样本,从而用来训练图像生成模型的核心部分。

虽然这个例子只展示了从无噪声(数量0)到完全噪声(数量4)的几种情况,但我们可以轻松控制添加到图像中的噪声量,并且可以将其分成数十个步骤。这样,我们就可以为训练数据集中的每张图像生成数十个训练样本。

有了这个数据集,我们就可以训练一个噪声预测器。当它在特定的配置下运行时,这个噪声预测器实际上能够生成图像。

虽然在实际的图像生成过程中,我们并不直接使用前向扩散过程生成图像,但它是理解整个扩散模型机制的关键。
在前向扩散过程中,从初始的图像开始,通过逐步添加高斯噪声,将图像逐渐转化为噪声图像。这个过程可以看作是一个马尔可夫链,每一步都在前一步的基础上添加噪声,直到最终得到一张完全由噪声组成的图像。这个过程的目的是为了在后续的逆向过程中,通过去噪操作逐步恢复出原始的图像信息。
逆向去噪过程
逆向去噪过程是Stable Diffusion生成图像的关键步骤。
在这个过程中,U-Net网络结合文本编码器提供的语义向量,逐步去除初始潜在表示中的噪声。

具体来说,U-Net网络在每个去噪步骤中都会接收当前的潜在表示和语义向量作为输入,然后预测出潜在表示中的噪声成分。通过从当前的潜在表示中减去预测的噪声,得到一个新的潜在表示,这个新的潜在表示更接近于目标图像的潜在表示。

这个过程会重复多次,每次去噪步骤都会使潜在表示中的噪声逐渐减少,图像的语义信息逐渐增强。

例如,在生成“一只在森林中漫步的白色独角兽”图像的过程中,U-Net会在每次去噪时根据语义向量中的信息,逐步生成独角兽的形状、森林的背景等细节,直到最终生成与文本描述高度匹配的图像。
采样器的作用:采样器在扩散与去噪阶段中起到了重要的控制作用。它定义了去噪过程的采样策略,包括采样步骤的数量、每一步的噪声添加和去除方式等。不同的采样器算法会对生成图像的质量和速度产生显著影响。例如,DDIM采样器通过减少采样步骤,提高了生成速度,但可能会牺牲一些图像质量;而PLMS采样器则在保证图像质量的同时,具有较高的采样效率。用户可以根据具体的应用场景和需求,选择合适的采样器来平衡图像质量和生成速度。
3.3 输出生成阶段
输出生成阶段是Stable Diffusion工作流程的最后一步,这一阶段的主要任务是将经过去噪处理后的潜在表示解码为最终的图像输出。
解码为像素空间:在经过多次去噪步骤后,得到的潜在表示已经包含了丰富的语义信息,能够准确地表示目标图像的内容。此时,变分自编码器(VAE)的解码器部分将这个潜在表示解码回像素空间,生成最终的图像。VAE的解码器通过学习图像数据的分布,能够将低维的潜在向量映射回高维的像素空间,从而得到一张与文本描述匹配的高质量图像。例如,对于经过去噪处理后的潜在表示,解码器能够将其解码为一张清晰的“一只在森林中漫步的白色独角兽”图像,图像中的独角兽具有逼真的细节,背景中的森林也具有丰富的层次感。
后处理与优化:在生成图像之后,Stable Diffusion还会进行一些后处理操作,以进一步优化图像的质量。这些后处理操作可能包括色彩校正、对比度调整、锐化等,以使生成的图像更加符合用户的期望和实际应用的需求。此外,根据不同的应用场景,还可以对生成的图像进行一些特定的优化处理。例如,在艺术创作领域,可以对图像进行风格化处理,使其更具有艺术感;在广告设计领域,可以对图像进行细节增强,使其更具吸引力。
3.3 加速:在潜在空间而不是图像像素空间进行扩散
为了加速图像生成过程,Stable Diffusion采用了在压缩的潜在空间(Latent Space)中运行扩散模型的方法,而不是直接在像素图像上操作。这种方法被称为“进入潜在空间(Departure to Latent Space)”,通过自编码器(Autoencoder)实现图像的压缩和解压缩。

具体来说:
自编码器的作用:自编码器由编码器(Encoder)和解码器(Decoder)组成。编码器将图像压缩到潜在空间,生成一个低维的潜在表示(Latent Representation),而解码器则根据这个压缩后的信息重建图像。
潜在空间的优势:在潜在空间中进行扩散过程可以显著减少计算量和内存占用。例如,一个512×512像素的图像在潜在空间中可能被压缩成更小的维度(如4×64×64),从而极大地提高了生成效率。
生成过程:扩散模型在潜在空间中逐步去除噪声,最终生成清晰的潜在表示,然后通过解码器将其转换回像素空间,生成最终的图像。
通过这种方式,Stable Diffusion不仅提高了图像生成的速度,还降低了对硬件资源的需求,使得模型在普通设备上也能高效运行。

简单来说,现在扩散过程是在压缩后的潜在向量上进行的,而不是直接在图像的像素上。噪声也是加在这些潜在向量上,而不是像素图像上。所以,噪声预测器其实是被训练来预测压缩后的潜在空间中的噪声,而不是原始图像中的噪声。

正向过程(就是用自编码器的编码器)是用来生成训练噪声预测器的数据的。等噪声预测器训练好了之后,我们就可以通过反向过程(用自编码器的解码器)来生成图像啦。

这两个流程在LDM/Stable Diffusion论文的图3中有所展示。图中还额外展示了“条件化”(conditioning)组件,即文本提示(text prompts),这些提示描述了模型应该生成的图像内容。因此,接下来我们来深入探讨文本组件的作用。
关键点总结:
正向扩散过程:通过自编码器的编码器将图像压缩到潜在空间(latent space),并在这些潜在表示上逐步添加噪声。
反向扩散过程:训练完成后,通过自编码器的解码器逐步去除噪声,最终生成图像。
文本提示的作用:文本提示通过预训练的文本编码器(如CLIP模型)转换为嵌入向量(embeddings),这些嵌入向量作为条件输入,引导扩散模型生成符合文本描述的图像。
条件化机制:文本嵌入向量通过交叉注意力机制(cross-attention)与图像的潜在表示结合,使得模型能够根据文本提示生成特定内容的图像。
通过这种方式,Stable Diffusion不仅能够生成高质量的图像,还能通过文本提示精确控制图像的内容和风格。
3.4 文本编码器:Transformer模型
Transformer模型作为文本理解的核心组件,负责接收文本提示并生成标记嵌入(token embeddings)。在发布的Stable Diffusion模型中,使用了基于GPT的ClipText模型,而在论文中则使用了BERT。

早期的Stable Diffusion模型直接使用了OpenAI发布的预训练ClipText模型。正如预期的那样,未来的模型可能会转向使用更新且规模更大的OpenCLIP变体。OpenCLIP的文本模型参数规模可达3.54亿,远超ClipText的6300万。例如,Stable Diffusion V2已经采用了OpenCLIP ViT-H/14文本编码器,这一改进显著提升了图像生成的质量。
OpenCLIP的引入不仅因为其更大的模型规模,还因为它提供了更透明的数据训练过程。与OpenAI的CLIP模型(使用专有数据训练)相比,OpenCLIP的开源性和大规模数据训练使其更适合长期发展。此外,Stable Diffusion V2还支持更高分辨率的图像生成(如768×768像素),并优化了文本提示的理解能力。
总的来说,OpenCLIP的使用为Stable Diffusion带来了更强大的文本理解能力和更高的图像生成质量。
CLIP是怎么训练的。
想象一下,你有一个超大的数据集,里面有4亿张图片和对应的描述文字。CLIP就是用这样的数据集来训练的。实际上,CLIP用的是从网上爬取的图片,还有它们的“alt”标签(就是图片的描述文字)。
CLIP由两部分组成:一个是图像编码器,另一个是文本编码器。训练过程可以简单理解为:把一张图片和它的描述文字分别用这两个编码器转换成数字表示(也就是嵌入向量)。

然后,我们用余弦相似度来比较这两个向量。刚开始训练的时候,即使文字描述很准确,它们的相似度也会很低。

接下来,我们调整这两个模型,让它们下次转换的时候,生成的向量更接近。通过在数据集上反复做这个过程,而且每次用很大的批量数据来训练,最后模型就能学会让一张狗的图片和“一张狗的图片”这句话的向量变得很相似。

就像word2vec一样,训练过程中还需要用到一些“反面例子”,比如图片和文字不匹配的情况。模型要学会给这些不匹配的对子打很低的相似度分数。
3.5 CLIPText 文本编码器与U-Net 噪声预测器的校正
要将文本信息整合到图像生成过程中,我们需要对噪声预测器进行调整,使其能够接收文本作为输入。
我们的数据集现在包括了编码后的文本。由于我们在潜在空间(latent space)中操作,输入的图像和预测的噪声都在这个潜在空间中。
为了更好地理解文本标记是如何在Unet中使用的,我们深入看看Unet的内部结构。
Unet噪声预测器的层级结构(不使用文本):
输入和输出
输入: 压缩后的潜在向量(latents)和时间步(timestep)。
输出: 预测的噪声向量。
内部结构

Unet是一个多层的神经网络,每一层都在对潜在向量进行转换。
每一层的输出会成为下一层的输入。
部分输出会通过残差连接(residual connections)传递到网络的后续处理部分。
时间步(timestep)会被转换成一个时间步嵌入向量(timestep embedding vector),这个向量会在每一层中被使用。
带有文本的Unet噪声预测器的层级结构
要让系统支持文本输入(技术上叫“文本条件化”),我们需要在ResNet模块之间加入一个注意力层(attention layer)。这个改动是关键。
具体来说:

ResNet模块本身并不直接处理文本。
ResNet模块的主要工作是处理图像的潜在向量(latents),而不是直接和文本交互。
注意力层的作用: 注意力层会将文本的嵌入向量(来自文本编码器的输出)与潜在向量结合起来。换句话说,它会把文本信息“融入”到图像的潜在表示中。
后续ResNet模块的利用: 经过注意力层处理后,下一个ResNet模块就可以利用这些已经融入文本信息的潜在向量进行进一步处理。这样一来,文本信息就逐步传递到了整个网络中。