深度学习——Diffusion Model学习,扩散模型
一、什么是扩散模型
针对一张图片有一个前向过程,也就是逐渐批次加噪,生成一张Noise图片,那么问题就是是不是有这样的一个反向的过程能够针对一个有噪点的数据,还原到清晰的图片
具体来说:通过加入0-1正态分布的高斯噪声生成Noise图片,而扩散模型需要完成的是去预测每个时间步的噪声,到达去噪的目的
二、加噪过程(Forward Diffusion Process)
加噪过程简单来讲就是,图片+噪声=Noise图片,但是需要注意的是,这个的相加是有系数的,可以从下图右下角中发现,图片的系数是逐渐减小的,而噪声的系数是逐渐增大的,那为什么要这样设计呢:
可以举个相对极端的例子,如果在每次加噪水平一致的情况下,比较第一次加噪和最后一次加噪,第一次相较于最后一次对原图的质量影响是比较明显的,为了使每次加噪对原图的质量影响尽可能一致,所以设计了这两个参数,让第一次加噪的图片权重要大噪声权重要小,然后逐渐降低图片的权重,增大噪声的权重,达到最后的加噪效果
从下图右侧第一个图看出,前面咱们针对加噪过程讲的是一步一步进行加噪,经过公式的迭代推导,从下图右侧第二个图可以发现,从x。到Noise图片可以一步完成:
三、去噪过程(Reverse Diffusion Process)
对于加噪过程是一步一步加入高斯噪声,所以是满足马尔可夫性质的,但是对于回溯过程,逐渐去噪是很难找到这样一个高斯分布q(Xt-1|Xt),针对去噪的目标就是找到一个从Xt到Xt-1的噪声高斯分布
这个时候就需要神经网络去拟合这样的一个高斯噪声pθ(Xt-1|Xt),也就是下图中Approximated Distribution逐渐逼近Targe Distributionde的过程
首先用一个神经网络去拟合我们观察到的数据分布,也就是生成一个参数能够让我们生成的数据相较于ground truth的概率最大,对应到数学中就是求一个最大自然估计
最大自然估计等价于min -logpθ(X0)
注:Dkl散度就是描述两个数据之间的距离,即恒大于等于0的值
ELBO是观测数据对数似然的一个下界,用于近似潜在变量在观测变量下的条件概率分布。在变分推断中,直接计算后验概率通常是困难的,因此引入了ELBO来作为一个可优化的目标函数。
这样loss函数就可以经过一系列的数学推导过程得出
四、训练过程(Illustration of training)
- 随机采样时间步并进行encode
在训练扩散模型时,为了让模型学会处理所有可能的噪声水平,不会每次都从 t=0 完整地加噪到 t=T ,再完整地去噪回去。这样太慢了,而且不高效。相反,他们会随机选择一个时间步 t(比如从 1 到 1000 中随机挑一个数字,比如 34),然后直接在那个时间步上操作。
而编码是为了让模型需要知道当前处理的是哪个时间步(比如 t=34),因为不同的时间步对应不同的噪声水平。为了让模型理解 t 的具体含义,t 通常会被“编码”成一种更容易被神经网络处理的形式。
- 加噪
通过前面提到的一步加噪,将原始图片加噪到t=34时的噪声数据
- 开始训练
将噪声和时间步输入到UNet网络,通过网路去预测一个噪声
- 最后计算loss
五、采样过程(Illustration of sampling)
- 初始化:从纯噪声开始
在 t=T (最大时间步,比如 T=1000 ) 时,我们从一个标准高斯分布中随机采样一个初始样本 XT∼N(0,I) 。这个 XT就是纯噪声,完全没有数据的信息,看起来就像电视上的“雪花屏”。然后和时间步输入到Unet中预测一个噪声ϵθ(xt,t),这里的ϵθ是训练好的模型。
利用预测的噪声,按照反向过程的公式,从 xt 去掉一部分噪声,生成下一步的样本 xt−1。
- 逐步去噪:从 t=T到 t=0
- 重复直到 t=0
这里需要注意的是,在最后一步是不加扰动项的
六、总结
总的来说,扩散模型是一种生成模型,它的工作原理是通过一个“加噪-去噪”的过程来学习数据的分布。训练时,先从真实数据开始,逐步添加噪声(称为正向过程),然后让模型学会从纯噪声反向恢复到原始数据(称为反向过程)。
七、Reference
一文理清 Diffusion Model 扩散模型 | 原理图解+公式推导
八、Think
扩散模型作为一个生成式模型,其训练数据是决定生成分布的,训练数据是猫的话,生成的结果只会是猫,那如果训练数据包括猫、狗、鸟等多种类别,模型则会学习所有这些类别的联合分布。采样时生成的 x0 可能是猫、狗或鸟中的一种(具体是什么取决于初始噪声的随机性)。