基于概率分布的方法(DDPM/DDIM)
本文档主要从概率分布的角度出发,介绍扩散模型的理论推导,以及在各方面的改进 · 10 min read
将图片一步步加噪,最终得到近似纯噪声图片,再通过神经网络一步步去噪,得到原来的图片
-
加噪过程, 单步加噪:
q(xt∣xt−1)=N(xt;1−βtxt−1,βtI)
-
重参数化:
xt=αˉtx0+1−αˉtϵ
其中: αt=1−βt,αˉt=∏i=1tαi,ϵ∼N(0,I)
-
去噪过程 1. 原始后验分布:
q(xt−1∣x0,xt)=N(xt−1;μ~(xt,x0),β~tI)
其中μ~(xt,x0)=1−αˉtαˉt−1βtx0+1−αˉtαt(1−αˉt−1)xt, β~t:=1−αˉt1−αˉt−1βt 1. 近似后验分布:
pθ(xt−1∣xt)=N(xt−1;μθ(xt,t),Σθ(xt,t))
DDPM中直接令Σθ(xt,t))=β~tI(取βt效果类似)
-
损失函数:
L=Et,x0,ϵ[∥ϵ−ϵθ(αˉtx0+1−αˉtϵ,t)∥2]
-
采样流程:
xt−1=αt1(xt−1−αˉt1−αtϵθ(xt,t))+σtz
其中,z∼N(0,I),t>1,σt2=βt(结果与β~t类似)
- 训练流程

- 采样流程

