Diffusion大模型

前言

人工智能生成内容(AI Generated Content,AIGC)

生成式模型本质上是一组概率分布。

DDPM

训练——加噪过程

数据集中随机选出图片X0,随机选择t时刻,标准正态分布随机选择噪声epsilon,unet网络预测的epsilon_theta,是该时刻的噪音图像。输入已经添加好噪声的图像,预测输出本次添加的噪声。
这是一个加噪的过程,x(t-1)再加上了当前随机的产生的噪声epsilon后变成了x(t)。所以网络要根据输入x(t)以及时刻t,学习到加的这个噪声到底是什么,所以损失函数就是使网络输出epsilon_theta无限接近epsilon
在这里插入图片描述
下图也是一个加噪示意图(来自下面的视频),无论加噪降噪,核心还是那两个公式,都在图中。这两个公式是结论,推导过程就是最终得出这俩公式。
在这里插入图片描述

推理——降噪过程

先随机产生一个x(T),T一般是1000,二者(T是经过编码的)同时输入网络得到噪声
在这里插入图片描述

DDPM很好的视频讲解

VQ-VAE

lantent diffusion models(LDM)

DDPM是一个基于马尔可夫链的算法,它通过对一个随机噪声进行逐步去噪来实现了图像生成任务。DDPM等算法是直接在图像像素空间中进行操作,并且因为DDPM的链式特性,这造成了它的训练和推理都是非常消耗资源的。为了提升扩散模型的生成效率,LDM提出了将扩散空间从图像空间转移到潜空间(Latent Space),而这个潜空间的概率分布可以通过训练好的VAE得到。预测概率分布除了能够提升生成效率,还能够避免扩散模型在图像像素上的过度训练,而图像的这些细节我们交给更擅长做这个的VAE去完成,从而显著提升了生成图像的质量。最后,LDM通过交叉注意力模块,支持将不同模态的条件加入到扩散过程中,从而实现了生成模型的生成内容的可控性。

优势:

  • 压缩潜在空间:在低分辨率的潜在空间中训练扩散模型计算效率更高
  • 整的平滑/压缩潜在空间:扩散模型任务更容易,采样速度更快
  • 灵活性:自动编码器可以根据数据(图像、视频、文本、图形、3D点云、网格等)进行定制

模型结构

LDM是一个二阶段的模型,包括训练一个VQ-VAE和扩散模型本身
在这里插入图片描述

感知图像压缩(Perceptual Image Compression)

模型左侧红色部分是感知图像压缩,使用了一个训练好的VQ-VAE。它包括一个编码器ε和一个解码器D。编码器ε用于将一个RGB彩色图x(H W 3)像压缩到一个特征向量z(h w c)。解码器D则用于将这个潜变量z还原为输入图像x尖。

扩散模型

因为LDM是作用在潜空间,特征的大小要比图像空间小很多,因此LDM的推理速度是要快很多的。并且LDM作用的潜空间是一个具有实际意义的视觉码本,这使得LDM的扩散模型部分更侧重于生成图像的语义信息而非图像的纹理细节。
扩散模型可以理解为一个时序去噪自编码器,它的目标是根据输入图像x在t时刻的加噪图像 预测一个在其上添加的噪声,则DM(扩散模型、如DDPM、DDIM等)的目标函数可以表示为式(1)。其中t是在序列{1,2,……T}上的均匀采样。
在这里插入图片描述
而在LDM中,我们是在潜空间中学习,也就是预测在Zt上添加的噪声,对应的损失函数表示为式
在这里插入图片描述

条件机制

类似于其它条件模型,我们可以在LDM中添加不同的条件来让模型生成我们定制的内容。具体来说,我们通过在U-Net引入交叉注意力(cross attention)来引入条件。简单来讲,当注意力的机制的Q,K,V都是使用同一个特征计算来时,这个注意力叫做自注意力;而当Q,K,V来自于不同的数据源时,这个注意力叫做交叉注意力。
在这里插入图片描述
好好理解这个cross attention,Q来自unet,K、V来自其他模态的编码向量,attention输出维度与Q相同,不破坏unet的整体结构。
还有张图片,更新不了,参考 LDM总结博客

stable diffusion

stable diffusion是LDM的改进,工程上进行了优化,原理基本近似。

主要结构

从上到下分为 3 块,我在图中使用 Part 1、2、3 进行了标注。框架包含训练 + 采样两个阶段
在这里插入图片描述
训练阶段 (查看图中 Part 1 和 Part 2),主要包含:

  • 使用 AutoEncoderKL 自编码器将图像 Image 从 pixel space 映射到 latent space,学习图像的隐式表达,注意 AutoEncoderKL 编码器已提前训练好,参数是固定的。此时 Image 的大小将从 [B, C, H, W] 转换为 [B, Z, H/8, W/8],其中 Z 表示 latent space 下图像的 Channel 数。这一过程在 Stable Diffusion 代码中被称为 encode_first_stage;
  • 使用 FrozenCLIPEmbedder 文本编码器对 Prompt 提示词进行编码,生成大小为 [B, K, E] 的 embedding 表示(即 context),其中 K 表示文本最大编码长度 max length, E 表示 embedding 的大小。这一过程在 Stable Diffusion 代码中被称为 get_learned_conditioning;
  • 对图像的隐式表达进行不断加噪进行前向扩散过程(Diffusion Process),之后对加噪后的图像调用 UNetModel 对噪声进行预估;UNetModel 同时接收图像的隐式表达 latent image 以及文本 embedding context,在训练时以 context 作为 condition,使用 Attention 机制来更好的学习文本与图像的匹配关系;
  • 扩散模型输出噪声εθ,计算和真实噪声之间的误差作为 Loss,通过反向传播算法更新 UNetModel 模型的参数,注意这个过程中 AutoEncoderKL 和 FrozenCLIPEmbedder 中的参数不会被更新。
    采样阶段(查看图中 Part 2 和 Part 3),也就是我们加载模型参数后,输入提示词就能产出图像的阶段。主要包含:
  • 使用 FrozenCLIPEmbedder 文本编码器对 Prompt 提示词进行编码,生成大小为 [B, K, E] 的 embedding 表示(即 context);
  • 随机产出大小为 [B, Z, H/8, W/8] 的噪声 Noise,利用训练好的 UNetModel 模型,按照 DDPM/DDIM/PLMS 等算法迭代 T 次,将噪声不断去除,恢复出图像的 latent 表示;
  • 使用 AutoEncoderKL 对图像的 latent 表示(大小为 [B, Z, H/8, W/8])进行 decode(解码),最终恢复出 pixel space 的图像,图像大小为 [B, C, H, W]; 这一过程在 Stable Diffusion 中被称为 decode_first_stage

