Diffusion Model解读(一)
模型概述:
Diffusion生成式模型做的事情很简单,这里直接以DDPM原文中的伪代码为例:
![image-20250707113135401]()
在Training过程中,就是从数据集中采样真实的图片,给图片一步一步加上高斯噪声, 最终得到一张几乎不包含原图信息,只剩下高斯噪声的图片,原文这里可以把整个过程根据公式推导简化成一个式子(这个后面会有具体过程),所以没有用到for循环;在Sampling过程中,从一张随机采样的高斯噪声开始,每一步预测当前的噪声,并用图片根据原来的权重减去噪声,最终for循环能够得到想要生成的图片。
数学原理:
这里为了防止对之前的生成式相关知识有所遗忘,直接从头开始推导,以x为变量,z为隐变量。
ELBO:
生成式模型的目的是找出真实变量x对应的隐变量z,也就是\(P(z|x)\),这里可以用贝叶斯定理得到:
\[P(z|x)=\frac{P(x|z)P(z)}{P(x)}
\]
关键为真实变量x的\(P(x)\)难以计算,因此引入一个可训练的\(q(z|x)\)来逼近真实后验\(P(z|x)\),利用对数似然求出变分推断的下界:
引入\(q(z|x)\),由于\(\int q(z|x)dz=1\),等式不变:
\[log~P(x)=logP(x)\int~q(z|x)dz
\]
将\(P(x)\)带入到积分中,并用贝叶斯定理替换得到:
\[\int~q(z|x)log\frac{P(x,z)}{P(z|x)}dz
\]
将\(q(z|x)\)同时带入分子分母,并将式子拆开得到
\[\int~q(z|x)log\frac{P(x,z)q(z|x)}{P(z|x)q(z|x)}dz=\int~q(z|x)log\frac{P(x,z)}{q(z|x)}dz+\int~q(z|x)log\frac{q(z|x)}{P(z|x)}dz
\]
根据KL散度的定义\(KL(P||Q)=\int~P(x)log\frac{P(x)}{Q(x)}dx\)可知后面的部分为KL散度,前面的部分可以看作是期望,可以得到:
\[E_{q(z|x)}[log\frac{P(x,z)}{q(z|x)}]+KL(q(z|x)||P(z|x))
\]
由于KL散度大于等于0,可以得到:
\[log~P(x)\geq E_{q(z|x)}[log\frac{P(x,z)}{q(z|x)}]=ELBO
\]
这个就是证据下界。由于我们的目标是优化拟合函数\(q(z|x)\)的参数,使其更加接近于\(P(z|x)\),而直接最小化KL散度项是很困难的,所以我们的目标就是最大化ELBO,因为ELBO和KL散度的和为常数,所以ELBO越大,KL散度就会越小。
在VAE和DDPM中,目标函数都是最大化这个ELBO,只不过VAE的\(q(z|x)\)是他的Encoder,而Diffusion的\(q(z|x)\)是Diffusion Process,也就是给真实数据逐步增加噪声使其变成纯噪声的过程。
Diffusion中的目标函数:
这里的推理根据了Variational Diffusion Models的思想,将生成过程解释为变分推断的框架,将扩散过程看作是一个变分推断问题。
继续将贝叶斯定理带入ELBO可以得到:
\[ELBO=\int~q(z|x)logP(x|z)dz-\int~q(z|x)log\frac{P(z)}{q(z|x)}=E_{q(z|x)}[P(x|z)]-KL(q(z|x)||P(z))
\]
在Diffusion中,有这样三个假设:
1.潜变量维度与数据维度完全相同;
2.每个时间步的潜变量编码不是通过学习得到的,而是预定义的线性高斯模型,也就是以前一个时间步的输出为中心的高斯分布;
3.潜变量编码器的高斯参数会随着时间变化,最终时间步的潜变量分布式标准的高斯分布;
根据假设一,这里沿用了马尔科夫链的思想,得到:
\[q(x_{1:T}|x_0)=\prod_{t-0}^T q(x_T|x_{T-1})
\]
根据假设二可以得到:
\[q(x_t|x_{t-1})=N(x_t;\sqrt{α_t}x_{t-1},(1-α_t)I)
\]
在N里面,第一个表示了这个函数的目标,第二个表示均值,这里与假设不同,在前一个时间步的结果上乘了一个权重,目的是弱化前一个时间步的影响,使得结果能够逐步演化成纯噪声(这里参考了别的文章,可能是对于中心的翻译和理解不同);第三个是协方差,表示的是当前时间步加入的噪声,单位阵表示维度之间没有相关性。
在这里,我们还是可以通过最大化ELBO来优化VDM:
\[\begin{aligned}
log~P(x_0) &=log\int P(x_{0:T})dx_{1:t}\\
&=log\frac{P(x_{0:T})q(x_{1:T}|x_0)}{q(x_{1:T}|x_0)}dx_{1:t}\\
&=logE_{q(x_{1:t}|x_0)}[\frac{P(x_{0:T})}{q(x_{1:T}|x_0)}]\geq E_{q(x_{1:T}|x_0)}log[\frac{P(x_{0:T})}{q(x_{1:T}|x_0)}]\\
&=\int q(x_{1:t}|x_0)log\frac{P(x_{0:T})}{q(x_{1:T}|x_0)}dx_{1:t}\\
&=\int q(x_{1:T}|x_0)log\frac{P(x_T)\prod_{t=1}^TP(x_{t-1}|x_t)}{\prod_{t=1}^Tq(x_t|x_{t-1})} dx_{1:t}\\
&=\int q(x_{1:T}|x_0)log\frac{P(x_T)P(x_0|x_1)\prod_{t=2}^TP(x_{t-1}|x_t)}{q(x_T|x_{T-1})\prod_{t=1}^{T-1}q(x_t|x_{t-1})}dx_{1:t}\\
&=\int q(x_{1:T}|x_0)log\frac{P(x_T)P(x_0|x_1)\prod_{t=1}^{T-1}P(x_{t}|x_{t+1})}{q(x_T|x_{T-1})\prod_{t=1}^{T-1}q(x_t|x_{t-1})}dx_{1:t}\\
&=\int q(x_{1:T}|x_0)log\frac{P(x_T)P(x_0|x_1)}{q(x_T|x_{T-1})}dx_{1:t}+\int q(x_{1:T}|x_0)log\frac{\prod_{t=1}^{T-1}P(x_{t}|x_{t+1})}{\prod_{t=1}^{T-1}q(x_t|x_{t-1})}dx_{1:t}\\
&=\int q(x_{1:T}|x_0)logP(x_0|x_1)dx_{1:t}+\int q(x_{1:T}|x_0)log\frac{P(x_T)}{q(x_T|x_{T-1})}dx_{1:t}+\int q(x_{1:T})\sum_{t=1}^{T-1}log \frac {P(x_t|x_{t+1})}{q(x_t|x_{t-1})}dx_{1:t}\\
&=E_{q(x_1|x_0)}[logP(x_0|x_1)]+\int q(x_{1:T-1}|x_0)q(x_T|x_{T-1})log\frac{P(x_T)}{q(x_T|x_{T-1})}dx_{1:t}+\sum_{t=1}^{T-1}\int q(x_{1:T})log \frac {P(x_t|x_{t+1})}{q(x_t|x_{t-1})}dx_{1:t}\\
&=E_{q(x_1|x_0)}[logP(x_0|x_1)]-E_{q(x_{1:T-1}|x_0)}[KL(q(x_T|x_{T-1})||P(x_T))]-\sum_{t=1}^{T-1}E_{q(x_{t-1,x_t+1|x_0})}[KL(q(x_t|x_{t-1})||P(x_t|x_{t+1}))]
\end{aligned}
\]
这里的第三项中,将\(q(x_{1:T}|x_0)\)展开成\(q(x_{t-1},x_t,x_{t+1}|x_0)\),然后把中间项用来作为KL散度的一部分,这里实际上是忽略了\(x_t\)的无关项,只保留了相邻的和\(x_t\)有关的项。
这里面,第一项表示从第一步加噪之后的\(x_1\)重建为原始数据\(x_0\)的能力,这里和VAE中的重建项\(logP(x|z)\)类似,本质为从少量加噪的样本中还原原始数据。
第二项为先验匹配项,由于q是固定的加噪过程(里面的权重参数都是预先设定好的,后面会有解释),所以第二项实际上没有参数需要优化,本质为确保最终得到的噪声状态为标准的高斯噪声,在训练的时候可以被忽略。
第三项为一致性项,是对前向加载和反向去噪的约束,可以理解为你从一个较为干净的样本中加噪得到\(x_t\),也应该能从一个噪声更大的样本反推得到\(x_t\),本质为让正向和反向的过程在中间的时刻保持一致,这里可以用于最小化从\(x_{t-1}\)和从\(x_{t+1}\)得到的\(x_t\)的差异。
优化VDM的主要计算来自第三项,这一项需要在所有的时间t上进行优化,根据上面的推导,所有的项都是期望的形式,因此可以用蒙特卡洛方法来模拟期望,但是由于第三项涉及到两个随机变量\(x_{t-1}\)和\(x_{t+1}\),用蒙特卡洛估计可能比单变量采样有更大的方差,会导致结果具有不稳定性,因此,可以根据贝叶斯法则重新推理,根据式子:
\[q(x_t|x_{t-1},x_0)=\frac{q(x_{t-1}|x_t,x_0)q(x_t|x_0)}{q(x_{t-1}|x_0)}
\]
可以得到:
\[\begin{aligned}
&注:第一步的推导和上面一样,只是分母从累乘中提取出的式子不同\\
log~P(x)&\geq \int q(x_{1:T}|x_0)log\frac{p(x_T)p(x_0|x_1)\prod_{t=2}^TP(x_{t-1}|x_t)}{q(x_1|x_0)\prod_{t=2}^{T}q(x_t|x_{t-1})}dx_{1:t}\\
&=\int q(x_{1:T}|x_0)[log\frac{P(x_T)P(x_0|x_1)}{q(x_1|x_0)}+log\prod_{t=2}^T\frac{P(x_{t-1}|x_t)}{\frac{q(x_{t-1}|x_t,x_0)q(x_t|x_0)}{q(x_{t-1}|x_0)}}]dx_{1:t}\\
&=\int q(x_{1:T}|x_0)[log\frac{P(x_T)P(x_0|x_1)}{q(x_1|x_0)}+log\prod_{t=2}^T\frac{P(x_{t-1}|x_t)}{q(x_{t-1}|x_t,x_0)}+log\prod_{t=2}^T\frac{q(x_{t-1}|x_0)}{q(x_t|x_0)}]dx_{1:t}\\
&=\int q(x_{1:T}|x_0)[log\frac{P(x_T)P(x_0|x_1)}{q(x_1|x_0)}+log\frac{q(x_1|x_0)}{q(x_T|x_0)}+log\prod_{t=2}^T\frac{P(x_{t-1}|x_t)}{q(x_{t-1}|x_t,x_0)}]dx_{1:t}\\
&=\int q(x_{1:T}|x_0)[log\frac{p(x_t)P(x_0|x_1)}{q(x_t|x_0)}+\sum_{t=2}^Tlog\frac{P(x_{t-1}|x_t)}{q(x_{t-1}|x_t,x_0)}]dx_{1:t}\\
&=E_{q(x_1|x_0)}[logP(x_0|x_1)]+E_{q(x-T|x_0)}[log\frac{P(x_T)}{q(x_T|x_0)}]+\sum_{t=2}^TE_{q(x_t,x_{t-1}|x_0)}[log\frac{P(x_{t-1}|x_t)}{q(x_{t-1}|x_t,x_0)}]\\
&=E_{q(x_1|x_0)}[logP(x_0|x_1)]-KL(q(x_T|x_0)||P(x_T))-\sum_{t=2}^TE_{q(x_t|x_0)}[KL(q(x_{t-1}|x_t,x_0)||P(x_{t-1}|x_t)]
\end{aligned}
\]
这个式子具有更低的方差,在数值上也更加稳定;第一项为重建项,和原来的第一项一样;
第二项为最终得到的图像\(x_T\)和标准正态分布的KL散度,在实际训练的时候常常被忽略。
第三项为去噪匹配项,由于\(x_0\)是已知的,所以可以精确计算\(q(x_{t-1}|x_t,x_0)\),通过最小化前向分布和反向分布的KL散度,使得模型能够学习正确的去噪路径,也就似乎\(P(x_{t-1}|x_t)\)。
由于第三项的任意后验很难最小化,因此可以根据贝叶斯定理得到:
\[q(x_{t-1}|x_t,x_0)=\frac{q(x_t|x_{t-1},x_0)q(x_{t-1}|x_0)}{q(x_t|x_0)}
\]
根据我们对编码器的假设可以得到:
\[q(x_t|x_{t-1};x_0)=q(x_t|x_{t-1})=N(x_t;\sqrt{α_t}x_{t-1},(1-α_t)I)
\]
这里面\(q(x_t|x_0)\)就是对原始数据增加噪声t次的结果。这里可以引出DDPM对原始数据进行加噪的公式,也就是上面Training的过程:
\[x_t=\sqrt{α_t}x_{t-1}+\sqrt{1-α_t}ϵ
\]
其中ϵ为正态分布,这里面的\(α_t\)都是原先设定好的固定值,通常\(α_t\)会随着时间步的增加而减少,目的是让原有图片的信息不断减小,使得得到的结果不断趋近于纯噪声。虽然只要\(α_t\)小于1,随着时间步的增加\(x_t\)就会演变成纯噪声,这里有一个形象的解释:给一杯糖水加糖,想要提升同样的甜度,越往后需要加的糖越多(这也是模拟了一个非线性的过程)。
由于加法前后两项的权重都是一样的,并且在前向推导的时候,\(x_0\)也是一样的,所以可以得到由\(x_0\)直接推出\(x_t\)的公式:
\[\begin{aligned}
x_t &=\sqrt{α_t}x_{t-1}+\sqrt{1-α_t}ϵ_{t-1}\\
&=\sqrt{α_t}(\sqrt{α_{t-1}}x_{t-2}+\sqrt{1-α_{t-1}}ϵ_{t-2}+\sqrt{1-α_t}ϵ_{t-1}\\
&=\sqrt{α_tα_{t-1}}x_{t-2}+\sqrt{α_t-α_tα_{t-1}}ϵ_{t-2}+\sqrt{1-α_t}ϵ_{t-1})\\
&=\sqrt{α_tα_{t-1}}x_{t-2}+\sqrt{\sqrt{α_t-α_tα-{t-1}}^2+\sqrt{1-α_t}^2}ϵ_{t-2}\\
&=\sqrt{α_tα_{t-1}}x_{t-2}+\sqrt{1-α_tα_{t-1}}ϵ_{t-2}\\
&=\sqrt{\overlineα_t}x_0+\sqrt{1-\overlineα_t}ϵ_{0}
\end{aligned}
\]
这里面的\(\overlineα_t\)就是从\(α_0\)累乘到\(α_t\),这里只是把每个时间步的噪声采样结果简化成了一次的采样结果,实际影响不大。
对于原文中的Sampling过程,实际上就是这个过程的反推,模型每次会预测当前时间步的噪声,根据预设好的噪声来按照权重去噪,这里有一点需要注意,在去噪过程中会加上一个噪声z,这里和VAE的思想一致,因为模型学到的是一个分布而不仅仅是一个点,这样不仅能增加输出的多样性,在实际运用的时候也能改善模型性能。(有相关研究表明不加这个噪声的时候训练不出很好的模型)
由上面的公式可以得出,两个独立的高斯随机变量之和仍然服从高斯分布,所以实际上得到的每一个\(q(x_{t-1}|x_t,x_0)\)都是服从高斯分布的,这个均值是和\(x_0\)有关,方差与我们预设定的权重有关,为了让神经网络预测的反向分布\(P(x_{t-1}|x_t)\)能够拟合真实去噪分布,我们也把他建模成高斯的形式,其中方差使用正向推导中已知的方差,而均值则通过\(x_t\)进行预测,这里给出方差公式的推导:
\[\begin{aligned}
q(x_{t-1}|x_t,x_0)&=\frac{q(x_t|x_{t-1},x_0)q(x_{t-1}|x_0)}{q(x_t|x_0)}\\
&=\frac{N(x_t;\sqrt{α_t}x_{t-1},(1-α_t)I)N(x_{t-1};\sqrt{\overlineα_{t-1}}x_0,\sqrt{1-\overlineα_{t-1}}I)}{N(x_{t};\sqrt{\overlineα_{t}}x_0,\sqrt{1-\overlineα_{t}}I)}\\
&∝exp\{-[\frac{(x_t-\sqrt{α_t}x_{t-1})^2}{2(1-α_t)}+\frac{(x_{t-1}-\sqrt{\overlineα_{t-1}}x_0)^2}{2(\sqrt{1-\overlineα_{t-1}})}-\frac{(x_t-\sqrt{\overlineα_{t}}x_0)^2}{2\sqrt{1-\overlineα_{t}}}] \}\\
&=exp\{-\frac{1}{2}[\frac{(-2\sqrt{α_t}x_tx_{t-1}+α_tx_{t-1}^2)}{1-α_t}+\frac{(x_{t-1}^2-2\sqrt{\overlineα_{t-1}}x_{t-1}x_0)}{1-\overlineα_{t-1}}+C(x_t,x_0)] \}\\
&∝exp\{-\frac{1}{2}[-\frac{2\sqrt{α_t}x_tx_{t-1}}{1-α_t}+\frac{α_tx_{t-1}^2}{1-α_t}+\frac{x_{t-1}^2}{1-\overlineα_{t-1}}-\frac{2\sqrt{\overlineα_{t-1}}x_{t-1}x_0}{1-\overlineα_{t-1}}] \}\\
&=exp\{-\frac{1}{2}[\frac{1-\overlineα_{t}}{(1-α_{t})(1-\overlineα_{t-1})}x_{t-1}^2-2(\frac{\sqrt{α_{t}}x_t}{1-α_{t}}+\frac{\sqrt{\overlineα_{t-1}}x_0}{1-\overlineα_{t-1}})x_{t-1}] \}\\
&=exp\{-\frac{1}{2}(\frac{1-\overlineα_{t}}{(1-α_{t})(1-\overlineα_{t-1})})[x_{t-1}^2-2\frac{\sqrt{α_t}(1-\overlineα_{t-1})x_t+\sqrt{\overlineα_{t-1}}(1-α_{t})x_0}{1-\overlineα_{t}}x_{t-1}] \}\\
&∝N(x_{t-1};\frac{\sqrt{α_t}(1-\overlineα_{t-1})x_t+\sqrt{\overlineα_{t-1}}(1-α_{t})x_0}{1-\overlineα_{t}},\frac{(1-α_{t})(1-\overlineα_{t-1})}{1-\overlineα_{t}}I)
\end{aligned}
\]
这里在第三行,把与\(x_{t-1}\)无关的常数项省略;在最后去正比的时候,虽然少了均值的平方这一项,但是由于这一项是常数,也可以忽略,因为我们主要关注的是\(x_{t-1}\)的正比关系,可以省略部分常数和添加部分常数。
因此在反向推导的时候,后验的方差可以直接由这个式子得到。因此我们的目标就变成了,让模型预测的均值接近真实的后验均值。,也就是让两者的KL散度尽可能小:
\[\underset{\boldsymbol{\theta}}{\arg\min} \, D_{\text{KL}} \big( q(\boldsymbol{x}_{t-1} \mid \boldsymbol{x}_t, \boldsymbol{x}_0) \, \big\| \, P(\boldsymbol{x}_{t-1} \mid \boldsymbol{x}_t) \big)\\
= \underset{\boldsymbol{\theta}}{\arg\min} \frac{1}{2\sigma_q^2(t)} \cdot \frac{\bar{\alpha}_{t-1} (1 - \alpha_t)^2}{(1 - \bar{\alpha}_t)^2} \left[ \left\| \hat{\boldsymbol{x}}_\boldsymbol{\theta}(\boldsymbol{x}_t, t) - \boldsymbol{x}_0 \right\|_2^2 \right]
\]
这里的sigma的平方就是上面推导出来的方差。
因此,优化VDM可以归结为在所有噪声水平上最小化我们得到的这个式子。
但是由于在不同时间步,图像原本的信息不同,例如,当时间步很大的时候,x基本接近于噪声,所以这时候学习到的损失并没有什么意义,因此要对每一个时间步学习到的均值损失添加一个权重。我们将方差带入上面的式子可以得到:
\[\frac{1}{2} \left( \frac{\bar{\alpha}_{t-1}}{1 - \bar{\alpha}_{t-1}} - \frac{\bar{\alpha}_t}{1 - \bar{\alpha}_t} \right) \left[ \left\| \hat{\boldsymbol{x}}_\boldsymbol{\theta}(\boldsymbol{x}_t, t) - \boldsymbol{x}_0 \right\|_2^2 \right]
\]
可以注意到前面的式子就是信噪比\(SNR=\frac{\overlineα_t}{1-\overlineα_t}\),这里可以发现SNR是一个递减的序列。但是这个SNR是一个确定的序列,表示那个时间步更加重要。在后面的DDPM改进版本中,为了增加网络的多样性,模型里面常常用一个简单的神经网络(比如MLP)来学习SNR(t)=exp(\(\exp(-\omega_\eta(t))\))。但是DDPM本身还是用固定的权重来衡量误差的。
至此,对于DDPM的前向和反向推导过程以及损失函数都讲解完了。(之后可能会出(二)来解读一下VDM的等效损失函数和从得分模型的角度来解释VDM)