扩散模型(Diffusion)

本文最后更新于 2026年7月19日 晚上

北京大学信息科学技术学院 生成模型基础(2025秋)的课程笔记

第六讲:Diffusion

在经历了VAE AR GAN Flow四大模型的洗礼后
我们终于要迎来生成模型的集大成之作,当下图像生成领域最强力的模型:Diffusion
和前四种模型相比,Diffusion深层、非序列且非MLE

何为diffusion

diffusion一词意为扩散,来源于粒子在水中的扩散运动
假设$x$为初始分布在水里随机某个位置的粒子
经过扩散后形成$z$,符合标准正态分布
如果我们能从数据中学习到神经网络来逆推这个过程,我们就可以把$z$还原为$x$

三大挑战:

  • 如何模拟扩散过程$\rightarrow$前向传播
  • 如何逆向推演$\rightarrow$反向传播
  • 如何训练模型$\rightarrow$score matching

前向传播

前向传播显然是diffusion中最容易理解的部分,即对数据加噪过程
我们设初始的image为$x_0$,然后逐步对其加噪
$x_1=\sqrt{1-\beta_1}x_0+\sqrt{\beta_1}\epsilon_1,\epsilon_1 \sim N(0,I),\beta_1 \in (0,1)$
可以理解为用$\sqrt{\beta_1}$进行加噪,而用$\sqrt{1-\beta_1}$去除上下文信息

那么在已知$x_0$情况下$x_1$的分布$q(x_1|x_0)=N(x_1;\sqrt{1-\beta_1}x_0,\beta_1I)$
由正态分布均值和标准差的性质,这是易得的,相当于均值变为${1-\beta_1}x_0$,方差变为$\beta_1$

以此类推,类似的我们有:
$x_2=\sqrt{1-\beta_2}x_1+\sqrt{\beta_2}\epsilon_2,\epsilon_2 \sim N(0,I),\beta_2 \in (0,1)$
$q(x_2|x_1)=N(x_2;\sqrt{1-\beta_2}x_1,\beta_2I)$

写成通项就是:
$x_{t+1}=\sqrt{1-\beta_{t+1}}x_t+\sqrt{\beta_{t+1}}\epsilon_{t+1},\epsilon_{t+1} \sim N(0,I),\beta_{t+1} \in (0,1)$
$q(x_{t+1}|x_t)=N(x_{t+1};\sqrt{1-\beta_{t+1}}x_t,\beta_{t+1}I)$

我们高中就学过,这种形如$x_{t+1}=ax_t+b$,其中$a,b$为常数的数列,通项公式都不难解出
这里我们采用了迭代法,略去过程,迭代的结果如下:
设$\alpha_{t+1}=(1-\beta_{t+1})…(1-\beta_1)$
则$x_{t+1}=\sqrt{\alpha_{t+1}}x_0+\sqrt{1-\alpha_{t+1}\epsilon},\epsilon \sim N(0,I)$
$q(x_{t+1}|x_0)=N(x_{t+1};\sqrt{\alpha_{t+1}}x_0,(1-\alpha_{t+1})I)$
此时如果令$\alpha_t \rightarrow 0,T \rightarrow \infty$,则$q(x_T|x_0)\rightarrow N(0,I)$
这就是在加噪次数足够多时,最后可以趋近标准正态分布

反向传播

反向传播的过程就没那么好理解了,相当于要从噪声$x_T$还原回图像$x_0$
我们完全不了解ground truth $x_0$的分布
只知道$x_T$的分布$q(x_T)$,$x_0$到$x_T$的传播过程
需要学习如何反向传回去

首先我们可以轻松sample出$x_T \sim N(0,I)$
但是从$x_t \rightarrow x_{t-1}$这一步,显然不能直接进行逆推,需要使用神经网络来实现
由于$x_0$和$x_T$是一样的,所以我们可以假设前向和反向的每一个过程一一对应

形式化来说,就是设$x_{t-1}\sim p_{\theta}(x_{t-1}|x_t)=N(x_{t-1};\mu_{\theta}(x_t,t),\sigma_t^{2}I)$
其中$p_{\theta}(x_{t-1}|x_t)$是一个神经网络
我们希望这个神经网络可以尽可能确保前向和反向传播的一一对应,也就是$p_{\theta}(x_0) \approx q(x_0)$

DDPM

接下来就是diffusion理论的真正重头戏了
这一部分数学推导非常非常多,笔者自己学的时候也被绕得晕头转向,还记得wps老师在cv课上自述,他看DDPM这篇论文足足花了一周时间才完全弄懂,所以这里我也只能是在力所能及的地方尽量多写一些……

最基本的评估生成模型质量的方式,显然是优化MLE
也即maximize $E_{q_0(x_0)}[logp_0(x_0;\theta)]$
这等价于minimize $E_{q_0(x_0)}[-logp_0(x_0;\theta)]$
问题在于,对于任意$x_0$,要计算它由$p_\theta$产生的概率并不容易,要经过非常多层神经网络
于是我们又要回到经典的ELBO(如果忘了的话可以回顾一下VAE)

