我公众号文章目录综述:
https://wangguisen.blog.csdn.net/article/details/
往期重点回顾:
生成模型与极大似然简述
变分自编码器 VAE 详解
保姆级讲解 生成对抗网络 GAN
往期回顾:
图像分类篇[10]:EfficientNet V1网络详解
图像分类篇[9]:ShuffleNet V2网络详解及复现
图像分类篇[8]:ShuffleNet V1网络详解
图像分类篇[7]:MobileNet V3网络详解及复现
保姆级讲解BERT
保姆级讲解Transformer
关于Attention的超详细讲解(Attention、Self-Attention、Multi-Head Attention)
目录
一、引入
二、扩散原理阐述
2.1、直观理解
2.2、前向过程(扩散)
2.3、反向过程(去噪)
2.4、模型训练
三、算法流程概述
四、数学描述
4.1、前向过程(扩散)
4.2、反向过程(去噪)
4.3、训练损失
五、torch复现
References
一、引入
近年AIGC的爆火离不开人工智能在图像生成、文本生成以及多模态等领域的不断累积,其中生成模型的发展占据了很大功劳,如:生成对抗网络 GAN 及其一系列变体、变分自编码器 VAE 及其一系列变体、自回归模型 AR、流模型 flow ,以及近年大火的扩散模型 Diffusion Model 等。
扩散模型的大火并非横空出世,早在2015年就有人提出了类似的想法,直到2020年才提出了经典的 Denoising Diffusion Probabilistic Models(DDPM),像OpenAI、NovelAI、NVIDIA和Google成功的训练了大规模模型之后,它们吸引了很多人注意,后续有了很多基于扩散模型的变体,比如有:GLIDE、DALLE-2、Imagen和年底爆火的完全开源的稳定扩散模型(Stable Diffusion)。
扩散模型与之前所有的生成方法有着本质的区别:
直观的说它是将图像生成过程(采样)分解为许多小的去噪步骤,其实 Diffusion 的含义本质上就是一个迭代过程,实线箭头用于扩散步骤中添加随机噪声,虚线箭头代表的是通过学习逆向扩散过程从噪声中重构所需的数据样本。引入噪声导致了信息的衰减,再通过噪声尝试还原原始数据,多次迭代最小化损失后,能够使模型在给定噪声输入的情况下学习生成新图像。
所以Diffusion模型和其它生成模型的区别是,它不是直接的图像->潜变量、潜变量->图像的一步到位,它是一步一步的逐渐分解、逐渐去噪的过程。
当然有关Diffusion的理解和变体有很多,但是扩散模型从本质上讲就是DDPM,所以本文主要对DDPM的原理进行讲解,并给出DDPM的扩散过程、去噪过程、训练损失的详细推导,对于掌握Diffusion算法原理只需要抓住以下四点即可:
前向过程(扩散);
反向过程(去噪、采样);
如何训练;
如何推断。
二、扩散原理阐述
扩散模型包括 前向扩散过程 和 反向去噪过程(采样),前向阶段对图像逐步施加噪声,直至图像被破坏变成完全的高斯噪声,然后在反向阶段学习从高斯噪声还原为原始图像的过程。
2.1、直观理解
散模型的目的是什么?
学习从纯噪声生成图片的方法。
扩散模型是怎么做的?
训练一个UNet,接受一系列加了噪声的图片,学习预测所加的噪声。
前向过程在干什么?
逐步向真实图片添加噪声最终得到一个纯噪声;
对于训练集中的每张图片,都能生成一系列的噪声程度不同的加噪图片;
在训练时,这些 【不同程度的噪声图片 + 生成它们所用的噪声】 是实际的训练样本。
反向过程在干什么?
训练好模型后,采样、生成图片。
2.2、前向过程(扩散)
前向过程在原始输入图像上逐步添加随机噪声,这个噪声服从高斯分布,每一步得到的图像只和上一步的加噪结果相关,逐步添加噪声至步,可以得到趋向于纯粹噪声的图像,如下图所示:
后面有详细的推导,公式比较多,这里先提前把主要的列一下方便阐述。
对于将一张图片,从的逐步加噪破坏的公式为:
其中:
表示第步的图像;
是一个满足正态分布的随机噪声,;
是图片的权重,是噪声的权重;
定义:
随着的增加,噪声的占比会越来越大,所以添加的噪声强度也会越来越大,也就是说图片的权重要越来越小,噪声的权重要越来越大。因为随着扩散过程的增加,图像中噪声的占比也会越来越大,我们想要进一步破坏它的结构,就需要添加更多的噪声。
换句话说,一开始图像比较清晰,这个时候添加的噪声小一些,随着图像的噪声越来越多,这个时候再加一点噪声的话,对原来的图像就没什么影响了,因为它本身就有好多噪声了,所以随着图像的噪声越来越多,后面的步骤就要加更多的噪声。
实际训练过程中会比较大(DDPM原文中为1000),所以会有从递推到的公式:
其中:
、有一个固定的已知函数,是可以直接进行计算的;
为随机产生的噪声;
所以整个式子是已知的,式、就可以描述前向过程了,用于将一张图片的逐步破坏,用于一步到位的破坏。
2.3、反向过程(去噪)
反向过程则是不断去除噪声的过程,给定一个噪声图片,对它一步步的去噪还原,直至最终将原始图像给恢复出来,如下图所示:
去噪的过程,、、都是已知的,只有公式中的真实噪声是未知的,因为它是随机采样的。所以需要一个神经网络把给学出来,也就是说训练一个由和估测噪声的模型:
其中就是模型的参数,通常使用UNet作为预估噪声的模型。
2.4、模型训练
所以说反向过程其实就是训练网络去学习分解过程每一步的噪声,当网络训练好之后,输入一张噪声图片,通过网络就能把加的噪声给求出来,噪声有了代入公式,就能把步的比较清晰的图给求出来了,一步步往前迭代就行了。
采用L2距离刻画相近程度就可以,DDPM的关键是训练,目的就是使预测的噪声与真实用于破坏的噪声相近:
模型训练完后,只要给定随机高斯噪声,就可以生成一张从未见过的图像。
UNet本文不做介绍,结构图为:
额外强调的是:Unet里有一个位置编码,是关于时间步的,每个时间步是有一个线性调度器的,每个时间添加的噪声的方差是不一样的,所以将时间步作为编码嵌入的话,可以将模型预测的噪声更加的准确。
三、算法流程概述
再次总结,扩散模型两个步骤如下:
一个固定的(预先定义好的)前向扩散过程:逐步向图片增加噪声直到最终得到一张纯粹的噪声图;
一个学习得到的去噪过程:训练一个神经网络去逐渐的从一张纯噪声中消除噪声,直到得到一张真正的图片。
算法1 为训练流程:
line2:从数据中采样,的意思是给加上噪声;
line3:随机选取 time step ;
真实训练过程中我们不可能一步步的从到,因为会很大,这就意味着每输入一张图片,就会产生张噪声图像,也就是一张图像的网络要训练个噪声样本,非常耗时。
所以对进行了采样,就是从里采集若干个的意思。
举个例子:假设采集的分别为100、20、3,对应的为、、,对应噪声为、、,对于的预测噪声为、、,只需要将和代入MSE公式即可(相减、平方、最小化)。
line 4:生成随机高斯噪声;
line 5:调用模型估计,计算真实噪声与估计噪声之间的MSE Loss,反向传播更新模型。
网络的作用是预测噪声,随着的增加,噪声强度会越来越大,因此预测的噪声是和迭代是直接相关的,所以要把作为参数送入到网络当中。
直到收敛。
算法2 为采样流程:
line 1:从高斯分布采样;
line 2:按照的顺序进行迭代;
line 3:如果令;如果,从高斯分布中采样;
line 4:利用公式求出均值和方差,进而求得;
经过上述迭代,恢复。
四、数学描述
4.1、前向过程(扩散)
我们来推导如何从原始图像直接到第t时刻的图像()。
首先回顾 2.1小节 的两个定义:
,要越大越好,论文中从0.0001到0.02;
,累乘,下面会用到;
,每一时刻添加的噪声均独立;
我们要求时刻的图像,它需要一步步的加噪迭代,这样太慢了。因为每一步添加的噪声独立且服从正太分布,我们可以做如下推导:
为了不混淆,只需要记住:下标越小,噪声越小,即的噪声是小于的。
上述用的就是重参数化技巧。
方差参数可以固定为一个常数,也可以选择作为时间段的一个时间表。事实上,人们可以定义一个方差表,它可以是线性的、二次的、余弦的等等。最初的DDPM作者利用了一个从到增加的线性时间表。Nichol等人2021年的研究表明,采用余弦时间表效果更好。
4.2、反向过程(去噪)
接下来是反向过程的推导:
给定要预测,它是一个高斯分布,和的方差是固定的,论文作者使用原始的噪声调度器作为方差,也就是说噪声调度器一旦确立,方差的大小也就固定了。所以我们只需要预测这个均值就好了,下面给出具体的推导过程:
我们先看整个损失函数,是个负对数似然:
希望神经网络的参数,可以使得生成的概率越大越好。
但问题在于的概率不好计算,因为它依赖于之前的所有步长,从开始。作为一种解决方案,我们可以计算这个目标的变分下界,并得到一个更易于计算的公式:
其中:
指的是...整个序列。
现在依然无法计算,我们继续推导:
我们将 KL divergence 改写后,再利用贝叶斯公式进行变形,即分母可以改写为:
将其代回原式:
所以原式可简化为:
分子,就是前向过程,它是固定的,从到的采样,换句话说就是从我们数据中的一些图像开始;
分母,
;
将提出来,是因为是指当前图像,它是不依赖于网络参数的。
根据贝叶斯公式可以变换如下:
具有比较高的方差,因为根据这张照片,我们无法确定它来自哪里,但是引入,我们就可以容易的预测出,
因此我们使用:
替换贝叶斯重写后的式子,我们得到:
上述标记的式子,也可以简化,我们假设:
因此我们可以简化为:
第一项KL散度可以忽略,因为只是个正向过程,没有可学习参数,换句话说就是它是固定的。
第二项KL散度,左边和右边都是正太分布,分别服从
、:
第一项的、就是我们要求的值,这里省略了这部分的推导,不影响算法的理解,
凡是涉及到的,就是学习调度器的,我们不需要关注它
我们可以化简,我们知道,即:
还知道:、
代入得到:
代入之后我们发现它就不再依赖于了,它就是和的一个关系式,式中的、、都是已知的,最后的本质就是我们只是从中减去缩放的随机噪声。
这样一来,DDPM的每一步推断可以总结为:
每个时间步通过和来预测高斯噪声,图中用表示,根据上述公式计算得到均值;
得到方差;
代入公式得到,利用重参数化得到。
4.3、训练损失
下面我们来看损失的推导,我们来回顾第二项:
我们需要减小KL散度,由于方差是固定的,我们无法优化,所以需要将它们的均值之差减小,原论文中使用的是简单的均方误差:
将表达式代入:
研究人员发现,忽略前面的系数项会变得更简单,采样质量也会得到提高,所以前面这个系数项我们直接忽略,它是和噪声调度器有关的,我们加噪的话也会使计算复杂。
我们最小化也就是最小化了KL散度,KL散度变小了也就是变分上限优化到最小,所以那个负对数似然也会变小。
上面还剩了最后一项,这个作者决定去掉它,即在时,我们不添加噪声。也就是下面横线的地方,只有的时候才服从高斯分布,如果,直接让,即噪声设置为0。
回顾上面整个推导过程:我们从负对数似然 -> 优化下界 -> 简化下界 -> 预测噪声。
五、torch复现
https://wangguisen.blog.csdn.net/article/details/
Referenceshttps://arxiv.org/abs/2006.11239https://kexue.fm/archives/9119https://zhuanlan.zhihu.com/p/https://zhuanlan.zhihu.com/p/https://www.bilibili.com/video/BV1bHXhttps://www.bilibili.com/video/BV1WD4y1E7X5https://huggingface.co/blog/annotated-diffusionhttps://www.datalearner.com/blog/25795https://lilianweng.github.io/posts/2021-07-11-diffusion-models
到此这篇ddpm模型(ddpm模型概述)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/bcyy/72629.html