注:
2024 年 12 月 26 日终于完工啦,如有错误,欢迎指正~
参考:
【大白话01】一文理清 Diffusion Model 扩散模型 | 原理图解+公式推导_哔哩哔哩_bilibili
多模态大模型:算法、应用与微调 刘兆峰 (豆瓣) (douban.com)
狗都能看懂的DDPM论文详解-CSDN博客
Diffusion model(一): 公式推导详解_diffusion模型公式推导-CSDN博客
扩散模型理论与公式推导——详细过程速览与理解加深_扩散模型加噪公式中加噪推导-CSDN博客
1. 什么是 Diffusion Model ?
扩散的设计灵感主要来自于非平衡热力学,在非平衡热力学中,系统和环境之间经常发生物质与能量的交换。如果在一个装有水的容器中滴入一滴墨水,那么会看到墨水在水中逐渐扩散,直至最后均匀的分布在整个容器。如果把这个扩散过程的每一步都控制的足够小,那么理论上这个过程就是可逆的。
Denoising Diffusion Probabilistic Models[^1],DDPM 是一种生成模型,所谓生成模型,就是从学习给定数据的分布,然后再通过该分布生成新的数据样本。那么理所当然的,DDPM 可以用于缓解数据集稀缺或数据集类别分布不平衡、数据增强。
DDPM 包含两个关键过程:
-
正向扩散过程(Forward Diffusion Process)
对数据逐步加入噪声,直到变为纯随机噪声

-
逆向生成过程(Reverse Diffusion Process)
从纯噪声中逐步移除噪声,生成目标数据

