DDPM介绍

(余济闻师弟 研究领域AIGC-related Applications & Generation Models)

1-0 前置知识

  1. Markov:当前位置的概率只会受前一时刻概率影响

  2. 正态分布(高斯分布)叠加性

    E(N1+N2)=μ1+μ2​

    Var(N1+N2)=σ12+σ22

  3. 贝叶斯

    P(A|B)=P(B|A)P(A)P(B)​

    给定条件C下的贝叶斯

    P(A|B,C)=P(B|A,C)P(A|C)P(B|C)

1-1 概述

扩散模型相比GAN的优势是:训练难度(调参)、训练的稳定性、损失函数的简易程度(损失的指向性、可观测性)等方面。

1-2 扩散阶段

image-20240316110314906

首先,Xt−1到Xt​的加噪公式是:

Xt=1−βtXt−1+βtZt,    Zt∼N(0,I)

构造Xt=f′(X0),希望一步加噪声,从干净图像得到Xt​,推导:

image-20240316113649024

通过公式代入,推导一次Xt和Xt−2的关系,可以找到规律/归纳法得到Xt=f′(X0)​:

Important

核心公式 Xt=αt¯X0+1−αt¯Z, αt¯=∏i=1tαi

Xt=f′(X0)使得我们获取某一步的扩散数据变得非常方便。

XT=αT¯X0+1−αT¯Z,而XT≈Z​ 是完全的噪声图。所以,实际上我们 βt 的设计和 T 的选择需要保证αT¯≈0。

逆过程再通过神经网络将噪声 Z 估计出来,进行去噪:

X0=Xt−1−αt¯Z~αt¯

但实际推理时,真实的reverse过程没法这么做,因为从完全的噪声图直接得到X0​是困难的,步数过少的reverse也是比较模糊的。

重建的过程是一步一步推的,效果比较好。

1-3 重建阶段(上)

前面知道,重建的公式是:X0=1αt¯(Xt−1−αt¯Z~)​

能估计噪声 Z~ 的神经网络UNet是如下的训练流程:

image-20240316200558903

但是一步到位的重建的效果会差、很模糊。我们需要得到一步一步重建的公式:

image-20240316203159793

1-4 重建阶段(下)

上面提到我们训练了一个UNet可以将加的噪声采样估计出来。写得再准确一点呢,这个UNet的输入还有t,因为不同的Xt,它的噪声强度是不一样的。所以实际上是一个条件去噪过程。

Z~=UNet(Xt,t)

虽然两个变量可以逆变换,

Xt−1=1αt(Xt−1−αtZt−1→t)

但可能因为这里的Zt−1→t是Xt−1到Xt加的噪声,而我们训练时都是X0到Xt直接加噪(更方便训练收敛)。UNet预测的是Z~0→t而不是Z~t−1→t,所以reverse过程没法简单的进行公式逆变换。而是要推导构造出Z~0→t。

已知

q(Xt|Xt−1)∼N(αtXt−1,(1−αt)I)​​​

q(Xt−1)∼N(α¯t−1X0,(1−α¯t−1)I)

q(Xt)∼N(α¯tX0,(1−α¯t)I)​

N(μ,σ2)∝exp(−12(x−μ)2σ2)

让我们推一下:

q(Xt−1|Xt)=q(Xt−1,Xt)q(Xt)=q(Xt|Xt−1)q(Xt−1)q(Xt)=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|X0,Xt−1)可以写为q(Xt|Xt−1),是因为马尔可夫性质,Xt时刻只和Xt−1有关。

∝exp(−12((Xt−αtXt−1)21−αt+(Xt−1−α¯t−1X0)21−α¯t−1−(Xt−α¯tX0)21−α¯t))​

我们最希望构造出exp(−12(x−μ)2σ2),其中x是这里的xt−1

∝exp(−12((αtβt+11−α¯t−1)xt−12−2(αtxtβt+α¯t−1x01−α¯t−1)xt−1+C))

∝exp(−12(Axt−12+Bxt−1+C))​

∝exp(−12(A(xt−1+B2A)2+C′))

∴μ=−B2A,σ2=1A

其中A=αtβt+11−α¯t−1,B=−2(αtxtβt+α¯t−1x01−α¯t−1)​

σ2=1A=1/(αt−αtα¯t−1+βtβt(1−α¯t−1))=βt(1−α¯t−1)1−α¯t​

我们可以发现方差实际是由αt、βt组合而来,所以方差是确定的

