一、什么是扩散模型
1.前向过程(加噪过程)
什么是扩散?即如图在正向扩散过程将高斯噪声逐步添加到输入图像中。
那依照什么样的规律来添加噪声呢?这里就涉及一个参数,在我们的前向扩散过程中,t时刻的图像值与它的上一时刻的图像值和上一时刻到t时刻所要加上的噪声值z有关(z是一个符合高斯分布的采样值),由于图像变得越来越扩散,即噪声越来越多,那么
将更取决于将加入的的噪声,而不是上一时刻的值。
因此我们需要随着迭代的时刻数逐渐减小,即
逐渐增大,论文中定义了
的递增范围,从而使得
变成了一个被定义的递减函数。
由于每次加入的噪声都服从高斯分布,在我们不断带入化简得过程中 最后可以得到下式:
补充:公式zt上的杠去掉,杠表示累乘
获得如图的公式后我们只要有输入的照片x0,就能求出t时刻我们的迭代的值。
2.反向过程(去噪过程)
在前向过程中,我们最终获得了一张符合高斯分布的噪声图,即。那反向过程我们最终的目标,就是根据我们的
,获得图像
。但是想要从
直接求得
,那肯定是不现实的,我们要先着手求
。
根据贝叶斯公式
由于我们在前向过程中,我们已经学会了如何由 求
与
求
,因此贝叶斯公式所需的三个值,对我们来说都是已知条件,所以现在我们就可以由
求
。
注意!!!此处的只是我们用
表示出来的。不然
都有了咱求啥。
然后我们将公式代入之后,我们的目标就是计算,T-1时刻的分布,也就是他的方差和均值
注:zt没有杠。这个值实际上是我们要估计的每个时刻的噪声,科学家把这个交给神经网络来处理,训练一个模型来给出我们的zt。训练所需的是各时刻的分布以及时刻值。
3.训练过程(对应前向过程)
前向过程就是我们训练的过程,我们的数据集需要遵循一定的分布,比如都是猫都是狗什么的,然后会统一采样一个该种类的 ,随后给予训练中每个图像不同的轮次数,以防相同的轮次数让它学到某种无用的规律,然后训练我们的估计噪声模型,通常是u-net,也就是很多扩散模型中的Denoisying U-net。
4.sampling
5.reference
1-19 节直播11: Diffusion模型_哔哩哔哩_bilibili
二、Latent diffusion mode
论文:https://arxiv.org/abs/2112.10752
扩散模型(DMs)在图像数据上实现了最先进的合成结果,并超越了这一点。然而,由于这些模型通常直接在像素空间中操作,优化强大的DMs通常需要消耗数百个GPU天,并且由于序列评估,推理过程很昂贵。为了在有限的计算资源下启用DM训练,同时保留它们的质量和灵活性,LDMs使用一个Autoencoder去学习能尽量表达原始image space的低维空间表达(latent embedding),这样可以大大减少需要的算力。
1. LDM核心要点
LDMs相比DDPM最大的两点改进如下:
1. 加入Autoencoder(上图中左侧红色部分),使得扩散过程在latent space下,提高图像生成的效率;
2. 加入条件机制,能够使用其他模态的数据控制图像的生成(上图中右侧灰色部分),其中条件生成控制通过Attention(上图中间部分QKV)机制实现。
2.网络结构
2.1 VAE
Stable Diffusion模型整体上是一个End-to-End模型,主要由VAE(变分自编码器,Variational Auto-Encoder),U-Net以及CLIP Text Encoder三个核心组件构成。
在Stable Diffusion中,VAE(变分自编码器,Variational Auto-Encoder)是基于Encoder-Decoder架构的生成模型。VAE的Encoder(编码器)结构能将输入图像转换为低维Latent特征,并作为U-Net的输入。VAE的Decoder(解码器)结构能将低维Latent特征重建还原成像素级图像。
当我们输入一个尺寸为 的数据,VAE的Encoder模块会将其编码为一个大小为ℎ×w×c的低维Latent特征,其中f=H/ℎ=W/w为VAE的下采样率(Downsampling Factor)。反之,VAE的Decoder模块有一个相同的上采样率(Upsampling Factor)将低维Latent特征重建成像素级别的图像。
为什么VAE可以将图像压缩到一个非常小的Latent space(潜空间)后能再次对图像进行像素级重建呢?
因为虽然VAE对图像的压缩与重建过程是一个有损压缩与重建过程,但图像全图级特征关联并不是随机的,它们的分布具有很强的规律性:比如人脸的眼睛、鼻子、脸颊和嘴巴之间遵循特定的空间关系,又比如一只猫有四条腿,并且这是一个特定的生物结构特征。
2.2条件控制生成机制
DDPM的UNet可以根据当前采样的t预测noise,但没有引入其他额外条件。但是LDM实现了“以文生图”,“以图生图”等任务,就是因为LDM在预测noise的过程中加入了条件机制,即通过一个编码器(encoder)将条件和Unet连接起来。
与其他类型的生成模型类似,扩散模型原则上能够对形式为 p(z|y) 的条件分布进行建模,这可以通过条件去噪自动编码器 来实现,这样就可以实现比如通过文本 y 来控制 z 的生成(text-to-image),同样的,如果 � 为图像,也可以实现image-to-image任务。LDM通过在UNet 模型中使用交叉注意机制(cross-attention),将Diffusion Models转变为更灵活的条件图像生成器。本来将使用text-to-image来举例。
这里引入一个新的encoder(这个是用于条件编码的encoder,和上面提到的用于降维的是不同的)来将条件 y 映射到 ,然后
通过cross-attention layer 映射到UNet 的中间层。
2.3 U-net
下图是Rocky梳理的Stable Diffusion U-Net的完整结构图
(1)ResNetBlock模块
在传统深度学习时代,ResNet的残差结构在图像分类,图像分割,目标检测等主流方向中几乎是不可或缺,其简洁稳定有效的“残差思想”终于在AIGC时代跨过周期,在SD模型的U-Net结构中继续繁荣。
值得注意的是,Time Embedding正是输入到ResNetBlock模块中,为U-Net引入了时间信息(时间步长T,T的大小代表了噪声扰动的强度),模拟一个随时间变化不断增加不同强度噪声扰动的过程,让SD模型能够更好地理解时间相关性。
同时,在SD模型调用U-Net重复迭代去噪的过程中,我们希望在迭代的早期,能够先生成整幅图片的轮廓与边缘特征,随着迭代的深入,再补充生成图片的高频和细节特征信息。由于在每个ResNetBlock模块中都有Time Embedding,就能告诉U-Net现在是整个迭代过程的哪一步,并及时控制U-Net够根据不同的输入特征和迭代阶段而预测不同的噪声残差。
在上面的Stable Diffusion U-Net完整结构图中展示了完整的ResNetBlock模块,其输入包括Latent Feature和 Time Embedding。首先Latent Feature经过GSC(GroupNorm+SiLU激活函数+卷积)模块后和Time Embedding(经过SiLU激活函数+全连接层处理)做加和操作,之后再经过GSC模块和Skip Connection而来的输入Latent Feature做加和操作,进行两次特征融合后最终得到ResNetBlock模块的Latent Feature输出,增强SD模型的特征学习能力。
同时,和传统深度学习时代的U-Net结构一样,Decoder结构中的ResNetBlock模块不单单要接受来自上一层的Latent Feature,还要与Encoder结构中对应层的ResNetBlock模块的输出Latent Feature进行concat操作。举个例子,如果Decoder结构中ResNetBlock Structure上一层的输出结果的尺寸为 [512, 512, 1024],Encoder结构对应 ResNetBlock Structure的输出结果的尺寸为 [512, 512, 2048],那么这个Decoder结构中ResNeBlock Structure得到的Latent Feature的尺寸为 [512, 512, 3072]。
(2)CrossAttention模块
CrossAttention模块是我们使用输入文本Prompt控制SD模型图片内容生成的关键一招。
上面的Stable Diffusion U-Net完整结构图中展示了Spatial Transformer(Cross Attention)模块的结构。Spatial Transformer模块和ResNetBlock模块一样接受两个输入:一个是ResNetBlock模块的输出,另外一个是输入文本Prompt经过CLIP Text Encoder模型编码后的Context Embedding。
两个输入首先经过Attention机制(将Context Embedding对应的语义信息与图片中对应的语义信息相耦合),输出新的Latent Feature,再将新输出的Latent Feature与输入的Context Embedding再做一次Attention机制,从而使得SD模型学习到了文本与图片之间的特征对应关系。
Spatial Transformer模块不改变输入输出的尺寸,只在图片对应的位置上融合了语义信息,所以不管是在传统深度学习时代,还是AIGC时代,Spatial Transformer都是将本文与图像结合的一个“万金油”模块。
看CrossAttention模块的结构图,大家可能会疑惑为什么Context Embedding用来生成K和V,Latent Feature用来生成Q呢?
原因也非常简单:因为在Stable Diffusion中,主要的目的是想把文本信息注入到图像信息中里,所以用图片token对文本信息做 Attention实现逐步的文本特征提取和耦合。
3.reference
深入浅出完整解析Stable Diffusion(SD)核心基础知识 - 知乎 (zhihu.com)
一文读懂Stable Diffusion 论文原理+代码超详细解读 - 知乎 (zhihu.com)
Attention机制详解(二)——Self-Attention与Transformer - 知乎 (zhihu.com)