首先我们有$E_{q(x_0)}[-logp_\theta(x_0)]$
将其逐步拆分:$E_{q(x_0)q(x_1:x_T|x_0)}[-logp_\theta(x_0)]$
为了简便,记$z=x_1:x_T$,原式可改写为
$E_{q(x_0)q(z|x_0)}[-log\dfrac{q(z|x_0)}{q(z|x_0)}p_\theta(x_0)]$
然后利用条件概率公式,进一步变为
$E_{q(x_0)q(z|x_0)}[-log\dfrac{q(z|x_0)}{q(z|x_0)}\dfrac{p_\theta(x_0,z)}{p_\theta(z|x_0)}]$
然后经典拆成两项
$E_{q(x_0)q(z|x_0)}[-log\dfrac{p_\theta(x_0,z)}{q(z|x_0)}]+E_{q(x_0)q(z|x_0)}[-log\dfrac{q(z|x_0)}{p_\theta(z|x_0)}]$

这一幕实在是太眼熟了,第二项就是$-KL(q||p_\theta)$,一定$\le 0$
我们只需考虑第一项(ELBO)
将$z$代回,变为
$E_{q(x_0)q(x_1:x_T|x_0)}[-log\dfrac{p_\theta(x_0:x_T)}{q(x_1:x_T|x_0)}]$
再经过拆分,最终结果为
minimize $E_{q(x_0:x_T)}[-logp_\theta(x_0|x_1)+\Sigma_{t=2}^TKL(q(x_{t-1}|x_t,x_0))|p_\theta(x_{t-1}|x_t)]$

为了最小化这个期望,与$p,q$相关的分布都是可计算的
$p_\theta(x_{t-1}|x_t) \sim N(x_{t-1};\mu_\theta(x_t,t),\sigma_t^{2}I)$
$q(x_{t-1}|x_t,x_0)\sim N(x_{t-1};\tilde{\mu_t}(x_t,x_0),\tilde{\beta_t}I)$
这里

这个推导会留作课后作业,也是DDPM中非常神奇的一个trick

然后呢,两个高斯分布之间的KL散度是有公式的,没记错的话这个公式是VAE那一章节的课后作业
代入公式后,$q,p_\theta$之间的KL散度即为
$\dfrac{1}{2\sigma_t^2}\lVert \tilde{\mu_t}(x_t,x_0)-\mu_\theta(x_t,t) \rVert_2^2$
上面的公式还是不够“优雅”,于是数学家们又开始神奇变换
将$x_{t}=\sqrt{\alpha_{t}}x_0+\sqrt{1-\alpha_{t}\epsilon}$代入$\tilde{\mu_t}(x_t,x_0)$中
$\tilde{\mu_t}(x_t,x_0)=\dfrac{1}{\sqrt{1-\beta_t}}(x_t-\dfrac{\beta_t}{\sqrt{1-\alpha_t}}\epsilon),\epsilon \sim N(0,I)$
与此同时我们可以人为“规定”$\mu_\theta$的表达式也为这个格式,将$\epsilon$换成$\epsilon_\theta$即可
$\mu_\theta(x_t,t)=\dfrac{1}{\sqrt{1-\beta_t}}(x_t-\dfrac{\beta_t}{\sqrt{1-\alpha_t}}\epsilon_\theta(x_t,t))$
这样一来KL散度的公式又可以改写为
$\dfrac{\beta_t^2}{2\sigma_t^2(1-\beta)(1-\alpha_t)}\lVert \epsilon-\epsilon_\theta(x_t,t) \rVert_2^2$
忽略系数,将$x_t$表达式代入,变为
minimize $\lVert \epsilon-\epsilon_\theta(\sqrt{\alpha_{t}}x_0+\sqrt{1-\alpha_{t}\epsilon},t) \rVert_2^2$
这便是diffusion的训练过程!

上面这一长串推导就是大名鼎鼎的 Denoising Diffusion Probabilistic Model (DDPM)

具体训练中,diffusion model常用U-net结构,并且带有残差块或者attention层

如上,$\beta_t,\sigma_t$分别控制前向与反向传播的方差
$\beta_t$通常会缓慢增加到预设值(like 0.02),在原论文中作者设定$\beta_t=\sigma_t^2$

DDPM and score function

这里我们将会从另一个角度理解DDPM

如上图,根据之前推导过的$q(x_t|x_0)$我们对其取对数然后求梯度
最终有$\nabla_{x_t} log q(x_t|x_0)=-\dfrac{1}{\sqrt{1-\alpha_t}}\epsilon$
我们称对一个概率密度函数的一个点求导,这个值就是score function
需要明确的是,Score matching 训练的本质,不是让网络去学习干净图像的 Score Function,而是要它去匹配前向加噪过程中,每一步产生的带噪图像的 Score Function。
因为 Score Function 与分布之间基本具备一一对应关系,所以网络学到的实际就是一系列噪声条件下的分布信息。

DDPM与随机微分方程

数院的同学喜欢用微分方程来描述DDPM
例如$\dfrac{dx}{dt}=f(x,t)$
那么$x(t)-x(0)=\int_0^t f(x,t)dt$
欧拉法数值解:$x(t+\Delta t)=x_t+\Delta tf(x,t)$

如上图,在$[0,1]$上考虑无穷多步的DDPM

然后通过泰勒展开,最后会得到一个前向扩散随机微分方程(SDE)
ODE正向和反向过程显然是一致的,但SDE则不然
前向可以直接计算,反向还是需要加上score function这一项,难以直接计算,必须采用神经网络估计

笔者按:终于啃完了这块硬骨头,虽然所有的数学推导本人都似懂非懂,全盘忘却……计划还要写一个附录来再补充一下DDPM的数学推导

附录


扩散模型(Diffusion)
https://yjyxfcy.github.io/2026/07/19/gen6/
作者
Yjy
发布于
2026年7月19日
更新于
2026年7月19日
许可协议