μ=−B2A=−βt(1−α¯t−1)2(1−α¯t)∗−2(αtxtβt+α¯t−1x01−α¯t−1)=αt1−α¯t−11−α¯txt+α¯t−1βt1−α¯tx0

由于X0是未知的,我们继续代入X0=Xt−1−αt¯Z~0→tαt¯,只留下先验Xt,和UNet预测的是Z~0→t​:

前面是为了以示区分,我们后面就将Z~0→t简称Z~

μ=αt1−α¯t−11−α¯tXt+α¯t−1βt1−α¯tXt−1−αt¯Z~αt¯​

=αt1−α¯t−11−α¯tXt+βt(1−α¯t)αtXt−βtαt1−α¯tZ~

=αt−αtα¯t−1+βt(1−α¯t)αtXt−βtαt1−α¯tZ~

=1−α¯t(1−α¯t)αtXt−βtαt1−α¯tZ~

=1αt(Xt−βt1−α¯tZ~)

我们发现均值经过推导可以得到Xt和Z~​的一个线性组合,一个比较简洁的形式。

总结一下,q(Xt−1|Xt)服从:

q(Xt−1|Xt)∼N(1αt(Xt−βt1−α¯tZ~),βt(1−α¯t−1)1−α¯t)​

即

Xt−1=1αt(Xt−βt1−α¯tZ~)+βt(1−α¯t−1)1−α¯tZ

  1. 方差的部分实际上是从标准正态分布采样的

  2. 最后X1到X0这步是不加后面一项噪声的。前面的T−1

Z~=UNet(Xt,t),Z∼N(0,I)

Tips:每一次Xt到Xt−1​的去噪过程,还要再加一个新的噪声。这也是希望在它整个reverse过程中增加一些不确定性。实际上整个reverse过程也是想模拟一个分子热运动的布朗运动的过程:每一步既有确定性的部分,也有随机的扰动。

Q:为什么UNet预测噪声,而不是直接预测Xt−1

一方面UNet预测噪声比预测图像更容易,另一方面如果是预测图像就形成了Deterministic的过程,失去多样性,最后一方面,论文将变分下界(Variational LB)作为优化目标。

1-5 整理总结

1.Diffusion(扩散阶段)

Xt∼N(αtXt−1,(1−αt)I)​

Xt∼N(αt¯X0,(1−α¯t)I)

Xt=αtXt−1+1−αtZt

Xt=αt¯X0+1−αt¯Z​​

αt都是我们预先设定好的数值,Zt是我们从标准正态分布里采样的一个噪声。然后由于一步一步加噪不够高效,我们经过一番推导得到从X0直接推任意Xt的退化公式。然后Xt本身也可以写成正态分布。

2.Reverse(重建阶段)

Xt−1=f(Xt,UNet(Xt,t))=f(Xt,Z~)

Xt−1=1αt(Xt−βt1−α¯tZ~)+βt(1−α¯t−1)1−α¯tZ​

  • 推导过程的前置知识X=μ+σZ∼N(μ,σ2I)​,也属于一种重参数技巧。

  • 先验 & 后验,已知 & 未知 & 估计。

  • μ=αt1−α¯t−11−α¯txt+α¯t−1βt1−α¯tx0​

    • t越小,Z~0→t(对x0​​的估计)是越来越准的。

    • xt和x0加权,xt的权重越来越小,xo​的估计越来越准,其权重也越来越大。

    • 可以把扩散过程理解为xT,x~0@T,x~0@(T−1),...,x~0@1的一个加权,只不过xT​这个完全的噪声,它的权重非常小。

image-20240330135403381

这里添加的扰动σtZ,βt(1−α¯t−1)1−α¯t只是适合采用的σt的上界,实际小一点,极端来说一直为 0​不扰动也是可以的。

以上的流程和公式已经比较详尽了,足以手撸DDPM的训练代码。

1-6 代码实现

Note

只讲关键部分的代码实现,可以一定程度上减轻复现或者读懂代码的难度。

扩散模型实际的代码实现非常简单,进而会让人感叹为什么这样一个简单的设计能够达到这么好的生成效果。

为了复现DDPM,我们需要考虑哪些细节问题?

(1)alpha、beta这些预先定义好的参数怎么获得?

https://github.com/abarankab/DDPM/blob/main/ddpm/diffusion.py

(2)训练过程?

Tip

在这套代码展开的细节中,运用了很多python的实用的语法。

(3)推理过程?

