扩散模型原理
深入浅出扩散模型
一、概念简介
1、Denoising Diffusion Probalistic Models,DDPM
1.1 扩散模型运行原理
- 首先sample一个都是噪声的图片向量,这个向量的shape和要生成的图像大小相同。
- 通过Denoise过程来一步一步有规律的滤去噪声。
- Denoise的次数是事先规定的,给每一个步骤给定编号,最终步骤编号为1。
- 从噪声到图像的过程称为Reverse Process
雕像已经在大理石里边了,我只是把不要的部分凿掉。--米开朗基罗
1.2 Denoise Model
将相同的Denoise model反复进行图像去噪过程,但是每一个步骤阶段输入的噪声图像之间差别很大。则如果每个不同阶段都使用完全相同的Denoise model或许表现不会很好。
解决方案是,设计Denoise时候,去噪过程中,输入元素不仅是该阶段的噪声影像,还同时输入当前图像的噪声覆盖严重程度指标(即当前是第几步骤)。Denoise model根据输入的噪声程度采取不同的去噪操作。
1.3 Denoise model内部构造
- Noise Predictor的作用是预测输入图像中的噪声分布。
- Noise Predictor通过接收输入噪声图像和噪声覆盖程度参数,生成预测的该噪声图像中的噪声分布图。
- 输出的预测噪声图与输入的噪声图相减,得出Denoise操作后的结果。
1.4 如何训练Noise Predictor
在训练预测噪声分布的时候是需要有Ground Truth来进行监督的,则需要首先制造Ground Truth标签来提供Noise Predictor训练。
- 首先,拿出一张训练影像,随机从高斯分布Gaussian distribution中sample一个噪声加到训练影像中,产生有点噪声的影像,并记录这是第几步增加噪声。
- 重复每一步骤增加噪声的过程,最后会得到一个完全被噪声覆盖的影像。
- 将训练集中的影像都进行这样增加噪声的处理。
- 做完增加噪声处理过后,就得到训练Denoise Predictor的每一噪声覆盖程度的Ground Truth数据了。
- 这个增加噪声的过程称为Forward Process(Diffusion Process)
1.5 文字提示的生成影像Text-to-Image
- 需要训练一个由文字生成影像的模型,则需要文本和影像成对的训练数据,如LAION数据集具有58.5亿张成对影像。
- 在训练过程中,通过在每一个Denoise步骤中加入文字描述条件来进行影响去噪。
- 即在Noise Predictor模组中同时输入文字描述条件。
- 每一张训练影像都有对应的文字描述,先将图片进行Diffusion Process增加噪声之后
- 在训练时不仅要给Noise Predictor输入该步骤的影像和步骤参数还包括文字描述。
- Noise Predictor根据输入的三者数据产生适当的噪声预测。
2、Stable Diffusion
2.1 框架Framework
经典Stable Diffusion框架由三个关键部件组成:Text Encoder文本编码器、Generation生成器、Decoder解码器。文本编码器将文本描述编码为向量嵌入;生成器则利用Diffusion model,输入一个噪声矩阵与文本编码输出一个“中间产物”,即高维度的编码影像;最后经过解码器来将编码影像解码输出生成的影像。通常三个模组是单独训练的,最后将其组合在一起。
2.1.1 Text Encoder
文本编码器的大小会影响到模型生成图像的质量好坏。图中的FID值越小越好,CLIP Score值越大越好。由图中的实验结果可以看出,当文本编码器的参数量越大时,模型生成后的图像质量越高。
edges:
- FID(Fréchet Inception Distance)一种用于评估生成模型的图像质量的指标。
- 先有一个预训练好的CNN分类模型,将影像输入CNN模型中,得到CNN模型的潜在representation,之后将真实影像的representation和生成影像的representation画出来。
- 若两组representation之间的距离越接近则表示生成的图像与真实图像越相近,则生成质量越高。
- 假设两者representation的分布为高斯分布,FID通过计算两组representation之间的Fréchet距离,FID值越小越好。
- FID存在的问题是需要sample出很多的影像才能计算,如FID-10k就是sample了10k张影像来评估模型的生成性能。
- CLIP Score代表通过使用经由400 million个影像-文本对上预训练的CLIP模型,将生成的影像和该影像对应的文本描述同时输入预训练好的CLIP模型中。
- CLIP模型利用图像编码器和文本编码器将输入的影像和文本描述编码为特征向量。
- 给影像向量与文本向量之间计算相似性,相似性越高证明生成的影像和文本描述越贴合,则生成的影像质量很高。
2.1.2 Generation Model
经研究之后,Generation中的Diffusion Model的大小对生成图像的质量影响非常小。上图的U-Net size表示Diffusion Model中的Noise Predictor的大小。
训练过程
- Noise需要添加在中间产物(小图或潜在表征)上。
- 先利用Encoder将一幅影像进行编码,得到潜在表征。
- sample一个噪声,添加在潜在表征上,重复添加噪声的过程,直到最后得到的潜在表征变为纯粹的噪声。
- 将某一step添加噪声的潜在表征作为输入,该step的编号代表当前噪声的覆盖程度作为输入,还有对原始图像的文本描述进行编码之后得到的文本潜在向量作为输入。
- 训练Noise Predictor来预测当前的step的噪声潜在表征,当前step添加进去的噪声分布作为Ground Truth进行监督。
生成过程
- 首先纯粹从高斯分布(正态分布)中sample出的潜在表征输入Denoise。
- 对当前生成的文本描述进行编码之后作为条件输入Denoise。
- Denoise通过训练好Noise Predictor预测噪声来去除一些潜在表征在文本描述条件下的噪声。
- 重复去除噪声的步骤。
- 直到产生的潜在表征达到质量要求之后,将潜在表征输入训练好的Decoder来解码为最终的生成影像。
2.1.3 Decoder
Decoder在训练时不需要影像配对的文本描述。
Generation输出为低分辨率影像时对Decoder训练的策略
- 可以将训练影像都进行下采样操作,得到成对的下采样后影像与原始图像对。
- 利用低分辨率和原始影像对进行Decoder的训练。
Generation输出为潜在表征时对Decoder训练的策略
- 训练一个Auto-encoder,将输入的影像进行编码之后得到潜在表征。
- 将潜在表征通过Decoder还原为原始影像。
- 训练目的是将Decoder还原的影像与原始影像越接近。
- 训练好Decoder之后,Decoder就可以执行将输入的潜在表征解码为生成的最终影像。
3、Diffusion Model的数学原理
3.1 Denoising DIffusion Probabilistic Models的算法
3.1.1 Training过程
- repeat---表示一直重复步骤1到步骤5的内容,直到converged结束。
- ---首先sample一张干净的影像,即所需要生成的影像。
- ---从1到T之间sample一个整数t,T通常会设定一个较大的数值,例如T=1000。
- ---从一个高斯分布(正态分布)中sample一个noise为,该正态分布的平均值mean为0,每一个维度的方差variance为1。sample的noise 的shape与原始影像相同。
- ---公式中红色框中所做的事是和进行权值相加,权值是事先定好的一组权重,通常设计是由大到小,最大,则如果第三步sample的t值越大,代表越小,代表原始图像占比越小,noise占比越多,则t值sample到越大,代表噪声添加的越多。进行权值相加之后得到的是一个加了噪声的影像,作为函数的输入,这个代表Noise Predictor network,通过输入一个加了噪声的影像和sample到的数值t,得到一个预测的noise分布。学习的目标是Noise Predictor预测出的Noise与第四步sample到的Ground Truth噪声十分接近。
- 概念中的Diffusion Model运行应该是一点一点在原始影像上添加噪声,每次训练Noise Predictor的时候是把有噪声的影像作为输入,再输入step的数值来预测这个step添加进来的噪声分布,还原的时候将有噪声的影像还原为该step添加噪声之前的状态。想象中是噪声是一点一点添加进去,Denoise时候也是一点一点去除噪声。
- 实际上DDPM的运行是给原始的影像直接按照权重比例添加一个噪声,得到有噪声的影像。训练时就是将有噪声的影像和 t 作为输入,直接预测添加的噪声分布。实际上噪声并没有一步一步添加进来,并没有多次添加噪声,而是一次直接将噪声添加进去,在Denoise时候也是一次就将噪声去除。
3.1.2 Sampling过程
- ---首先从正态分布中sample一个全是Noise的影像。
- ---Reverse process过程生成影像,需要循环T次。
- ---每次生成图的时候,都要先从正态分布中sample一个Noise z。
- ---其中是上一轮循环中得到的,减去带有权重的Denoise中的Noise Predictor预测的噪声分布。式子中的关键点为最后需要加上一个噪声,这里是一个常数。最终得到的影像为。
3.2 影像生成模型本质上的共同目标
影像生成模型本质上的共同目标是在输入端有一个简单已知的概率分布,通常是高斯分布。从高斯分布中sample出一个向量z出来,输入到一个Network中G(z)=x,输出为一张影像x。就算输入是很简单的高斯分布sample,通过一个Network之后转换为一个非常复杂的影像x,该影像x应该与真实的影像分布越接近。
更常见的应用是给一段文本描述,根据描述来生成图形。这段文本描述称之为条件Condition,但是对应的影像是千变万化的,此时模型的目标是产生出的影像分布与真实影像的分布越接近越好。
3.3 最大似然估计Maximum Likelihood Estimation
3.3.1 概述
最大似然估计(Maximum Likelihood Estimation,简称MLE)是统计学中一种用于估计概率分布参数的方法。MLE的目标是找到最大化似然函数的参数值,其中似然函数衡量观测数据与分布之间的拟合程度。
MLE的基本思想是找到使观测数据最有可能发生的参数值。这是通过计算在不同的参数值下获得观测数据的概率来实现的。为了进行MLE,需要根据对概率分布的假设定义似然函数。然后通过对参数求导并令导数等于零来最大化似然函数。这将得到一组方程,可以通过数值求解来获得参数估计值。
如何去衡量两个分布之间的距离,常用影像生成模型的衡量方法是最大似然估计。
- 假设Network的参数用表示,根据Network生成的分布用表示,真实分布用表示。
- 首先从中sample出影像,这些影像是训练模型时所需要的训练数据。
- 假设能够计算Network 能够生成的某一张影像的几率(实际上因为过于复杂有可能是做不到的)。
- 要得出的模型参数即可以让从真实域中sample出的影像,被Network产生出来的概率最大的参数。
- 目标函数为上图公式,代表需要寻找一组参数 ,这个参数需要让 部分的值最大。
- 代表对sample出的每一幅影像,都采用来计算出模型可以生成该幅影像的概率,之后将每一张的概率相乘。
- 最终得到的为模型学习所需要得到的参数。
3.3.2 目标函数详解
- 因为arg max操作的目的是取最大值,则给原式取log不影响最终结果。
- ---左边式子中和最大,近似于每个的概率最大,也就近似于右边式子的期望越大。切比雪夫大数定律,当m足够大时收敛于均值的m倍。
- ---等同于对x做积分。
- ---不会影响结果,只跟data本身有关。但是加入这一项之后有助于公式合并。
- ---则此时与KL散度Kullback-Leibler Divergence等价。KL散度作用是计算两个概率分布之间的差异程度。KL散度的值越大就代表两个概率分布之间的差异越大。
- 在求取模型参数的目标中,最大似然估计等价于最小化KL散度。
3.4 VAE与DDPM的相似推导
3.4.1 VAE的推导
- ---要去计算x被生成的概率需要去看每一个z被生成的概率,再看每个z生成x的概率,再对所有的z求积分。其中每个z被生成的概率是已知,如从高斯分布中sample的z。
- ---代表每个z经过Network生成x的概率。式子中,若一个z经过Network生成的影像完全逐像素相等于x,此时概率为1,反之就是0。但是生成的影像几乎不可能和原始影像x逐像素完全相同,这样定义的坏处是每张生成的影像的概率都可能是0。
- VAE中的假设是,输入z,输出G(z),G(z)代表高斯分布的mean均值。
- ---式子中的随机发生的概率Probability Density正比于G(z)与x的距离的第二范式,取负号,再取e的指数函数。假设G(z)代表高斯分布的均值mean,的概率密度函数与后边式子成正比,如果某一张影像x与G(z)越接近,的概率就越大。
3.4.2 VAE中logP(x)的下界
在VAE中无法直接最大化P(x),通常真正最大化的是P(x)的下界。
- ---无论是什么分布,等式都成立。logP(x)与z无关,提出积分符号外边之后,积分里边的值等于1。
- ---根据贝叶斯公式可以得到。
- ---为与的KL散度。KL散度衡大于等于0,。
- ---则对其取期望值,就得到概率的下界。
- 在VAE中是Encoder。
- 在做VAE时就相当于是寻找一个好的方法来最大化下界。
3.4.3 DDPM的推导
当DDPM生成影像时,可以把过程想成生成了一个高斯分布的mean,如果与生成的完全相同,此时概率最大。(假设为高斯分布并不完全合理,且假设每个维度都是固定的,文献中的实验都证明将方差考虑进来并不会提升性能。假设输出为高斯分布因为对中间部分推导有益)
整个DDPM在生成某一幅影像的概率可以写成上式。对所有可能的做积分。
3.4.4 q(x_t|x_t-1)的推导
- 先有一张与相乘,为事先设定好的超参数,可以调整。
- 乘上从高斯分布中sample出的噪声。
- 则概率分布其实也是高斯分布,均值为,方差为,每个维度的方差都相同。
- 的计算实际上是可以直接算出的,并不需要按照步骤计算。
- 每一个step中从高斯分布中sample出的噪声之间是相互独立的。
- 将上一个step的公式带入到中,可以得到与之间的关系。
- 在同一个高斯分布中sample出两个噪声,并乘上两个不同的权重,加起来之后的概率分布项可以简化成只从高斯分布中sample一次噪声乘上一个权重。相互独立的高斯分布的和仍然是高斯分布。
- 以此类推,整个扩散过程可以整合为图中式子。
- 为了公式简化,设定为,。
- 实际上整个扩散过程是一步到位的只需要从高斯分布中sample一次噪声。
3.4.5 DDPM中logP(x)的下界
- DDPM的下界在形式上与VAE十分相似,且推导过程也是相同步骤。
- DDPM中的为扩散过程Diffusion Process。
- 需要最大化的下界在整理之后得到可以计算的公式。
- 第一项是的概率分布,对取期望值。
- 第二项为与的KL散度。(第二项可以不用计算,是从一个高斯分布中sample出的噪声的概率,与Network参数无关。是扩散过程,人工设定好的)
- 第三项中期望值的概率分布是,要计算的是两个分布中的KL散度
- ---假设已经看到并且做了t次扩散之后得到,但是中间的过程还不可知,此时这个式子就是代表的分布。
- 可以算出的是、、。
- 同经公式变换化简之后得到,已知化简后式子中都是高斯分布。
- 通过推导 的均值mean和方差variance可以得出。
如何去最小化KL散度
- 并不需要实际的计算出KL散度,只需要最小化KL散度。
- 是一个高斯分布,该高斯分布的均值mean和方差variance是固定的,因为该分布是人工设定好的,与Network参数无关。
- 是由Denoise Model决定的,但是均值variance也是固定的,假设输出的高斯分布的每个维度的方差都是固定值。也有文献讨论过均值variance方差但是并不影响结果。均值mean取决于Denoise Model,如果目标是让两个分布的KL散度越大,即让两个分布越接近越好。
- 其中的分布固定,分布的均值variance固定,均值mean可以变化。则需要使两个分布越接近越好,通过将分布的均值mean与分布的均值mean越接近越好。
- 实际上的操作是,的均值mean已知,的均值mean是将输入Denoise之后输出的。通过训练Denoise Model,让与的均值mean越接近。
- 期望中是先给定的,是从训练集中sample出的一张真实影像。需要通过将乘一个系数,从高斯分布中sample的噪声乘以一个系数,sample出来。
- Denoise Model接受输入和 t ,输出的结果需要与的均值mean越接近越好,这个均值是和的某种插值interpolation。
- 的均值mean相当于的分布,但是实际上均值mean的公式中中并没有。
- 再将均值进行化简,和之间的关系是已知的,经过移项处理过后将代进去。
- 在要真实生成的目标中,Network真正需要去预测的是加到影像中的噪声,与均为设定好的超参数,为输入。
- 在DDPM论文中视图训练与,但是对表现并没有提升。
3.5 补充说明部分
3.5.1 Sampling算法中需要额外添加噪声猜想
- 需要考虑的是为什么在Sampling算法中还需要多添加一个噪声。
- 在Denoise model输出的是一个高斯分布的均值mean,在做sample时候需要加上一个噪声代表考虑高斯分布的方差variance。
- 若直接取均值mean,代表取高斯分布中的概率密度函数最大的输出。
猜想:
- Diffusion Model其实是一种Autoregressive Model妥协的结果。
- Autoregressive Model的一次到位的结果通常不好,将其改为N个step。
- 每次Denoise的步骤相当于Autoregressive的一个step,在做Autoregressive时每个step需要添加一点噪声,即一点随机性结果才会好,也许在Denoise时也加一点噪声,随机性会好。
- 通过验证这种说法,当与原文设定相同时,同样的 可以正常生成影像。
- 当时,就无法生成正常影像。