
扩散过程是一个逐渐在数据上加噪的马尔科夫链,直到最终变成一个完全的噪声。而扩散模型就是一个使用变分推断训练的参数化马尔科夫链。如上图所示。学习的是一个reverse process。
前提条件:
1. 马尔可夫性质:当前的状态只与之前一个时刻的状态有关;
2. 前向和反向状态服从高斯分布,而且变化比较小(利于数学分析);
扩散模型的前向过程就是不断在数据上加噪的过程,可以使用如下形式表示,其中:
q(x1:T|x0):=∏Tt=1q(xt|xt−1) q(xt|xt−1):=N(xt;√1−βtxt−1,βtI)
这里为了后续计算方便,将条件概率的均值和方差设置成√1−βtxt−1和βt。其中,0<β1<β2<...<βt−1<βt<1。
扩散模型的反向过程,可以使用如下的概率形式表示,将其定义为可学习的马尔科夫链,该过程的起始点为p(xT)=N(xT;0,I)。
pθ(x0:T):=p(xT)∏Tt=1pθ(xt−1|xt) pθ(xt−1|xt):=N(xt−1;μθ(xt,t),∑θ(xt,t))
所以扩散模型就是通过学习,来估计;μθ(xt,t)和∑θ(xt,t))的过程。
DDPM的前向加噪过程如下:
每次加噪过程如下:
q(xt|xt−1)=N(xt;√1−βt∗xt−1,βtI)
xt=√1−βt∗xt−1+√βt∗εt−1 0<β1<β2<...<βt−1<βt<1。
引入新变量αt=1−βt
因此上面加噪的过程可以写成:
xt=√αt∗xt−1+√1−αt∗εt−1
xt−1=√αt−1∗xt−2+√1−αt−1∗εt−2
合并上面两式,得:
xt=√αtαt−1∗xt−2+√αt(1−αt−1)∗εt−2+√1−αt∗εt−1
xt=√αtαt−1∗xt−2+√1−αtαt−1∗εt
以此类推,得到:
xt=√αtαt−1...α2α1∗x0+√1−αtαt−1...α2α1∗εt=√¯αt∗x0+√1−¯αt∗εt
其中,¯αt=αtαt−1...α2α1
因此,实际的前向过程中,t时刻的图片是直接使用上面的关系一次加噪完成的。
重采样
一个高斯分布不可导,可以将其转换成标准高斯分布的格式:
y=σ∗ε+μ∼N(μ,σ2)
所以,这里xt满足高斯分布,且
xt∼N(√1−βt∗xt−1,βt)
DDPM的反向生成过程如下:
由上描述的扩散过程p(xT)pθ(xT−1|xT)...pθ(xt−1|xt)...pθ(x0|x1)
其中,定义pθ(xt−1|xt)为高斯过程,即:
pθ(xt−1|xt):=N(xt−1;μθ(xt,t),∑θ(xt,t))
实际上,在训练的时候,反向过程的x0已知,因此反向过程也是一个确定的过程。
贝叶斯公式q(xt−1|xt)=q(xt|xt−1)q(xt−1)q(xt)。
在推理的时候q(xt−1),q(xt)未知,但是在训练的时候,q(xt−1|x0),q(xt|x0)已知,因此:
q(xt−1|xt,x0)=q(xt|xt−1,x0)q(xt−1|x0)q(xt|x0)
因为每个分布都是高斯分布,即:
q(xt|xt−1)=N(xt;√1−βt∗xt−1,βtI)
q(xt|x0)=N(xt;√¯αt∗x0,(1−¯αt)I)
q(xt−1|x0)=N(xt−1;√¯αt−1∗x0,(1−¯αt−1)I)
推理得到:


因此DDPM的前向和反向过程如下:
前向扩散:q(xt|xt−1)=N(xt;√1−βt∗xt−1,βtI)
反向生成:q(xt−1|xt,x0)=N(xt;1√αt(xt−1−αt√1−¯αtεt),βt∗1−¯αt−11−¯αtI)
这里只需要通过模型预测εt即可。
这里预测的高斯噪声εt只是均值μ里面的一部分,所以在生成的时候,还需要加噪一个额外的高斯噪声, 这样才能使得q(xt−1|xt)符合高斯噪声。
DDPM训练优化目标
和所有的生成式模型一样,DDPM就是求模型的最大对数似然。
因为扩散过程的如下:
Pθ(x0)=∫x1:xTp(xT)pθ(xT−1|xT)...pθ(xt−1|xt)...pθ(x0|x1)dx1:xT
因此,由Jensen不等式f(E[X])≥E[f(X)],可得:
logPθ(x0)=log∫pθ(x0:T)dx1:T=log∫pθ(x0:T)q(x1:T|x0)q(x1:T|x0)dx1:T≥∫q(x1:T|x0)logpθ(x0:T)q(x1:T|x0)dx1:T=Eq(x1:T|x0)[logpθ(x0:T)q(x1:T|x0)]=Eq(x1:T|x0)[logp(xT)+∑t≥1logpθ(xt−1|xt)q(xt|xt−1)]
因此扩散模型就是最大化logPθ(x0),即损失函数为最小化负对数似然,即:
Eq(x1:T|x0)[−logpθ(x0:T)q(x1:T|x0)]
经过如下推导:


其中的三个分量分别为LT,Lt−1,L_{0},如下所示。

对于LT而言,其含义为前向加噪的终点和模型推理的时候的起点高斯噪声尽可能接近。即xt=√¯αt∗x0+√1−¯αt∗ε和ε尽可能接近。因为在超参数设置的时候,¯αt在t=T时趋近于0。因此不需要考虑LT。
对于L0而言,其含义为x1和x0尽可能接近,这一项也可以通过设置超参数实现,因此这一项也不考虑。
所以,只考虑Lt−1,即:

最终就是训练一个去噪模型。
最终的算法:

DDPM代码在DDPM生成人脸代码一节。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)