一、数学基础
1. 正态分布标准化
对于一个服从高斯分布的随机变量,计算其均值和标准差。“标准正态分布”,就是取、正态分布给出的,其概率密度函数为:
对于任意一个正太分布的概率密度函数积分:
令,上边公式就变成了:
可以得到新的随机变量,符合标准正太分布。
所以对于一个服从高斯分布的随机变量,取即可将其转化为标准正态分布。
2. 参数重整化
若希望从高斯分布中采样,可以先从标准分布 采样出,再得到,这就是我们想要采样的结果。这样做的好处是将随机性转移到了这个常量上,而和则当作仿射变换网络的一部分。
二、DDPM模型
1. 模型总览
DDPM(Denoising Diffusion Probalistic Models)是一种用于图片生成的扩散模型。如下图所示,DDPM模型主要分为两个过程:forward加噪过程(从右往左)和reverse去噪过程(从左往右)。
加噪过程:向数据集的真实图片中逐步加入高斯噪声,加噪过程满足一定的数学规律,不进行模型学习。
去噪过程:对加了噪声的图片逐步去噪,从而还原出真实图片,去噪过程则采用神经网络来学习。
2. 扩散过程(加噪)
2.1 定义
T :总步数
:每一步产生的图片,其中是原始图片,是纯高斯噪声
:为每一步添加的高斯噪声
:指通过向图像中添加高斯噪声,得到
根据上面的流程图,有,根据公式,为了得到,需要sample好多次噪声,可以使用重参数进行简化。
2.2 重参数
在由加噪至的过程中,噪声的标准差/方差是以一个在区间内的固定值来确定的,均值是以固定值和当前时刻的图片数据来确定的,加噪过程可以写成公式:
上式意思是:由得到的过程,满足分布。(这个分布是指以为均值,为方差的高斯分布)。因此我们看到这个噪声只由和来确定,是一个固定值而不是一个可学习过程。因此,只要我们有了,并且提前确定每一步的固定值,我们就可以推出任意一步的加噪数据。这里加噪过程是一个马尔科夫链过程。
借助参数重整化可以写成:
其中,是从标准高斯分布中采样的噪声。
2.3 任意时刻数据的计算
在逐步加噪的过程中,我们其实并不需要一步一步地从去迭代得到。事实上,我们可以直接从和固定值序列直接计算得到。
:一系列常数,类似于超参数,随着T的增加越来越小
:一系列常数,是我们直接设定的超参数,随着T的增加越来越大
定义,根据上面的重参数得到的递推公式,得到:
现在,只需要sample一次噪声,就可以直接从得到了。
-
逆扩散过程
由于加噪过程只是按照设定好的超参数进行前向加噪,本身不经过模型,但去噪过程是真正训练并使用模型的过程。定义表示去噪过程,其中表示模型参数。
如上图所示,从第T个timestep开始,模型的输入为与当前timestep。模型中蕴含一个噪声预测器(UNet),它会根据当前的输入预测出噪声。然后,将当前图片减去预测出来的噪声,就可以得到去噪后的图片。重复这个过程,直到还原出原始图片为止。可以看到,每一步的预测需要前一步的图片信息和timestep,timestep的表达类似于位置编码,需要告诉模型,现在进行的是哪一步去噪。
-
训练与推理步骤
DDPM的训练流程如下图左边部分,推理流程如下图右边部分:
4.1 训练流程
由加噪过程可知:
在第t个时刻的输入图片可以表示为:。
噪声真值表示为:在第t个时刻sample出来的噪声。
预测出来的噪声表示为:,其中为模型参数,表示预测出的噪声和模型相关。
loss:,只需要最小化该loss即可。
由于不管对任何输入数据,不管对它的任何一步,模型在每一步做的都是去预测一个来自高斯分布的噪声。因此,整个训练过程可以设置为:
从训练数据中,抽样出一条
随机抽样出一个timestep。(即)
随机抽样出一个噪声。(即)
计算:
计算梯度,更新模型,重复上面过程,直至收敛。
4.2 推理流程
推理流程需要串行执行,我们从最后一个时刻(T)开始,传入一个纯噪声(或者是一张加了噪声的图片),逐步去噪。根据 ,我们可以进一步推出和的关系(上图的前半部分)。而图中一项,则不是直接推导而来的,是我们为了增加推理中的随机性,而额外增添的一项。可以类比于GPT中为了增加回答的多样性,不是选择概率最大的那个token,而是在topN中再引入方法进行随机选择。
三、SD模型
SD是一个基于latent的扩散模型 ,它在UNet中引入text condition来实现基于文本生成图像。基于latent的扩散模型的优势在于计算效率更高效,因为图像的latent空间要比图像pixel空间要小,这也是SD的核心优势。
1. 结构介绍
整体输入输出:
上图中最左侧的和 是模型的输入输出,比如 的三维张量,代表图片的宽、高和通道数。这里的 是模型训练的原始图片输入,推理时使用的是最右侧的 Images 模块。
像素空间与隐空间:
像素空间(Pixel Space),上图左侧,红框部分。通常是人眼可以识别的图像内容。
隐空间(Latent Space),上图中央,绿框部分。通常是人眼无法识别的内容,但包含的信息量与像素空间相近。
像素 -> 隐空间:经过Encoder,转化为张量,即称为隐空间。
隐空间 -> 像素空间:经过Decoder,转换回像素空间。
Diffusion Process:
对隐向量添加噪声,按照DDPM模型的流程,采样一组高斯分布噪声,通过公式推导,得到 向量。
Denoising Process:
Conditioning:
对应图中最右边灰白色框,输入类型包括text、images等。在Conditioning模块中,会执行以下步骤:
这些“附加信息”会通过对应的编码器 ,转换成向量表示。
转换后的向量,会输入给U-Net,作为其中Attention模块的K、V输入,辅助噪声的预测。
2. 主要部分
2.1 VAE
作用就是将原始图片转换到隐空间,经过处理再转换回来,使用的就是VAE的Encoder和Decoder。这个模块是预训练好的,固定住参数。
原理:
原始张量输入,经过非常简单的网络结构,转换成较小的张量
在Latent张量上,加一点点噪声扰动
用对称的简单网络结构,还原回原始大小
对比输入前后的张量是否相似
特点:
网络计算复杂度比较低
Encoder和Decoder可以分开使用
无监督训练,不需要标注输入的label
有了噪声扰动之后,Latent Space的距离具有实际物理含义,可以实现例如“(满杯水+空杯子)/ 2 = 半杯水”的操作
2.2 CLIP
文本信息转化为向量,此模块是预训练好的,固定住参数。
训练方式:
图像以及它的描述文本,经过各自的Encoder转换为向量表示,希望转换后的向量距离相近。经过训练后,文本描述可以映射到向量空间的一个点,其代表的物理含义与原始图像相近。
2.3 U-Net
作为核心组件,U-Net是模型训练过程中,唯一需要参数更新的部分。在这个结构中,输入是带有噪声的隐向量、当前的时间戳,文本等Conditioning的张量表示,输出是中的噪声预测。
UNet是一个语义分割模型,其主要执行过程与其它语义分割模型类似,首先利用卷积进行下采样,然后提取出一层又一层的特征,利用这一层又一层的特征,其再进行上采样,最后得出一个每个像素点对应其种类的图像。Unet中网络层越深得到的特征图,有着更大的视野域,浅层卷积关注纹理特征,深层网络关注本质的那种特征,所以深层浅层特征都是有格子的意义的;另外一点是通过反卷积得到的更大的尺寸的特征图的边缘,是缺少信息的,毕竟每一次下采样提炼特征的同时,也必然会损失一些边缘特征,而失去的特征并不能从上采样中找回,因此通过特征的拼接,来实现边缘特征的一个找回。
模型结构:
U-Net大致上可以分为三块:降采样层、中间层、上采样层。