前面提到扰动的噪声,实际比上界小一点也是可以的。1−α¯t−11−α¯t>1,所以我们将βt(1−α¯t−1)1−α¯t可以简化为βt​使用,使得代码也更为简洁。

(4)UNet的结构?

https://github.com/abarankab/DDPM/blob/main/ddpm/unet.py

关键:time_emb是怎么得到的,是怎么作为条件输入的。

x → norm/act/conv → + time_emb → norm/act/conv + shortcut → attention → out (这算是一种比较简单的调控,实际上你可以想到任何条件网络的控制方式都有可能能够用在这里)

DDPM的应用

DDPM的流程图:

image-20240401131336101

2-1 SR3

Image Super-Resolution via Iterative Refinement(https://ar5iv.labs.arxiv.org/html/2104.07636)

image-20240401131547713

相对DDPM的改动:

个人解读:

  1. UNet处似乎可以改为pixel-shuffle减少复杂度

  2. 之前有文章认为与其隐晦地给一个 t,不如将噪声强度 α¯t 作为条件。

  3. 改动2是为改动3作铺垫的,二者连用。从均匀分布 U[α¯t−1,α¯t] 里取噪声强度,它更连续,也给后面我们为了推理加速设定新的 T​ 提供了支持。

改动2是为可以任意改变采样的步数铺路,不然UNet只见过离散的条件。

对于 np.linspace(low, high, T),假设训练时 low=1e-4, high=2e-2, T=2000,推理时 我们可以设定 新的 βT 和 T,比如low=1e-4, high=0.1, T=100,只要最后满足α¯T≈0。从T=2000到T=100推理速度快了20倍。

2-2 deblur

Deblurring via Stochastic Refinement(https://openaccess.thecvf.com/content/CVPR2022/papers/Whang_Deblurring_via_Stochastic_Refinement_CVPR_2022_paper.pdf)

Stochastic Refinement 就是指的扩散模型

提出问题:目前的图像去模糊问题主要是deterministic的方法,重建的视觉质量不好

提出解决方案:1. 提出一个新框架,基于条件扩散模型 2. 同时也提出一个有效的predict-and-refine的方法,并给出扩散模型在PD曲线上遍历的方法

image-20240401133238235

以前的经验和分析得出,在模型能力(size)一定的情况下,它的Perception和Distortion的指标是有trade-off的。

2-3 DDIM

Denoising Diffusion Implicit Models(https://ar5iv.labs.arxiv.org/html/2010.02502)

回顾DDPM(去噪扩散概率模型):

在 DDPM 中,生成过程被定义为马尔可夫扩散过程的反向过程,在逆向采样过程的每一步,模型预测噪声。

image-20240401164218887

DDIM(去噪扩散隐式模型):

DDIM 的作者发现,扩散过程并不是必须遵循马尔科夫链, 在之后的基于分数的扩散模型以及基于随机微分等式的理论都有相同的结论。 基于此,DDIM 的作者重新定义了扩散过程和逆过程,并提出了一种新的采样技巧, 可以大幅减少采样的步骤,极大的提高了图像生成的效率,代价是牺牲了一定的多样性, 图像质量略微下降,但在可接受的范围内。

去马尔可夫化,DDIM用待定系数法推导:

回到q(Xt−1|Xt,X0)=q(Xt|Xt−1,X0)q(Xt−1|X0)q(Xt|X0)​​

q(Xs|Xk,X0)=q(Xk|Xs,X0)q(Xs|X0)q(Xk|X0)∼Non−Markov,s<k−1

由于不是马尔可夫过程,等式右边q(Xk|Xs,X0), q(Xs|X0), q(Xk|X0)理论上我们都不知道,左边分布的解的可能性会更多。但由于DDIM只是采样方法,我们用的UNet模型还是DDPM一样的方式训练的,所以q(Xs|X0), q(Xk|X0)​需要满足DDPM的公式。

现在仅仅是q(Xk|Xs,X0)是未知的。在DDPM里是转换成了q(Xt|Xt−1),但这个马尔可夫的强假设,并不是必要的,因为训练过程中并没有Xt−1到Xt​的加噪。我们不妨使用待定系数法,不限制它的形式。

其实DDIM里前向的增噪过程q(Xk|Xs,X0)也已经和DDPM不一样了,但是因为训练过程中没用到,就没事,只要训练中一步到位加噪的q(Xt|X0)一致,我们的噪声预测模型就依然是DDPM/DDIM通用的。

假设q(Xt−1|Xt,X0)为任意满足上述等式的分布

待定系数

Important

以下推导中的t−1都可以替换为s,t都可以替换为k。同样成立

设:q(Xt−1|Xt,X0)∼N(kX0+mXt,σ2I)​,

Xt−1=kX0+mXt+σZt,Zt∼N(0,I)​

∵Xt=α¯tX0+1−α¯tZ

(DDIM论文里的αt、βt符号和DDPM里区别很大,我们还是调整一致)

∴Xt−1=kX0+m(α¯tX0+1−α¯tZt)+σZ

=(k+mα¯t)X0+m1−α¯tZt+σZ​

=(k+mα¯t)X0+Z′,Z′∼N(0,m2(1−α¯t)+σ2)

∵Xt−1=α¯t−1X0+1−α¯t−1Zt−1

∴k+mα¯t=α¯t−1 和 m2(1−α¯t)+σ2=1−α¯t−1​

求得:m=1−α¯t−1−σ21−α¯t 和 k=α¯t−1−1−α¯t−1−σ2α¯t1−α¯t​

∴q(Xt−1|Xt,X0)∼N((α¯t−1−1−α¯t−1−σ2α¯t1−α¯t)X0+1−α¯t−1−σ21−α¯tXt,σ2I)∼N((α¯t−1−1−α¯t−1−σ2α¯t1−α¯t)(Xt−1−αt¯Z~θαt¯)+1−α¯t−1−σ21−α¯tXt,σ2I)​

∼N(α¯t−1(Xt−1−αt¯Z~θαt¯)+1−α¯t−1−σ2Z~θ,σ2I)​

Xt−1=α¯t−1(Xt−1−αt¯Z~θαt¯)+1−α¯t−1−σ2Z~θ+σ2Z

DDIM仅用待定系数法假设满足q(Xt−1|Xt,X0)=q(Xt|Xt−1,X0)q(Xt−1|X0)q(Xt|X0),没有任何其他强假设。推导过程中也没有用到q(Xt|Xt−1)。

DDIM 可以看做是 DDPM 的扩展, DDPM 是 DDIM 的一个特例

因为DDIM不是马尔可夫假设,所以不需要严格遵守Xt→Xt−1​​​

s=t−1,z=t

∴Xs=α¯s(Xk−1−αk¯Z~θαk¯)+1−α¯s−σ2Z~θ+σ2Z

s<k,k≤T,s和k不需要连续

由于推导中σ2全程没有用到,所以神奇的是σ​取任何值,等式都成立。

DDIM推导中的σ是待定系数法假设来的,是一个自由随机变量。

DDIM牺牲了多样性,提升了图片质量。

总结,DDIM特点:多样性↓,速度↑,图像质量↑

在DDIM里,取了XT,后面过程是有一个确定(Deterministic)路径的,已经对应了生成的图像。这也带来一个好处,这使得XT​有点类似VAE、GAN里的latent space,方便进一步研究它的性质(如transfer, similarity, editting)。

直接分析构造(高视角)

image-20240408204622924

可以看到这每一步都好理解,

等式中用特殊代替一般是成立的。而且确定性更强。

Xs=α¯sX^0|k+1−α¯s−σk2εθ(Xk,k)+σkε

2-4 guided-diffusion

Diffusion Models Beat GANs on Image Synthesis (https://proceedings.neurips.cc/paper_files/paper/2021/file/49ad23d1ec9fa4bd8d77d02681df5cfa-Paper.pdf)

扩散模型提出后有两大优势:1.生成效果较好,保真度高,2.生成图像多样性高。但直到guided-diffusion这篇文章发表之前,扩散模型在保真度的指标(FID)上一直没有超过GAN。

设 y​ 是类别条件,首先根据贝叶斯公式:

q^(Xt−1|y)=q^(y|Xt−1)q^(Xt−1)q^(y),再添Xt的条件。但数学功底够好,可以直接看出得到下面的等式。

q^(Xt−1|Xt,y)=q^(y|Xt−1,Xt)q^(Xt−1|Xt)q^(y|Xt)​

如果沿用DDPM的训练,只是在采样阶段使用classifier guidance,有:

q^(Xt|Xt−1,y)=q(Xt|Xt−1)

q^(X0)=q(X0)

q^(XT|X0,y)=∏t=1Tq^(Xt|Xt−1,y) Markov

我们继续推:

classifier guidance和classifier-free guidance

 

其他优秀博客

科学空间 生成扩散模型漫谈-系列