2. Diffusion Model 的数学推导
2.1 Forward Diffusion Process
这个阶段是一个逐渐往图片中加入噪声的过程,通过 T 步加入噪声之后,得到一个完全为噪声的图像。每个加噪的步骤都是类似的,对于 t 步的样本 xt,可以理解成一个递推过程:xt=f(xt−1),而 f(x) 的定义如下:
xt=1−βt×xt−1+βt×εtεt∼N(0,I)
其中 t 表示第 t 个时间步,xt 表示在第 t 个时间步的数据,εt 表示第 t 个时间步的多维标准高斯正态噪声,它的每个维度是独立同分布的,即: ε∼N(0,I) ——均值为 0,协方差矩阵为单位矩阵 I 。
协方差矩阵:随机变量的各个维度之间是独立的,且每个维度的方差都为 1
βt 表示时间步 t 的噪声调度参数(Noise Schedule Parameter),用于控制噪声的强度( βt 通常很小,如 0.0001 ∼ 0.02 ),通常来说, t 越大,βt 越大(因为越到后面,轻微扰动很难看出变化,所以 βt 的值会越来越大)。
在训练的时候,如果直接使用这种逐步计算的过程,自然是效率很低的,那么通过这个公式能否直接从初始时刻推导到最后时刻呢?这里我们直到答案是肯定的,具体的步骤如下~
首先令 αt=1−βt,那么 xt 就转换成:
xt=αt×xt−1+1−αt×εt
对于上式中的 xt−1 ,我们再利用该公式进行替换:
xt=αt(αt−1×xt−2+1−αt−1×εt−1)+1−αt×εt
稍微化简一下:
xt=αtαt−1×xt−2+(αt−αtαt−1×εt−1+1−αt×εt)
我们知道:
αt−αtαt−1×εt−1∼N(0,(αt−αtαt−1)×I)
1−αt×εt∼N(0,(1−αt)×I)
二者相加,因为:
IFThenx∼N(μx,σx2),Y∼N(μy,σy2)Z=x+YZ∼N(μx+μy,σx2+σy2)
根据均值方差相加,那么可以得到:
αt−αtαt−1×εt−1+1−αt×εt∼N(0,(1−αtαt−1×I))
所以 xt 公式可以写为:
xt=αtαt−1×xt−2+1−αtαt−1×εε∼N(0,I)
那么我们可以推导出:
xt=αtαt−1...α1×x0+1−αtαt−1...α1×ε
方便起见,令 αt=αtαt−1...α1 ,最终我们可以得到:
xt=αt×x0+1−αt×ε
当 t 很大的时候,xt≈ε (全噪声),αt 为 0 ,βt 此时比较大,符合一开始的结论。
这就是 Diffusion 模型的 Forward Diffusion Process 过程,还是比较容易的~
2.2 Reverse Diffusion Process
对于 Reverse 阶段,模型的目标是通过一个完全噪声的图片,逐步的进行去噪操作,最终得到我们所需要的图片。
这里可能有的同学会去想,那么我们把 Forward 过程直接逆过来可以吗?在这里是不可以的。因为初始状态是一个纯噪声的图片,想要一步步的去噪,生成所需的图片。那其实相当于我们直接知道了我们所需的图片了,这显然是自相矛盾了,我们怎么可能提前知道了所要生成的图片呢?
既然已经明确了这个阶段是一个逐步去噪的过程,那么是怎么做的呢?这里 DDPM 采用的方法是神经网络里的 UNet 去预测当前时间步 xt 里的噪声 εt,这里需要联系上方 Forward 过程,和之前的公式是同样的参数。
根据前面的 Forward 过程,我们知道,从 xt−1 生成 xt 的过程是一个高斯分布:
q(xt∣xt−1)=N(xt; αtxt−1,(1−αt)I)
给出该公式的计算过程:
因为 xt=αtxt−1+1−αtεt ,其中 εt∼N(0, I) 是标准高斯分布。可以看出 xt 是由 xt−1 和一个独立的高斯噪声项线性组合而成,所以 xt 也是一个高斯分布。
如果随机变量 x 和 y 服从高斯分布,并且有以下线性关系:
y=Ax+b+ϵ
则 y 的分布也是高斯分布,均值和协方差分别为:
其中:
- ϵ∼N(0,Σ) 是独立的高斯噪声;
- A 是线性变换矩阵,b 是偏置项。
- 均值:μy=Aμx+b
- 协方差:Σy=AΣxAT+Σϵ
在扩散模型中:
- A=αt,即 xt−1 被缩放;
- b=0,无偏移项;
- ϵ∼N(0,(1−αt)I) ,协方差是 (1−αt)I。
因此,xt 的分布是:
q(xt∣xt−1)=N(xt;αtxt−1,(1−αt)I)
对于后向分布 q(xt−1∣xt),通过贝叶斯公式 q(xt−1∣xt)=q(xt)q(xt, xt−1)=q(xt)q(xt∣xt−1)q(xt−1) 可以得到 q(xt−1∣xt) 自然也属于高斯分布。但是我们不能够简单推断 q(xt−1∣xt) ,那么需要做的就是,使用一个神经网络,去拟合这个噪声的分布,也就是让以下公式去拟合真实的 q(xt−1∣xt) :
pθ(xt−1∣xt)=N(xt−1; μθ(xt, t), Σθ(t))
其中:
- 均值 μθ(xt, t) 是一个由神经网络预测的,输入时带噪的图片 xt 和时间步 t。
- 协方差 Σθ(t) 是一个固定值,可由神经网络预测。通常,为简化计算,协方差 Σθ(t) 被设为一个固定值或直接从前向过程的参数继承。
- pθ(xt−1 ∣ xt) 是一个可调分布,依赖于神经网络的参数 θ 。通过训练,网络会逐步优化这个部分,使它尽可能接近真实的后向分布 q(xt−1 ∣ xt) 。
后向分布(Backward Distribution)是指在扩散模型的生成阶段中,从当前时刻 xt 推测上一时刻 xt−1 的条件分布。
训练过程的核心目标是最小化两者之间的差距:
DKL(q(xt−1 ∣ xt) ∣∣ pθ(xt−1 ∣ xt))
这里 DKL 是 Kullback-Leibler 散度,用来衡量两个概率分布之间的差异。通过最小化 DKL ,神经网络会调整 μθ(xt, t) 和 Σθ(t) ,使得 pθ(xt−1 ∣ xt) 更加接近真实分布 q(xt−1 ∣ xt) 。
KL 散度:
具体见:Kullback-Leibler 散度 - Excelius’s World
简单理解,KL 散度是用来衡量两个概率分布之间“相似度”的一个数学工具。如果 KL 散度小,表示 Q(x) 能很好地近似 P(x);KL 散度大,表示 Q(x) 和 P(x) 有较大的差异。
2.2.1 Reverse 过程的具体步骤
-
初始化
从纯噪声开始采样:
xT∼N(0, I)
-
逐步去噪
通过神经网络从 xt 逐步生成 xt−1:
xt−1∼pθ(xt−1 ∣ xt)
- 对于每一步 t,我们从近似分布 pθ(xt−1 ∣ xt) 中采样。
- 逐步重复该过程,直到 t=0,最终得到生成的样本 x0。
-
单步去噪公式
采样过程通常按照如下公式进行:
xt−1=μθ(xt, t)+Σθ(t)⋅z
其中:
- z∼N(0, I) 是随机噪声,用来为每一步增加随机性(如果 t=1,可以直接去掉随机性)。
- μθ(xt, t) 和 Σθ(t) 由神经网络预测。
高斯分布采样公式:
对于一个随机变量 x∼N(μ,Σ),高斯分布的采样公式为:
x=μ+Σ⋅z,z∼N(0,I)
- μ:高斯分布的均值。
- Σ:协方差矩阵(如果是对角矩阵,则每个元素是方差)。
- z:标准正态分布噪声。
扩散模型中的 pθ(xt−1 ∣ xt) 是高斯分布,因此可以直接套用这一公式:
xt−1=μθ(xt, t)+Σθ(t)⋅z
这里的 z∼N(0,I) 表示在采样过程中添加的随机性。
2.2.2 Reverse 过程中的噪声预测
在 DDPM 中,通常不直接预测后向分布的均值 μθ(xt, t),而是将任务转化为预测噪声 ϵ,原因如下:
-
真实的均值依赖于 x0:
- 在 Forward 过程中,xt 可以由 x0 和噪声 ϵ 表示为:xt=αtx0+1−αtϵ
- q(xt−1 ∣ xt) 的均值公式中涉及 x0,但 x0 是未知的。
- 神经网络可以间接通过预测 ϵ 来推导 μθ。
-
预测噪声更简单:
- 对于上述的 xt 计算公式,神经网络学习预测噪声 ϵ,不直接预测均值 μθ(xt, t),通过预测噪声,可以间接计算出均值:
μθ(xt, t)=αt1(xt−1−αt1−αtϵθ(xt, t))
上述公式的推导公式:
在扩散模型中,前向过程(Forward Process)的每一步是一个加噪的马尔科夫链,其条件分布定义为:
q(xt∣xt−1)=N(xt;αtxt−1,(1−αt)I)
我们想要计算后向分布 q(xt−1∣xt),实际上这个在理论上很难计算的——数据分布未知: 数据的真实分布 q(x0) 通常是未知的,而后向分布依赖于这个分布。
于是乎,对于这个马尔可夫过程,我们引入 q(xt−1 ∣ xt, x0)来代替原始的 q(xt−1 ∣ xt),此时
q(xt−1 ∣ xt, x0)=q(xt ∣ x0)q(xt, xt−1 ∣ x0)=q(xt ∣ x0)q(xt ∣ xt−1, x0)q(xt−1 ∣ x0)
在扩散模型中,Forward 过程是马尔可夫过程,意味着 xt 的分布只依赖于上一时刻 xt−1,与 x0 无关:
q(xt ∣ xt−1, x0)=q(xt ∣ xt−1)
然后,我们再忽略归一化项,最终,后向分布可以化简为:
q(xt−1 ∣ xt, x0)∝q(xt ∣ xt−1)q(xt−1 ∣ x0)
关于归一化项为什么要忽略:
归一化项 q(xt∣x0) 表示边际分布:
q(xt ∣ x0)=∫q(xt ∣ xt−1)q(xt−1 ∣ x0)dxt−1
这个积分在实际中难以解析计算,但它对于 q(xt−1 ∣ xt,x0) 的相对值或形式并不重要。
实际采样中不需要归一化项
在扩散模型的 Reverse 过程中,我们需要通过采样生成 xt−1。采样过程中,只需要知道分布的相对权重(如 P~(x) 的形状),而不需要知道它的具体归一化值 Z。因此,在推导和实现中,可以省略 Z。
那么好,此时我们也知道了 q(xt ∣ xt−1)=N(xt; αtxt−1, (1−αt)I) (前方已经给出了)和 q(xt−1 ∣ x0)=N(xt−1; αt−1x0, (1−αt−1)I) (根据先前的公式可以计算出),其两者相乘的后向分布 q(xt−1 ∣ xt, x0) 依然是高斯分布。其条件均值 μ(xt, x0) 计算步骤如下:
-
联合分布方差:
Σ=(Σ1−1+Σ2−1)−1=(1−αt1+1−αt−11)−1I=(1−αt)+(1−αt−1)(1−αt)(1−αt−1)I=1−αt(1−αt)(1−αt−1)I
其中,累积噪声衰减因子 αˉt 的一个性质:
1−αt=1−αtαt−1=乘法展开(1−αt)+(1−αt−1)−(1−αt)(1−αt−1)≈(1−αt)+(1−αt−1)
注意:在扩散模型中,(1−αˉt−1)(1−αt) 是高阶小量,可以被忽略(噪声强度通常很小)。
-
联合分布均值:
μ=Σ(Σ1−1μ1+Σ2−1μ2)=1−αt(1−αt)(1−αt−1)(1−αtαtxt+1−αt−1αt−1x0)=1−αt(1−αt−1)αtxt+1−αt(1−αt)αt−1x0
即:
μ(xt,x0)=1−αt(1−αt−1)αtxt+1−αt(1−αt)αt−1x0
高斯分布乘积的性质
两个高斯分布:
p1(x)=N(x; μ1, Σ1),p2(x)=N(x; μ2, Σ2)
相乘的结果是:
p(x)∝N(x;μ,Σ)
其中:
- 协方差: Σ=(Σ1−1+Σ2−1)−1
- 均值: μ=Σ(Σ1−1μ1+Σ2−1μ2)
之后呢,我们使用神经网络预测噪声,由 x0=αtxt−1−αtϵ(上方公式可推导),因为噪声 ϵ 是未知的,我们使用神经网络 ϵθ(xt, t) 来预测,可近似为:
x^0=αtxt−1−αtϵθ(xt, t)
将 x^0 带入到 μ(xt,x0)得:
μ(xt,x^0)=1−αt(1−αt−1)αtxt+1−αt(1−αt)αt−1⋅αtxt−1−αtϵθ(xt, t)
整理便可得:
μθ(xt, t)=αt1(xt−1−αt1−αtϵθ(xt, t))
- 这样,我们可以通过噪声预测模型间接计算 μθ(xt, t) ,然后通过预测的 μθ(xt, t) 和后向分布的协方差 Σθ(xt, t),生成 xt−1,然后我们逐步重复这个过程,就可以得到最终样本 x0。
-
训练目标转换为噪声预测:
- 目标是让神经网络预测噪声 ϵ^θ(xt, t),并与真实噪声 ϵ 之间最小化均方误差(MSE):
L=Et[∥ϵ−ϵ^θ(xt,t)∥2]
好了,现在我们已经讲解完毕 Diffusion 模型的 Reverse 阶段了,这个阶段比较复杂,但是经过梳理之后,我们也顺利推导出来各项公式了~
接下来我会再写一篇 Diffusion 模型在 NLP 的一篇实战博文,敬请期待~
[^1]: Ho J, Jain A, Abbeel P. Denoising diffusion probabilistic models. NeuralPS, 2020.