Processing math: 100%

Diffusion模型介绍

概率生成模型

Posted by QITINGSHE on March 22, 2023

最近在阅读Diffusion模型,发现这真是一个非常有趣的方向,利用预测概率分布的方式进行生成任务,相比较以往确定性任务而言,这种方式天然具有随机性,有着天马行空的想象力,当我们需要进行更加精确的生成时,只需要增加条件约束就可以了,比如增加文本约束,线稿信息约束等。通过添加约束不断缩小其预测空间,但是无论增加多少约束,其随机性总是无法消除掉,从某种程度上讲,我们可以对它生成的结果抱有期待。谁又能抵御对未知的好奇心呢?

一段话描述Diffusion模型

Diffusion模型又称为扩散模型,它涉及到几个概念,扩散过程、反向过程。

扩散过程:对一张图像逐步添加高斯噪声得到 xt,经过 T 步之后,得到 xT 是一个符合标高斯分布的噪声(你选择其他分布的噪声也不是不可以,这里不是强制约束) 反向过程:扩散过程是数据噪声化,那么反向过程就是其逆过程,一个去噪的过程,从一个随机高斯噪声逐渐去噪最终生成一张图片,所以反向过程也是一个数据生成过程

Diffusion模型就是构建一个预测噪声的模型 M,假定从标准高斯分布中采样的噪声为 ϵ,将这个噪声按照一定方法添加到图像数据 x0 中,得到 xt,将 xt输入到模型M(xt),模型输出噪声为 ˆϵ ,期望这个输出噪声所在的分布与 ϵ所对应的标准高斯分布一致,可以通过KL散度来计算分布的相似度(可以转换为求两个噪声的L2损失)。

从上面描述我们可以发现,模型的任务其实是希望从输入 xt 中恢复噪声 ϵ,但是模型并不知道原始图像 x0具体是什么,这个时候模型就需要在训练过程中,不断学习整个训练集的数据分布,借此来估计原始输入 x0,也就是隐式地学习了图像数据的构建信息。

在Inference阶段,其实是一个 T次循环的去噪过程:

  1. 从标准高斯分布中采样一个噪声 xT;
  2. 利用步骤1中的采样噪声计算出下一个采样噪声 xT1 的分布,从中采样出 xT1;
  3. 然后送入模型预测一个噪声 ϵT1;
  4. 利用模型预测的噪声对 xT1 进行去噪,生成 xT2

理论上讲 xT2 会更加趋近于真实图像数据的分布。以此循环步骤2~4,最后生成x0,即完成图像的生成。这就是目前Diffusion模型的工作流程。

原理分析

扩散过程

给定一个从真实数据分布中采样的数据点 x0q(x) ,在 T步中逐渐给数据样本添加少量的高斯噪声,生成带噪声的样本序列 x1,,xT

q(xtxt1)=N(xt;1βtxt1,βtI)q(x1:Tx0)=Tt=1q(xtxt1)

其中 βtTt=1 表示每步添加的噪声的方差,取值区间为01,称为variance schedule或noise schedule,通常t越大方差越大,即β1<β2<<βT

上述过程有一个重要性质:可以直接基于原始数据 x0 来对任意 t 步的 xt 进行采样

αt=1βt,且 ˉαt=ti=1α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(xtx0)=N(xt;ˉαtx0,(1ˉαt)I)

这样,只要设定好βt的取值,就可以快速得到任何第t步的扩散结果,即

xt(x0,ϵ)=ˉαtx0+1ˉαtϵ where ϵN(0,I)

DDPM论文3.2节所提到的算法1就是基于该公式得到的

反向过程

反向过程就是上述扩散过程的逆过程,即要构建 q(xt1xt),这样我们就可以从随机噪声 xTN(0,I)中重建真实数据样本——生成图片了。

但是想要估计出 q(xt1xt) 并不容易,因为这需要利用到全量数据集的先验信息,因此我们需要学习一个模型 pθ 来近似之前的条件概率分布,这样就可以执行之前说的反向过程了

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

其中,p(xT)=N(xT;0,I)

