扩散模型DDPM:先前向加噪后反向去噪从而建立噪声估计模型pg电子官方网站

  在写本文之前,我反复看了网上很多阐述DDPM的文章,实话说,一开始看到那种一上来就一堆公式的,起初基本看不下去,虽然后来 慢慢的都看得下去了,但如果对于一个初次接触DDPM的初学者来说,一上来就一堆公式确实容易把人绕晕,但如果没有公式,则又没法透彻理解背后的算法步骤

  两相权衡,本文将侧重算法每一步的剖析,而公式更多为解释算法原理而服务,说白了,侧重原理 其次公式,毕竟原理透彻了,公式也就自然而然的能写出来了

  简单来讲,扩散模型的灵感来自非平衡热力学,通过定义了一个扩散步骤的马尔可夫链,以缓慢地将「符合高斯分布的随机噪声」添加到数据中,然后反转扩散过程以从噪声中构建所需的数据样本

  随后,2019年,斯坦福一在读博士宋飏和导师通过此文《Generative Modeling by Estimating Gradients of the Data Distribution》提出了一种新方法来构建生成模型:即不需要估计数据的概率分布(高维曲面),相反,它估计的是分布的梯度(可以看成是高维曲面的斜率)

  一方面,从预测转换图像改进为预测噪声(强调这点的文章太少了,可它是DDPM的关键,更是DDPM的本质) 作者认为,每次直接从预测,这种图像到图像的转化不太好优化,所以直接去预测从到这一步所添加的噪声,这样就简化了问题:毕竟噪声一旦被预测出来,减去噪声即得 这种操作就有点类似ResNet的残差结构。每次新增一些层,模型不是直接从 去预测(这样比较困难),而是让新增的层去预测()。这样新增层不用全部重新学习,而是学习原来已经学习到的 和真实值 之间的残差就行(residual) DDPM采用了一个U-Net 结构的Autoencoder来对 时刻的高斯噪声进行预测,训练目标即希望预测的噪声和真实的噪声一致,所以目标函数为和的 Loss: 这里的标签是正向扩散过程中,我们每一步添加的,所以是已知的 这里的就对应了U-Net 模型结构 至于 就是U-Net 的输入之外的另一个输入time embedding「类似transformer里的正弦位置编码,主要用于告诉 U-Net模型,现在到了反向过程的第几步,相当于引导U-Net生成」 通过这个简单的损失函数,模型就可以训练起来了

  另一方面,DDPM只预测正态分布的均值虽然正态分布由均值和方差决定,但作者在这里发现,其实模型不需要学方差,只需要学习均值就行。逆向过程中高斯分布的方差项直接使用一个常数,模型的效果就已经很好。所以就再一次降低了模型的优化难度

  DDPM也有些类似VAE,也可以将其当做一个encoder-decoder的结构,但是有几点区别:

  DDPM的每一步输出输出都是同样维度大小的,但对一般的自编码器(AE/VAE等),往往中间的bottleneck特征会比输入小很多

  扩散模型有步数step的概念(time step、time embedding),模型要经过很多步才能生成图片,且在所有step中,U-Net都是共享参数的

  DDPM使得扩散模型可以在真实数据集上work得很好之后,一下子吸引了很多人的兴趣。因为DDPM在数学上简洁美观,无论正向还是逆向,都是高斯分布,可以做很多推理证明,而且还有很多不错的性质,2020年底左右,OpenAI推出了 improved DDPM

  DDPM的逆向过程中,高斯分布的方差项直接使用一个常数而不用学习 improved DDPM作者就觉得如果对方差也进行学习的话,效果应该会更好,改了之后果然取样和生成效果都好了很多

  DDPM添加噪声时采用的线性的variance schedule改为余弦schedule,效果更好(类似学习率从线性改为余弦)

  2. 提出了新的归一化方式——Adaptive Group Normalization,相当于根据步数进行自适应的归一化,这个方法是对group归一化的一个改进: 上面公式中的是残差块激活函数的输出,是一个线性层对时步和后面用到的类别信息的嵌入。组归一化是对输入的通道方向进行分组归一化的归一化方法,可以理解为局部LayerNorm

  3. 使用classifier guidance的方法,引导模型进行采样和生成这样不仅使生成的图片更逼真,而且加速了反向采样过程。论文中,只需要25次采样,就可以从噪声生成图片 所谓classifier guided diffusion,即在反向过程训练U-Net的同时,也训练一个简单的图片分类器。这个分类器是在ImageNet上训练的,只不过图片加了很多噪声 (毕竟扩散模型的输入始终是加了很多噪声的,跟真实的ImageNet图片是很不一样的,是从头训练的) 当采样之后,直接扔给分类器,就可以看到图片分类是否正确,这时候就可以算一个交叉熵目标函数,对应的就得到了一个梯度。之后使用分类器对的梯度信息指导扩散模型的采样和生成

  这个梯度暗含了当前图片是否包含物体,以及这个物体是否真实的信息。通过这种梯度的引导,就可以帮助U-Net将图片生成的更加真实,要包含各种细节纹理,而不是意思到了就行,要和真实物体匹配上

  CLIP guidance:将简单的分类器换成CLIP之后,文本和图像就联系起来了。此时不光可以利用这个梯度引导模型采用和生成,而且可以利用文本指导其采样和生成

  image侧引导:除了利用图像重建进行像素级别的引导,还可以做图像特征和风格层面的引导,只需要一个gram matrix就行

  text 侧:可以用训练好的NLP大模型做引导 以上所有引导方式,都是下面目标函数里的,即模型的输入不光是和time embedding,还有condition,加了condition之后,可以让模型的生成又快又好 且值得一提的是,额外引入一个网络来指导,推理的时候比较复杂 (扩散模型需要反复迭代,每次迭代都需要额外算一个分数),所以引出了后续工作classifier free guidance

  所谓classifier free guidance的方式,只是改变了模型输入的内容,除了 conditional输入外(随机高斯噪声输入加引导信息)pg电子官方网站,还有 unconditional 的 采样输入,两种输入都会被送到同一个 diffusion model,从而让其能够具有无条件和有条件生成的能力

  最后反向扩散做生成时,我们用无条件的生成,也能达到类似有条件生成的效果,这样一来就摆脱了分类器的限制,所以叫classifier free guidance 比如在训练时使用图像-文本对,这时可以使用文本做指导信号,也就是训练时使用文本作为生成图像。然后把去掉,替换为一个空集(空的序列),生成另外的输出

  总之,扩散模型本来训练就很贵了,classifier free guidance这种方式在训练时需要生成两个输出,所以训练更贵了。但是这个方法确实效果好,所以在GLIDE 、DALL·E2和Imagen里都用了,而且都提到这是一个很重要的技巧,用了这么多技巧之后,GLIDE终于是一个很好的文生图模型了,只用了35亿参数,生成效果和分数就比DALL·E(120亿参数)还好

  OpenAI一看GLIDE这个方向靠谱,就马上跟进,不再考虑DALL·E的VQ-VAE路线了,而是将GLIDE改为层级式生成(56→256→1024)并加入prior网络等等,最终得到了DALL·E2 (具体在下一篇文章会重点讲解)

  2021年,Jonathan Ho和他在谷歌研究中心的同事Tim Salimans,与其他地方的团队合作,展示了如何结合大型语言模型的信息与图像生成扩散模型,即用文本(比如“金鱼在海滩上喝可口可乐”)指导扩散过程,从而生成图像,如 DALL·E2 这样的从文本到图像模型成功的背后原因,就是这种“引导扩散”(guided diffusion)过程

  回到DDPM,每一个噪声都是在前一时刻增加噪声而来的,从最开始的 时刻开始,最终得到 时刻的纯噪声图像。不过问题来是为什么要加噪声?

  1. Diffusion的最终目标是去噪以生成图片,而为了推导出逆向的去噪方法,必须了解增加噪声的原理。同时,添加噪声的过程其实就是不断构建标签的过程。如果在前一时刻可以预测出来后一时刻的噪声,便能很方便地实现还原操作(就和人走路一样,不管你从哪来,哪怕走过万水千山,最后都可按原路返回至原出发点) 说白了当你学会了怎么加噪(前向扩散),就一定能知道怎么去噪(逆向生成),毕竟知道怎么来 也必知道怎么回

  2. 且在噪声的添加过程中,每一步都要保持尽量相同的噪声扩散幅度。比如,在给上图加噪的过程中,前期的分布非常均匀,添加一些噪声便可以将原始分布改变,但到后期,需要添加更多的噪声,方可保证噪声扩散幅度相同(这就像往水中加糖,为了使糖的甜味增长相同,后期需要加更多的糖)

  所以DDPM为了从随机噪声中直接生成图片,首先需要训练一个噪声估计模型,然后将输入的随机噪声还原成图片,相当于就两个关键,一个是训练过程,一个是推理过程

  训练过程:随机生成噪声,经过步将噪声扩散到输入原始图片中,破坏后的图片,学习破坏图片的预估噪声,并用L2 loss约束预估噪声与原始输入噪声编辑的距离

  前向过程(forward process)也称为扩散过程(diffusion process),简单理解就是对原始图片通过逐步添加「方差为的高斯噪声」变成,从而达到破坏图片的目的,如下图

  正态分布有两个参数:均值和方差。其中,是分布的均值,决定了分布的中心位置,σ 是标准差,决定了分布的宽度

  上面的方差之所以表示为,原因在于我们一般处于情况下,而是单位矩阵,表明每个维度有相同的标准偏差

  且是事先给定的常量,代表从到这一步的方差,且正因为设置的比较小,所以使得的均值在附近,换言之,相当于就是在的基础上加了一些噪声,而且是渐进式逐步增加/扩散的,当然 从加噪大小的角度上讲,前期加噪较弱,后期加噪加强,所以在DDPM的论文中,作者取为从0.0001到0.02的线性递增序列

  接下来,如果我们定义 , 且 『被称为Noise schedule,通常是一些列很小的值』,以及 是高斯噪声,便可以得到 的采样值

  换言之,所以 在 条件下的分布就是均值为 , 方差为 的正态分布 (下式的意义在于,只需要给出,便可以计算出任意时刻的)

  考虑到可能会有读者对这个 到 的一步到位感到困惑,而一般的同类文章不会展开的特别细,故本文细致展开下(能拆10步则10步 确保阅读无障碍)首先通过可知,,把这个代入到的表达式后,再展开即可得考虑到「两个独立正态分布的随机变量之和是正态的,其均值是两个均值之和,其方差是两个方差之和(即标准差的平方是标准差的平方),比如两个方差不同的高斯分布和相加等于一个新的高斯分布」,然后再通过重参数技巧可得 对此,本文参考文献中的这篇《Understanding Diffusion Models: A Unified Perspective》也解释了这几个步骤最后定义一个累积混合系数, ,即,可得

  更具体而言,正向扩散和逆扩散过程都是马尔可夫,唯一的区别就是正向扩散里每一个条件概率的高斯分布的均值和方差都是已经确定的(依赖于 和 ),而逆扩散过程里面的均值和方差需要通过网络学出来,怎么个学法呢?

  1. 有人可能要说,直接把上一节得到的移个项不就行了(先把带的项移到等式左边,然后所有项各自除以,最后把等式右边的提取到括号外边即可)? 但问题在于中的是个随机变量,意味着 也是个随机变量,其具体取值由 实际取值决定「相当于现在我们有一个具体的 ,它对应着 的某个取值,但是什么值我们并不知道」,所以我们只能以前向过程的 取值为标签,训练一个模型去估计它,即: 其中就是所谓的模型,用来近似真实的(即前向过程采样出来的) ;相应地,就是 的近似,或者,你也可以无视,直接把 视为模型 为了训练它,最直接的想法就是用 L2 损失或者

  理论上没问题,但是实际效果很差,为什么呢?如果直接用 ,那么中间的都没用了,整个 DDPM 就退化成了 VAE 的结构,但是

  VAE 的生成模型和后验都是自己学习出来的,二者双向奔赴共同优化去寻找最优解 而 DDPM 的后验是人为指定的(即),并且由于 ,基本上就是一个标准正态分布,磨灭掉了几乎所有的输入信息,全靠生成模型这一边去恢复,难度未免过大..

  ,就可以从高斯噪声 还原出原图分布 因为我们可以证明如果前向满足高斯分布且 足够小,其逆向

  仍然是一个高斯分布 那样,我们便可以使用「参数为 θ 的U-Net+attention 结构」去预测这样的一个逆向的分布(类似VAE): 不过在DDPM的论文中,作者把条件概率 的方差直接取了,而不是上面说的需要网络去估计的 ,所以说实际上只有均值需要网络去估计

  可惜 和 是未知的,事情到这里似乎走入了僵局,但是我们敏锐地发现和 是已知的,这样,等式右边的三项就都可知了 相当于如果给上式加上 为条件,则立马柳暗花明,而一旦知道了 ,便可以直接写出

  解释下上面7.1~7.5这5个步骤的推导7.1依据的是7.2中,分母部分依据的是 分子部分依据的是7.3依据的是分子分母同时除以至于7.3到7.4 依据的是 且由前向扩散过程的特性『别忘了2.1.2节中,有 』,可知最后,再解释下怎么从7.4到的7.5 先举一个最简单的例子,比如对于 ,稍加转化下即是,而这个则对应于7.5中的则对应于7.5中的 且其均值为,方差为,从而有

  大部分文章对上面这个的推导都是一步到位的,但本文为细致起见,故还是一步步来推导下首先直接把和代入进去,可得

  接下来,我们可以进一步观察到 分子中的后半部分有这一项,怎么进一步化简呢?接下来非常关键(截止23年5月份之前,暂时没看到有其他中英文资料解释了这个细节) 好在之前有定义:,即,从而有

  以下分别对上面的三行公式做解释说明: 接着把上阶段2得到的式子的分子拆成三项,且三项中最后两项的分子分母同时乘以 然后再把上一步骤中分子三项中的前两项通过提取出从而实现合并 前两项合并之后,再对前两项中第一项的分子分母同时乘以,然后对第三项的分子分母同时除以,即可得,原因很简单,因为:接下来,针对上面阶段3得到的式子的前两项再做合并,合并中用到了一个细节,即,原因也同样很简单,根据上面阶段2出现的这个式子而来,再之后就更eazy 便不再赘述了

  总之,从最终得到的结果可以看出,在给定 的条件下,后验条件高斯分布的均值只和超参数、、有关,即

  生成模型的本质是根据给定的样本(训练数据)生成新样本具体而言,给定一批训练数据,假设其服从某种复杂的真实分布,则给定的训练数据可视为从该真实分布中采样的观测样本如果能从这些观测样本中估计出训练数据的真实分布,相当于就可以从该分布(估计出的接近真实分布的分布)中不断的采样出新的样本了,故说白了,生产模型的目标就是估计训练数据的真实分布,并假定其真实分布为从而问题自然而然就变成了尽可能缩小估计的分布与真实分布之间的差距

  与之前介绍的VAE相比pg电子官方网站,扩散模型的隐变量是和原始数据是同维度的,而且encoder(即扩散过程)是固定的

  既然扩散模型是隐变量模型,那么我们可以基于变分推断来得到variational lower bound(VLB,又称ELBO)作为最大化优化目标,当然实际训练时一般对VLB取负,即我们要最小化目标分布的负对数似然:

  考虑到本文的定位起见,逐一解释下上面推导的每一行第一行:由 KL 散度的非负性质(KL 散度始终大于等于零),我们得到如下不等式:

  老规矩,上面整个推导总计九行,下面逐行解释下上面推导的每一行(纵使其他所有文章都不解释,本文也要给你解释的明明白白)第一行,直接给出了 的定义,即计算概率分布 和之间的对数比值的期望(注意,这是咱们的目标)

  第五行,将 项的对数比值分解为两个对数比值的和,其中一个涉及和 ,另一个涉及和 ,相当于补了个

  这里面的关键是,即同时乘以后,怎么就得到上式了呢,分母部分一目了然,直接乘上的,但分子部分呢,明明应该是,则就变成了这个呢:?好问题! 原因在于这两个式子是等价的,即(定义为等式1)

  故有『下面五个等式先后依据:马尔科夫假设倒推、条件概率定义、分母中联合概率定义、分子中联合概率定义、分子分母同时约掉』

  第六行,将第五行的中间项一分为二,即拆分为两个求和项第七行,将第五行中间部分得到的两个求和项的第二个求和项的最后一项分离出来,说白了,将第二个求和项的范围调整为从1到,啥意思呢 首先,第五行中间部分的两个求和项可以表示为

  接下来,关键的一步在于,上面中括号里的第二个求和项在求和过程中相邻两项会相互抵消 「依据:」 具体地,当时的会和当时的相互抵消,这样的抵消会发生在每一对相邻的项上,从2到,最后,只剩下和时的两项,即 从而得到最终整个第7行所示的结果,如下第八行,上一行第7行总共4个带log的项,把最后两个log项拆开成4个式子,抵消两个,还分别剩一个、一个,然后与最初4项中的第1项合并,即可得到整个第八行的结果

  第九行,将最后一项中的负号移到对数里面,并将整个表达式重写为一系列 KL 散度项的和,这些项分别为 、 和

  最后得到的表达式表示了最初我们想求解的最终是一系列 KL 散度项之和,我们可以利用这个结果进行参数优化,使得两个概率分布之间的差异最小

  首先,是和优化无关的(由于前向过程 没有可学习参数,而 则是纯高斯噪声,因此 可以当做常量忽略),所以不用管,只用看右边的

  : 对于真实后验分布 ,我们已经在上一节2.2.2节推导出其解析形式,这是一个高斯分布,其均值和方差为

  对于估计分布 ,其是我们网络期望拟合的目标分布,也是一个高斯分布,均值用网络估计,方差被设置为了一个和 有关的常数

  3. 考虑到,如果有两个分布 p,q 都是高斯分布,则他们的KL散度为 然后因为这两个分布的方差全是常数,和优化无关『说白了,去掉方差相关的项,只留下均值相关的 』,所以其实优化目标就是两个分布均值的二范数,从而可得

  “怎么来的?我再细致解释下,对于这个公式而言这里的 是在分布 下的期望,当我们的表达式代入后,得到:在这个式子中, 是一个服从标准正态分布的随机变量,而则取决于和。因此,这个期望 实际上是在 和 的联合分布下的期望(在 和 的所有可能值上取平均),于是我们得到:

  4. 这个时候我们可以直接整个网络出来直接学习 ,然后再去预测 因为是 的输入,的量都是常数,所以其中的未知量其实只有,所以我们干脆把需要学习的定义成: 也就是说,不用网络预测,而是用网络先预测噪声(注意,这是个关键步骤),然后把预测出来的噪声带入到定义好的表达式中去计算出预测的均值即可

  经过这样一番推导之后就是个 L2 loss,网络的输入是一张和噪声线性组合的图片,然后要估计出来这个噪声:

  由上可知,DDPM的关键是训练模型,使其预测的与真实用于破坏的相近,用L2距离刻画相近程度就好,总之,我们的Loss就是如下公式『相当于训练时,网络输入为 (由 和噪声 线性组合而成) 和时刻 ,输出要尽可能的拟合输入的噪声 (通过L2 loss约束)』

  下图可以总结噪声估计模型的训练过程 (依然是经典的那一套:对比预测噪声predicted noise与真实噪声true noise 之间的差距 建loss 反向传播,训练好之后,好预测噪声,毕竟模糊的图片减掉噪声 不就得到清晰的图片了么)

  从最终得到的结果可以看出,在给定 的条件下后验条件高斯分布的均值只和超参数、、有关,即方差只与超参数有关,即从而通过以上的方差和均值,我们就得到了的解析形式

  通过2.2节的最后,我们估计到了噪声估测模型 ,接下来要生成模型就很简单了。从N(0,1)中随机生成一个噪声作为,然后再用该模型逐步从估测噪声,并用去噪公式逐渐恢复到 即可,见如下伪代码

  用通俗的语言来说,如何去噪生成清晰图片呢? 如上述第4行代码所述, 比较模糊的图片 减掉噪声估计器预测出来的噪声 ( 只是实际操作时,减掉的是与一个常数 相乘之后的噪声 ),得到的结果乘以 之后,最后再加上一个带 的

  换言之,推理时,我们从各项独立的高斯分布 开始,一共 步,每一步其实都是用了一次reparameterization trick

 

TEL

0571-86721188
13800006565