最近在阅读Diffusion模型,发现这真是一个非常有趣的方向,利用预测概率分布的方式进行生成任务,相比较以往确定性任务而言,这种方式天然具有随机性,有着天马行空的想象力,当我们需要进行更加精确的生成时,只需要增加条件约束就可以了,比如增加文本约束,线稿信息约束等。通过添加约束不断缩小其预测空间,但是无论增加多少约束,其随机性总是无法消除掉,从某种程度上讲,我们可以对它生成的结果抱有期待。谁又能抵御对未知的好奇心呢?
一段话描述Diffusion模型
Diffusion模型又称为扩散模型,它涉及到几个概念,扩散过程、反向过程。
扩散过程:对一张图像逐步添加高斯噪声得到 xt,经过 T 步之后,得到 xT 是一个符合标高斯分布的噪声(你选择其他分布的噪声也不是不可以,这里不是强制约束)
反向过程:扩散过程是数据噪声化,那么反向过程就是其逆过程,一个去噪的过程,从一个随机高斯噪声逐渐去噪最终生成一张图片,所以反向过程也是一个数据生成过程
Diffusion模型就是构建一个预测噪声的模型 M,假定从标准高斯分布中采样的噪声为 ϵ,将这个噪声按照一定方法添加到图像数据 x0 中,得到 xt,将 xt输入到模型M(xt),模型输出噪声为 ˆϵ ,期望这个输出噪声所在的分布与 ϵ所对应的标准高斯分布一致,可以通过KL散度来计算分布的相似度(可以转换为求两个噪声的L2损失)。
从上面描述我们可以发现,模型的任务其实是希望从输入 xt 中恢复噪声 ϵ,但是模型并不知道原始图像 x0具体是什么,这个时候模型就需要在训练过程中,不断学习整个训练集的数据分布,借此来估计原始输入 x0,也就是隐式地学习了图像数据的构建信息。
在Inference阶段,其实是一个 T次循环的去噪过程:
- 从标准高斯分布中采样一个噪声 xT;
- 利用步骤1中的采样噪声计算出下一个采样噪声 xT−1 的分布,从中采样出 xT−1;
- 然后送入模型预测一个噪声 ϵT−1;
- 利用模型预测的噪声对 xT−1 进行去噪,生成 xT−2
理论上讲 xT−2 会更加趋近于真实图像数据的分布。以此循环步骤2~4,最后生成x0,即完成图像的生成。这就是目前Diffusion模型的工作流程。
原理分析
扩散过程
给定一个从真实数据分布中采样的数据点 x0∼q(x) ,在 T步中逐渐给数据样本添加少量的高斯噪声,生成带噪声的样本序列 x1,…,xT
q(xt∣xt−1)=N(xt;√1−βtxt−1,βtI)q(x1:T∣x0)=T∏t=1q(xt∣xt−1)其中 βtTt=1 表示每步添加的噪声的方差,取值区间为0∼1,称为variance schedule或noise schedule,通常t越大方差越大,即β1<β2<…<βT
上述过程有一个重要性质:可以直接基于原始数据 x0 来对任意 t 步的 xt 进行采样
令 αt=1−βt,且 ˉαt=∏ti=1αi,可得
xt=√αtxt−1+√1−αtϵt−1; where ϵt−1,ϵt−2,⋯∼N(0,I)=√αtαt−1xt−2+√1−αtαt−1¯ϵt−2; where ¯ϵt−2 merges two Gaussians (∗).=…=√ˉαtx0+√1−ˉαtϵq(xt∣x0)=N(xt;√ˉαtx0,(1−ˉαt)I)这样,只要设定好βt的取值,就可以快速得到任何第t步的扩散结果,即
xt(x0,ϵ)=√ˉαtx0+√1−ˉαtϵ where ϵ∼N(0,I)DDPM论文3.2节所提到的算法1就是基于该公式得到的
反向过程
反向过程就是上述扩散过程的逆过程,即要构建 q(xt−1∣xt),这样我们就可以从随机噪声 xT∼N(0,I)中重建真实数据样本——生成图片了。
但是想要估计出 q(xt−1∣xt) 并不容易,因为这需要利用到全量数据集的先验信息,因此我们需要学习一个模型 pθ 来近似之前的条件概率分布,这样就可以执行之前说的反向过程了
pθ(x0:T)=p(xT)T∏t=1pθ(xt−1∣xt)pθ(xt−1∣xt)=N(xt−1;μθ(xt,t),Σθ(xt,t))其中,p(xT)=N(xT;0,I)
而上面公式中的 pθ(xt−1∣xt) 是一个参数化的高斯分布,其均值为 μθ(xt,t), 方差为 Σθ(xt,t)
建模成功后,就要考虑如何获得真实的条件分布了,我们无法直接处理 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,x0)=q(xt∣xt−1)=N(xt;√1−βtxt−1,βtI)这里的x0是一个多余条件,现在可以发现等式右边都是扩散模型的扩散过程中的某一步,这个是可以获得的。
经过推导可以得到后验概率分布q(xt−1∣xt,x0)的均值和方差
ˉβt=1−ˉαt−11−ˉαt⋅βt μt(xt,x0)=√αt(1−ˉαt−1)1−ˉαtxt+√ˉαt−1βt1−ˉαtx0=1√αt(xt−1−αt√1−ˉαtϵt)可以发现方差是一个定量(扩散过程参数固定),而均值是一个依赖xt的函数 具体推导过程参考What are Diffusion Models?
上面这个反向过程的公式推导很重要,是扩散模型能够重建图像的理论依据,这样就得到DDPM论文所述的算法2
上述扩散过程和反向过程可以看作是有T个隐变量的VAE模型,我们可以利用变分下限来构建优化目标
−logpθ(x0)≤−logpθ(x0)+DKL(q(x1:T∣x0)‖pθ(x1:T∣x0))=−logpθ(x0)+Ex1:T∼(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(x0TT)[logq(x1:T∣x0)pθ(x0:T)]≥−Eq(x0)logpθ(x0)进一步对训练目标分解得到
LVLB=Eq[DKL(q(xT∣x0)‖pθ(xT))⏟LT+T∑t=2DKL(q(xt−1∣xt,x0)‖pθ(xt−1∣xt))⏟Lt−1−logpθ(x0∣x1)⏟L0]=LT+LT−1+⋯+L0其中
where LT=DKL(q(xT∣x0)‖pθ(xT))Lt=DKL(q(xt∣xt+1,x0)‖pθ(xt∣xt+1)) for 1≤t≤T−1L0=−logpθ(x0∣x1)每个KL散度(除了 L0)都表示两个高斯分布的相似度,训练阶段 LT 可以被忽略,因为 p 没有可学习参数,而 xT 是一个高斯随机噪声, L0 单独采用一个解码器进行图像重建。
之前定义了 pθ(xt−1∣xt) 为一个参数化的高斯分布
N(xt−1;μθ(xt,t),Σθ(xt,t))对于两个高斯分布的KL散度,其计算公式为
KL(p1‖p2)=12(tr(Σ−12Σ1)+(μ2−μ1)⊤Σ−12(μ2−μ1)−n+logdet(Σ2)det(Σ1))在DDPM中,对该模型做了进一步简化,采用固定方差Σθ(xt,t)=σ2tI 就有
DKL(q(xt−1∣xt,x0)‖pθ(xt−1∣xt))=DKL(N(xt−1;˜μ(xt,x0),σ2tI)‖N(xt−1;μθ(xt,t),σ2tI))=12(n+1σ2t‖˜μt(xt,x0)−μθ(xt,t)‖2−n+log1)=12σ2t‖˜μt(xt,x0)−μθ(xt,t)‖2那么优化目标Lt−1就变成
Lt−1=Eq(xt∣x0)[12σ2t‖˜μt(xt,x0)−μθ(xt,t)‖2]即,希望网络学习到的均值μθ(xt,t)和后验分布的均值ˉμ(xt,x0)一致。
不过DDPM发现预测均值并不好,根据
xt(x0,ϵ)=√ˉαtx0+√1−ˉαtϵ where ϵ∼N(0,I)可将上述优化目标简化为
Lsimple t−1=Ex0,ϵ∼N(0,I)[‖ϵ−ϵθ(√ˉαtx0+√1−ˉαtϵ,t)‖2]这样就由原来预测均值转换成预测噪音 ϵ
对应优化目标变为随机生成噪音数据 ϵ 与模型预测的噪音 ϵθ(√ˉαtx0+√1−ˉαtϵ,t) 的L2损失。
总结
Diffusion就是构建一个深度模型来预测噪声,训练阶段该模型输入是一张带噪声的图片,希望模型经过训练可以估计出图片分布,从而将图片与噪声能够剥离开来;当模型训练完成后,给定一个噪声,可以利用Diffusion的反向过程对该噪声进行去噪操作,每次去噪之后生成的结果在分布上都会更加趋近于真实图像分布,达到了生成图像的目的。