由于课题组研究需要,了解了一下当前比较火爆的扩散模型(Diffusion Model),其中DDMP作为扩散模型中比较重要的基础模型之一,特此记录。
这篇论文主要介绍了一种去噪扩散概率模型。
关于扩散模型的一些基础笔记,记录在http://t.csdn.cn/VZkZG
* PDF:PDF是一个“概率函数”,表示连续随机变量的密度(可能性)——在这种情况下,这意味着一个函数,表示图像位于函数参数定义的特定值范围之间的可能性。 每个PDF都有一组参数,这些参数决定了分布的形状和概率。分布的形状会随着参数值的变化而变化,如下图所示。例如,在正态分布的情况下,我们有均值µ(mu)和方差σ2(sigma)来控制分布的中心点和扩散。
上图体现了扩散模型的正反向扩散过程,其中:
这个术语也被称为前向扩散核(FDK)。它定义了给定图像xt-1的前向扩散过程xt中的时间步长t处的图像的PDF。它表示正向扩散过程中每一步应用的“过渡函数”。
类似于正向过程,这个术语被称为反向扩散核(RDK)。它代表给定xt的xt-1的PDF,由. 这个 意味着使用神经网络来学习反向过程的分布参数。它是应用于反向扩散过程中每一步的“过渡函数”。
简言之,在DDPM模型中,主要包括了两个过程:
前向过程 (Forward process):不断地往原始图片中添加噪声
反向过程 (Reverse process):通过不断地去噪去复原图片
简单来说,前向过程的输入是原始图片,该图片服从一定的分布,输出是噪音图片,该图片服从高斯分布。
在前向过程中,对于一个输入图片,在某一个特定的时间 t 下,添加某种程度的噪音,得到噪音样本。前向过程不断重复该步骤,结果是一个时间序列和一系列噪音增大的图片。
具体来说,从数据分布 q(x) 中选取图片 x0,在时间序列 {0, T} 内的某个时间 t,选取某个等级的噪音 nt,把噪音添加到输入图片,得到噪音样本 xt。在 T 个步长后得到样本序列:{X0, Xt}。步长由超参数方差机制 βt(0 - 1) 来控制。
前向扩散过程中的分布q被定义为马尔可夫链,由下式给出:
我们首先从我们的数据集中获取一张图像:x0。从数学上讲,它被称为从原始(但未知)数据分布中采样一个数据点:x0~q(x0)。
正向过程的PDF是从时间步长为1的从1→ T的个体分布的产物。
正向扩散过程是固定的和已知的。即:整个前向过程是固定的,没有需要学习的参数。
从1到T的所有中间噪声图像也被称为“延迟(latents)”。latents的大小与原始图像相同。
用于定义FDK的PDF是“正态/高斯分布”(方程2)。
在每个时间步长t,定义图像xt分布的参数设置为:
术语 (β)被称为“扩散率”,并使用“方差调度器”预先计算。术语I是一个单位矩阵。因此,每个时间步长的分布称为各向同性高斯分布。
原始图像在每个时间步长都会通过添加少量的高斯噪声而被破坏。添加的噪声量由调度器调节。
通过选择足够大的时间步长并定义一个良好的t重复应用FDK逐渐将数据分布转换为几乎各向同性的高斯分布。
文章中给出的前向过程如下:
重复如下步骤,直到收敛
在前向过程执行中,有两个主要的问题:
(1)我们如何从xt-1中获得图像xt?
(2)我们如何在每步添加噪声?
他们的实现,可以利用变分自动编码器中使用重新参数化技巧实现:
参考第二个方程,我们可以很容易地从正态分布中对图像xt进行采样,如下所示:
其中,ε是从标准高斯分布中随机采样的“噪声”项,首先进行缩放,然后添加(缩放)x(t-1)。以这种方式,从x0开始,原始图像从t=1…t迭代破坏
然而,每当我们需要在t的样本xt时,我们必须在马尔可夫链中执行t-1步。这会导致前向过程效率极为低下:
为了解决这个问题,DDPM的作者重新制定了内核,在这个过程中直接从第0步(即从原始图像)到第t步。
实现方法(重参数化):
新增两个术语:
其中方程(5) 是的累积乘积 从1到t。
然后,通过采用高斯分布的加法性质。正向扩散过程可以根据 改写为:
使用上面的公式,我们可以在马尔可夫链中的任意步t进行采样。
下面放一张网上找的解释:
简单来说,反向过程的输入是添加了噪音的图片,该图片服从高斯分布。输出是去噪之后的图片,该图片服从一定的分布(如果网络训练完毕,那么该图片的分布应该接近模型的输入图片的分布)。
在反向过程中,对于一个带噪音的输入图片,在某一特定时间 t 下,消除一部分的噪音,得到噪音少了一些的图片。反向过程不断重复该步骤,结果是一个时间序列和一系列的噪音越来越少的图片,最终噪音完全消失,只剩下类似于原始图片的生成图片。这基本上意味着我们必须“撤消”前向过程,即迭代地消除前向过程中添加的噪声。它是使用神经网络模型完成的。
在正向过程中,转移函数 q 是使用高斯定义的,那么逆向过程 p 应该使用什么函数呢?神经网络应该学习什么?
1949 年,W. Feller 证明,对于高斯(和二项式)分布,扩散过程的反转具有与前向过程相同的函数形式。这意味着与定义为正态分布的FDK类似,我们可以使用相同的函数形式(高斯分布)来定义反向扩散核。
反向过程也是马尔可夫链,其中神经网络预测每步的反向扩散内核的参数。在训练期间,学习到的(参数)估计应该接近每个时间步的 FDK 后验参数。因为如果我们反向遵循前向轨迹,我们可能会返回到原始数据分布。在此过程中还将学习如何从纯高斯噪声开始生成与底层数据分布紧密匹配的新样本(在推理过程中无法访问前向过程)。
反向过程如下图所示:
1.反向扩散的马尔可夫链从正向过程结束的地方开始,即在时间步 T 处,数据分布已转换为(几乎)各向同性高斯分布。
2.反向扩散过程的 PDF 是我们从纯噪声 xT 开始获得数据样本(与原始分布相同)的所有可能路径的“积分”。
这里加一下网上的解释
基于扩散的生成模型的训练目标相当于“最大化生成的样本(在反向过程结束时)(x)属于原始数据分布的对数似然性”
扩散模型中的过渡函数为高斯函数。为了最大化高斯分布的对数似然性,需要尝试找到分布的参数(, 2) 从而使生成的数据属于与原始数据相同的数据分布的“可能性”最大化。
训练神经网络过程中,损失函数(L)定义为目标函数的负函数。所以p(x0)值越高表示低损耗,反之亦然。
然而,事实证明,仅仅如此的方法难以实施,因为我们需要在非常高维(像素)的空间上积分T步长的连续值。
因此,作者从VAE中获得了灵感,并使用变分下界(VLB)重新制定了训练目标,方程如下:
简化后,作者得出了最后的Lvlb–变分下界损失项如下:
我们可以将损失项Lvlb分解:
Lvlb 由三项损失组成:
作者的简化方法主要是忽略一些损失函数中的项,以实现简化:
L0–作者在移除此项后得到了更好的结果。
LT–这是正向过程中最后一个潜在值和反向过程中第一个潜在值之间的“KL发散”。然而,这里没有涉及神经网络参数,所以我们对此无能为力,只能定义一个好的方差调度器,并使用大的时间步长,使它们都表示各向同性高斯分布。
因此,Lt-1是唯一剩下的损失项,它是前向过程(以xt和初始样本x0为条件)的“后向”和参数化反向扩散过程之间的KL发散。这两项也是高斯分布。
从而,深度学习模型在训练期间的目标是近似/估计这个(高斯)后验的参数,使得KL发散尽可能小。
后验分布的参数如下:
为了简化模型的任务,作者引入了超参数t。现在,该模型只需要学习预测上述方程。并且反向扩散核被修改为:
由于我们一直保持方差不变,最小化KL偏差就像最小化两个高斯分布q和p之间的差(或距离)的均值一样简单 ,这可以如下进行:
此模型可以通过三个方法实现其功能:
1.直接预测X0,并通过它在后验函数中找到
2.预测整个
3.预测每个时间步长的噪声。
在方法3中,可以表示为:
同样(xt,t)被设置为:
在训练时,只需知道’s、’s和xt。因此,模型只需要预测每个时间步长的噪声。在去噪扩散概率模型中使用的简化(在忽略一些加权项之后)损失函数如下:
此即为作者认为本文的最大贡献:从那些看起来可怕的ELBO术语开始,最终得到了整个机器学习领域中最简单的损失函数。DDPM的最终损失函数只是前向过程中添加的噪声和模型预测的噪声之间的“均方误差”。
前向过程对噪音机制的方差 βt 设置为线性机制。变化范围从 β1 = 1e-4 到 βT = 0.02。实验结果表明:线性机制虽然能够生成高质量的图像,但是对数似然指标不如其他生成模型。
作者设置 Σθ(xt, t) = σ^2I,其中 σ 是不可学习的,设置为 βt 或者 βt-hat。因为作者发现学习方差 Σθ 会导致训练过程不稳定并生成低质量图像。