其中βt是从0.0001到0.02线性增加的
-
改进对数似然:1. 学习方差:
Σθ(xt,t)=exp(vlogβt+(1−v)logβ~t)
其中v是模型的输出向量,相应的损失函数修改为:
Lhybrid=Lsimple+λLvlb
其中Lsimple为DDPM的损失函数,Lvlb为变分下界(variational low bound, VLB) λ=0.001, 训练时采用重要性采样:
Lvlb=Et∼pt[ptLt], pt∝E[Lt2], ∑pt=1
由于真实的 E[Lt2] 是未知且随着训练动态变化的,这里为每个时间步t维护一个最近 10 个Lt值的队列。在训练过程中,他们持续计算每个 t的 E[Lt2] 的移动平均,并据此更新采样概率pt。在训练刚开始时,先进行一段时间的均匀采样,以收集足够的初始数据来估计各个pt。
Lvlb的计算公式如下:
Lvlb=t=0∑TLt
L0=−logpθ(x0∣x1)
Lt−1=DKL(q(xt−1∣xt,x0)∥pθ(xt−1∣xt))
LT=DKL(q(xT∣x0)∥pθ(xT))
实际训练时由于所有的分布均为高斯分布,因此采用如下公式计算KL散度
DKL(N(μ1,σ12)∥N(μ2,σ22))=21[logσ12σ22+σ22σ12+σ22(μ1−μ2)2−1]
实际训练时可以直接把UNet的输出通道数×2即可
-
改进噪声调度,原始论文噪声调度为线性增长,该论文修改为:
αˉt=f(0)f(t),f(t)=cos(1+st/T+s⋅2π)2
这种采样方式更适合低分辨率图像
-
提高采样频率
St为{1,⋯,T}的一个子集,只在该子集上做sample,相应的方差值修改如下
βSt=1−αˉSt−1αˉSt
β~St=1−αˉSt1−αˉSt−1βSt
再通过学习的Σθ(xSt,St)做相应的插值
-
增加模型大小,多训练几轮能提高模型的表现
-
对模型的改进方向(来源于 beat GANs)
- 更宽的模型能更快地收敛并达到更优的FID (即更大的通道数)。更深的模型(即堆叠更多的残差块)也能有好的性能,但训练所需的时间更长。资源不足的前提下优先选择增加模型的通道数
- attention:对8×8,16×16,32×32的图像都使用了attention机制,维数为通道数,序列长度为h×w。使用多头注意力机制,把每个头的通道数固定为64
- 借鉴BigGAN:
- BigGAN的块通常包含一个平均池化层来减小分辨率,同时在残差连接(skip connection)上也进行相应的下采样。
- BigGAN的块先用简单的插值(如最近邻插值)放大特征图,然后再进行卷积操作。
- 自适应组归一化 Adaptive Group Normalization (AdaGN):修改label和时间t的注入方式,计算公式为
AdaGN(h,yemb)=ys∗GroupNorm(h)+yb
其中h为每个残差块第一个卷积后的特征图,yemb是由条件和时间嵌入拼接而成的条件向量。通过一个线性层将其投影成 ys,yb,然后做上述仿射变换。
训练DDPM使用重参数技巧,训练目标只依赖于边缘分布q(xt∣x0), 而不依赖联合分布的具体形式,因此本文设计了一族非马尔可夫前向过程,保证重参数化下xt的分布不变,对采样过程进行了修改
将DDPM中的马尔可夫过程
q(x1:T∣x0):=t=1∏Tq(xt∣xt−1), where q(xt∣xt−1):=N(αtxt−1,(1−αt)I)
修改为如下的非马尔可夫过程
qσ(x1:T∣x0):=qσ(xT∣x0)t=2∏Tqσ(xt−1∣xt,x0)
其中的条件分布满足
qσ(xt−1∣xt,x0)=N(αt−1x0+1−αt−1−σt2⋅1−αtxt−αtx0,σt2I)
此时仍然满足之前重参数技巧后的式子
xt=αtx0+1−αtϵ,whereϵ∼N(0,I)
因此可以直接使用DDPM训练得到的模型
-
采样公式
xt−1=αˉt−1(αˉtxt−1−αˉtϵθ(xt,t))+1−αˉt−1−σt2⋅ϵθ(xt,t)+σtϵt
前一项用于预测x0,后一项用于引导噪声方向
-
特殊情况:当σt取0时,可以得到完全确定性的采样过程
-
加速采样:考虑{xt,t=1,2,⋯,T}的一个子集{xτi,i=1,2,⋯,S},S<<T,q(xτi∣x0)=N(ατix0,(1−ατi)I),只需要将上面的αt−1修改成ατi−1即可得到完整的采样公式
-
和VE-SDE的关系:采样过程为如下ODE的离散形式:
dtdxˉ(t)=dtdσ(t)⋅ϵ_θ(σ2(t)+1xˉ(t),t)
其中,xˉ(t)=α(t)x(t),σ(t)=α(t)1−α(t)
-
目标:通过增加一个分类器(即下文中的pϕ也是用神经网络训练的),来得到指定类别的图片(此时训练好的diffusion model无需再添加其他输入,无需重新训练)
-
对于DDPM,条件采样分布,由Bayes公式
pθ,ϕ(xt∣xt+1,y)≈Z⋅pθ(xt∣xt+1)⋅pϕ(y∣xt)
其中Z为归一化参数,再通过对数似然的泰勒展开,可得修正后的均值:
μ^=μθ(xt,t)+Σ⋅∇xtlogpϕ(y∣xt)
其中 Σ 是方差矩阵。再添加缩放因子后可以得到:
μ^=μθ(xt,t)+s⋅Σ⋅∇xtlogpϕ(y∣xt)
-
对于DDIM,定义score function:
∇xtlogpθ(xt)=−1−αˉ_t1ϵθ(xt,t)
联合分布的score function为:
∇xtlog[pθ(xt)pϕ(y∣xt)]=−1−αˉ_t1ϵθ(xt,t)+∇xtlogpϕ(y∣xt)
因此有修正后的噪声预测:(添加了缩放因子s)
ϵ^(xt)=ϵθ(xt)−s⋅1−αˉ_t⋅∇xtlogpϕ(y∣xt)
- 注:上述的无条件模型也可以改成有条件的模型,有条件模型+引导器指导采样的图片效果最好
论文见 CFG, CFG++
-
核心算法:1. 训练算法:使用同一个神经网络模型来同时学习条件和无条件生成,在训练的每个步骤中,以一定的概率 puncond(例如10%或20%)随机丢弃条件信息 c,修改为空符号。目标函数保持不变,具体的流程如下:
1. 采样算法:同时计算条件预测和无条件预测,然后将原来的预测噪声部分修改为
ϵˉt=(1+w)ϵcond−wϵ_uncond
其中w为超参,设置越高越能生成符合条件的图像。完整的算法流程如下:

-
核心公式的推导:
ϵˉt=(1+w)ϵcond−wϵ_uncond
推导从上面给的引导器采样开始,我们有如下公式:
∇zλlogp~(zλ∣c)=∇zλlogp(zλ∣c)+w⋅∇zλlogpϕ(c∣zλ)
由score function和神经网络输出的转化关系我们有如下式子
ϵ~θ(zλ,c)=ϵθ(zλ,c)−wσλ∇zλlogpϕ(c∣zλ)
我们想要替换外部分类器,由贝叶斯公式再求对数梯度,我们有
∇zλlogp(c∣zλ)=∇zλlogp(zλ∣c)−∇zλlogp(zλ)
再由score function和神经网络输出的转化关系即可得到核心公式(32)