[2021-09-19更新:强烈推荐Yang Song的这篇关于基于得分的生成建模的博文(几篇参考文献的主要作者)]。
[2022-08-27更新:添加了无分类器引导GLIDEunCLIPImagen
[2022-08-31更新:添加了潜在扩散模型
[2024-04-13更新:添加了渐进蒸馏一致性模型,和模型架构部分

到目前为止,我已经写了三种生成模型,GANVAE基于流的模型。它们在生成高质量样本方面取得了巨大的成功,但每种模型都有其自身的局限性。由于对抗训练的性质,GAN模型的训练可能不稳定且生成的多样性较差。VAE依赖于代理损失函数。流模型必须使用专门的架构来构建可逆变换。

扩散模型受到非*衡热力学的启发。它们定义了一个马尔可夫链的扩散步骤,通过逐步向数据添加随机噪声,然后学习逆转扩散过程,从噪声中构造所需的数据样本。与VAE或流模型不同,扩散模型通过固定的程序进行学习,潜变量具有与原始数据相同的高维度。

图1. 各种生成模型的概述。

什么是扩散模型?

已经提出了几种基于扩散的生成模型,它们具有相似的基本思想,包括扩散概率模型(Sohl-Dickstein等,2015)、噪声条件得分网络(NCSNYang & Ermon,2019)和去噪扩散概率模型(DDPMHo等,2020)。

正向扩散过程

给定一个从真实数据分布中采样的数据点x0q(x),我们定义一个正向扩散过程,其中我们在T步中向样本中添加少量高斯噪声,产生一系列噪声样本x1,,xT。步长由方差调度{βt(0,1)}t=1T控制。

q(xt|xt1)=N(xt;1βtxt1,βtI)q(x1:T|x0)=t=1Tq(xt|xt1)

随着步骤t变大,数据样本x0逐渐失去其可辨识的特征。最终,当T时,xT等同于各向同性高斯分布。

图2. 通过慢慢添加(移除)噪声生成样本的正向(逆向)扩散过程的马尔可夫链。(图片来源:Ho等,2020,附加了一些注释)

上述过程的一个好处是,我们可以使用重新参数化技巧在任何任意时间步t以闭合形式采样xt。设αt=1βtα¯t=i=1tαi

xt=αtxt1+1αtϵt1 ;where ϵt1,ϵt2,N(0,I)=αtαt1xt2+1αtαt1ϵ¯t2 ;where ϵ¯t2 merges two Gaussians (*).==α¯tx0+1α¯tϵq(xt|x0)=N(xt;α¯tx0,(1α¯t)I)

(*) 回想一下,当我们合并两个具有不同方差的高斯分布N(0,σ12I)N(0,σ22I)时,新分布为N(0,(σ12+σ22)I)。这里合并的标准差为(1αt)+αt(1αt1)=1αtαt1

通常,当样本变得更嘈杂时,我们可以负担得起更大的更新步长,所以β1<β2<<βT因此α¯1>>α¯T

与随机梯度朗之万动力学的联系

朗之万动力学是物理学中的一个概念,专为统计建模分子系统而开发。结合随机梯度下降,随机梯度朗之万动力学(Welling & Teh 2011)可以使用马尔可夫链中的更新中的梯度xlogp(x)来生成概率密度p(x)的样本:

xt=xt1+δ2xlogp(xt1)+δϵt,where ϵtN(0,I)

其中δ是步长。当T,ϵ0xT等于真实的概率密度p(x)

与标准SGD相比,随机梯度朗之万动力学将高斯噪声注入参数更新中,以避免陷入局部最小值。

逆向扩散过程

如果我们能够逆转上述过程并从q(xt1|xt)中采样,我们将能够从高斯噪声输入xTN(0,I)重新创建真实样本。请注意,如果βt足够小,q(xt1|xt)也将是高斯分布。不幸的是,我们无法轻松估计q(xt1|xt),因为它需要使用整个数据集,因此我们需要学习一个模型pθ来*似这些条件概率,以便运行逆向扩散过程

pθ(x0:T)=p(xT)t=1Tpθ(xt1|xt)pθ(xt1|xt)=N(xt1;μθ(xt,t),Σθ(xt,t))

图3. 训练扩散模型以模拟2D瑞士卷数据的示例。(图片来源:Sohl-Dickstein等,2015

值得注意的是,当以x0为条件时,逆向条件概率是可处理的:

q(xt1|xt,x0)=N(xt1;μ~(xt,x0),β~tI)

使用贝叶斯规则,我们有:

q(xt1|xt,x0)=q(xt|xt1,x0)q(xt1|x0)q(xt|x0)exp(12((xtαtxt1)2βt+(xt1α¯t1x0)21α¯t1(xtα¯tx0)21α¯t))=exp(12(xt22αtxtxt1+αtxt12βt+xt122α¯t1x0xt1+α¯t1x021α¯t1(xtα¯tx0)21α¯t))=exp(12((αtβt+11α¯t1)xt12(2αtβtxt+2α¯t11α¯t1x0)xt1+C(xt,x0)))

其中C(xt,x0)是某些不涉及xt1的函数,细节被省略了。按照标准高斯密度函数,均值和方差可以参数化如下(回想一下αt=1βtα¯t=i=1Tαi):

β~t=1/(αtβt+11α¯t1)=1/(αtα¯t+βtβt(1α¯t1))=1α¯t11α¯tβtμ~t(xt,x0)=(αtβtxt+α¯t11α¯t1x0)/(αtβt+11α¯t1)=(αtβtxt+α¯t11α¯t1x0)1α¯t11α¯tβt=αt(1α¯t1)1α¯txt+α¯t1βt1α¯tx0

由于良好的性质,我们可以表示x0=1α¯t(xt1α¯tϵt)并将其代入上述方程得到:

μ~t=αt(1α¯t1)1α¯txt+α¯t1βt1α¯t1α¯t(xt1α¯tϵt)=1αt(xt1αt1α¯tϵt)

如图2所示,这种设置与VAE非常相似,因此我们可以使用变分下界优化负对数似然。

logpθ(x0)logpθ(x0)+DKL(q(x1:T|x0)pθ(x1:T|x0))=logpθ(x0)+Ex1:Tq(x1:T|x0)[logq(x1:T|x0)pθ(x0:T)/pθ(x0)]=logpθ(x0)+Eq[logq(x1:T|x0)pθ(x0:T)+logpθ(x0)]=Eq[logq(x1:T|x0)pθ(x0:T)]Let LVLB=Eq(x0:T)[logq(x1:T|x0)pθ(x0:T)]Eq(x0)logpθ(x0)

同样使用詹森不等式可以很容易得到相同的结果。假设我们希望将交叉熵最小化作为学习目标,

LCE=Eq(x0)logpθ(x0)=Eq(x0)log(pθ(x0:T)dx1:T)=Eq(x0)log(q(x1:T|x0)pθ(x0:T)q(x1:T|x0)dx1:T)=Eq(x0)log(Eq(x1:T|x0)pθ(x0:T)q(x1:T|x0))Eq(x0:T)logpθ(x0:T)q(x1:T|x0)=Eq(x0:T)[logq(x1:T|x0)pθ(x0:T)]=LVLB

为了将方程中的每一项转换为可解析的,我们可以将目标进一步重写为若干KL散度和熵项的组合(详见Sohl-Dickstein等,2015的附录B中的详细步骤):

LVLB=Eq(x0:T)[logq(x1:T|x0)pθ(x0:T)]=Eq[logt=1Tq(xt|xt1)pθ(xT)t=1Tpθ(xt1|xt)]=Eq[logpθ(xT)+t=1Tlogq(xt|xt1)pθ(xt1|xt)]=Eq[logpθ(xT)+t=2Tlogq(xt|xt1)pθ(xt1|xt)+logq(x1|x0)pθ(x0|x1)]=Eq[logpθ(xT)+t=2Tlog(q(xt1|xt,x0)pθ(xt1|xt)q(xt|x0)q(xt1|x0))+logq(x1|x0)pθ(x0|x1)]=Eq[logpθ(xT)+t=2Tlogq(xt1|xt,x0)pθ(xt1|xt)+t=2Tlogq(xt|x0)q(xt1|x0)+logq(x1|x0)pθ(x0|x1)]=Eq[logpθ(xT)+t=2Tlogq(xt1|xt,x0)pθ(xt1|xt)+logq(xT|x0)q(x1|x0)+logq(x1|x0)pθ(x0|x1)]=Eq[logq(xT|x0)pθ(xT)+t=2Tlogq(xt1|xt,x0)pθ(xt1|xt)logpθ(x0|x1)]=Eq[DKL(q(xT|x0)pθ(xT))LT+t=2TDKL(q(xt1|xt,x0)pθ(xt1|xt))Lt1logpθ(x0|x1)L0]

让我们分别标记变分下界损失中的每个组件:

LVLB=LT+LT1++L0where LT=DKL(q(xT|x0)pθ(xT))Lt=DKL(q(xt|xt+1,x0)pθ(xt|xt+1)) for 1tT1L0=logpθ(x0|x1)

LVLB中的每个KL项(除了L0)比较两个高斯分布,因此它们可以在闭合形式中计算LT是常数,在训练过程中可以忽略,因为q没有可学习的参数,并且xT是高斯噪声。Ho等,2020使用从N(x0;μθ(x1,1),Σθ(x1,1))派生的单独的离散解码器来建模L0

用于训练损失的Lt的参数化

回想一下,我们需要学习一个神经网络来*似逆向扩散过程中的条件概率分布,pθ(xt1|xt)=N(xt1;μtheta(xt,t),Σtheta(xt,t))\boldsymbol{\mu}_theta\tilde{\boldsymbol{\mu}}_t = \frac{1}{\sqrt{\alpha_t}} \Big( \mathbf{x}_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}} \boldsymbol{\epsilon}_t \Big)\mathbf{x}_t使t\mathbf{x}_t\boldsymbol{\epsilon}_t$:

μtheta(xt,t)=1αt(xt1αt1α¯tϵtheta(xt,t))Thus xt1=N(xt1;1αt(xt1αt1α¯tϵtheta(xt,t)),Σtheta(xt,t))

损失项Lt被参数化以最小化与μ~的差异:

Lt=Ex0,ϵ[12Σtheta(xt,t)22μ~t(xt,x0)μtheta(xt,t)2]=Ex0,ϵ[12Σtheta221αt(xt1αt1α¯tϵt)1αt(xt1αt1α¯tϵtheta(xt,t))2]=Ex0,ϵ[(1αt)22αt(1α¯t)Σtheta22ϵtϵtheta(xt,t)2]=Ex0,ϵ[(1αt)22αt(1α¯t)Σtheta22ϵtϵtheta(α¯tx0+1α¯tϵt,t)2]

简化

经验上,Ho等(2020)发现训练扩散模型在忽略加权项的简化目标下效果更好:

Ltsimple=Et[1,T],x0,ϵt[ϵtϵtheta(xt,t)2]=Et[1,T],x0,ϵt[ϵt\boldboldsymbolϵtheta(α¯tx0+1α¯t\boldboldsymbolϵt,t)2]

最终的简化目标是:

Lsimple=Ltsimple+C

其中C是一个不依赖于θ的常数。

图4. DDPM中的训练和采样算法(图片来源:Ho等,2020

与噪声条件得分网络(NCSN)的联系

Song & Ermon (2019) 提出了一种基于分数的生成建模方法,通过使用通过分数匹配估计的数据分布的梯度,通过Langevin动力学生成样本。每个样本x的密度概率的分数定义为其梯度xlogq(x)。分数网络sθ:RDRD被训练用来估计它,sθ(x)xlogq(x)

为了使其在深度学习环境下可扩展到高维数据,他们提出使用去噪分数匹配Vincent, 2011)或切片分数匹配(使用随机投影;Song等,2019)。去噪分数匹配向数据添加预定的小噪声q(x~|x)并通过分数匹配估计q(x~)

回顾一下,Langevin动力学可以使用分数xlogq(x)在迭代过程中从概率密度分布中采样数据点。

然而,根据流形假设,大多数数据预计集中在低维流形中,尽管观察到的数据看起来可能是任意高维的。这对分数估计产生了负面影响,因为数据点无法覆盖整个空间。在数据密度较低的区域,分数估计不那么可靠。加入少量高斯噪声以使扰动数据分布覆盖整个空间RD后,分数估计网络的训练变得更加稳定。Song & Ermon (2019)通过以不同级别的噪声扰动数据并训练一个噪声条件分数网络来联合估计所有不同噪声级别的扰动数据的分数。

增加噪声级别的时间表类似于前向扩散过程。如果我们使用扩散过程的标注,分数*似为sθ(xt,t)xtlogq(xt)。假设一个高斯分布xN(μ,σ2I),我们可以将其密度函数对数的导数写为xlogp(x)=x(12σ2(xμ)2)=xμσ2=ϵσ,其中ϵN(0,I)回顾一下q(xt|x0)N(α¯tx0,(1α¯t)I)因此,

sθ(xt,t)xtlogq(xt)=Eq(x0)[xtq(xt|x0)]=Eq(x0)[ϵθ(xt,t)1α¯t]=ϵθ(xt,t)1α¯t

βt的参数化

Ho等人(2020)中,前向方差被设定为一系列线性增加的常数,从β1=104βT=0.02。与标准化的图像像素值在[1,1]之间相比,它们相对较小。尽管他们的实验中扩散模型显示了高质量的样本,但仍无法达到其他生成模型的竞争性模型对数似然。

Nichol & Dhariwal(2021)提出了一些改进技术,以帮助扩散模型获得更低的NLL。其中一项改进是使用基于余弦的方差时间表。时间表函数的选择可以是任意的,只要它在训练过程中间提供接**滑的下降,并在t=0t=T附*的变化很小。

βt=clip(1α¯tα¯t1,0.999)α¯t=f(t)f(0)where f(t)=cos(t/T+s1+sπ2)2

其中小偏移s是为了防止βt在接*t=0时变得太小。

图5. 训练期间线性和基于余弦的βt时间表比较。(图片来源:Nichol & Dhariwal,2021

反向过程方差Σθ的参数化

Ho等人(2020)选择将βt固定为常数,而不是使它们可学习,并将Σθ(xt,t)=σt2I设定为常数,其中σt不是可学习的,而是设定为βtβ~t=1α¯t11α¯tβt。因为他们发现学习对角方差Σθ会导致训练不稳定和样本质量下降。

Nichol & Dhariwal(2021)提出学习Σθ(xt,t)作为βtβ~t之间的插值,通过模型预测一个混合向量v

Σθ(xt,t)=exp(vlogβt+(1v)logβ~t)

然而,简单目标Lsimple不依赖于Σθ。为了增加依赖性,他们构建了一个混合目标Lhybrid=Lsimple+λLVLB,其中λ=0.001很小,并且在LVLB项中停止了μθ的梯度,因此LVLB只引导Σθ的学习。经验表明,LVLB很难优化,可能是由于梯度噪声,因此他们提出使用带有重要采样的时间*均*滑版本的LVLB

图6. 改进DDPM与其他基于似然生成模型的负对数似然比较。NLL以比特/维度为单位报告。(图片来源:Nichol & Dhariwal,2021

条件生成

在带有条件信息(如ImageNet数据集)的图像上训练生成模型时,通常会生成条件在类别标签或一段描述性文本上的样本。

分类器引导的扩散

为了在扩散过程中显式地结合类别信息,Dhariwal & Nichol(2021)在带有噪声的图像xt上训练了一个分类器fϕ(y|xt,t),并使用梯度xlogfϕ(y|xt)引导扩散采样过程朝向条件信息y(例如目标类别标签),通过改变噪声预测。 回顾一下xtlogq(xt)=11α¯tϵθ(xt,t)我们可以将联合分布q(xt,y)的分数函数写成如下形式:

ϵ¯θ(xt,t)=ϵθ(xt,t)1α¯txtlogfϕ(y|xt)

为了控制分类器引导的强度,我们可以在delta部分添加一个权重w

ϵ¯θ(xt,t)=ϵθ(xt,t)1α¯twxtlogfϕ(y|xt)

得到的消融扩散模型ADM)和带有附加分类器引导的模型(ADM-G)能够比现有最先进的生成模型(例如BigGAN)取得更好的结果。

图7. 这些算法使用分类器的引导在DDPM和DDIM中运行条件生成。(图片来源:Dhariwal & Nichol,2021

此外,通过对U-Net架构的一些修改,Dhariwal & Nichol(2021)展示了在扩散模型上比GAN更好的表现。架构修改包括更大的模型深度/宽度,更多的注意头,多分辨率注意力,BigGAN残差块用于上/下采样,残差连接重新缩放为1/2和自适应组归一化(AdaGN)。

无分类器引导

在没有独立分类器fϕ的情况下,通过结合条件和无条件扩散模型的分数,仍然可以运行条件扩散步骤(Ho & Salimans,2021)。设无条件去噪扩散模型pθ(x)通过分数估计器ϵtheta(xt,t)进行参数化,而条件模型pθ(x|y)通过ϵθ(xt,t,y)进行参数化。这两个模型可以通过一个神经网络来学习。具体来说,一个条件扩散模型pθ(x|y)在成对数据(x,y)上训练,其中条件信息y会在随机的时间段被丢弃,这样模型也知道如何无条件生成图像,即ϵθ(xt,t)=ϵθ(xt,t,y=)

隐式分类器的梯度可以通过条件和无条件分数估计器表示。一旦插入分类器引导的修改分数,分数就不再依赖于单独的分类器。

xtlogp(y|xt)=xtlogp(xt|y)xtlogp(xt)=11α¯t(ϵθ(xt,t,y)ϵtheta(xt,t))ϵ¯θ(xt,t,y)=ϵtheta(xt,t,y)1α¯twxtlogp(y|xt)=ϵtheta(xt,t,y)+w(ϵθ(xt,t,y)ϵtheta(xt,t))=(w+1)ϵθ(xt,t,y)wϵθ(xt,t)

他们的实验表明,无分类器引导可以在FID(区分合成和生成图像)和IS(质量和多样性)之间实现良好的*衡。

引导扩散模型GLIDE(Nichol, Dhariwal & Ramesh, et al. 2022)探讨了两种引导策略,CLIP引导和无分类器引导,并发现后者更受欢迎。他们假设这是因为CLIP引导通过对CLIP模型的对抗性示例利用模型,而不是优化更匹配的图像生成。

加速扩散模型

通过遵循反向扩散过程的马尔可夫链从DDPM生成一个样本非常慢,因为T可以达到一千步甚至几千步。Song等人(2020)的一个数据点:“例如,从DDPM采样50k张32 × 32大小的图像大约需要20小时,而在Nvidia 2080 Ti GPU上用GAN不到一分钟。”

减少采样步骤与蒸馏

一种简单的方法是运行跨步采样计划(Nichol & Dhariwal, 2021),通过每隔T/S步进行采样更新,将过程从T步减少到S步。生成的新采样计划是{τ1,,τS},其中τ1<τ2<<τS[1,T]S<T

另一种方法是将qσ(xt1|xt,x0)根据nice property重新参数化为期望的标准偏差σt

xt1=α¯t1x0+1α¯t1ϵt1=α¯t1x0+1α¯t1σt2ϵt+σtϵ=α¯t1(xt1α¯tϵθ(t)(xt)α¯t)+1α¯t1σt2ϵθ(t)(xt)+σtϵqσ(xt1|xt,x0)=N(xt1;α¯t1(xt1α¯tϵθ(t)(xt)α¯t)+1α¯t1σt2ϵθ(t)(xt),σt2I)

其中模型ϵθ(t)(.)xt预测ϵt

回顾一下q(xt1|xt,x0)=N(xt1;μ~(xt,x0),β~tI),因此我们有:

β~t=σt2=1α¯t11α¯tβt

σt2=ηβ~t,这样我们可以将ηR+作为超参数来控制采样随机性。η=0的特例使采样过程确定性。这种模型称为去噪扩散隐式模型DDIMSong等人,2020)。DDIM具有相同的边际噪声分布,但确定性地将噪声映射回原始数据样本。

在生成过程中,我们不必遵循整个链t=1,,T,而是一个步骤的子集。让我们用s<t表示这个加速轨迹中的两个步骤。DDIM更新步骤为:

qσ,s<t(xs|xt,x0)=N(xs;α¯s(xt1α¯tϵθ(t)(xt)α¯t)+1α¯sσt2ϵθ(t)(xt),σt2I)

在实验中,所有模型都使用T=1000的扩散步骤进行训练,但他们观察到DDIM(η=0)在S较小时可以产生最佳质量样本,而DDPM(η=1)在S较小时表现更差。DDPM确实在我们能够运行完整的反向马尔可夫扩散步骤(S=T=1000)时表现更好。使用DDIM,可以将扩散模型训练到任意数量的前向步骤,但在生成过程中只从步骤的子集中采样。

图8. 在CIFAR10和CelebA数据集上不同设置的扩散模型的FID分数,包括DDIM (η=0)和DDPM (σ^)。(图片来源:Song等人,2020

与DDPM相比,DDIM能够:

  1. 使用更少的步骤生成更高质量的样本。
  2. 具有“一致性”属性,因为生成过程是确定性的,这意味着多个样本在相同的潜在变量条件下应具有相似的高级特征。
  3. 由于一致性,DDIM可以在潜在变量中进行语义上有意义的插值。

图9. 渐进蒸馏可以在每次迭代中将扩散采样步骤减少一半。(图片来源:Salimans & Ho, 2022

渐进蒸馏Salimans & Ho, 2022)是一种将训练好的确定性采样器蒸馏到新的减少一半采样步骤的模型中的方法。学生模型从教师模型初始化并向目标去噪,其中一个学生DDIM步骤匹配2个教师步骤,而不是使用原始样本x0作为去噪目标。在每次渐进蒸馏迭代中,我们可以将采样步骤减半。

图10. 并列比较算法1(扩散模型训练)和算法2(渐进蒸馏),渐进蒸馏中的相对变化以绿色突出显示。
(图片来源:Salimans & Ho, 2022

一致性模型Song等人,2023)学习将扩散采样轨迹上的任何中间噪声数据点xt,t>0直接映射回其原点x0。它被称为一致性模型,因为其自一致性属性,即轨迹上的任何数据点都映射到相同的原点。

图11. 一致性模型学习将轨迹上的任何数据点映射回其原点。(图片来源:Song等人,2023

给定轨迹{xt|t[ϵ,T]}一致性函数f定义为f:(xt,t)xϵ,且方程f(xt,t)=f(xt,t)=xϵ在所有t,t[ϵ,T]时成立。当t=ϵ时,f是一个恒等函数。模型可以参数化如下,其中cskip(t)cout(t)函数的设计方式是cskip(ϵ)=1,cout(ϵ)=0

fθ(x,t)=cskip(t)x+cout(t)Fθ(x,t)

一致性模型有可能在单步中生成样本,同时仍保持通过多步采样过程权衡计算与质量的灵活性。

论文介绍了两种训练一致性模型的方法:

  1. 一致性蒸馏(CD):通过最小化从相同轨迹生成的模型输出之间的差异,将扩散模型蒸馏到一致性模型中。这使得评估采样更加便宜。一致性蒸馏损失为:

    LCDN(θ,θ;ϕ)=E[λ(tn)d(fθ(xtn+1,tn+1),fθ(x^tnϕ,tn)]x^tnϕ=xtn+1(tntn+1)Φ(xtn+1,tn+1;ϕ)

    其中

    • Φ(.;ϕ)是一步ODE求解器的更新函数;
    • nU[1,N1],在1,,N1上具有均匀分布;
    • 网络参数θθ的EMA版本,这大大稳定了训练(就像在DQN动量对比学习中一样);
    • d(.,.)是一个满足x,y:d(x,y)0d(x,y)=0当且仅当x=y的正距离度量函数,如21LPIPS(学习的感知图像补丁相似性)距离;
    • λ(.)R+是一个正权函数,论文设置λ(tn)=1
  2. 一致性训练(CT):另一种选择是独立训练一致性模型。注意,在CD中,使用预训练的分数模型sϕ(x,t)来*似地面真值分数logpt(x),但在CT中,我们需要一种方法来估计这个分数函数,事实证明,存在logpt(x)的无偏估计器,即xtxt2。CT损失定义如下:

LCTN(θ,θ;ϕ)=E[λ(tn)d(fθ(x+tn+1z,tn+1),fθ(x+tnz,tn)] where zN(0,I)

根据论文中的实验,他们发现,

  • Heun ODE求解器比Euler的一阶求解器效果更好,因为高阶ODE求解器在相同N下的估计误差较小。
  • 在不同选项的距离度量函数d(.)中,LPIPS度量比12距离效果更好。
  • 较小的N导致更快的收敛,但样本更差,而较大的N导致收敛速度较慢,但收敛后的样本更好。

图12. 不同配置下一致性模型的性能比较。CD的最佳配置是LPIPS距离度量、Heun ODE求解器和N=18。(图片来源:Song等人,2023

潜变量空间

潜扩散模型LDMRombach & Blattmann等人,2022)在潜空间而不是像素空间中运行扩散过程,从而降低训练成本并加快推理速度。其动机是观察到图像的大多数位元贡献于感知细节,而经过激进压缩后,语义和概念组成仍然保留。LDM通过首先用自编码器去除像素级冗余,然后在学习的潜变量上使用扩散过程进行语义概念的操纵/生成,松散地将感知压缩和语义压缩与生成建模学习分解。

图13. 压缩率与失真之间权衡的图示,说明两阶段压缩——感知压缩和语义压缩。(图片来源:Rombach & Blattmann等人,2022

感知压缩过程依赖于自编码器模型。一个编码器E用于将输入图像xRH×W×3压缩到一个更小的二维潜向量z=E(x)Rh×w×c,其中下采样率f=H/h=W/w=2m,mN。然后一个解码器D从潜向量重建图像,x~=D(z)。论文探索了自编码器训练中的两种正则化方法以避免潜空间中的任意高方差。

  • KL-reg:对学习的潜变量施加一个小的KL惩罚,趋向标准正态分布,类似于VAE
  • VQ-reg:在解码器内使用向量量化层,类似于VQVAE,但量化层被解码器吸收。

扩散和去噪过程发生在潜向量z上。去噪模型是一个时间条件U-Net,增强了交叉注意力机制,以处理用于图像生成的灵活条件信息(例如类标签、语义图、图像的模糊变体)。这种设计等效于通过交叉注意力机制将不同模态的表示融合到模型中。每种类型的条件信息都配有一个特定领域的编码器τθ,将条件输入y投射到可以映射到交叉注意力组件的中间表示中,τθ(y)RM×dτ

Attention(Q,K,V)=softmax(QKd)Vwhere Q=WQ(i)φi(zi),K=WK(i)τθ(y),V=WV(i)τθ(y)and WQ(i)Rd×dϵi,WK(i),WV(i)Rd×dτ,φi(zi)RN×dϵi,τθ(y)RM×dτ

图14. 潜扩散模型(LDM)的架构。(图片来源:Rombach & Blattmann等人,2022

扩大生成分辨率和质量

为了生成高分辨率的高质量图像,Ho等人(2021)提出了使用多个扩散模型在增加的分辨率下的流水线。噪声条件增强是流水线模型之间最有效的,旨在对每个超分辨率模型pθ(x|z)的条件输入z应用强数据增强。条件噪声有助于减少流水线设置中的复合错误。U-net是扩散建模中用于高分辨率图像生成的常见选择。

图15. 在增加分辨率下的多个扩散模型的级联流水线。(图片来源:Ho等人,2021

他们发现最有效的噪声是在低分辨率时应用高斯噪声,在高分辨率时应用高斯模糊。此外,他们还探索了两种需要对训练过程进行小修改的条件增强形式。注意,条件噪声仅在训练时应用,而不是在推理时。

  • 截断条件增强在t>0步骤早期停止扩散过程以实现低分辨率。
  • 非截断条件增强运行全低分辨率反向过程直到步骤0,然后通过ztq(xt|x0)来破坏它,然后将破坏的zt输入超分辨率模型。

两阶段扩散模型unCLIPRamesh等人,2022)大量利用CLIP文本编码器来生成高质量的文本引导图像。给定预训练的CLIP模型c和扩散模型的成对训练数据(x,y),其中x是图像,y是相应的标题,我们可以计算CLIP文本和图像嵌入,ct(y)ci(x)。unCLIP并行学习两个模型:

  • 先验模型P(ci|y):给定文本y输出CLIP图像嵌入ci
  • 解码器P(x|ci,[y]):在给定CLIP图像嵌入ci和可选的原始文本y的条件下生成图像x

这些模型使条件生成成为可能,因为

P(x|y)=P(x,ci|y)ci 是给定x的确定性=P(x|ci,y)P(ci|y)

图16. unCLIP的架构。(图片来源:Ramesh等人,2022

unCLIP遵循两阶段图像生成过程:

  1. 给定文本y,首先使用CLIP模型生成文本嵌入ct(y)。使用CLIP潜在空间可以通过文本进行零样本图像操纵。
  2. 扩散或自回归先验P(ci|y)处理此CLIP文本嵌入以构建图像先验,然后扩散解码器P(x|ci,[y])生成图像,条件在先验上。这个解码器还可以在图像输入的条件下生成图像变体,保留其风格和语义。

与CLIP模型不同,ImagenSaharia等人,2022)使用预训练的大型LM(即冻结的T5-XXL文本编码器)来编码用于图像生成的文本。通常,模型尺寸越大,图像质量和文本-图像对齐越好。他们发现T5-XXL和CLIP文本编码器在MS-COCO上的性能相似,但在DrawBench(涵盖11个类别的提示集合)上,人类评估更喜欢T5-XXL。

在应用无分类器引导时,增加w可能会导致更好的图像-文本对齐但较差的图像保真度。他们发现这是由于训练-测试不匹配,即由于训练数据x保持在[1,1]范围内,测试数据也应该如此。引入了两种阈值策略:

  • 静态阈值:将x预测裁剪到[1,1]
  • 动态阈值:在每个采样步骤,计算s作为某个百分位数的绝对像素值;如果s>1,将预测裁剪到[s,s]并除以s

Imagen在U-net中修改了几种设计,使其成为高效U-Net

  • 通过为较低分辨率添加更多残差锁,将模型参数从高分辨率块移到低分辨率;
  • 将跳跃连接缩放为1/2
  • 将下采样(在卷积之前)和上采样操作(在卷积之后)的顺序反转,以提高前向传递的速度。

他们发现噪声条件增强、动态阈值和高效U-Net对图像质量至关重要,但缩放文本编码器大小比U-Net大小更重要。

模型架构

扩散模型有两种常见的骨干架构选择:U-Net和Transformer。

U-NetRonneberger等人,2015)由下采样堆栈和上采样堆栈组成。

  • 下采样:每一步包括两次3x3卷积(无填充卷积)的重复应用,每次后跟一个ReLU和一个具有2步幅度的2x2最大池化。在每一步下采样时,特征通道的数量加倍。
  • 上采样:每一步包括一个特征图的上采样,随后是一个2x2卷积,每次减半特征通道数量。
  • 快捷方式:快捷连接将高分辨率特征提供给上采样过程。

图17. U-net架构。每个蓝色方块是一个特征图,顶部标有通道数,左下角标有高度x宽度维度。灰色箭头标记快捷连接。(图片来源:Ronneberger,2015

为了使图像生成以额外图像为条件进行组合信息如Canny边缘、Hough线、用户涂鸦、人体姿势骨架、分割图、深度和法线,ControlNetZhang等人,2023通过在U-Net的每个编码器层中添加“夹心”零卷积层,将原始模型权重的可训练副本引入架构中进行架构变化。具体而言,给定神经网络块Fθ(.),ControlNet执行以下操作:

  1. 首先,冻结原始块的参数θ
  2. 将其克隆为带有可训练参数θc的副本和额外的条件向量c
  3. 使用两个零卷积层,表示为Zθz1(.;.)Zθz2(.;.),即1x1卷积层,权重和偏置都初始化为零,将这两个块连接起来。零卷积在初始训练步骤中通过消除随机噪声作为梯度来保护此骨干。
  4. 最终输出为:yc=Fθ(x)+Zθz2(Fθc(x+Zθz1(c)))

图18. ControlNet架构。(图片来源:Zhang等人,2023

扩散TransformerDiTPeebles & Xie,2023)用于扩散建模在潜变量块上运行,使用与LDM(潜扩散模型)相同的设计空间。DiT有以下设置:

  1. 将输入的潜表示z作为DiT的输入。
  2. 将大小为I×I×C的噪声潜变量“块化”为大小为p的块,并将其转换为大小为(I/p)2的块序列。
  3. 然后这个块序列通过Transformer块。他们在探索如何在时间步t或类标签c等上下文信息的条件下进行生成的三种不同设计。在三种设计中,adaLN(自适应层归一化)-Zero效果最好,优于上下文内条件和交叉注意力块。比例和偏移参数γβ是从tc的嵌入向量之和回归出来的。尺度参数α也是回归的,并在任何残差连接之前立即应用于DiT块中。
  4. Transformer解码器输出噪声预测和输出对角协方差预测。

图19. 扩散Transformer(DiT)架构。
(图片来源:Peebles & Xie,2023

Transformer架构可以轻松扩展,这是DiT的最大优点之一,因为其性能随着更多计算量的增加而提高,较大的DiT模型在实验中显示出更高的计算效率。

快速总结

  • 优点:在生成建模中,可追溯性和灵活性是两个相互冲突的目标。可追溯的模型可以进行分析评估并廉价地拟合数据(例如通过高斯或拉普拉斯),但它们不能轻易描述丰富数据集中的结构。灵活的模型可以拟合数据中的任意结构,但评估、训练或从这些模型中采样通常非常昂贵。扩散模型既是可追溯的,又是灵活的。

  • 缺点:扩散模型依赖于长的扩散步骤马尔可夫链生成样本,因此在时间和计算方面可能相当昂贵。已提出新的方法使这一过程更快,但采样仍然比GAN慢。

引用

引用为:

Weng, Lilian.(2021年7月)。什么是扩散模型?Lil’Log。https://lilianweng.github.io/posts/2021-07-11-diffusion-models/。

或者

@article{weng2021diffusion,
  title   = "What are diffusion models?",
  author  = "Weng, Lilian",
  journal = "lilianweng.github.io",
  year    = "2021",
  month   = "Jul",
  url     = "https://lilianweng.github.io/posts/2021-07-11-diffusion-models/"
}