概述
去噪扩散模型全称为 Denoising Diffusion Probabilistic Models,简称 DDPM 或 Diffusion 模型(下简称 Diffusion 模型)。相比于 GAN, VAE 等模型,其核心优势在于:通过学习训练数据的真实分布,来生成与训练数据风格、质量一致的逼真样本。
Diffusion 通过学习训练数据(比如大量真实图片)的概率分布,最终能从纯噪声出发,生成出分布与训练数据高度相似的逼真图片。在生成图片的过程中,Diffusion 模型主要有以下两个流程
- 从高随机性的噪声分布中采样
- 将这张纯噪声图进行处理,这一步取决于去噪模型(Denoise Model)
Diffusion 模型通常被描述为一个马尔可夫链,这个马尔可夫链包括前向过程和反向过程。前向过程是有具体的表达式可以计算的,后向过程是利用神经网络来学习的。和 GAN, VAE 类似,Diffusion 模型想要通过某种方式估计给定数据样本 {x(i)} 服从的概率分布,因此我们将花费更多笔墨介绍这一部分。
基础模型
反向过程
用 x0 表示生成的目标样本,我们定义一系列与 x0 维数相同的随机变量 x1,⋯,xT,其表示从 x0 开始不断添加随机高斯噪声,最终得到 xT∼p(xT)=N(xT;0,I)。这一过程称为前向过程或扩散过程,我们在下一小节再详细介绍。
设 x0 的先验分布为 q(x0),我们希望用参数为 θ 的神经网络估计 x0 的概率密度函数,记为 pθ(x0)。这可以看做对联合概率密度 pθ(x0:T) 求变量 x0 的边缘概率密度。由概率论知识有
pθ(x0)=∫pθ(x0:T)dx1:T
其中的 dx1:T 可以被视为 dx1⋯dxT。接下来,我们将 pθ(x0:T) 定义为一个马尔科夫链,其转移方程被描述为高斯过程。具体形式可以由条件概率乘积链表示
pθ(x0:T)=p(xT)t=1∏Tpθ(xt−1∣xt)
这一过程称为反向过程,因为其描述了从噪音 xT 恢复为 x0 的过程。在恢复的每一步中,我们可以证明条件概率仍然服从高斯分布,并且其均值,协方差来自上一步由神经网络 θ 给出的结果
pθ(xt−1∣xt)=N(xt−1;μθ(xt,t),Σθ(xt,t))
最终,整个 Diffusion 模型的前向过程和反向过程可以被表示为下图。
[{"url":"https://pic3.zhimg.com/v2-8f48241c47d13649d11a471ae53881fc_1440w.jpg","alt":"Figure 2","title":""}]
前向过程
现在来看前向过程的概率分布,用记号 q 表示人为规定的高斯噪声添加过程。整个前向过程 q(x1:T∣x0) 仍然被定义为一个马尔科夫链,表示从已知样本 x0 得到纯高斯噪声 xT,因此有
q(x1:T∣x0)=t=1∏Tq(xt∣xt−1)
指定标量序列 β1,⋯,βT,令前向过程的单步转移满足
q(xt∣xt−1)=N(xt;1−βtxt−1,βtI)
前向过程具有一个特殊的性质:我们可以借助 x0 对任意 xt 进行采样。定义 αt=1−βt,他们的所有前步乘积表示为
αˉt=s=1∏tαs
利用高斯分布的可加性,可以证明前向传播的任意采样满足
q(xt∣x0)=N(xt;αˉtx0,(1−αˉt)I)
原文指出了序列 β1,⋯,βT 的意义:将 βt 从 β1=10−4 线性增长到 βT=0.02,当 βt 越大时 αt 和 αˉt 越小,此时代入重参数化采样得到
xt=αˉtx0+1−αˉtϵ∼approxN(xT;0,I)=p(xT)
因此噪声公式能够从慢到快地改变原图像,让噪声 xT 最终服从标准高斯分布。
KL散度优化
训练目标在于对 pθ(x0) 进行最大似然估计,这可以转化为负对数优化问题
θmin−logpθ(x0)
对于前向过程分布 q,可以将上式的估计内容改写为以 q 为基准分布的期望
−logpθ(x0)=−logx1:T∑q(x1:T∣x0)q(x1:T∣x0)pθ(x0)=−logEq[q(x1:T∣x0)pθ(x0)]
利用对数函数的凸性,由Jensen不等式得到
−logEq[q(x1:T∣x0)pθ(x0)]⩽Eq[−logq(x1:T∣x0)pθ(x0)]
将分子分母拆分为乘积链的形式,利用对数函数的性质有
Eq[−logq(x1:T∣x0)pθ(x0)]=Eq[−logp(xT)−t=1∑Tlogq(xt∣xt−1)pθ(xt−1∣xt)]=defL
利用贝叶斯定理,对于 2⩽t⩽T 可以把 q 反向化书写
q(xt∣xt−1)=q(xt−1∣xt,x0)q(xt−1∣x0)q(xt∣x0)
此时,L 内求和部分的每一项可以被拆分为
q(xt∣xt−1)pθ(xt−1∣xt)=q(xt−1∣xt,x0)pθ(xt−1∣xt)q(xt∣x0)q(xt−1∣x0)
注意到下式可以通过裂项相消的方式得到
t=2∏Tq(xt∣x0)q(xt−1∣x0)=q(xT∣x0)q(x1∣x0)
因此不难得到
q(x1:T∣x0)pθ(x0)=q(xT∣x0)p(xT)⋅t=2∏Tq(xt−1∣xt,x0)pθ(xt−1∣xt)⋅pθ(x0∣x1)
对上式左端取负对数并对 q(x1:T∣x0) 求期望得到 L,右端化简为
L=Eq[DKL[q(xT∣x0)∥p(xT)]+t=2∑TDKL[q(xt−1∣xt,x0)∥pθ(xt−1∣xt)]−logpθ(x0∣x1)]
用符号 L 简记上式几项,可以记作
L=Eq[LT+t=2∑TLt−1−L0]
对于条件概率 q(xt−1∣xt,x0),可以证明其形式为
q(xt−1∣xT,x0)=N(xt−1;1−αˉtαˉt−1βtx0+1−αˉtαt(1−αˉt−1)xt,1−αˉt(1−αˉt−1)βtI)
将上述高斯分布的参数记为 μ~t(xt,x0),β~tI
扩散与去噪
ELBO分析
前面我们得到了 Diffusion 模型的变分界形式为
L=Eq[LT+t=2∑TLt−1−L0]
这若干项可以看做三个部分
- LT:前向过程结果 xT 与标准高斯先验 N(0,I) 的区别
- Lt−1:后验分布 q(xt−1∣xt,x0) 与神经网络 pθ(xt−1∣xt) 的区别
- L0:从 x1 恢复到 x0 的重建项
目前,我们先假定 βi 是固定常数,因此 LT 可以视为常数不参与训练。现在重点关注 Lt−1 项,它是 Diffusion 模型的理论核心。考虑训练目标神经网络
pθ(xt−1∣xt)=N(xt−1;μθ(xt,t),Σθ(xt,t)),1<t⩽T
这个反向过程中,我们假定方差的形式为 Σθ(xt,t)=σt2I,其中的 σt2 有两种取法
- σt2=βt:此时若 x0∼N(x0;0,I),则模型表现更佳
- σt2=βt~:此时若 x0 服从单点分布,则模型表现更佳
预测新噪声
上述两种采样情况都属于极端情况,划定了数据损失熵的上界和下界。接着,我们需要对均值 μθ(xt,t) 进行参数化。利用 KL 散度的性质,我们可以把 Lt−1 项转化为如下 L2 范数形式
Lt−1=Eq[2σt21μ~t(xt,x0)−μθ(xt,t)2]+C
直观上说,由于 μ~t(xt,x0) 表示后验 q(xt−1∣xt,x0) 的均值,因此上式试图使用神经网络 θ 的输出 μθ(xt,t) 以逼近真实后验均值。参考VAE中的重参数化技巧,我们考虑随机 ϵ∼N(ϵ;0,I) 并对 xt 采样
xt=xt(x0,ϵ)=αˉtx0+1−αˉtϵ
该采样方法的依据为
q(xt∣x0)=N(xt;αˉtx0,(1−αˉt)I)
将该采样结果代入 Lt−1 可以得到如下形式
Lt−1−C=Eq[2σt21μ~t(xt(x0,ϵ),x0)−μθ(xt(x0,ϵ),t)2]=Ex0,ϵ2σt21μ~t(xt(x0,ϵ),αˉtxt(x0,ϵ)−1−αˉtϵ)−μθ(xt(x0,ϵ),t)2=Ex0,ϵ2σt21αˉt1(xt(x0,ϵ)−1−αˉtβtϵ)−μθ(xt(x0,ϵ),t)2
上式从代数角度证明了,对前向过程 q 的期望可以转化为对 x0,ϵ 的期望。对于给定的 xt,神经网络 θ 的目标是用 μθ 去预测真实后验均值,而真实后验均值现在可以被视为 ϵ 的函数。我们记 ϵ=ϵθ(xt,t),那么神经网络 θ 的输出将尝试逼近下式。
μθ(xt,t)=αˉt1(xt−1−αˉtβtϵθ(xt,t))
这一过程巧妙的把对 μ~t 的预测转化为对简单噪声 ϵ 的预测,我们就只需要对标准高斯噪声 ϵθ 进行预测,模型就能根据上式计算出对应的 μθ,从而完成输出预测。换言之,我们现在的神经网络只需要输出 ϵθ 即可,对应的 Lt−1 项被记为
Lt−1−C=Ex0,ϵ[2σt2αt(1−αˉt)βt2ϵ−ϵθ(αˉtx0+1−αˉtϵ,t)2]
图像解码近似
一个常见的图像像素值可以被定义为 i∈{0,1,⋯,255},在 Diffusion 处理图像时,常将这些像素值线性映射到 [−1,1] 中,以保证参数量级与先验分布 p(xT) 对应。现在考虑 L0=−logpθ(x0∣x1),为了处理离散形式的 x0,设其像素维度数为 D,线性处理后的像素表示为 x0(i),则有
pθ(x0∣x1)=i=1∏D∫δ−(x0(i))δ+(x0(i))N(x;μθ(i)(x1,1),σ12)dx
其中的积分界函数被定义为
δ+(x)=⎩⎨⎧+∞,x+2551,x=1x<1,δ−(x)=⎩⎨⎧−∞,x−2551,x=−1x>−1
这里通过在离散点周围进行积分,以求取近似的高斯分布值。实际中可近似为
∫δ−(x0(i))δ+(x0(i))N(x;μθ(i)(x1,1),σ12)dx≈2552N(x0(i);μθ(i),σ12)
训练与预测
在实际训练中,下述目标函数近似通常表现的更佳
Lsimple(θ)=Et,x0,ϵ[ϵ−ϵθ(αˉtx0+1−αˉtϵ,t)2]
接下来我们来简单讨论 Diffusion 模型的训练步骤。
- 从数据集 q(x0) 采样 x0
- 采样时间步 t∼U({1,⋯,T})
- 采样噪音 ϵ∼N(0,I)
- 一步合成含噪音样本 xt=αˉtx0+1−αˉtϵ
- 计算梯度 ∇θ∥ϵ−ϵθ(xt,t)∥2 并更新参数
- 重复上述步骤直到梯度收敛
当神经网络 θ 训练完毕后,我们使用 ϵθ 生成新数据。需要注意的是,我们在反向过程中的采样 xt−1∼pθ(xt−1∣x) 需要同样引入一个全新的标准高斯噪音 z∼N(0,I),具体而言有
xt−1=μθ(xt,t)+σtz=αˉt1(xt−1−αˉtβtϵθ(xt,t))+σtz
当 T⩾t>1 时,我们反复执行上述转移。当 t=1 时不需要添加噪声,即有最终输出
x0=μθ(x1,1)
U-Net
最后一节,我们来简要介绍神经网络 θ 的构建。在 Diffusion 论文中,作者主要使用了 U-Net 架构。U-Net常用于CV领域的图像分割任务,可以被视为编码器-解码器架构。
简单来说,U-Net 通过一系列的卷积、反卷积、池化操作提取图像信息,其架构如下图所示。
[{"url":"https://pic3.zhimg.com/v2-9fff7b43ed249e5241af058ff410a904_1440w.jpg","alt":"U-Net","title":""}]
不同图例的含义如下
若已经理解前面U-net的基础知识,将能更好地看懂整个U-net的结构。首先看一下图例的含义:
- 深蓝色箭头:利用 3×3的卷积核对图片进行卷积后,通过ReLU 激活函数输出
- 灰色箭头:对左边下采样过程中的图片进行裁剪复制
- 红色箭头:通过最大池化对图片进行下采样,池化核大小为 2×2
- 绿色箭头:反卷积,对图像进行上采样,卷积核大小为 2×2
- 青色箭头:使用 1×1 的卷积核对图片进行卷积
DiTs
众所周知,人工智能领域中最有影响力的模型之一便是完全基于注意力机制的 Transformer 架构,因此人们开始尝试把这种注意力架构范式融入生成式模型中,这便得到了 Diffusion in Transformer 架构。下面我们简称其为 DiT 模型。
具体而言,DiT 模型可以被简单拆解为以下几点
- DiT 完全保留了 DDPM 的扩散生成原理
- DiT 不直接在像素级别扩散,而是先使用预训练的 VAE 把高维原图编码为低维的潜在表示 z,然后在 z 上执行扩散,再解码为高维图片
- 使用 (Vision in) Transformer 替换 U-Net,这是本模型的核心贡献
输入处理
DiT 的扩散过程只发生在低维潜空间,这使得计算更加容易。以 ImageNet 的 256×256×3 数据集为例,我们抽取图像 x∼q(x) 和其图像标签 c,进行编码操作
z0=E(x)∈R32×32×4
其中 E 采用的是 Stable Diffusion 中的 KL-f8 VAE 编码器,下采样因子为 8。
需要注意的是,DiT 的训练和 VAE 的训练是完全解耦的。因此在扩散模型的训练过程中,VAE 的参数是完全冻结的,这使得我们可以使用前人的预训练 VAE。
使用 DDPM 的采样方法,可以一步合成得到含噪潜变量
zt=αˉtz0+1−αˉtϵ,t∼U({1,2,⋯,T})
类似于 ViT,我们把 zt 拆分为若干个 patches,其大小表示为 p×p×4。这总计 T 个 patches 被拉平为并线性投影,然后植入正弦-余弦编码以表示位置信息。为避免混淆,我们称这部分输入为图像词元。
原文设置了以下四种 Transformer Block,用不同方式添加条件信息(t,c,自然语言等)
- 上下文条件生成:简单的把 t 和 c 通过向量嵌入添加到输入序列中。这意味着上下文 t,c 只能在自注意力层中影响图像词元。在输出头把这两个特殊词元拿走,以保证生成效果。
- 交叉注意力:在每个 Transformer Block 中添加一个交叉注意力层,其查询为图像词元,键值为向量嵌入后的 t,c。
- adaLN: 我们考虑一个标准的层归一化 x^=γ∘σx−μ+β,其中的参数 γ,β 可以使用一个 MLP 得到。这个 MLP 接收向量嵌入后的 t,c 作为输出,并将结果作用于 Transformer Block 的两个层归一化中。这意味着每个模块将多出四个参数 (γ1,2,β1,2)
- adaLN-Zero:另外考虑两个初始为零的门控参数 α1,2,其同样由 MLP 输出。该门控参数作用于每次残差连接之前,保证噪声信号的量级稳定。
下面的图片展示了上述的模块。
[{"url":"/img/world/DiT.png","alt":"DiT模块架构","title":""}]
训练与生成
DiT的训练目标函数基本遵循 DDPM 的形式
L=∥ϵ−ϵθ(zt,t,c)∥
如果我们不采用分类标签 c,可以将其设为空词元 <null> 或 ∅。
训练过程便是对扩散模型的参数进行梯度参数优化。需要注意的是,DiT 同时对 μθ 和 Σθ 进行了参数优化,具体原理不在此赘述。
在生成过程中,我们首先进行先验分布采样
zT∼N(zT;0,I)
在逐步去噪中,我们考虑一种双条件前向过程
ϵ~θ(zt,t,c)=ϵθ(zt,t,∅)+s[ϵθ(zt,t,c)−ϵθ(zt,t,∅)]
这使得我们不需要 Dropout 就可以把类标签 c 看做可学习的嵌入类型,其中的 s 是超参数,在原文中取值范围为 [1,4] 以进行实验评估。
最后,我们把得到的 z0 经过冻结的 VAE 解码器便得到了生成图像。