Stable Diffusion
1 作用
原始论文为High-Resolution Image Synthesis with Latent Diffusion Models,2022年发表在CVPR上。代码仓https://github. com/CompVis/latent-diffusion
稳定扩散模型的原名是潜扩散模型(Latent Diffusion Model, LDM)。正如它的名字所指出的那样,扩散过程发生在潜在空间中。这就是为什么它比纯扩散模型更快。
2 解释
整体架构图
潜在空间
首先训练一个自编码器,学习将图像数据压缩为低维表示。
通过使用训练过的编码器E,可以将全尺寸图像编码为低维潜在数据(压缩数据)。然后通过使用经过训练的解码器D,将潜在数据解码回图像。
潜在空间的扩散
将图像编码后,在潜在空间中进行正向扩散和反向扩散过程。
条件作用/调节
稳定扩散模型的真正强大之处在于它可以从文本提示生成图像。这是通过修改内部扩散模型来接受条件输入来完成的。
通过使用交叉注意机制增强其去噪 U-Net,将内部扩散模型转变为条件图像生成器。
上图中的开关用于在不同类型的调节输入之间进行控制:
- 对于文本输入,首先使用语言模型 𝜏θ(例如 BERT、CLIP)将它们转换为嵌入(向量),然后通过(多头)Attention(Q, K, V) 映射到 U-Net 层。
- 对于其他空间对齐的输入(例如语义映射、图像、修复),可以使用连接来完成调节。
训练
训练目标(损失函数)与纯扩散模型中的训练目标非常相似。唯一的变化是: - 输入潜在数据zₜ而不是图像xₜ。
- U-Net增加条件输入𝜏θ(y)。
采样
由于潜在数据的大小比原始图像小得多,所以去噪过程会快得多。
架构的比较
比较纯扩散模型和稳定扩散模型(潜在扩散模型)的整体架构。
Diffusion Model
Stable Diffusion (Latent Diffusion Model)
快速总结一下:
- 扩散模型分为正向扩散和反向扩散两部分。
- 正扩散可以用封闭形式的公式计算。
- 反向扩散可以用训练好的神经网络来完成。
- 为了近似所需的去噪步骤q,我们只需要使用神经网络εθ近似噪声εₜ。
- 在简化损失函数上进行训练可以获得更好的样本质量。
- 稳定扩散(潜扩散模型)是在潜空间中进行扩散过程,因此比纯扩散模型快得多。
- 纯扩散模型被修改为接受条件输入,如文本、图像、语义等。
组件
组件 | 参数个数 | 文件大小 | 占比 |
---|---|---|---|
CLIP | 123,060,480 | 492 MB | 12% |
VAE | 83,653,863 | 335 MB | 8% |
UNet | 859,520,964 | 3.44 GB | 80% |
Total | 1,066,235,307 | 4.27 GB | 100% |
Stable Diffusion是一种计算机生成图像的方法,它是Diffusion Model(扩散模型)的一种变体。扩散模型是一种深度学习模型,用于生成高质量、逼真的图像,同时保持一定的稳定性。Stable Diffusion的特点是能够生成高质量、多样化的图像,同时保持较低的计算成本和较快的生成速度。
Stable Diffusion的工作原理是通过对图像进行逐步的"去噪"和"重构",从随机噪声开始,逐步恢复出高质量的图像。在这个过程中,模型会不断地调整噪声和图像的混合程度,直到最终生成出高质量的图像。这种方法可以有效地利用计算资源,生成出高质量的图像。
最基本的原理是:根据文字指示,把一张随机生成的全是噪点的图片,一步步去掉噪点生成跟文字描述匹配的图片。
Latent Space & VAE
图片太大了,如果图片用像素数据表示,现在 iPhone 拍的一张照片有最小有 500w 像素,即使做常见的图片压缩(JPG/PNG),也有几百K的数据大小,如果用原图按上面的流程跑下来,计算量巨大,显然我们要针对图片做降维(或者理解为压缩),把一张图片的数据量降低,再进行后续的训练和使用。所以需要一个降维模型做这个事,这个模型需要满足:
- 有 encode 和 decode,需要能从 encode 和处理后的低维数据 decode 成高清图片。
- 要压缩得尽量小,方便低成本做上述海量的计算。
- 信息要能保留得足够多。
- 信息要有语义,不然训练过程中不同图片的信息无法交叉融合。
VAE (Variational Autoencoders 变分自编码器)能做到这些,VAE 提供了 encoder 和 decoder,一张图片经过 VAE encode,可以压缩成仅有 64x64x4 的矩阵,这里经过 encode 后的数据空间,就称为隐空间(Latent Space),在这个空间里进行上述扩散模型的训练和生成流程,成本就非常低,这也是目前Stable Diffusion能跑在我们普通电脑上的原因。最后在隐空间里生成的图片数据,经过 VAE decoder,就能转换成高清图。
那 VAE 为什么能做到这样?一张图片转成 64x64x4 这么小的数据量,为什么能保存图片的信息?通俗理解是 VAE 把图片内容转成了语义概率表示,相当于变成了这张图片的描述,比如描述这张图片有猫的概率、有猫爪子的概率,猫在左边的概率,绿色的概率,类似这样,更深入就不了解了,这篇文章 有讲解到一些,也只了解到这里了
CLIP
VAE 解决图片编码问题,再来看看文本的编码。在控制生成里,文本实际上是怎样参与到模型训练和生成的过程?如果文本只是随便编码进入模型,模型可能只认得一些特定字符,不认识语义,也就在后续的图片生成中没法比较好地通过自由的prompt文案控制。
SD 使用 OpenAI 训练的 CLIP 模型,把文本转为对应的向量,为什么用它,因为 CLIP 模型本身是一个文本到图片的映射模型,它对文本转出来的向量,更贴近图片的特征空间。
稍微展开说下原理:
- 有N张图片、以及它们对应的 N 个对图片的描述文本
- 对图像进行编码,得到I,下图中,I1/I2/.../IN 表示从第 1 到 N 张图片的编码表示。
- 对文本片段进行编码,得到T,下图中,T1/T2...TN 表示从第 1 到 N 张图片对应的文本描述。
- 模型的任务是训练 TextEncoder 和 ImageEncoder的 参数:
- 让图中蓝色部分Ti和Ii相似度变高,它们原本就是一一对应的文本-图片,属于正样本。(数学上是计算余弦相似度,越大表示相似度越高,最大化这个值)
- 让白色部分相似度最低,它们的文本和图片是没有关系的,属于负样本。(数学上是余弦相似度值最小化)
这样训练后,最终使用这个模型时,TextEncoder出来的向量表示,就跟图片内容有很强的关系。比如下图第四行,猫的文字描述通过 TextEncode 出来的值,跟猫的图片的ImageEncode出来的值,相似度更高,跟其图片的encode相似度就低。
PS. 更细节的 CLIP 怎么跟 SD 生成过程结合,还没弄得很清楚,实际上SD 没有用 CLIP 里的 Image encoder,扩展模型训练过程中是用别的 Image Encoder,那就并没有用到文本和实际图片的对应映射关系,但可能CLIP出来的文本编码,语义和表现形式上已经是图片的模式,比如文字 cat
,它能跟图片空间里猫所表示的形态(形状/位置)、视觉(眼睛/颜色/形状)、语义(宠物/动物)能比较接近地对应上,也能存储到相关信息,所以跟其他图片编码结合,也能起到很大作用?
采样器
编码和数据量的问题解决了,还有个问题没提到,就是上面流程里的步数太长了,最开始提出的扩散模型训练方案 DDPM(Denoising Diffusion Probabilistic Models 去噪扩散概率模型),正常需要 1000 步降噪过程(称为采样),才能生成一张不错的图片,即使上述隐空间已经降低了计算量,但生成一张图要1000步,还是达不到大规模可用。
为什么 DDPM 一定要这么多次采样?这篇文章说得比较清楚,不能直接减小步数(每次噪声加得很少,避免一步就破坏掉原图),不能跳步降噪(每一步状态都依赖前一步,号称马尔科夫性质)。
随后很快有人提出 DDIM(Denoising Diffusion Implicit Models 去噪扩散隐式模型) 方案,训练时还是 DDPM 一步步来,但生成时是可以做到跳步,同时还能让在步数变少的情况下保持生成的稳定。DDIM不是从头开始逐步去噪,而是选择几个关键的时间点,只在这些时间点上进行去噪操作,并且中间的步骤,比如从降噪100次的图片,下一步直接生成降噪90次的图片,跳10步,生成速度就快了10倍。为什么它能做到跳步,具体原因都是数学公式,就不展开了(还没全看懂),可以看回这篇文章。
Stable Diffusion 的 WebUI 上有很多采样器,Eular a,Karras,DPM 等,在去噪过程中通过不同的方法,有不同的多样化程度、图像质量、速度、收敛性的区别。
Stable Diffusion UNet 结构
最初的 DDPM(去噪扩散概率模型),和后来改良的 LDM(潜在扩散模型),对 UNet 网络逐步做了一些改造,以适合扩散模型图生成的过程,SD 是基于 LDM 实现的。
最后 SD 里的 UNet,整体结构流程跟上述一致,改造大部分是在上采样和下采样的每一层的实现里,最大的改造是引入了 ResnetBlock(残差模块)和 Transformer 模块。ResnetBlock 提升网络表达能力(原 UNet 是简单卷积模块),而 Transformer 模块的交叉注意力机制,将文本提示(prompt)的嵌入与图像特征进行融合,实现基于文本条件的图像生成。
SD UNet 每个模块的组成如图(图片来源):
左边下采样每层由2个残差模块和2个Transformer模块连接组成,右边上采样是各3个,中间层是2个残差模块和1个Transformer模块。(高维的d4和u1没有接入Transformer模块,原因不明,可能是试过加入后效果不佳,在高维这里加入 Prompt 交叉注意机制,文字权重太大?)
细分模块结构
里面每一块具体的结构这篇文章画得很详细,摘录学习一下。我们拿其中一个下采样模块看看:
两个残差模块,两个Transformer模块。这图表示了 SD 生图的三个输入:input(噪声图)、prompt_embdding(文字 Prompt)、time_embdding(步数)在这几个模块的流转和处理。这里每一个小模块处理完后,输出的可以近似认为都是一个预测的噪声图的数据表示。
残差模块的输入输出 噪声图+步数 → 预测噪声图,Transformer 模块的输入输出是 噪声图+ Prompt → 预测噪声图。
Transformer 模块
再细看一下 Transformer 模块,Transformer 模块由下图所示好几个部分组成,最主要的是 自注意力模块(SelfAttention)和交叉注意力模块(CrossAttention):
展开看看这两个模块:
自注意力模块,Transformer 结构里的 QKV 输入都是图片特征(上一层的处理结果,就是降噪图的特征),这样做可以让模型获得包含整个输入图像的感受野,捕捉图片特征中不同位置之间的关系, 全局感受力是 Transformer 架构的特点。
交叉注意力模块,它的作用是融合不同模态的输入,在这里就是融合噪声图和文本特征,Q的输入是图片特征,KV的输入是文字 prompt_embedding,让图片特征可以关注到文字输入,根据注意力权重调整图片的生成方向。文字 prompt 在整个Transformer模块中只作用在交叉注意力这部分里。
Transformer 的机制原理、QKV的含义,是另一个比较大的话题,可以先看看网上其他相关讲解,比如这篇,后续再细拆深入。
回顾
关键几个模块的组成了解了,再回到整个UNet的构成:
现在通过这些结构图,可以大致看到 UNet 网络里的整体处理流程,以及关键模块的作用,经过这些模块的逐个叠加,组合成一个个采样模块,再组合成 UNet 网络架构,完成整个生图运算。
这里面还有很多需要深入学习的点,当前先了解到这个维度,已经可以帮助大致理解后续 ControlNet 等网络的机制原理。
Stable Diffusion总结
最后总结说下 Stable Diffusion。上面整个过程和概念,是一个个解决问题的方法,把它们组合起来,逐渐建立起基于扩散模型生成图片的方法大厦,谁都可以用这些公开的理论方法建一套自己的生图模型。
Stable Diffusion 就在这些基础上做一些改进,建立一套稳定的框架、训练出基础模型,开源让所有人可以用,整个 SD 就是多种能力的组合,这些能力可以分别不断升级替换,模型本身还有很多方式去做更强的控制干预(controlNet / LORA等),使得它可定制性可玩性很强,生态越来越繁荣。
最后让我们用一个图串起整个流程和讲解到的概念。
- Part1 是用 CLIP 模型对文本做编码。
- Part2 在模型训练过程中,图片经过 AutoencoderKL(VAE编码器的实现)生成隐空间下图片的表示,随机生成一个 noise 噪声,加到这个图片里,同时把通过 CLIP 模型编码的图片对应描述文本加入进来,一起进入 UNet 模型,训练预测加了多少 noise 噪声的能力。
- Part3 在模型推理过程中,输入一个完全随机噪点,在隐空间里通过不同的采样器,结合prompt 文本输入(图上没表示出来,文本数据会参与到降噪过程),在 UNet 模型里迭代多步做降噪预测,生成隐空间里的图片,再通过 VAE AutoencoderKL 解码出图片。
了解整个基础流程和概念后,现在看 Stable Diffusion 论文中的这张架构图,应该也大致能理解是什么意思了。
总结
DiffusionModel VIT、DIT、UVIT与Stable Diffusion的联系与区别
特性 | Diffusion Model | ViT | DiT | U-ViT | Stable Diffusion |
---|---|---|---|---|---|
目标 | 通用生成框架 | 图像分类、检测等任务 | 高质量图像生成 | 高分辨率图像生成 | 高效文本到图像生成 |
主干架构 | 通常基于 U-Net | Transformer | 基于 ViT 的扩散模型 | ViT + U-Net | U-Net + 条件模块(CLIP) |
特征处理 | 局部特征为主 | 全局特征建模 | 全局特征建模 | 全局与局部结合 | 潜空间局部处理 + 条件控制 |
条件能力 | 基础条件控制 | 无条件 | 强条件(时间步、文本) | 强条件(多模态任务) | 强条件(文本、图像) |
应用场景 | 图像生成、修复、去噪 | 分类、检测、多模态任务 | 条件和无条件生成 | 多模态、高分辨率生成 | 文本到图像、多模态生成 |
参考资料
- https://www.bilibili.com/video/BV1wZ421h7w7/?vd_source=9c2f477a97bce8e38909b83b89e244e2
- 详细介绍SD中相关技术
- # 手写stable-diffusion
- 源码手写SD
- https://zhuanlan.zhihu.com/p/639952809
Sora
stablediffusion
SD相关资料
# Stable Diffusion 图片生成原理简述
# 理解 Stable Diffusion UNet 网络
# Stable diffusion --- High-Resolution Image Synthesis with Latent Diffusion Models
# Diffusion Models
# Stable Diffusion 原理 | 深度学习算法
# Stable Diffusion 原理介绍与源码分析(一)
# The Illustrated Stable Diffusion
# 零基础读懂Stable Diffusion(II):怎么训练
ICCV 2023 | 最全AIGC梳理,5w字30个diffusion扩散模型方向,近百篇论文!
【CVPR2024】面向StableDiffusion的编辑算法FreePromptEditing,提升图像编辑效果
# 技术神秘化的去魅:Sora关键技术逆向工程图解