这里主要是基于 Denoising Diffusion Probabilistic Models (DDPM) 去做介绍。
基本概念
Diffusion model 的运作方式是:给出一张从高斯分布采样得到的噪声图,经过 T 次的去噪(Denosing), 最终得到生成的图像。[这个过程也叫做diffusion model 的 reverse process]。
图中所示的 Denoise 模块是同一个网络模块,其输入是一张包含噪声的图像以及当前的 step 数 (step 数的输入非常重要,因为不同的step输入的图像的差距是非常巨大的,denoise 模块需要通过step数来判断输入的图像中的噪声大小)。
当然实际上 Denoise 模块并不是直接让网络就预测输出去除噪声之后的图像, 而是让网络去预测输入图像中的噪声部分,然后输入图像减去预测的噪声得到去噪之后的图像。 (是否可以直接让网络预测输出去噪之后的图像呢?理论上这是可以的, 但是实际上却很少这样子做,因为直接输出去噪之后的图像相对于预测图像中的噪声是更加复杂困难的任务, 这个复杂困难可以从噪声图像的概率分布的复杂性和去噪之后的图像的概率分布的复杂性这个角度去理解)。
图中的输入只有噪声图像和step number,如果是文生图的应用场景, 则每一步的输入还应该有文本输入(每一步输入的文本都是相同的)。
那么如何训练 noise predictor 呢? 我们需要的是每个 step 对应的噪声 ground truth,用来监督训练 noise predictor; 我们可以通过往正常的需要生成的图像上一步步加噪声来产生对应的数据对。 这就是diffusion model 的前向过程 (forward process)。
当然,往正常的需要生成的图像上一步步加噪声这个过程,每一步加的噪声的大小是有对应的公式控制,并不是随便加入一个噪声。
DDPM 的完整算法如下图所示; 可以看到,算法伪代码展示的算法过程,跟我们上面介绍的概念是存在一定区别的, 比如加噪声的过程并不是真的一步步加的,而是通过公式直接从x0产生某一步的结果xt; 这是因为在 DDPM 的算法设计和假设中,通过数学化简得到的。
数学原理
前向过程
给定真实图像 x0∼q(x) , diffusion 前向过程通过 T 次对其添加高斯噪声, 得到 x1,x2,⋯,xT。
Diffusion Model 的前向过程的数学定义如下:
q(x1:T∣x0):=T∏t=1q(xt∣xt−1),q(xt∣xt−1):=N(xt;√1−βtxt−1,βtI)具体来说,对于某个时刻 t 与上一个时刻 t−1 的图像均值关系如下:
xt=√1−βt xt−1+√βt z1z1∼N(0,1)其中 \left{ \beta_t \in (0, 1) \right }_{1}^{T} 是事先设定好的参数, βt 随着 t 的增大是递增的。前向过程每个时刻 t 都只与 t−1 时刻有关,是一个马尔科夫过程。
实际上,我们可以对加噪声过程进行数学上的变换和化简,从而得到 xt 与 x0 的关系, 这对于我们模型的训练效率是十分重要的。令 αt=1−βt
xt=√αtxt−1+√1−αtz1=√αt(√αt−1xt−1+√1−αt−2z2)+√1−αtz1=√αtαt−1xt−2+(√αt(1−αt−1)z2+√1−αtz1)因为 z1 和 z2 独立同分布(IID),并且都服从标准高斯分布。 因此(代入高斯分布的概率密度公式化简之后即可得到):
√αt(1−αt−1)z2+√1−αtz1=√1−αtαt−1¯z2,where ¯z2∼N(0,1)因此:
xt=√αtαt−1xt−2+√1−αtαt−1ˉz2=⋯=√αtαt−1⋯α1 x0+√1−αtαt−1⋯α1 ˉzt=√ˉαt x0+√1−ˉαt ˉzt其中 ˉα=αtαt−1⋯α0, 这就是DDPM 算法伪代码中 Training 部分第5行,输入到噪声预测网络ϵθ 的图像公式。
逆向过程
前向过程(forward process) 是加噪的过程,逆向过程(reverse process)就是去噪的过程, 也是图像生成的过程。如果我们能够逐步得到逆转后的分布P(xt−1∣xt) , 就可以从完全的标准高斯分布 xT∼N(0,I) 还原得到原图 x0。这个过程的概率密度数学表达式如下:
P(x0:T)=P(xT)T∏t=1Pθ(xt−1∣xt);Pθ(xt−1∣xt)∼N(xt−1;μθ(xt,t),Σθ(xt,t))因为P(xt−1∣xt) 是无法通过数学计算出公式解,需要使用神经网络来拟合, 记为 Pθ(xt−1∣xt);θ 代表网络参数。
至此,我们需要回想一下图像生成的本质共同目标:通过某种方式把高斯分布映射到生成结果所构成的概率分布。
我们需要做的就是,在已经收集的数据上,对 Pθ(x) 做 maximize likelihood。 对于diffusion model 来说,
Pθ(x0)=∫x1:xTP(x0:T)dx1:T=∫x1:xTP(xT)T∏t=1Pθ(xt−1∣xt)dx1:T对于任意的 P(x) ,都有(跟VAE的部分是一样的)
logP(x)=∫zq(z∣x)logP(x)dz【q(z∣x) can be any distribution 】=∫zq(z∣x)log(P(z,x)P(z∣x))dz=∫zq(z∣x)log(P(z,x)q(z∣x)q(z∣x)P(z∣x))dz=∫zq(z∣x)log(P(z,x)q(z∣x))dz+∫zq(z∣x)log(q(z∣x)P(z∣x))dz其中第二项 ∫zq(z∣x)log(q(z∣x)P(z∣x))dz 即是 KL 散度 KL(q(z∣x)||P(z∣x))≥0,因此
logP(x)≥∫zq(z∣x)log(P(x,z)q(z∣x))dz=Eq(z∣x)[log(P(x,z)q(z∣x))]Eq(z∣x)[log(P(x,z)q(z∣x))] 即是 lower bound。 我们需要maximize 这个 lower bound 从而达到 maximize logP(x) 的目的。
将VAE 与 DDPM 对应起来,很容易发现,对应于 DDPM,我们需要做的是:
maximize Eq(x1:T∣x0)[log(P(x0:T)q(x1:T∣x0))]其中 q(x1:T∣x0) 就是前向过程(forward process, diffusion process)。
将 Eq(x1:T∣x0)[log(P(x0:T)q(x1:T∣x0))] 进行变换(化简),
logP(x)≥Eq(x1:T∣x0)⌊logP(x0:T)q(x1:T∣x0)⌋=Eq(x1:T∣x0)[logP(xT)∏Tt=1P(xt−1∣xt)∏Tt=1q(xt∣xt−1)]=Eq(x1:T∣x0)[logP(xT)P(x0∣x1)∏Tt=2P(xt−1∣xt)q(x1∣x0)∏Tt=2q(xt∣xt−1)]=Eq(x1:T∣x0)[logP(xT)P(x0∣x1)∏Tt=2P(xt−1∣xt)q(x1∣x0)∏Tt=2q(xt∣xt−1,x0)]=Eq(x1:T∣x0)[logP(xT)P(x0∣x1)q(x1∣x0)+logT∏t=2P(xt−1∣xt)q(xt∣xt−1,x0)]=Eq(x1:T∣x0)[logP(xT)P(x0∣x1)q(x1∣x0)+logT∏t=2P(xt−1∣xt)q(xt−1∣xt,x0)q(xt∣x0)q(xt−1∣x0)]=Eq(x1:T∣x0)[logP(xT)P(x0∣x1)q(x1∣x0)+logT∏t=2P(xt−1∣xt)q(xt−1∣xt,x0)q(xt∣x0)q(xt−1∣x0)]=Eq(x1:T∣x0)[logP(xT)P(x0∣x1)q(x1∣x0)+logq(x1∣x0)q(xT∣x0)+logT∏t=2P(xt−1∣xt)q(xt−1∣xt,x0)]=Eq(x1:T∣x0)[logP(xT)P(x0∣x1)q(xT∣x0)+T∑t=2logP(xt−1∣xt)q(xt−1∣xt,x0)]=Eq(x1:T∣x0)[logP(x0∣x1)]+Eq(x1:T∣x0)[logP(xT)q(xT∣x0)]+T∑t=2Eq(x1:T∣x0)[logP(xt−1∣xt)q(xt−1∣xt,x0)]=Eq(x1∣x0)[logP(x0∣x1)]+Eq(xT∣x0)[logP(xT)q(xT∣x0)]+T∑t=2Eq(xt,xt−1∣x0)[logP(xt−1∣xt)q(xt−1∣xt,x0)]=Eq(x1∣x0)[logP(x0∣x1)]⏟reconstruction term −DKL(q(xT∣x0)‖P(xT))⏟prior matching term −T∑t=2Eq(xt∣x0)[DKL(q(xt−1∣xt,x0)‖P(xt−1∣xt))]⏟denoising matching term最终我们得到三项相加(减)的结果; 第一项可以认为是重建项,就像在普通 VAE 的 ELBO 中的重建项 ∫zq(z∣x)logP(x∣z)dz 第二项表示diffusion process 的最终分布与标准高斯先验的接近程度,没有可训练的参数,并且在我们的假设下也等于零; 第三项是去噪匹配项,是这里最重要的一项。 diffusion model 的 reverse process 就是希望通过 denoise 模块的 P(xt−1∣xt) 去拟合去噪步骤的ground truth q(xt−1∣xt,x0) ,即如下图所示
因此我们需要把 q(xt−1∣xt,x0) 计算出来,利用贝叶斯概率公式
q(xt−1∣xt,x0)=q(xt∣xt−1,x0)q(xt−1∣x0)q(xt∣x0)=q(xt∣xt−1)q(xt−1∣x0)q(xt∣x0)最右边一项能够化简是因为 q(xt∣xt−1,x0)=q(xt∣xt−1), 即forward process 满足马尔科夫性质。 而到这一步,q(xt∣xt−1) , q(xt−1∣x0) 和 q(xt∣x0) 都是已知的概率分布, 将概率密度公式代进去硬算可以得到 q(xt−1∣xt,x0) 服从分布如下
N(xt−1;√αt(1−ˉαt−1)xt+√ˉαt−1(1−αt)x01−ˉαt⏟μq(xt,x0),(1−αt)(1−ˉαt−1)1−ˉαtI)⏟Σq(t)我们的目标是最小化第三项去噪匹配项,即让两个分布的KL散度最小, 就是希望通过 denoise 模块的 P(xt−1∣xt) 去拟合去噪步骤的ground truth q(xt−1∣xt,x0) q(xt−1∣xt,x0) 是一个高斯分布,而我们对 P(xt−1∣xt) 的网络输出就是高斯分布的均值,方差一般不考虑。
因此KL散度最小化即是让网络输出的均值跟 q(xt−1∣xt,x0) 的均值 √αt(1−ˉαt−1)xt+√ˉαt−1(1−αt)x01−ˉαt 越接近越好。
我们对上述均值式子进一步化简,将 x0 使用 xt 替换,我们在前面已经推导出
xt=√ˉαt x0+√1−ˉαt ˉzt将 x0 表示成 xt 的表达式并使用 ϵ 来替代 ˉzt 表示噪声
x0=xt−√1−ˉαtϵˉαt将上式带入 q 的均值式子并化简可以得到
μq(xt,x0)=1√αt(xt−1−αt√1−ˉαtϵ)而这里实际需要要网络预测的部分只有 ϵ,因此diffusion model 只需要预测加入的噪声, 并通过上式就可以计算出 xt−1 的图像 这也是diffusion model 算法伪代码的 smapling 的第四行的第一部分的式子。