UNetModel 介绍

在这里插入图片描述

模型的输入包含三个部分:

  • 大小为 [B, C, H, W] 的图像 image; 注意不用在意表示大小时所用的符号,应将它们视作接口,比如 UNetModel 接收大小为 [B, Z, H/8, W/8] 的 noise latent image 作为输入时,这里的 C 就等于 Z, H 就等于 H/8, W 就等于 W/8;
  • 大小为 [B,] 的 timesteps
  • 小为 [B, K, E] 的文本 embedding 表示 context, 其中 K 表示最大编码长度,E 表示 embedding 大小

模型使用 DownSample 和 UpSample 来对样本进行下采样和上采样,此外出现最多的模块是 ResBlock 以及 SpatialTransformer,其中图中每一个 ResBlock 接收来自上一个模块的输入以及 timesteps 对应的 embedding timestep_emb (大小为 [B, 4*M],M 是可配置的参数);而图中每一个 SpatialTransformer接收来自上一个模块的输入以及 context (Prompt 文本的 embedding 表示),使用 Cross Attention,以 context 为 condition,学习 Prompt 和图像的匹配关系。文本信息作为条件通过SpatialTransformer的crossattention添加到网络结构中。
可以看到,最后模型的输出大小为 [B, C, H, W], 和输入大小相同,也就是说 UNetModel 不改变输入输出的大小。

ResBlock 的实现

ResBlock 网络结构图如下,它接受两个输入,图像 x 以及 timestep 对应的 embedding:
在这里插入图片描述

timestep_embedding 实现

timestep_embedding 的生成方式如下,用的是 Tranformer(Attention is All you Need)这篇 paper 中的方法:
在这里插入图片描述

SpatialTransformer 的实现

最后再看下 SpatialTransformer 的实现,其模块比较多,在接收图像作为输入时,还使用 context 文本作为 condition 信息,二者使用 Cross Attention 进行建模。进一步展开 SpatialTransformer, 发现包含 BasicTransformerBlock ,它实际调用 Cross Attention 模块,而在 Cross Attention 模块中,图像信息作为 Query,文本信息作为 Key & Value,这里与LDM相同。模型会关注图像和文本各部分内容的相关性
在这里插入图片描述

controlNet

ControlNet是一种“辅助式”的神经网络模型结构,通过在Stable Diffusion模型中添加辅助模块,从而引入“额外条件”来控制AI绘画的生成过程。如下图通过Adding Conditional Control(边缘、pose、纹理等),比单纯的通过文本prompt更加准确控制生成目标。
在这里插入图片描述

模型思想HyperNetwork

HyperNetwork是一种模型微调的技术,尤其适用于微调大模型。通过训练一个小模型,将小模型的输出或中间层结果,添加到大模型中,从而影响大模型的输出。
如下图所示,a图是一个普通的stable diffusion大模型,输入文本prompt x,输出图像y,为了更加准确的控制生成目标,如下图b所示,添加了控制条件c(边缘、pose、纹理等)。
在这里插入图片描述
在使用ControlNet模型之后,Stable Diffusion模型的权重被复制出两个相同的部分,分别是“锁定”副本(locked)和“可训练”副本。
ControlNet主要在“可训练”副本上施加控制条件,然后将施加控制条件之后的结果和原来SD模型的结果相加(add)获得最终的输出结果。可训练的副本是一个结构相同、权重相同的Unet模型。
其中“锁定”副本中的权重保持不变,保留了Stable Diffusion模型原本的能力;与此同时,使用额外数据对“可训练”副本进行微调,学习我们想要添加的条件。因为有Stable Diffusion模型作为预训练权重,所以我们使用小批量数据集就能对控制条件进行学习训练,同时不会破坏Stable Diffusion模型原本的能力。

另外,大家可能发现了ControlNet模型的最小单元结构中有两个zero convolution模块,它们是1×1卷积,并且权重和偏置都初始化为零。这样一来,在我们开始训练ControlNet之前,所有zero convolution模块的输出都为零,使得ControlNet完完全全就在原有Stable Diffusion底模型的能力上进行微调训练,不会产生大的能力偏差。
这时很多人可能就会有一个疑问,如果zero convolution模块的初始权重为零,那么梯度也为零,ControlNet模型将不会学到任何东西。那么为什么“zero convolution模块”有效呢?(AIGC算法面试必考点)

ControlNet核心网络结构解析

Unet模型分为encoder和decoder两部分,副本模型继承了encoder部分,同时再经过一个zero convolution后,连接到decoder相应的layer中。右图b部分是可训练的controlNet部分,左图是参数冻结的stable diffusion模型。
在这里插入图片描述
loss与stable diffusion相似,都是L2 loss,这里多了一个控制条件cf而已。
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值