而上面公式中的 pθ(xt1xt) 是一个参数化的高斯分布,其均值为 μθ(xt,t), 方差为 Σθ(xt,t)

建模成功后,就要考虑如何获得真实的条件分布了,我们无法直接处理 q(xt1xt),因为不知道需要恢复到哪个样本,所以需要加上 x0 的后验分布 q(xt1xt,x0)

根据贝叶斯公式,得到

q(xt1xt,x0)=q(xtxt1,x0)q(xt1x0)q(xtx0)

其中

q(xtxt1,x0)=q(xtxt1)=N(xt;1βtxt1,βtI)

这里的x0是一个多余条件,现在可以发现等式右边都是扩散模型的扩散过程中的某一步,这个是可以获得的。

经过推导可以得到后验概率分布q(xt1xt,x0)的均值和方差

ˉβt=1ˉαt11ˉαtβt μt(xt,x0)=αt(1ˉαt1)1ˉαtxt+ˉαt1βt1ˉαtx0=1αt(xt1αt1ˉαtϵt)

可以发现方差是一个定量(扩散过程参数固定),而均值是一个依赖xt的函数 具体推导过程参考What are Diffusion Models?

上面这个反向过程的公式推导很重要,是扩散模型能够重建图像的理论依据,这样就得到DDPM论文所述的算法2

上述扩散过程和反向过程可以看作是有T个隐变量的VAE模型,我们可以利用变分下限来构建优化目标

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

进一步对训练目标分解得到

LVLB=Eq[DKL(q(xTx0)pθ(xT))LT+Tt=2DKL(q(xt1xt,x0)pθ(xt1xt))Lt1logpθ(x0x1)L0]=LT+LT1++L0

其中

 where LT=DKL(q(xTx0)pθ(xT))Lt=DKL(q(xtxt+1,x0)pθ(xtxt+1)) for 1tT1L0=logpθ(x0x1)

每个KL散度(除了 L0)都表示两个高斯分布的相似度,训练阶段 LT 可以被忽略,因为 p 没有可学习参数,而 xT 是一个高斯随机噪声, L0 单独采用一个解码器进行图像重建。

之前定义了 pθ(xt1xt) 为一个参数化的高斯分布

N(xt1;μθ(xt,t),Σθ(xt,t))

对于两个高斯分布的KL散度,其计算公式为

KL(p1p2)=12(tr(Σ12Σ1)+(μ2μ1)Σ12(μ2μ1)n+logdet(Σ2)det(Σ1))

在DDPM中,对该模型做了进一步简化,采用固定方差Σθ(xt,t)=σ2tI 就有

DKL(q(xt1xt,x0)pθ(xt1xt))=DKL(N(xt1;˜μ(xt,x0),σ2tI)N(xt1;μθ(xt,t),σ2tI))=12(n+1σ2t˜μt(xt,x0)μθ(xt,t)2n+log1)=12σ2t˜μt(xt,x0)μθ(xt,t)2

那么优化目标Lt1就变成

Lt1=Eq(xtx0)[12σ2t˜μt(xt,x0)μθ(xt,t)2]

即,希望网络学习到的均值μθ(xt,t)和后验分布的均值ˉμ(xt,x0)一致。

不过DDPM发现预测均值并不好,根据

xt(x0,ϵ)=ˉαtx0+1ˉαtϵ where ϵN(0,I)

可将上述优化目标简化为

Lsimple t1=Ex0,ϵN(0,I)[ϵϵθ(ˉαtx0+1ˉαtϵ,t)2]

这样就由原来预测均值转换成预测噪音 ϵ

对应优化目标变为随机生成噪音数据 ϵ 与模型预测的噪音 ϵθ(ˉαtx0+1ˉαtϵ,t) 的L2损失。

总结

Diffusion就是构建一个深度模型来预测噪声,训练阶段该模型输入是一张带噪声的图片,希望模型经过训练可以估计出图片分布,从而将图片与噪声能够剥离开来;当模型训练完成后,给定一个噪声,可以利用Diffusion的反向过程对该噪声进行去噪操作,每次去噪之后生成的结果在分布上都会更加趋近于真实图像分布,达到了生成图像的目的。