扩散模型原理:从噪声到图像的数学之旅
想象一下修复照片的过程:起点是一张满是噪点的图片(高斯噪声),终点是一张清晰的照片。你需要找到一条路径,从无意义的噪声一步步变成有意义的图像。
这个故事要从头说起——我们如何让计算机学会这个魔法?
符号说明(查表用)
下面这些符号会在文章中反复出现。不需要记住,遇到不懂的符号时回来查这个表就行了。
图像符号
- x0:原始清晰图片(下标 0 表示第 0 步,也就是没有加过噪声)
- xt:第 t 步的带噪声图片(t 越大,图越模糊)
- xt−1:第 t−1 步的图片,比 xt 稍微清晰一点
- xT:最终第 T 步的图片,全是噪声
概率符号
- q(后∣前):真实的前向或逆向分布(上帝视角,理论上存在但可能算不出来)
- q(xt∣xt−1):前向加噪分布,从 xt−1 到 xt(已知,很好算)
- q(xt−1∣xt):逆向去噪分布,从 xt 到 xt−1(未知,很难算)
- pθ(后∣前):神经网络预测的分布(替身,用来近似真实分布)
- θ:神经网络的参数
- pθ(xt−1∣xt):神经网络预测的逆向分布
噪声符号
- ϵ:标准高斯噪声,ϵ∼N(0,1)
- βt:第 t 步加的噪声强度(人为设定的小常数)
- αt:信号保留比例,定义为 1−βt
- αˉt:累积保留比例,定义为 α1×α2×⋯×αt
直观理解
前向过程(加噪):x0qx1qx2q⋯qxT
逆向过程(去噪):xTpθxT−1pθ⋯pθx0
现在开始我们的故事。
第一章:直觉的陷阱
最直观的想法
假设你想把一张清晰的图片变成噪声。最直观的做法就像撒盐一样,一步步往上叠加噪声。
设 x0 是原图。在每一时刻 t,在上一时刻 xt−1 的基础上加一点噪声 ϵ:
xt=xt−1+β⋅ϵ
其中 ϵ∼N(0,1),β 表示噪声强度。
这个公式描述的是前向过程:从清晰图 xt−1 加噪得到 xt。用概率论的语言,我们把这个加噪过程记作 q(xt∣xt−1) —— 也就是在给定 xt−1 的条件下,xt 的分布。
现在不用纠结这个符号,你只需要知道:q(xt∣xt−1) 就是我们前面写的那个加噪公式。
展开 t 步后:
xt=x0+tβ⋅ϵˉ
其中 ϵˉ 是合并后的噪声。
直觉的崩溃
这个公式有两个致命缺陷。
问题 1:均值漂移
- 均值:E[xt]=x0
- 无论加多少步噪声,图像的均值永远是原图
- 这意味着原图的底色永远消不掉
问题 2:方差爆炸
- 方差:Var(xt)=tβ
- 随着时间 t 增加,方差会趋向于无穷大
- 标准正态分布的方差必须固定为 1
结论:这个模型无法收敛到标准正态分布 N(0,1),它只是造出了一个无限模糊且数值巨大的废图。
第二章:能量守恒的启示
引入衰减系数
为了防止方差爆炸,我们需要引入能量守恒的概念:既然要注入噪声能量(方差),就必须按比例拿走一部分图像能量。
在 xt−1 前面加一个衰减系数。为了保证总方差维持在 1,系数必须满足勾股定理的形式:
xt=1−βt⋅xt−1+βt⋅ϵ
其中 βt∈(0,1) 是一个小的常数,表示每步添加的噪声比例。
为什么这样就对了?
通过这种缩放操作,可以保证 Var(xt)=1(假设 Var(xt−1)=1),无论迭代多少次,数据的方差始终被控制在 1 左右。
这就构成了 Variance Preserving(保方差)的扩散过程。
这个改进后的公式就是我们前向加噪分布 q(xt∣xt−1) 的核心形式。
第三章:寻找直达公式
工程需求
训练神经网络时,我们需要在任意时刻 t 采样带噪图,然后告诉网络:这幅图里加的噪声是什么。这需要一个关键能力:给定原图 x0 和任意时刻 t,直接算出对应的噪声 xt 和噪声 ϵ。
如果只能一步步递推算,我们就不知道当前这幅 xt 里到底加了多少噪声——因为噪声累积了 t 步,每一步的噪声都不同。
所以我们需要一个"直达公式":从 x0 和 t 一步到位算出 xt,这样就能清楚地知道这幅图里包含的噪声 ϵ 是什么。
变量定义
为了书写简洁,定义两个变量:
αt=1−βt
αˉt=∏i=1tαi=α1×α2×⋯×αt
- αt:第 t 步的信号保留比例
- αˉt:累积保留比例(从第 1 步到第 t 步所有 α 的连乘积,读作 Alpha Bar t)
递归推导
通过数学归纳法,推导规律:
- 当 t=1 时:x0 的系数是 α1
- 当 t=2 时:x0 的系数是 α1α2
- 当 t=3 时:系数变成 α1α2α3
规律已经很清晰了,但还需要处理噪声项的合并。
高斯分布的魔力
两个独立高斯分布 N(0,σ12) 和 N(0,σ22) 相加,等于一个新的高斯分布 N(0,σ12+σ22)。
利用这个性质,推导出噪声项可以合并为 1−αˉt⋅ϵˉ 的形式。
DDPM 核心公式
通过数学归纳法,推广到任意时刻 t:
xt=αˉt⋅x0+1−αˉt⋅ϵ=q(xt∣x0)
左边是具体的计算公式,右边是符号表示(在给定原图 x0 的条件下,第 t 步的带噪图 xt 的分布)。
验证收敛
来看看当 t→∞(扩散到最后)时,这个公式会发生什么。
由于 αt<1,连乘积 αˉt 会趋近于 0,因此 xT≈ϵ(纯标准正态分布)。
结论:前向过程完美收敛到标准正态分布 N(0,1)。
训练数据准备
现在我们有了直达公式,就可以准备训练数据了!
给定一张清晰图片 x0,训练样本是这样准备的:
- 随机选时刻 t∈{1,2,...,T}
- 生成噪声 ϵ∼N(0,1)
- 计算带噪图 xt=αˉt⋅x0+1−αˉt⋅ϵ
每个训练样本包含:
- 输入:(xt,t) —— 带噪图和时间步
- 标签:ϵ —— 真实噪声
神经网络的任务:看带噪图 xt 和时间 t,预测这幅图里的噪声 ϵ。
这就为后面的训练做好了准备。
第四章:逆向的困境
问题:能走回去吗?
前三章我们一直在讲前向过程:从清晰图逐步加噪,最后得到 q(xt∣x0) —— 可以直接从原图生成任意时刻的带噪图。
现在的问题是:能不能走回去?
给定一张满是噪点的图 xt,怎么推算出它上一秒稍微清晰一点的样子 xt−1?
用概率论的语言,我们想求的是逆向过程 q(xt−1∣xt) —— 注意,条件反过来了!不再是从 xt−1 到 xt,而是要从 xt 推回 xt−1。
根据贝叶斯公式:
q(xt−1∣xt)=q(xt)q(xt∣xt−1)⋅q(xt−1)
- q(xt∣xt−1):已知(我们前三章推导的单步加噪公式)
- q(xt−1) 和 q(xt):未知!这需要知道全世界所有图片的边缘分布,在数学上是不可计算的
困境:逆向过程算不出来!
解决方案:找个替身
既然算不出真实的 q(xt−1∣xt),我们就训练一个神经网络(参数为 θ)来近似它。我们把这个替身记作 pθ(xt−1∣xt)。
为什么要预测高斯分布?
这里有个关键的直觉:前向过程每次加的噪声极小(βt 很小),就像画画时每一笔只涂抹一点点。那么撤销这一笔的操作,大概率也只是在一个很小的范围内微调。
数学上这叫做 Feller 理论:当扩散步数 T→∞ 且每一步加噪幅度 βt→0 时,前向过程变成了连续的布朗运动。如果前向过程是高斯扩散,逆向过程在数学形式上也必然是一个高斯过程。
所以,神经网络不需要预测整张图 xt−1,只需要预测一个高斯分布。
高斯分布需要什么参数?
一个高斯分布 N(μ,σ2) 由两个参数决定:
- 均值 μ:分布的中心位置
- 方差 σ2:分布的分散程度
理论上,神经网络需要预测这两个值。
DDPM 的简化
但是 DDPM 论文发现了一个事实:方差不需要训练,直接固定成常数(和前向过程的 βt 相关)效果就很好。
因此,神经网络的任务被简化了:
- 不需要预测:方差 Σθ(固定为常数)
- 只需要预测:均值 μθ(xt,t)
这个均值 μθ(xt,t) 代表什么?直觉上理解,它就是神经网络对"上一张图 xt−1 应该长什么样"的猜想的中心点。给定当前噪点图 xt 和时间 t,神经网络告诉我们:往这个方向走,应该能找到更清晰的图。
第五章:ELBO 的登场
目标:让神经网络生成真图
为了让这个神经网络 pθ 能够生成像 x0 这样的真图,我们需要最大化对数似然:logpθ(x0)。
但正如之前所说,直接算这个太难。于是我们引入 ELBO(Evidence Lower Bound,证据下界)。
什么是下界?
这里要用到一个经典的变分推断技巧:引入一个辅助分布 q,在 log 里面玩点数学游戏。
你可能注意到公式里出现了 x1:T 和 x0:T 这种写法,这是一种简写符号:
- x1:T 表示从第 1 步到第 T 步的所有带噪图:x1,x2,...,xT
- x0:T 表示 x0,x1,...,xT
从我们的目标开始:
logpθ(x0)=log∑x1:Tpθ(x0:T)
这个公式的逻辑是:模型生成一张清晰图 x0 的概率,等于它沿着所有可能的去噪路径(从纯噪声 xT 到 x0)推导回来的概率总和。
按照从左到右的顺序:
- log:对概率取对数,将连乘转化为加法,便于优化
- ∑x1:T:对所有可能的中间路径进行边缘化——把所有能产生同一张 x0 的不同路径(x1,x2,...,xT 的各种组合)的概率全部累加
- pθ(x0:T):模型参数为 θ 的联合概率,描述一条完整去噪链路 {xT,xT−1,...,x1,x0} 的发生概率
好比计算"到达山顶的总人数":把从北坡、南坡、西坡等所有路径上山的人数加起来。
现在我们在分数里乘以 q(x1:T∣x0)/q(x1:T∣x0)=1:
logpθ(x0)=log∑x1:Tq(x1:T∣x0)⋅q(x1:T∣x0)pθ(x0:T)
这可以写成期望的形式:
logpθ(x0)=logEq[q(x1:T∣x0)pθ(x0:T)]
关键步骤:利用 Jensen 不等式(log 是凹函数,所以 logE[X]≥E[logX]):
logpθ(x0)≥Eq[logq(x1:T∣x0)pθ(x0:T)]
或者写成更熟悉的形式:
logpθ(x0)≥Eq[logpθ(x0:T)q(x1:T∣x0)]
- 左边是我想最大化的目标(很难算)
- 右边是一个下界(Lower Bound)(相对好算)
策略:如果我们拼命把右边的下界抬高,左边的目标自然也就被顶上去了。
在深度学习里,我们要 minimize Loss,所以我们取负号,变成 Minimize Negative ELBO。
拆解 Loss
把上面那个复杂的式子展开(利用 Markov 链性质),Loss 可以被拆解成三项:
L=LT+Lt−1+L0
LT(正则项):
DKL(q(xT∣x0)∣∣p(xT))
这里的 q(xT∣x0) 是第三章推导的那个直达分布:从原图 x0 出发,经过 T 步前向加噪后得到最终噪声图 xT 的概率分布。
根据第三章的核心公式,这实际上是一个高斯分布:
q(xT∣x0)=N(αˉT⋅x0,1−αˉT)
p(xT) 是标准高斯分布 N(0,1)。这一项比较的是:模型最终生成的噪声分布(q)和标准高斯噪声(p)有多接近。
因为前向过程是锁死的,当 T 足够大时,αˉT→0,所以 q(xT∣x0) 本来就非常接近标准高斯。这一项近似为 0,不用训练。
L0(重构项):
−logpθ(x0∣x1)
最后一步的解码。
Lt−1(去噪核心项):这就是我们要关注的重点!
∑t>1DKL(q(xt−1∣xt,x0)∣∣pθ(xt−1∣xt))
这个 KL 散度在衡量两个分布的距离。
左边:上帝视角的真实分布 q(xt−1∣xt,x0)
这是"给定原图 x0 和当前带噪图 xt 的条件下,上一张稍微清晰点的图 xt−1 的概率分布"。
关键点:多了 x0 这个条件!
为什么这很重要?回顾第四章,q(xt−1∣xt) 算不出来——因为只知道当前带噪图 xt,但不知道它原本是什么样,有无数种可能的 xt−1 都能产生这个 xt。就像只知道终点,不知道起点,无法确定路径。
但加了 x0 之后情况就完全不同了:如果我们知道原图 x0(训练时当然知道,因为 xt 就是从它算出来的),就能锁定唯一的"去噪路径"。此时逆向概率 q(xt−1∣xt,x0) 变得可计算。
**具体怎么算?**利用贝叶斯公式:
q(xt−1∣xt,x0)=q(xt∣x0)q(xt∣xt−1,x0)⋅q(xt−1∣x0)
看公式右边的三项:
-
q(xt∣xt−1,x0):因为马尔可夫性,给定 xt−1 后,xt 不再依赖 x0,所以等于 q(xt∣xt−1)。这是单步高斯加噪分布:xt=1−βt⋅xt−1+βt⋅ϵ
-
q(xt−1∣x0):从原图 x0 一步到位到 xt−1 的分布。用直达公式:xt−1=αˉt−1⋅x0+1−αˉt−1⋅ϵ,这是高斯分布
-
q(xt∣x0):从原图 x0 一步到位到 xt 的分布。同样用直达公式:xt=αˉt⋅x0+1−αˉt⋅ϵ,这也是高斯分布
核心差别:第 2 和第 3 项都是从原图 x0 出发的"前向"分布,我们有直达公式可以一步到位计算;而第 1 项是单步加噪,公式也很简单。
这三项都能算,这就是为什么加了 x0 之后整个贝叶斯公式变得可计算——每一项都是已知的高斯分布。
既然三项都是高斯分布,它们的贝叶斯组合仍然是高斯分布。通过代数推导可以得到:
q(xt−1∣xt,x0)=N(μ~t,σ~t2)
其中均值的具体形式是:
μ~t=αt1(xt−1−αˉt1−αt⋅ϵ)
这个公式不需要背,但需要理解每个参数是怎么来的:
公式里的参数
- xt:当前带噪图(已知,这就是我们要处理的图)
- x0:原图(已知,训练时当然知道,因为 xt 就是从它算出来的)
- αt:第 t 步的信号保留比例(预设常数,训练前就设定好了)
- αˉt:累积保留比例(可以预先计算,就是 α1×α2×⋯×αt)
- ϵ:关键!这是从 x0 生成 xt 时加的噪声(可以从第三章的直达公式反算出来:ϵ=1−αˉtxt−αˉt⋅x0)
核心洞察:公式中只有 ϵ 是"隐藏"的,但它可以通过 xt 和 x0 算出来。
这就是为什么说"要想算出均值,本质上只需要知道噪声 ϵ 是多少"——因为其他所有参数都是公开的预设值,只有噪声是需要推导的。
右边:神经网络预测的分布 pθ(xt−1∣xt)
这是神经网络预测的分布——看着带噪图 xt,猜上一张图 xt−1 长什么样。
网络不知道原图 x0,只能通过观察 xt 来推测。它需要预测一个高斯分布 N(μθ,Σθ),但由于 DDPM 的简化(方差固定),实际上只需要预测均值 μθ。
神经网络的输入输出
- 输入:(xt,t) —— 带噪图和时间步
- 输出:预测的均值 μθ(xt,t)
小结
KL 散度在衡量:神经网络的预测(pθ)和上帝视角的真实答案(q)有多接近。
训练的目标就是让 μθ 尽可能逼近 μ~t。
第六章:从均值到噪声的蜕变
现在我们的任务很明确了:让神经网络预测的均值 μθ,去逼近第五章那个上帝视角的真实均值 μ~t。
第五章末尾我们注意到一个关键洞察:均值公式的形式揭示了与噪声 ϵ 的直接关系——要想算出均值,本质上只需要知道噪声 ϵ 是多少。
现在深入理解这个洞察:为什么"求均值"等于"减去噪声"?
搞懂符号
先让我们把公式里的零件一个个拆下来。
μθ(xt,t) 是什么?
这是神经网络根据当前满是噪点的图 xt,猜测出来的"上一张稍微清晰点的图 xt−1"的中心位置。
- 为什么要输入 xt?你需要看着当前的图,才能猜上一张图
- 为什么要输入 t?你需要知道现在是第几步。第 1000 步全是噪点很难猜,第 5 步基本看清了只需微调。时间 t 告诉网络噪声的浓度
那 Σθ 呢?
DDPM 论文发现了一个巧妙的事实:方差其实不用训练!前向加噪时每一步的噪声大小 βt 是人为设定的,逆向的不确定性跟它高度相关。
所以作者直接把方差固定成常数,神经网络只需要管好均值就行了。
关键洞察
现在到了最关键的地方:为什么"求均值"等于"减去噪声"?
请盯着第五章那个上帝视角的均值公式看三秒钟:
μ~t=αt1(xt−1−αˉt1−αt⋅ϵ)
- xt:当前的图(已知)
- αt,βt:预设的常数(已知)
- ϵ:这幅图里包含的噪声(未知!)
发现了吗?要想算出均值,本质上只需要知道这幅图里的噪声 ϵ 是多少!
这是一个惊人的发现:神经网络预测均值 μθ,在数学上等价于预测噪声 ϵθ。
于是,神经网络的工作变得很简单:
- 输入:xt(带噪图)
- 任务:告诉我这图里加的噪声 ϵ 长什么样
- 计算:把预测出来的噪声套进公式,算出 xt−1 的均值
- 采样:在均值旁边随机抖一下,就得到了 xt−1
MSE 的诞生
现在你应该理解了:虽然理论上我们在拟合一个高斯分布:
pθ=N(μ,Σ)
但在实际代码里,神经网络直接预测噪声 ϵθ,然后用 xt 减去噪声的部分,就得到了去噪后的结果。
复杂的 KL 散度 Loss,最终被简化成了两个噪声向量的均方误差:
Lsimple=∥ϵ−ϵθ(αˉtx0+1−αˉtϵ,t)∥2
- ϵ:训练时生成的真噪声
- ϵθ:神经网络预测的噪声
这个简化太重要了。让我们回顾一下它是怎么来的:
- Feller 理论告诉我们:逆向过程是高斯分布
- DDPM 简化告诉我们:方差可以固定,只需求均值
- 贝叶斯推导告诉我们:求均值等价于求噪声
- 最终实现:神经网络看图预测噪声
每一步都自然流畅,每一步都环环相扣。
第七章:生成图片
神经网络训练好后(训练过程前面已经讲过),怎么用它生成新图片?
初始状态:从纯噪声开始,xT∼N(0,1)
去噪循环:从 t=T 倒推到 t=1
每一步的更新公式:
xt−1=αt1(xt−1−αˉt1−αt⋅ϵθ(xt,t))+σt⋅z
其中 z∼N(0,1) 是随机噪声(σt 是预设的方差系数)。
完整生成流程:
-
初始化:从标准正态分布采样 xT∼N(0,1) 作为起点(纯噪声)
-
逐步去噪:对于 t=T,T−1,...,2,1,每次迭代:
- 把当前带噪图 xt 和时间步 t 输入神经网络
- 网络预测噪声 ϵθ(xt,t)
- 用上面的去噪公式计算 xt−1
- 得到稍微清晰一点的图
-
得到结果:重复 T 次后,最终得到清晰图 x0
直觉理解:
- 网络看当前带噪图 xt,预测里面的噪声 ϵθ
- 从 xt 中减去预测的噪声,得到上一时刻的图 xt−1
- 加一点随机噪声 z(保持生成的多样性)
- 重复 T 次(比如 1000 次),逐步去噪,最终得到清晰图 x0
核心洞察
训练和推理的对称性:
- 训练时(第三章):我们知道 x0,用直达公式生成带噪图 xt,让网络学习预测噪声 ϵ
- 推理时(本章):我们从纯噪声开始,用训练好的网络预测噪声,逐步去除噪声得到清晰图 x0
训练时教网络"加噪是什么样",推理时让网络"把噪声去掉"——这就是扩散模型的优雅之处。
终章:全流程闭环
按照 DDPM 论文的逻辑,你现在应该彻底通透了。让我们回顾一下这个完整的故事。
故事脉络
- 起点:想算逆向过程 q(xt−1∣xt),但算不出来
- 方法:用神经网络 pθ 去拟合它
- 手段:最大化 ELBO(变分下界)来训练
- 技巧:引入 x0 作为条件,使得 KL 散度的目标分布 q(xt−1∣xt,x0) 变得可计算
- 化简:把直达公式代入进去,发现拟合分布的均值,本质上就是在拟合噪声
- 结果:Loss 就是预测噪声和真实噪声的 MSE
核心优势
这种方法的关键优势在于利用了高斯噪声良好的数学性质,使整个过程的可建模性和可控性大大提高:
- 数学优雅:前向过程有闭式解,可以快速生成训练数据
- 训练稳定:通过能量守恒保持方差稳定
- 推导清晰:从 ELBO 到 MSE 的每一步都有严格的数学推导
- 工程可行:最终简化的 Loss 就是普通的 MSE,易于实现
这就是扩散模型背后的完整故事——从最直观的叠加噪声想法,到引入能量守恒,再到用神经网络拟合逆向过程,最终简化为预测噪声的 MSE Loss,最后落地到训练和推理的具体实现。
每一步都自然流畅,每一步都环环相扣。
现在,你应该真正理解了扩散模型的数学之美。
title: 扩散模型原理:从噪声到图像的数学之旅
category: 深度学习
tags:
- 扩散模型
- DDPM
- 机器学习
- 数学推导
status: 已完成
difficulty: 进阶
created: 2024-01-21T00:00:00.000Z
aliases:
- DDPM 原理
- Denoising Diffusion Probabilistic Models
cssclasses:
- math-document
theme: nico
扩散模型原理:从噪声到图像的数学之旅
想象一下修复照片的过程:起点是一张满是噪点的图片(高斯噪声),终点是一张清晰的照片。你需要找到一条路径,从无意义的噪声一步步变成有意义的图像。
这个故事要从头说起——我们如何让计算机学会这个魔法?
符号说明(查表用) ^symbol-table
下面这些符号会在文章中反复出现。不需要记住,遇到不懂的符号时回来查这个表就行了。
[!info] 图像符号
- x0:原始清晰图片(下标 0 表示第 0 步,也就是没有加过噪声)
- xt:第 t 步的带噪声图片(t 越大,图越模糊)
- xt−1:第 t−1 步的图片,比 xt 稍微清晰一点
- xT:最终第 T 步的图片,全是噪声
[!info] 概率符号
- q(后∣前):真实的前向或逆向分布(上帝视角,理论上存在但可能算不出来)
- q(xt∣xt−1):前向加噪分布,从 xt−1 到 xt(已知,很好算)
- q(xt−1∣xt):逆向去噪分布,从 xt 到 xt−1(未知,很难算)
- pθ(后∣前):神经网络预测的分布(替身,用来近似真实分布)
- θ:神经网络的参数
- pθ(xt−1∣xt):神经网络预测的逆向分布
[!info] 噪声符号
- ϵ:标准高斯噪声,ϵ∼N(0,1)
- βt:第 t 步加的噪声强度(人为设定的小常数)
- αt:信号保留比例,定义为 1−βt
- αˉt:累积保留比例,定义为 α1×α2×⋯×αt
直观理解
前向过程(加噪):x0qx1qx2q⋯qxT
逆向过程(去噪):xTpθxT−1pθ⋯pθx0
现在开始我们的故事。
第一章:直觉的陷阱 ^chapter-1
最直观的想法
假设你想把一张清晰的图片变成噪声。最直观的做法就像撒盐一样,一步步往上叠加噪声。
设 x0 是原图。在每一时刻 t,在上一时刻 xt−1 的基础上加一点噪声 ϵ:
xt=xt−1+β⋅ϵ
其中 ϵ∼N(0,1),β 表示噪声强度。
这个公式描述的是前向过程:从清晰图 xt−1 加噪得到 xt。用概率论的语言,我们把这个加噪过程记作 q(xt∣xt−1) —— 也就是在给定 xt−1 的条件下,xt 的分布。
现在不用纠结这个符号,你只需要知道:q(xt∣xt−1) 就是我们前面写的那个加噪公式。
展开 t 步后:
xt=x0+tβ⋅ϵˉ
其中 ϵˉ 是合并后的噪声。
直觉的崩溃
这个公式有两个致命缺陷。
[!warning]- 问题 1:均值漂移
- 均值:E[xt]=x0
- 无论加多少步噪声,图像的均值永远是原图
- 这意味着原图的底色永远消不掉
[!warning]- 问题 2:方差爆炸
- 方差:Var(xt)=tβ
- 随着时间 t 增加,方差会趋向于无穷大
- 标准正态分布的方差必须固定为 1
[!failure]- 结论
这个模型无法收敛到标准正态分布 N(0,1),它只是造出了一个无限模糊且数值巨大的废图。
第二章:能量守恒的启示 ^chapter-2
引入衰减系数
为了防止方差爆炸,我们需要引入能量守恒的概念:既然要注入噪声能量(方差),就必须按比例拿走一部分图像能量。
在 xt−1 前面加一个衰减系数。为了保证总方差维持在 1,系数必须满足勾股定理的形式:
xt=1−βt⋅xt−1+βt⋅ϵ
其中 βt∈(0,1) 是一个小的常数,表示每步添加的噪声比例。
为什么这样就对了?
通过这种缩放操作,可以保证 Var(xt)=1(假设 Var(xt−1)=1),无论迭代多少次,数据的方差始终被控制在 1 左右。
这就构成了 Variance Preserving(保方差)的扩散过程。
这个改进后的公式就是我们前向加噪分布 q(xt∣xt−1) 的核心形式。
第三章:寻找直达公式 ^chapter-3
工程需求
训练神经网络时,我们需要在任意时刻 t 采样带噪图,然后告诉网络:这幅图里加的噪声是什么。这需要一个关键能力:给定原图 x0 和任意时刻 t,直接算出对应的噪声 xt 和噪声 ϵ。
如果只能一步步递推算,我们就不知道当前这幅 xt 里到底加了多少噪声——因为噪声累积了 t 步,每一步的噪声都不同。
所以我们需要一个"直达公式":从 x0 和 t 一步到位算出 xt,这样就能清楚地知道这幅图里包含的噪声 ϵ 是什么。
变量定义
为了书写简洁,定义两个变量:
αt=1−βt
αˉt=∏i=1tαi=α1×α2×⋯×αt
- αt:第 t 步的信号保留比例
- αˉt:累积保留比例(从第 1 步到第 t 步所有 α 的连乘积,读作 Alpha Bar t)
递归推导
通过数学归纳法,推导规律:
- 当 t=1 时:x0 的系数是 α1
- 当 t=2 时:x0 的系数是 α1α2
- 当 t=3 时:系数变成 α1α2α3
规律已经很清晰了,但还需要处理噪声项的合并。
高斯分布的魔力
两个独立高斯分布 N(0,σ12) 和 N(0,σ22) 相加,等于一个新的高斯分布 N(0,σ12+σ22)。
利用这个性质,推导出噪声项可以合并为 1−αˉt⋅ϵˉ 的形式。
DDPM 核心公式 ^ddpm-core-formula
通过数学归纳法,推广到任意时刻 t:
xt=αˉt⋅x0+1−αˉt⋅ϵ=q(xt∣x0)
左边是具体的计算公式,右边是符号表示(在给定原图 x0 的条件下,第 t 步的带噪图 xt 的分布)。
验证收敛
来看看当 t→∞(扩散到最后)时,这个公式会发生什么。
由于 αt<1,连乘积 αˉt 会趋近于 0,因此 xT≈ϵ(纯标准正态分布)。
[!success]- 结论
前向过程完美收敛到标准正态分布 N(0,1)。
训练数据准备 ^training-data
现在我们有了直达公式,就可以准备训练数据了!
给定一张清晰图片 x0,训练样本是这样准备的:
- 随机选时刻 t∈{1,2,...,T}
- 生成噪声 ϵ∼N(0,1)
- 计算带噪图 xt=αˉt⋅x0+1−αˉt⋅ϵ
每个训练样本包含:
- 输入:(xt,t) —— 带噪图和时间步
- 标签:ϵ —— 真实噪声
神经网络的任务:看带噪图 xt 和时间 t,预测这幅图里的噪声 ϵ。
这就为后面的训练做好了准备。
第四章:逆向的困境 ^chapter-4
问题:能走回去吗?
前三章我们一直在讲前向过程:从清晰图逐步加噪,最后得到 q(xt∣x0) —— 可以直接从原图生成任意时刻的带噪图。
现在的问题是:能不能走回去?
给定一张满是噪点的图 xt,怎么推算出它上一秒稍微清晰一点的样子 xt−1?
用概率论的语言,我们想求的是逆向过程 q(xt−1∣xt) —— 注意,条件反过来了!不再是从 xt−1 到 xt,而是要从 xt 推回 xt−1。
根据贝叶斯公式:
q(xt−1∣xt)=q(xt)q(xt∣xt−1)⋅q(xt−1)
- q(xt∣xt−1):已知(我们前三章推导的单步加噪公式)
- q(xt−1) 和 q(xt):未知!这需要知道全世界所有图片的边缘分布,在数学上是不可计算的
[!failure]- 困境
逆向过程算不出来!
解决方案:找个替身
既然算不出真实的 q(xt−1∣xt),我们就训练一个神经网络(参数为 θ)来近似它。我们把这个替身记作 pθ(xt−1∣xt)。
[!faq]- 为什么要预测高斯分布?
这里有个关键的直觉:前向过程每次加的噪声极小(βt 很小),就像画画时每一笔只涂抹一点点。那么撤销这一笔的操作,大概率也只是在一个很小的范围内微调。
数学上这叫做 Feller 理论:当扩散步数 T→∞ 且每一步加噪幅度 βt→0 时,前向过程变成了连续的布朗运动。如果前向过程是高斯扩散,逆向过程在数学形式上也必然是一个高斯过程。
所以,神经网络不需要预测整张图 xt−1,只需要预测一个高斯分布。
[!info]- 高斯分布需要什么参数?
一个高斯分布 N(μ,σ2) 由两个参数决定:
- 均值 μ:分布的中心位置
- 方差 σ2:分布的分散程度
理论上,神经网络需要预测这两个值。
[!tip]- DDPM 的简化
但是 DDPM 论文发现了一个事实:方差不需要训练,直接固定成常数(和前向过程的 βt 相关)效果就很好。
因此,神经网络的任务被简化了:
- 不需要预测:方差 Σθ(固定为常数)
- 只需要预测:均值 μθ(xt,t)
这个均值 μθ(xt,t) 代表什么?直觉上理解,它就是神经网络对"上一张图 xt−1 应该长什么样"的猜想的中心点。给定当前噪点图 xt 和时间 t,神经网络告诉我们:往这个方向走,应该能找到更清晰的图。
第五章:ELBO 的登场 ^chapter-5
目标:让神经网络生成真图
为了让这个神经网络 pθ 能够生成像 x0 这样的真图,我们需要最大化对数似然:logpθ(x0)。
但正如之前所说,直接算这个太难。于是我们引入 ELBO(Evidence Lower Bound,证据下界)。
什么是下界?
这里要用到一个经典的变分推断技巧:引入一个辅助分布 q,在 log 里面玩点数学游戏。
你可能注意到公式里出现了 x1:T 和 x0:T 这种写法,这是一种简写符号:
- x1:T 表示从第 1 步到第 T 步的所有带噪图:x1,x2,...,xT
- x0:T 表示 x0,x1,...,xT
从我们的目标开始:
logpθ(x0)=log∑x1:Tpθ(x0:T)
这个公式的逻辑是:模型生成一张清晰图 x0 的概率,等于它沿着所有可能的去噪路径(从纯噪声 xT 到 x0)推导回来的概率总和。
按照从左到右的顺序:
- log:对概率取对数,将连乘转化为加法,便于优化
- ∑x1:T:对所有可能的中间路径进行边缘化——把所有能产生同一张 x0 的不同路径(x1,x2,...,xT 的各种组合)的概率全部累加
- pθ(x0:T):模型参数为 θ 的联合概率,描述一条完整去噪链路 {xT,xT−1,...,x1,x0} 的发生概率
好比计算"到达山顶的总人数":把从北坡、南坡、西坡等所有路径上山的人数加起来。
现在我们在分数里乘以 q(x1:T∣x0)/q(x1:T∣x0)=1:
logpθ(x0)=log∑x1:Tq(x1:T∣x0)⋅q(x1:T∣x0)pθ(x0:T)
这可以写成期望的形式:
logpθ(x0)=logEq[q(x1:T∣x0)pθ(x0:T)]
关键步骤:利用 Jensen 不等式(log 是凹函数,所以 logE[X]≥E[logX]):
logpθ(x0)≥Eq[logq(x1:T∣x0)pθ(x0:T)]
或者写成更熟悉的形式:
logpθ(x0)≥Eq[logpθ(x0:T)q(x1:T∣x0)]
- 左边是我想最大化的目标(很难算)
- 右边是一个下界(Lower Bound)(相对好算)
策略:如果我们拼命把右边的下界抬高,左边的目标自然也就被顶上去了。
在深度学习里,我们要 minimize Loss,所以我们取负号,变成 Minimize Negative ELBO。
拆解 Loss ^loss-decomposition
把上面那个复杂的式子展开(利用 Markov 链性质),Loss 可以被拆解成三项:
L=LT+Lt−1+L0
[!info]- LT(正则项)
DKL(q(xT∣x0)∣∣p(xT))
这里的 q(xT∣x0) 是[[第三章:寻找直达公式#^ddpm-core-formula|第三章推导的那个直达分布]]:从原图 x0 出发,经过 T 步前向加噪后得到最终噪声图 xT 的概率分布。
根据第三章的核心公式,这实际上是一个高斯分布:
q(xT∣x0)=N(αˉT⋅x0,1−αˉT)
p(xT) 是标准高斯分布 N(0,1)。这一项比较的是:模型最终生成的噪声分布(q)和标准高斯噪声(p)有多接近。
因为前向过程是锁死的,当 T 足够大时,αˉT→0,所以 q(xT∣x0) 本来就非常接近标准高斯。这一项近似为 0,不用训练。
[!info]- L0(重构项)
−logpθ(x0∣x1)
最后一步的解码。
[!important]- Lt−1(去噪核心项)
∑t>1DKL(q(xt−1∣xt,x0)∣∣pθ(xt−1∣xt))
这个 KL 散度在衡量两个分布的距离。
左边:上帝视角的真实分布 q(xt−1∣xt,x0) ^god-view-distribution
这是"给定原图 x0 和当前带噪图 xt 的条件下,上一张稍微清晰点的图 xt−1 的概率分布"。
[!tip]- 关键点
多了 x0 这个条件!
为什么这很重要?回顾[[第四章:逆向的困境#^chapter-4|第四章]],q(xt−1∣xt) 算不出来——因为只知道当前带噪图 xt,但不知道它原本是什么样,有无数种可能的 xt−1 都能产生这个 xt。就像只知道终点,不知道起点,无法确定路径。
但加了 x0 之后情况就完全不同了:如果我们知道原图 x0(训练时当然知道,因为 xt 就是从它算出来的),就能锁定唯一的"去噪路径"。此时逆向概率 q(xt−1∣xt,x0) 变得可计算。
具体怎么算?
利用贝叶斯公式:
q(xt−1∣xt,x0)=q(xt∣x0)q(xt∣xt−1,x0)⋅q(xt−1∣x0)
看公式右边的三项:
-
q(xt∣xt−1,x0):因为马尔可夫性,给定 xt−1 后,xt 不再依赖 x0,所以等于 q(xt∣xt−1)。这是单步高斯加噪分布:xt=1−βt⋅xt−1+βt⋅ϵ
-
q(xt−1∣x0):从原图 x0 一步到位到 xt−1 的分布。用直达公式:xt−1=αˉt−1⋅x0+1−αˉt−1⋅ϵ,这是高斯分布
-
q(xt∣x0):从原图 x0 一步到位到 xt 的分布。同样用直达公式:xt=αˉt⋅x0+1−αˉt⋅ϵ,这也是高斯分布
[!summary]- 核心差别
第 2 和第 3 项都是从原图 x0 出发的"前向"分布,我们有直达公式可以一步到位计算;而第 1 项是单步加噪,公式也很简单。
这三项都能算,这就是为什么加了 x0 之后整个贝叶斯公式变得可计算——每一项都是已知的高斯分布。
既然三项都是高斯分布,它们的贝叶斯组合仍然是高斯分布。通过代数推导可以得到:
q(xt−1∣xt,x0)=N(μ~t,σ~t2)
其中均值的具体形式是:
μ~t=αt1(xt−1−αˉt1−αt⋅ϵ)
这个公式不需要背,但需要理解每个参数是怎么来的:
[!info]- 公式里的参数
- xt:当前带噪图(已知,这就是我们要处理的图)
- x0:原图(已知,训练时当然知道,因为 xt 就是从它算出来的)
- αt:第 t 步的信号保留比例(预设常数,训练前就设定好了)
- αˉt:累积保留比例(可以预先计算,就是 α1×α2×⋯×αt)
- ϵ:关键!这是从 x0 生成 xt 时加的噪声(可以从第三章的直达公式反算出来:ϵ=1−αˉtxt−αˉt⋅x0)
[!tip]- 核心洞察
公式中只有 ϵ 是"隐藏"的,但它可以通过 xt 和 x0 算出来。
这就是为什么说"要想算出均值,本质上只需要知道噪声 ϵ 是多少"——因为其他所有参数都是公开的预设值,只有噪声是需要推导的。
右边:神经网络预测的分布 pθ(xt−1∣xt) ^neural-prediction
这是神经网络预测的分布——看着带噪图 xt,猜上一张图 xt−1 长什么样。
网络不知道原图 x0,只能通过观察 xt 来推测。它需要预测一个高斯分布 N(μθ,Σθ),但由于 DDPM 的简化(方差固定),实际上只需要预测均值 μθ。
[!info]- 神经网络的输入输出
- 输入:(xt,t) —— 带噪图和时间步
- 输出:预测的均值 μθ(xt,t)
小结 ^chapter-5-summary
KL 散度在衡量:神经网络的预测(pθ)和上帝视角的真实答案(q)有多接近。
训练的目标就是让 μθ 尽可能逼近 μ~t。
第六章:从均值到噪声的蜕变 ^chapter-6
现在我们的任务很明确了:让神经网络预测的均值 μθ,去逼近[[第五章:ELBO 的登场#^god-view-distribution|第五章那个上帝视角的真实均值]] μ~t。
第五章末尾我们注意到一个关键洞察:均值公式的形式揭示了与噪声 ϵ 的直接关系——要想算出均值,本质上只需要知道噪声 ϵ 是多少。
现在深入理解这个洞察:为什么"求均值"等于"减去噪声"?
搞懂符号
先让我们把公式里的零件一个个拆下来。
μθ(xt,t) 是什么?
这是神经网络根据当前满是噪点的图 xt,猜测出来的"上一张稍微清晰点的图 xt−1"的中心位置。
- 为什么要输入 xt?你需要看着当前的图,才能猜上一张图
- 为什么要输入 t?你需要知道现在是第几步。第 1000 步全是噪点很难猜,第 5 步基本看清了只需微调。时间 t 告诉网络噪声的浓度
那 Σθ 呢?
DDPM 论文发现了一个巧妙的事实:方差其实不用训练!前向加噪时每一步的噪声大小 βt 是人为设定的,逆向的不确定性跟它高度相关。
所以作者直接把方差固定成常数,神经网络只需要管好均值就行了。
关键洞察 ^key-insight
现在到了最关键的地方:为什么"求均值"等于"减去噪声"?
请盯着[[第五章:ELBO 的登场#^god-view-distribution|第五章那个上帝视角的均值公式]]看三秒钟:
μ~t=αt1(xt−1−αˉt1−αt⋅ϵ)
- xt:当前的图(已知)
- αt,βt:预设的常数(已知)
- ϵ:这幅图里包含的噪声(未知!)
发现了吗?要想算出均值,本质上只需要知道这幅图里的噪声 ϵ 是多少!
这是一个惊人的发现:神经网络预测均值 μθ,在数学上等价于预测噪声 ϵθ。
于是,神经网络的工作变得很简单:
- 输入:xt(带噪图)
- 任务:告诉我这图里加的噪声 ϵ 长什么样
- 计算:把预测出来的噪声套进公式,算出 xt−1 的均值
- 采样:在均值旁边随机抖一下,就得到了 xt−1
MSE 的诞生 ^mse-birth
现在你应该理解了:虽然理论上我们在拟合一个高斯分布:
pθ=N(μ,Σ)
但在实际代码里,神经网络直接预测噪声 ϵθ,然后用 xt 减去噪声的部分,就得到了去噪后的结果。
复杂的 KL 散度 Loss,最终被简化成了两个噪声向量的均方误差:
Lsimple=∥ϵ−ϵθ(αˉtx0+1−αˉtϵ,t)∥2
- ϵ:训练时生成的真噪声
- ϵθ:神经网络预测的噪声
这个简化太重要了。让我们回顾一下它是怎么来的:
[!summary]- MSE 的诞生过程
- Feller 理论告诉我们:逆向过程是高斯分布
- DDPM 简化告诉我们:方差可以固定,只需求均值
- 贝叶斯推导告诉我们:求均值等价于求噪声
- 最终实现:神经网络看图预测噪声
每一步都自然流畅,每一步都环环相扣。
第七章:生成图片 ^chapter-7
神经网络训练好后(训练过程前面已经讲过),怎么用它生成新图片?
初始状态:从纯噪声开始,xT∼N(0,1)
去噪循环:从 t=T 倒推到 t=1
每一步的更新公式:
xt−1=αt1(xt−1−αˉt1−αt⋅ϵθ(xt,t))+σt⋅z
其中 z∼N(0,1) 是随机噪声(σt 是预设的方差系数)。
[!info]- 完整生成流程
- 初始化:从标准正态分布采样 xT∼N(0,1) 作为起点(纯噪声)
- 逐步去噪:对于 t=T,T−1,...,2,1,每次迭代:
- 把当前带噪图 xt 和时间步 t 输入神经网络
- 网络预测噪声 ϵθ(xt,t)
- 用上面的去噪公式计算 xt−1
- 得到稍微清晰一点的图
- 得到结果:重复 T 次后,最终得到清晰图 x0
直觉理解:
- 网络看当前带噪图 xt,预测里面的噪声 ϵθ
- 从 xt 中减去预测的噪声,得到上一时刻的图 xt−1
- 加一点随机噪声 z(保持生成的多样性)
- 重复 T 次(比如 1000 次),逐步去噪,最终得到清晰图 x0
核心洞察 ^core-insight
[!tip]- 训练和推理的对称性
- 训练时([[第三章:寻找直达公式#^training-data|第三章]]):我们知道 x0,用直达公式生成带噪图 xt,让网络学习预测噪声 ϵ
- 推理时(本章):我们从纯噪声开始,用训练好的网络预测噪声,逐步去除噪声得到清晰图 x0
训练时教网络"加噪是什么样",推理时让网络"把噪声去掉"——这就是扩散模型的优雅之处。
终章:全流程闭环 ^finale
按照 DDPM 论文的逻辑,你现在应该彻底通透了。让我们回顾一下这个完整的故事。
故事脉络
- 起点:想算逆向过程 q(xt−1∣xt),但算不出来
- 方法:用神经网络 pθ 去拟合它
- 手段:最大化 ELBO(变分下界)来训练
- 技巧:引入 x0 作为条件,使得 KL 散度的目标分布 q(xt−1∣xt,x0) 变得可计算
- 化简:把直达公式代入进去,发现拟合分布的均值,本质上就是在拟合噪声
- 结果:Loss 就是预测噪声和真实噪声的 MSE
核心优势 ^core-advantages
这种方法的关键优势在于利用了高斯噪声良好的数学性质,使整个过程的可建模性和可控性大大提高:
- 数学优雅:前向过程有闭式解,可以快速生成训练数据
- 训练稳定:通过能量守恒保持方差稳定
- 推导清晰:从 ELBO 到 MSE 的每一步都有严格的数学推导
- 工程可行:最终简化的 Loss 就是普通的 MSE,易于实现
这就是扩散模型背后的完整故事——从最直观的叠加噪声想法,到引入能量守恒,再到用神经网络拟合逆向过程,最终简化为预测噪声的 MSE Loss,最后落地到训练和推理的具体实现。
每一步都自然流畅,每一步都环环相扣。
[!success]- 最终结论
现在,你应该真正理解了扩散模型的数学之美。
%%hidden
内部备注:
- 可以考虑添加相关笔记链接,如 [[VAE 原理]]、[[GAN 原理]] 等
- 可以添加练习题或思考题
- 可以添加代码实现示例
%%
theme: nico
扩散模型原理:从噪声到图像的数学之旅
想象一下修复照片的过程:起点是一张满是噪点的图片(高斯噪声),终点是一张清晰的照片。你需要找到一条路径,从无意义的噪声一步步变成有意义的图像。
这个故事要从头说起——我们如何让计算机学会这个魔法?
符号说明(查表用)
下面这些符号会在文章中反复出现。不需要记住,遇到不懂的符号时回来查这个表就行了。
图像符号
- x0:原始清晰图片(下标 0 表示第 0 步,也就是没有加过噪声)
- xt:第 t 步的带噪声图片(t 越大,图越模糊)
- xt−1:第 t−1 步的图片,比 xt 稍微清晰一点
- xT:最终第 T 步的图片,全是噪声
概率符号
- q(后∣前):真实的前向或逆向分布(上帝视角,理论上存在但可能算不出来)
- q(xt∣xt−1):前向加噪分布,从 xt−1 到 xt(已知,很好算)
- q(xt−1∣xt):逆向去噪分布,从 xt 到 xt−1(未知,很难算)
- pθ(后∣前):神经网络预测的分布(替身,用来近似真实分布)
- θ:神经网络的参数
- pθ(xt−1∣xt):神经网络预测的逆向分布
噪声符号
- ϵ:标准高斯噪声,ϵ∼N(0,1)
- βt:第 t 步加的噪声强度(人为设定的小常数)
- αt:信号保留比例,定义为 1−βt
- αˉt:累积保留比例,定义为 α1×α2×⋯×αt
直观理解
前向过程(加噪):x0qx1qx2q⋯qxT
逆向过程(去噪):xTpθxT−1pθ⋯pθx0
现在开始我们的故事。
第一章:直觉的陷阱
最直观的想法
假设你想把一张清晰的图片变成噪声。最直观的做法就像撒盐一样,一步步往上叠加噪声。
设 x0 是原图。在每一时刻 t,在上一时刻 xt−1 的基础上加一点噪声 ϵ:
xt=xt−1+β⋅ϵ
其中 ϵ∼N(0,1),β 表示噪声强度。
这个公式描述的是前向过程:从清晰图 xt−1 加噪得到 xt。用概率论的语言,我们把这个加噪过程记作 q(xt∣xt−1) —— 也就是在给定 xt−1 的条件下,xt 的分布。
现在不用纠结这个符号,你只需要知道:q(xt∣xt−1) 就是我们前面写的那个加噪公式。
展开 t 步后:
xt=x0+tβ⋅ϵˉ
其中 ϵˉ 是合并后的噪声。
直觉的崩溃
这个公式有两个致命缺陷。
问题 1:均值漂移
- 均值:E[xt]=x0
- 无论加多少步噪声,图像的均值永远是原图
- 这意味着原图的底色永远消不掉
问题 2:方差爆炸
- 方差:Var(xt)=tβ
- 随着时间 t 增加,方差会趋向于无穷大
- 标准正态分布的方差必须固定为 1
结论:这个模型无法收敛到标准正态分布 N(0,1),它只是造出了一个无限模糊且数值巨大的废图。
第二章:能量守恒的启示
引入衰减系数
为了防止方差爆炸,我们需要引入能量守恒的概念:既然要注入噪声能量(方差),就必须按比例拿走一部分图像能量。
在 xt−1 前面加一个衰减系数。为了保证总方差维持在 1,系数必须满足勾股定理的形式:
xt=1−βt⋅xt−1+βt⋅ϵ
其中 βt∈(0,1) 是一个小的常数,表示每步添加的噪声比例。
为什么这样就对了?
通过这种缩放操作,可以保证 Var(xt)=1(假设 Var(xt−1)=1),无论迭代多少次,数据的方差始终被控制在 1 左右。
这就构成了 Variance Preserving(保方差)的扩散过程。
这个改进后的公式就是我们前向加噪分布 q(xt∣xt−1) 的核心形式。
第三章:寻找直达公式
工程需求
训练神经网络时,我们需要在任意时刻 t 采样带噪图,然后告诉网络:这幅图里加的噪声是什么。这需要一个关键能力:给定原图 x0 和任意时刻 t,直接算出对应的噪声 xt 和噪声 ϵ。
如果只能一步步递推算,我们就不知道当前这幅 xt 里到底加了多少噪声——因为噪声累积了 t 步,每一步的噪声都不同。
所以我们需要一个"直达公式":从 x0 和 t 一步到位算出 xt,这样就能清楚地知道这幅图里包含的噪声 ϵ 是什么。
变量定义
为了书写简洁,定义两个变量:
αt=1−βt
αˉt=∏i=1tαi=α1×α2×⋯×αt
- αt:第 t 步的信号保留比例
- αˉt:累积保留比例(从第 1 步到第 t 步所有 α 的连乘积,读作 Alpha Bar t)
递归推导
通过数学归纳法,推导规律:
- 当 t=1 时:x0 的系数是 α1
- 当 t=2 时:x0 的系数是 α1α2
- 当 t=3 时:系数变成 α1α2α3
规律已经很清晰了,但还需要处理噪声项的合并。
高斯分布的魔力
两个独立高斯分布 N(0,σ12) 和 N(0,σ22) 相加,等于一个新的高斯分布 N(0,σ12+σ22)。
利用这个性质,推导出噪声项可以合并为 1−αˉt⋅ϵˉ 的形式。
DDPM 核心公式
通过数学归纳法,推广到任意时刻 t:
xt=αˉt⋅x0+1−αˉt⋅ϵ=q(xt∣x0)
左边是具体的计算公式,右边是符号表示(在给定原图 x0 的条件下,第 t 步的带噪图 xt 的分布)。
验证收敛
来看看当 t→∞(扩散到最后)时,这个公式会发生什么。
由于 αt<1,连乘积 αˉt 会趋近于 0,因此 xT≈ϵ(纯标准正态分布)。
结论:前向过程完美收敛到标准正态分布 N(0,1)。
训练数据准备
现在我们有了直达公式,就可以准备训练数据了!
给定一张清晰图片 x0,训练样本是这样准备的:
- 随机选时刻 t∈{1,2,...,T}
- 生成噪声 ϵ∼N(0,1)
- 计算带噪图 xt=αˉt⋅x0+1−αˉt⋅ϵ
每个训练样本包含:
- 输入:(xt,t) —— 带噪图和时间步
- 标签:ϵ —— 真实噪声
神经网络的任务:看带噪图 xt 和时间 t,预测这幅图里的噪声 ϵ。
这就为后面的训练做好了准备。
第四章:逆向的困境
问题:能走回去吗?
前三章我们一直在讲前向过程:从清晰图逐步加噪,最后得到 q(xt∣x0) —— 可以直接从原图生成任意时刻的带噪图。
现在的问题是:能不能走回去?
给定一张满是噪点的图 xt,怎么推算出它上一秒稍微清晰一点的样子 xt−1?
用概率论的语言,我们想求的是逆向过程 q(xt−1∣xt) —— 注意,条件反过来了!不再是从 xt−1 到 xt,而是要从 xt 推回 xt−1。
根据贝叶斯公式:
q(xt−1∣xt)=q(xt)q(xt∣xt−1)⋅q(xt−1)
- q(xt∣xt−1):已知(我们前三章推导的单步加噪公式)
- q(xt−1) 和 q(xt):未知!这需要知道全世界所有图片的边缘分布,在数学上是不可计算的
困境:逆向过程算不出来!
解决方案:找个替身
既然算不出真实的 q(xt−1∣xt),我们就训练一个神经网络(参数为 θ)来近似它。我们把这个替身记作 pθ(xt−1∣xt)。
为什么要预测高斯分布?
这里有个关键的直觉:前向过程每次加的噪声极小(βt 很小),就像画画时每一笔只涂抹一点点。那么撤销这一笔的操作,大概率也只是在一个很小的范围内微调。
数学上这叫做 Feller 理论:当扩散步数 T→∞ 且每一步加噪幅度 βt→0 时,前向过程变成了连续的布朗运动。如果前向过程是高斯扩散,逆向过程在数学形式上也必然是一个高斯过程。
所以,神经网络不需要预测整张图 xt−1,只需要预测一个高斯分布。
高斯分布需要什么参数?
一个高斯分布 N(μ,σ2) 由两个参数决定:
- 均值 μ:分布的中心位置
- 方差 σ2:分布的分散程度
理论上,神经网络需要预测这两个值。
DDPM 的简化
但是 DDPM 论文发现了一个事实:方差不需要训练,直接固定成常数(和前向过程的 βt 相关)效果就很好。
因此,神经网络的任务被简化了:
- 不需要预测:方差 Σθ(固定为常数)
- 只需要预测:均值 μθ(xt,t)
这个均值 μθ(xt,t) 代表什么?直觉上理解,它就是神经网络对"上一张图 xt−1 应该长什么样"的猜想的中心点。给定当前噪点图 xt 和时间 t,神经网络告诉我们:往这个方向走,应该能找到更清晰的图。
第五章:ELBO 的登场
目标:让神经网络生成真图
为了让这个神经网络 pθ 能够生成像 x0 这样的真图,我们需要最大化对数似然:logpθ(x0)。
但正如之前所说,直接算这个太难。于是我们引入 ELBO(Evidence Lower Bound,证据下界)。
什么是下界?
这里要用到一个经典的变分推断技巧:引入一个辅助分布 q,在 log 里面玩点数学游戏。
你可能注意到公式里出现了 x1:T 和 x0:T 这种写法,这是一种简写符号:
- x1:T 表示从第 1 步到第 T 步的所有带噪图:x1,x2,...,xT
- x0:T 表示 x0,x1,...,xT
从我们的目标开始:
logpθ(x0)=log∑x1:Tpθ(x0:T)
这个公式的逻辑是:模型生成一张清晰图 x0 的概率,等于它沿着所有可能的去噪路径(从纯噪声 xT 到 x0)推导回来的概率总和。
按照从左到右的顺序:
- log:对概率取对数,将连乘转化为加法,便于优化
- ∑x1:T:对所有可能的中间路径进行边缘化——把所有能产生同一张 x0 的不同路径(x1,x2,...,xT 的各种组合)的概率全部累加
- pθ(x0:T):模型参数为 θ 的联合概率,描述一条完整去噪链路 {xT,xT−1,...,x1,x0} 的发生概率
好比计算"到达山顶的总人数":把从北坡、南坡、西坡等所有路径上山的人数加起来。
现在我们在分数里乘以 q(x1:T∣x0)/q(x1:T∣x0)=1:
logpθ(x0)=log∑x1:Tq(x1:T∣x0)⋅q(x1:T∣x0)pθ(x0:T)
这可以写成期望的形式:
logpθ(x0)=logEq[q(x1:T∣x0)pθ(x0:T)]
关键步骤:利用 Jensen 不等式(log 是凹函数,所以 logE[X]≥E[logX]):
logpθ(x0)≥Eq[logq(x1:T∣x0)pθ(x0:T)]
或者写成更熟悉的形式:
logpθ(x0)≥Eq[logpθ(x0:T)q(x1:T∣x0)]
- 左边是我想最大化的目标(很难算)
- 右边是一个下界(Lower Bound)(相对好算)
策略:如果我们拼命把右边的下界抬高,左边的目标自然也就被顶上去了。
在深度学习里,我们要 minimize Loss,所以我们取负号,变成 Minimize Negative ELBO。
拆解 Loss
把上面那个复杂的式子展开(利用 Markov 链性质),Loss 可以被拆解成三项:
L=LT+Lt−1+L0
LT(正则项):
DKL(q(xT∣x0)∣∣p(xT))
这里的 q(xT∣x0) 是第三章推导的那个直达分布:从原图 x0 出发,经过 T 步前向加噪后得到最终噪声图 xT 的概率分布。
根据第三章的核心公式,这实际上是一个高斯分布:
q(xT∣x0)=N(αˉT⋅x0,1−αˉT)
p(xT) 是标准高斯分布 N(0,1)。这一项比较的是:模型最终生成的噪声分布(q)和标准高斯噪声(p)有多接近。
因为前向过程是锁死的,当 T 足够大时,αˉT→0,所以 q(xT∣x0) 本来就非常接近标准高斯。这一项近似为 0,不用训练。
L0(重构项):
−logpθ(x0∣x1)
最后一步的解码。
Lt−1(去噪核心项):这就是我们要关注的重点!
∑t>1DKL(q(xt−1∣xt,x0)∣∣pθ(xt−1∣xt))
这个 KL 散度在衡量两个分布的距离。
左边:上帝视角的真实分布 q(xt−1∣xt,x0)
这是"给定原图 x0 和当前带噪图 xt 的条件下,上一张稍微清晰点的图 xt−1 的概率分布"。
关键点:多了 x0 这个条件!
为什么这很重要?回顾第四章,q(xt−1∣xt) 算不出来——因为只知道当前带噪图 xt,但不知道它原本是什么样,有无数种可能的 xt−1 都能产生这个 xt。就像只知道终点,不知道起点,无法确定路径。
但加了 x0 之后情况就完全不同了:如果我们知道原图 x0(训练时当然知道,因为 xt 就是从它算出来的),就能锁定唯一的"去噪路径"。此时逆向概率 q(xt−1∣xt,x0) 变得可计算。
**具体怎么算?**利用贝叶斯公式:
q(xt−1∣xt,x0)=q(xt∣x0)q(xt∣xt−1,x0)⋅q(xt−1∣x0)
看公式右边的三项:
-
q(xt∣xt−1,x0):因为马尔可夫性,给定 xt−1 后,xt 不再依赖 x0,所以等于 q(xt∣xt−1)。这是单步高斯加噪分布:xt=1−βt⋅xt−1+βt⋅ϵ
-
q(xt−1∣x0):从原图 x0 一步到位到 xt−1 的分布。用直达公式:xt−1=αˉt−1⋅x0+1−αˉt−1⋅ϵ,这是高斯分布
-
q(xt∣x0):从原图 x0 一步到位到 xt 的分布。同样用直达公式:xt=αˉt⋅x0+1−αˉt⋅ϵ,这也是高斯分布
核心差别:第 2 和第 3 项都是从原图 x0 出发的"前向"分布,我们有直达公式可以一步到位计算;而第 1 项是单步加噪,公式也很简单。
这三项都能算,这就是为什么加了 x0 之后整个贝叶斯公式变得可计算——每一项都是已知的高斯分布。
既然三项都是高斯分布,它们的贝叶斯组合仍然是高斯分布。通过代数推导可以得到:
q(xt−1∣xt,x0)=N(μ~t,σ~t2)
其中均值的具体形式是:
μ~t=αt1(xt−1−αˉt1−αt⋅ϵ)
这个公式不需要背,但需要理解每个参数是怎么来的:
公式里的参数
- xt:当前带噪图(已知,这就是我们要处理的图)
- x0:原图(已知,训练时当然知道,因为 xt 就是从它算出来的)
- αt:第 t 步的信号保留比例(预设常数,训练前就设定好了)
- αˉt:累积保留比例(可以预先计算,就是 α1×α2×⋯×αt)
- ϵ:关键!这是从 x0 生成 xt 时加的噪声(可以从第三章的直达公式反算出来:ϵ=1−αˉtxt−αˉt⋅x0)
核心洞察:公式中只有 ϵ 是"隐藏"的,但它可以通过 xt 和 x0 算出来。
这就是为什么说"要想算出均值,本质上只需要知道噪声 ϵ 是多少"——因为其他所有参数都是公开的预设值,只有噪声是需要推导的。
右边:神经网络预测的分布 pθ(xt−1∣xt)
这是神经网络预测的分布——看着带噪图 xt,猜上一张图 xt−1 长什么样。
网络不知道原图 x0,只能通过观察 xt 来推测。它需要预测一个高斯分布 N(μθ,Σθ),但由于 DDPM 的简化(方差固定),实际上只需要预测均值 μθ。
神经网络的输入输出
- 输入:(xt,t) —— 带噪图和时间步
- 输出:预测的均值 μθ(xt,t)
小结
KL 散度在衡量:神经网络的预测(pθ)和上帝视角的真实答案(q)有多接近。
训练的目标就是让 μθ 尽可能逼近 μ~t。
第六章:从均值到噪声的蜕变
现在我们的任务很明确了:让神经网络预测的均值 μθ,去逼近第五章那个上帝视角的真实均值 μ~t。
第五章末尾我们注意到一个关键洞察:均值公式的形式揭示了与噪声 ϵ 的直接关系——要想算出均值,本质上只需要知道噪声 ϵ 是多少。
现在深入理解这个洞察:为什么"求均值"等于"减去噪声"?
搞懂符号
先让我们把公式里的零件一个个拆下来。
μθ(xt,t) 是什么?
这是神经网络根据当前满是噪点的图 xt,猜测出来的"上一张稍微清晰点的图 xt−1"的中心位置。
- 为什么要输入 xt?你需要看着当前的图,才能猜上一张图
- 为什么要输入 t?你需要知道现在是第几步。第 1000 步全是噪点很难猜,第 5 步基本看清了只需微调。时间 t 告诉网络噪声的浓度
那 Σθ 呢?
DDPM 论文发现了一个巧妙的事实:方差其实不用训练!前向加噪时每一步的噪声大小 βt 是人为设定的,逆向的不确定性跟它高度相关。
所以作者直接把方差固定成常数,神经网络只需要管好均值就行了。
关键洞察
现在到了最关键的地方:为什么"求均值"等于"减去噪声"?
请盯着第五章那个上帝视角的均值公式看三秒钟:
μ~t=αt1(xt−1−αˉt1−αt⋅ϵ)
- xt:当前的图(已知)
- αt,βt:预设的常数(已知)
- ϵ:这幅图里包含的噪声(未知!)
发现了吗?要想算出均值,本质上只需要知道这幅图里的噪声 ϵ 是多少!
这是一个惊人的发现:神经网络预测均值 μθ,在数学上等价于预测噪声 ϵθ。
于是,神经网络的工作变得很简单:
- 输入:xt(带噪图)
- 任务:告诉我这图里加的噪声 ϵ 长什么样
- 计算:把预测出来的噪声套进公式,算出 xt−1 的均值
- 采样:在均值旁边随机抖一下,就得到了 xt−1
MSE 的诞生
现在你应该理解了:虽然理论上我们在拟合一个高斯分布:
pθ=N(μ,Σ)
但在实际代码里,神经网络直接预测噪声 ϵθ,然后用 xt 减去噪声的部分,就得到了去噪后的结果。
复杂的 KL 散度 Loss,最终被简化成了两个噪声向量的均方误差:
Lsimple=∥ϵ−ϵθ(αˉtx0+1−αˉtϵ,t)∥2
- ϵ:训练时生成的真噪声
- ϵθ:神经网络预测的噪声
这个简化太重要了。让我们回顾一下它是怎么来的:
- Feller 理论告诉我们:逆向过程是高斯分布
- DDPM 简化告诉我们:方差可以固定,只需求均值
- 贝叶斯推导告诉我们:求均值等价于求噪声
- 最终实现:神经网络看图预测噪声
每一步都自然流畅,每一步都环环相扣。
第七章:生成图片
神经网络训练好后(训练过程前面已经讲过),怎么用它生成新图片?
初始状态:从纯噪声开始,xT∼N(0,1)
去噪循环:从 t=T 倒推到 t=1
每一步的更新公式:
xt−1=αt1(xt−1−αˉt1−αt⋅ϵθ(xt,t))+σt⋅z
其中 z∼N(0,1) 是随机噪声(σt 是预设的方差系数)。
完整生成流程:
-
初始化:从标准正态分布采样 xT∼N(0,1) 作为起点(纯噪声)
-
逐步去噪:对于 t=T,T−1,...,2,1,每次迭代:
- 把当前带噪图 xt 和时间步 t 输入神经网络
- 网络预测噪声 ϵθ(xt,t)
- 用上面的去噪公式计算 xt−1
- 得到稍微清晰一点的图
-
得到结果:重复 T 次后,最终得到清晰图 x0
直觉理解:
- 网络看当前带噪图 xt,预测里面的噪声 ϵθ
- 从 xt 中减去预测的噪声,得到上一时刻的图 xt−1
- 加一点随机噪声 z(保持生成的多样性)
- 重复 T 次(比如 1000 次),逐步去噪,最终得到清晰图 x0
核心洞察
训练和推理的对称性:
- 训练时(第三章):我们知道 x0,用直达公式生成带噪图 xt,让网络学习预测噪声 ϵ
- 推理时(本章):我们从纯噪声开始,用训练好的网络预测噪声,逐步去除噪声得到清晰图 x0
训练时教网络"加噪是什么样",推理时让网络"把噪声去掉"——这就是扩散模型的优雅之处。
终章:全流程闭环
按照 DDPM 论文的逻辑,你现在应该彻底通透了。让我们回顾一下这个完整的故事。
故事脉络
- 起点:想算逆向过程 q(xt−1∣xt),但算不出来
- 方法:用神经网络 pθ 去拟合它
- 手段:最大化 ELBO(变分下界)来训练
- 技巧:引入 x0 作为条件,使得 KL 散度的目标分布 q(xt−1∣xt,x0) 变得可计算
- 化简:把直达公式代入进去,发现拟合分布的均值,本质上就是在拟合噪声
- 结果:Loss 就是预测噪声和真实噪声的 MSE
核心优势
这种方法的关键优势在于利用了高斯噪声良好的数学性质,使整个过程的可建模性和可控性大大提高:
- 数学优雅:前向过程有闭式解,可以快速生成训练数据
- 训练稳定:通过能量守恒保持方差稳定
- 推导清晰:从 ELBO 到 MSE 的每一步都有严格的数学推导
- 工程可行:最终简化的 Loss 就是普通的 MSE,易于实现
这就是扩散模型背后的完整故事——从最直观的叠加噪声想法,到引入能量守恒,再到用神经网络拟合逆向过程,最终简化为预测噪声的 MSE Loss,最后落地到训练和推理的具体实现。
每一步都自然流畅,每一步都环环相扣。
现在,你应该真正理解了扩散模型的数学之美。
title: 扩散模型原理:从噪声到图像的数学之旅
category: 深度学习
tags:
- 扩散模型
- DDPM
- 机器学习
- 数学推导
status: 已完成
difficulty: 进阶
created: 2024-01-21T00:00:00.000Z
aliases:
- DDPM 原理
- Denoising Diffusion Probabilistic Models
cssclasses:
- math-document
theme: healer-readable
扩散模型原理:从噪声到图像的数学之旅
想象一下修复照片的过程:起点是一张满是噪点的图片(高斯噪声),终点是一张清晰的照片。你需要找到一条路径,从无意义的噪声一步步变成有意义的图像。
这个故事要从头说起——我们如何让计算机学会这个魔法?
符号说明(查表用) ^symbol-table
下面这些符号会在文章中反复出现。不需要记住,遇到不懂的符号时回来查这个表就行了。
[!info] 图像符号
- x0:原始清晰图片(下标 0 表示第 0 步,也就是没有加过噪声)
- xt:第 t 步的带噪声图片(t 越大,图越模糊)
- xt−1:第 t−1 步的图片,比 xt 稍微清晰一点
- xT:最终第 T 步的图片,全是噪声
[!info] 概率符号
- q(后∣前):真实的前向或逆向分布(上帝视角,理论上存在但可能算不出来)
- q(xt∣xt−1):前向加噪分布,从 xt−1 到 xt(已知,很好算)
- q(xt−1∣xt):逆向去噪分布,从 xt 到 xt−1(未知,很难算)
- pθ(后∣前):神经网络预测的分布(替身,用来近似真实分布)
- θ:神经网络的参数
- pθ(xt−1∣xt):神经网络预测的逆向分布
[!info] 噪声符号
- ϵ:标准高斯噪声,ϵ∼N(0,1)
- βt:第 t 步加的噪声强度(人为设定的小常数)
- αt:信号保留比例,定义为 1−βt
- αˉt:累积保留比例,定义为 α1×α2×⋯×αt
直观理解
前向过程(加噪):x0qx1qx2q⋯qxT
逆向过程(去噪):xTpθxT−1pθ⋯pθx0
现在开始我们的故事。
第一章:直觉的陷阱 ^chapter-1
最直观的想法
假设你想把一张清晰的图片变成噪声。最直观的做法就像撒盐一样,一步步往上叠加噪声。
设 x0 是原图。在每一时刻 t,在上一时刻 xt−1 的基础上加一点噪声 ϵ:
xt=xt−1+β⋅ϵ
其中 ϵ∼N(0,1),β 表示噪声强度。
这个公式描述的是前向过程:从清晰图 xt−1 加噪得到 xt。用概率论的语言,我们把这个加噪过程记作 q(xt∣xt−1) —— 也就是在给定 xt−1 的条件下,xt 的分布。
现在不用纠结这个符号,你只需要知道:q(xt∣xt−1) 就是我们前面写的那个加噪公式。
展开 t 步后:
xt=x0+tβ⋅ϵˉ
其中 ϵˉ 是合并后的噪声。
直觉的崩溃
这个公式有两个致命缺陷。
[!warning]- 问题 1:均值漂移
- 均值:E[xt]=x0
- 无论加多少步噪声,图像的均值永远是原图
- 这意味着原图的底色永远消不掉
[!warning]- 问题 2:方差爆炸
- 方差:Var(xt)=tβ
- 随着时间 t 增加,方差会趋向于无穷大
- 标准正态分布的方差必须固定为 1
[!failure]- 结论
这个模型无法收敛到标准正态分布 N(0,1),它只是造出了一个无限模糊且数值巨大的废图。
第二章:能量守恒的启示 ^chapter-2
引入衰减系数
为了防止方差爆炸,我们需要引入能量守恒的概念:既然要注入噪声能量(方差),就必须按比例拿走一部分图像能量。
在 xt−1 前面加一个衰减系数。为了保证总方差维持在 1,系数必须满足勾股定理的形式:
xt=1−βt⋅xt−1+βt⋅ϵ
其中 βt∈(0,1) 是一个小的常数,表示每步添加的噪声比例。
为什么这样就对了?
通过这种缩放操作,可以保证 Var(xt)=1(假设 Var(xt−1)=1),无论迭代多少次,数据的方差始终被控制在 1 左右。
这就构成了 Variance Preserving(保方差)的扩散过程。
这个改进后的公式就是我们前向加噪分布 q(xt∣xt−1) 的核心形式。
第三章:寻找直达公式 ^chapter-3
工程需求
训练神经网络时,我们需要在任意时刻 t 采样带噪图,然后告诉网络:这幅图里加的噪声是什么。这需要一个关键能力:给定原图 x0 和任意时刻 t,直接算出对应的噪声 xt 和噪声 ϵ。
如果只能一步步递推算,我们就不知道当前这幅 xt 里到底加了多少噪声——因为噪声累积了 t 步,每一步的噪声都不同。
所以我们需要一个"直达公式":从 x0 和 t 一步到位算出 xt,这样就能清楚地知道这幅图里包含的噪声 ϵ 是什么。
变量定义
为了书写简洁,定义两个变量:
αt=1−βt
αˉt=∏i=1tαi=α1×α2×⋯×αt
- αt:第 t 步的信号保留比例
- αˉt:累积保留比例(从第 1 步到第 t 步所有 α 的连乘积,读作 Alpha Bar t)
递归推导
通过数学归纳法,推导规律:
- 当 t=1 时:x0 的系数是 α1
- 当 t=2 时:x0 的系数是 α1α2
- 当 t=3 时:系数变成 α1α2α3
规律已经很清晰了,但还需要处理噪声项的合并。
高斯分布的魔力
两个独立高斯分布 N(0,σ12) 和 N(0,σ22) 相加,等于一个新的高斯分布 N(0,σ12+σ22)。
利用这个性质,推导出噪声项可以合并为 1−αˉt⋅ϵˉ 的形式。
DDPM 核心公式 ^ddpm-core-formula
通过数学归纳法,推广到任意时刻 t:
xt=αˉt⋅x0+1−αˉt⋅ϵ=q(xt∣x0)
左边是具体的计算公式,右边是符号表示(在给定原图 x0 的条件下,第 t 步的带噪图 xt 的分布)。
验证收敛
来看看当 t→∞(扩散到最后)时,这个公式会发生什么。
由于 αt<1,连乘积 αˉt 会趋近于 0,因此 xT≈ϵ(纯标准正态分布)。
[!success]- 结论
前向过程完美收敛到标准正态分布 N(0,1)。
训练数据准备 ^training-data
现在我们有了直达公式,就可以准备训练数据了!
给定一张清晰图片 x0,训练样本是这样准备的:
- 随机选时刻 t∈{1,2,...,T}
- 生成噪声 ϵ∼N(0,1)
- 计算带噪图 xt=αˉt⋅x0+1−αˉt⋅ϵ
每个训练样本包含:
- 输入:(xt,t) —— 带噪图和时间步
- 标签:ϵ —— 真实噪声
神经网络的任务:看带噪图 xt 和时间 t,预测这幅图里的噪声 ϵ。
这就为后面的训练做好了准备。
第四章:逆向的困境 ^chapter-4
问题:能走回去吗?
前三章我们一直在讲前向过程:从清晰图逐步加噪,最后得到 q(xt∣x0) —— 可以直接从原图生成任意时刻的带噪图。
现在的问题是:能不能走回去?
给定一张满是噪点的图 xt,怎么推算出它上一秒稍微清晰一点的样子 xt−1?
用概率论的语言,我们想求的是逆向过程 q(xt−1∣xt) —— 注意,条件反过来了!不再是从 xt−1 到 xt,而是要从 xt 推回 xt−1。
根据贝叶斯公式:
q(xt−1∣xt)=q(xt)q(xt∣xt−1)⋅q(xt−1)
- q(xt∣xt−1):已知(我们前三章推导的单步加噪公式)
- q(xt−1) 和 q(xt):未知!这需要知道全世界所有图片的边缘分布,在数学上是不可计算的
[!failure]- 困境
逆向过程算不出来!
解决方案:找个替身
既然算不出真实的 q(xt−1∣xt),我们就训练一个神经网络(参数为 θ)来近似它。我们把这个替身记作 pθ(xt−1∣xt)。
[!faq]- 为什么要预测高斯分布?
这里有个关键的直觉:前向过程每次加的噪声极小(βt 很小),就像画画时每一笔只涂抹一点点。那么撤销这一笔的操作,大概率也只是在一个很小的范围内微调。
数学上这叫做 Feller 理论:当扩散步数 T→∞ 且每一步加噪幅度 βt→0 时,前向过程变成了连续的布朗运动。如果前向过程是高斯扩散,逆向过程在数学形式上也必然是一个高斯过程。
所以,神经网络不需要预测整张图 xt−1,只需要预测一个高斯分布。
[!info]- 高斯分布需要什么参数?
一个高斯分布 N(μ,σ2) 由两个参数决定:
- 均值 μ:分布的中心位置
- 方差 σ2:分布的分散程度
理论上,神经网络需要预测这两个值。
[!tip]- DDPM 的简化
但是 DDPM 论文发现了一个事实:方差不需要训练,直接固定成常数(和前向过程的 βt 相关)效果就很好。
因此,神经网络的任务被简化了:
- 不需要预测:方差 Σθ(固定为常数)
- 只需要预测:均值 μθ(xt,t)
这个均值 μθ(xt,t) 代表什么?直觉上理解,它就是神经网络对"上一张图 xt−1 应该长什么样"的猜想的中心点。给定当前噪点图 xt 和时间 t,神经网络告诉我们:往这个方向走,应该能找到更清晰的图。
第五章:ELBO 的登场 ^chapter-5
目标:让神经网络生成真图
为了让这个神经网络 pθ 能够生成像 x0 这样的真图,我们需要最大化对数似然:logpθ(x0)。
但正如之前所说,直接算这个太难。于是我们引入 ELBO(Evidence Lower Bound,证据下界)。
什么是下界?
这里要用到一个经典的变分推断技巧:引入一个辅助分布 q,在 log 里面玩点数学游戏。
你可能注意到公式里出现了 x1:T 和 x0:T 这种写法,这是一种简写符号:
- x1:T 表示从第 1 步到第 T 步的所有带噪图:x1,x2,...,xT
- x0:T 表示 x0,x1,...,xT
从我们的目标开始:
logpθ(x0)=log∑x1:Tpθ(x0:T)
这个公式的逻辑是:模型生成一张清晰图 x0 的概率,等于它沿着所有可能的去噪路径(从纯噪声 xT 到 x0)推导回来的概率总和。
按照从左到右的顺序:
- log:对概率取对数,将连乘转化为加法,便于优化
- ∑x1:T:对所有可能的中间路径进行边缘化——把所有能产生同一张 x0 的不同路径(x1,x2,...,xT 的各种组合)的概率全部累加
- pθ(x0:T):模型参数为 θ 的联合概率,描述一条完整去噪链路 {xT,xT−1,...,x1,x0} 的发生概率
好比计算"到达山顶的总人数":把从北坡、南坡、西坡等所有路径上山的人数加起来。
现在我们在分数里乘以 q(x1:T∣x0)/q(x1:T∣x0)=1:
logpθ(x0)=log∑x1:Tq(x1:T∣x0)⋅q(x1:T∣x0)pθ(x0:T)
这可以写成期望的形式:
logpθ(x0)=logEq[q(x1:T∣x0)pθ(x0:T)]
关键步骤:利用 Jensen 不等式(log 是凹函数,所以 logE[X]≥E[logX]):
logpθ(x0)≥Eq[logq(x1:T∣x0)pθ(x0:T)]
或者写成更熟悉的形式:
logpθ(x0)≥Eq[logpθ(x0:T)q(x1:T∣x0)]
- 左边是我想最大化的目标(很难算)
- 右边是一个下界(Lower Bound)(相对好算)
策略:如果我们拼命把右边的下界抬高,左边的目标自然也就被顶上去了。
在深度学习里,我们要 minimize Loss,所以我们取负号,变成 Minimize Negative ELBO。
拆解 Loss ^loss-decomposition
把上面那个复杂的式子展开(利用 Markov 链性质),Loss 可以被拆解成三项:
L=LT+Lt−1+L0
[!info]- LT(正则项)
DKL(q(xT∣x0)∣∣p(xT))
这里的 q(xT∣x0) 是[[第三章:寻找直达公式#^ddpm-core-formula|第三章推导的那个直达分布]]:从原图 x0 出发,经过 T 步前向加噪后得到最终噪声图 xT 的概率分布。
根据第三章的核心公式,这实际上是一个高斯分布:
q(xT∣x0)=N(αˉT⋅x0,1−αˉT)
p(xT) 是标准高斯分布 N(0,1)。这一项比较的是:模型最终生成的噪声分布(q)和标准高斯噪声(p)有多接近。
因为前向过程是锁死的,当 T 足够大时,αˉT→0,所以 q(xT∣x0) 本来就非常接近标准高斯。这一项近似为 0,不用训练。
[!info]- L0(重构项)
−logpθ(x0∣x1)
最后一步的解码。
[!important]- Lt−1(去噪核心项)
∑t>1DKL(q(xt−1∣xt,x0)∣∣pθ(xt−1∣xt))
这个 KL 散度在衡量两个分布的距离。
左边:上帝视角的真实分布 q(xt−1∣xt,x0) ^god-view-distribution
这是"给定原图 x0 和当前带噪图 xt 的条件下,上一张稍微清晰点的图 xt−1 的概率分布"。
[!tip]- 关键点
多了 x0 这个条件!
为什么这很重要?回顾[[第四章:逆向的困境#^chapter-4|第四章]],q(xt−1∣xt) 算不出来——因为只知道当前带噪图 xt,但不知道它原本是什么样,有无数种可能的 xt−1 都能产生这个 xt。就像只知道终点,不知道起点,无法确定路径。
但加了 x0 之后情况就完全不同了:如果我们知道原图 x0(训练时当然知道,因为 xt 就是从它算出来的),就能锁定唯一的"去噪路径"。此时逆向概率 q(xt−1∣xt,x0) 变得可计算。
具体怎么算?
利用贝叶斯公式:
q(xt−1∣xt,x0)=q(xt∣x0)q(xt∣xt−1,x0)⋅q(xt−1∣x0)
看公式右边的三项:
-
q(xt∣xt−1,x0):因为马尔可夫性,给定 xt−1 后,xt 不再依赖 x0,所以等于 q(xt∣xt−1)。这是单步高斯加噪分布:xt=1−βt⋅xt−1+βt⋅ϵ
-
q(xt−1∣x0):从原图 x0 一步到位到 xt−1 的分布。用直达公式:xt−1=αˉt−1⋅x0+1−αˉt−1⋅ϵ,这是高斯分布
-
q(xt∣x0):从原图 x0 一步到位到 xt 的分布。同样用直达公式:xt=αˉt⋅x0+1−αˉt⋅ϵ,这也是高斯分布
[!summary]- 核心差别
第 2 和第 3 项都是从原图 x0 出发的"前向"分布,我们有直达公式可以一步到位计算;而第 1 项是单步加噪,公式也很简单。
这三项都能算,这就是为什么加了 x0 之后整个贝叶斯公式变得可计算——每一项都是已知的高斯分布。
既然三项都是高斯分布,它们的贝叶斯组合仍然是高斯分布。通过代数推导可以得到:
q(xt−1∣xt,x0)=N(μ~t,σ~t2)
其中均值的具体形式是:
μ~t=αt1(xt−1−αˉt1−αt⋅ϵ)
这个公式不需要背,但需要理解每个参数是怎么来的:
[!info]- 公式里的参数
- xt:当前带噪图(已知,这就是我们要处理的图)
- x0:原图(已知,训练时当然知道,因为 xt 就是从它算出来的)
- αt:第 t 步的信号保留比例(预设常数,训练前就设定好了)
- αˉt:累积保留比例(可以预先计算,就是 α1×α2×⋯×αt)
- ϵ:关键!这是从 x0 生成 xt 时加的噪声(可以从第三章的直达公式反算出来:ϵ=1−αˉtxt−αˉt⋅x0)
[!tip]- 核心洞察
公式中只有 ϵ 是"隐藏"的,但它可以通过 xt 和 x0 算出来。
这就是为什么说"要想算出均值,本质上只需要知道噪声 ϵ 是多少"——因为其他所有参数都是公开的预设值,只有噪声是需要推导的。
右边:神经网络预测的分布 pθ(xt−1∣xt) ^neural-prediction
这是神经网络预测的分布——看着带噪图 xt,猜上一张图 xt−1 长什么样。
网络不知道原图 x0,只能通过观察 xt 来推测。它需要预测一个高斯分布 N(μθ,Σθ),但由于 DDPM 的简化(方差固定),实际上只需要预测均值 μθ。
[!info]- 神经网络的输入输出
- 输入:(xt,t) —— 带噪图和时间步
- 输出:预测的均值 μθ(xt,t)
小结 ^chapter-5-summary
KL 散度在衡量:神经网络的预测(pθ)和上帝视角的真实答案(q)有多接近。
训练的目标就是让 μθ 尽可能逼近 μ~t。
第六章:从均值到噪声的蜕变 ^chapter-6
现在我们的任务很明确了:让神经网络预测的均值 μθ,去逼近[[第五章:ELBO 的登场#^god-view-distribution|第五章那个上帝视角的真实均值]] μ~t。
第五章末尾我们注意到一个关键洞察:均值公式的形式揭示了与噪声 ϵ 的直接关系——要想算出均值,本质上只需要知道噪声 ϵ 是多少。
现在深入理解这个洞察:为什么"求均值"等于"减去噪声"?
搞懂符号
先让我们把公式里的零件一个个拆下来。
μθ(xt,t) 是什么?
这是神经网络根据当前满是噪点的图 xt,猜测出来的"上一张稍微清晰点的图 xt−1"的中心位置。
- 为什么要输入 xt?你需要看着当前的图,才能猜上一张图
- 为什么要输入 t?你需要知道现在是第几步。第 1000 步全是噪点很难猜,第 5 步基本看清了只需微调。时间 t 告诉网络噪声的浓度
那 Σθ 呢?
DDPM 论文发现了一个巧妙的事实:方差其实不用训练!前向加噪时每一步的噪声大小 βt 是人为设定的,逆向的不确定性跟它高度相关。
所以作者直接把方差固定成常数,神经网络只需要管好均值就行了。
关键洞察 ^key-insight
现在到了最关键的地方:为什么"求均值"等于"减去噪声"?
请盯着[[第五章:ELBO 的登场#^god-view-distribution|第五章那个上帝视角的均值公式]]看三秒钟:
μ~t=αt1(xt−1−αˉt1−αt⋅ϵ)
- xt:当前的图(已知)
- αt,βt:预设的常数(已知)
- ϵ:这幅图里包含的噪声(未知!)
发现了吗?要想算出均值,本质上只需要知道这幅图里的噪声 ϵ 是多少!
这是一个惊人的发现:神经网络预测均值 μθ,在数学上等价于预测噪声 ϵθ。
于是,神经网络的工作变得很简单:
- 输入:xt(带噪图)
- 任务:告诉我这图里加的噪声 ϵ 长什么样
- 计算:把预测出来的噪声套进公式,算出 xt−1 的均值
- 采样:在均值旁边随机抖一下,就得到了 xt−1
MSE 的诞生 ^mse-birth
现在你应该理解了:虽然理论上我们在拟合一个高斯分布:
pθ=N(μ,Σ)
但在实际代码里,神经网络直接预测噪声 ϵθ,然后用 xt 减去噪声的部分,就得到了去噪后的结果。
复杂的 KL 散度 Loss,最终被简化成了两个噪声向量的均方误差:
Lsimple=∥ϵ−ϵθ(αˉtx0+1−αˉtϵ,t)∥2
- ϵ:训练时生成的真噪声
- ϵθ:神经网络预测的噪声
这个简化太重要了。让我们回顾一下它是怎么来的:
[!summary]- MSE 的诞生过程
- Feller 理论告诉我们:逆向过程是高斯分布
- DDPM 简化告诉我们:方差可以固定,只需求均值
- 贝叶斯推导告诉我们:求均值等价于求噪声
- 最终实现:神经网络看图预测噪声
每一步都自然流畅,每一步都环环相扣。
第七章:生成图片 ^chapter-7
神经网络训练好后(训练过程前面已经讲过),怎么用它生成新图片?
初始状态:从纯噪声开始,xT∼N(0,1)
去噪循环:从 t=T 倒推到 t=1
每一步的更新公式:
xt−1=αt1(xt−1−αˉt1−αt⋅ϵθ(xt,t))+σt⋅z
其中 z∼N(0,1) 是随机噪声(σt 是预设的方差系数)。
[!info]- 完整生成流程
- 初始化:从标准正态分布采样 xT∼N(0,1) 作为起点(纯噪声)
- 逐步去噪:对于 t=T,T−1,...,2,1,每次迭代:
- 把当前带噪图 xt 和时间步 t 输入神经网络
- 网络预测噪声 ϵθ(xt,t)
- 用上面的去噪公式计算 xt−1
- 得到稍微清晰一点的图
- 得到结果:重复 T 次后,最终得到清晰图 x0
直觉理解:
- 网络看当前带噪图 xt,预测里面的噪声 ϵθ
- 从 xt 中减去预测的噪声,得到上一时刻的图 xt−1
- 加一点随机噪声 z(保持生成的多样性)
- 重复 T 次(比如 1000 次),逐步去噪,最终得到清晰图 x0
核心洞察 ^core-insight
[!tip]- 训练和推理的对称性
- 训练时([[第三章:寻找直达公式#^training-data|第三章]]):我们知道 x0,用直达公式生成带噪图 xt,让网络学习预测噪声 ϵ
- 推理时(本章):我们从纯噪声开始,用训练好的网络预测噪声,逐步去除噪声得到清晰图 x0
训练时教网络"加噪是什么样",推理时让网络"把噪声去掉"——这就是扩散模型的优雅之处。
终章:全流程闭环 ^finale
按照 DDPM 论文的逻辑,你现在应该彻底通透了。让我们回顾一下这个完整的故事。
故事脉络
- 起点:想算逆向过程 q(xt−1∣xt),但算不出来
- 方法:用神经网络 pθ 去拟合它
- 手段:最大化 ELBO(变分下界)来训练
- 技巧:引入 x0 作为条件,使得 KL 散度的目标分布 q(xt−1∣xt,x0) 变得可计算
- 化简:把直达公式代入进去,发现拟合分布的均值,本质上就是在拟合噪声
- 结果:Loss 就是预测噪声和真实噪声的 MSE
核心优势 ^core-advantages
这种方法的关键优势在于利用了高斯噪声良好的数学性质,使整个过程的可建模性和可控性大大提高:
- 数学优雅:前向过程有闭式解,可以快速生成训练数据
- 训练稳定:通过能量守恒保持方差稳定
- 推导清晰:从 ELBO 到 MSE 的每一步都有严格的数学推导
- 工程可行:最终简化的 Loss 就是普通的 MSE,易于实现
这就是扩散模型背后的完整故事——从最直观的叠加噪声想法,到引入能量守恒,再到用神经网络拟合逆向过程,最终简化为预测噪声的 MSE Loss,最后落地到训练和推理的具体实现。
每一步都自然流畅,每一步都环环相扣。
[!success]- 最终结论
现在,你应该真正理解了扩散模型的数学之美。
%%hidden
内部备注:
- 可以考虑添加相关笔记链接,如 [[VAE 原理]]、[[GAN 原理]] 等
- 可以添加练习题或思考题
- 可以添加代码实现示例
%%
扩散模型原理:从噪声到图像的数学之旅
想象一下修复照片的过程:起点是一张满是噪点的图片(高斯噪声),终点是一张清晰的照片。你需要找到一条路径,从无意义的噪声一步步变成有意义的图像。
这个故事要从头说起——我们如何让计算机学会这个魔法?
符号说明(查表用)
下面这些符号会在文章中反复出现。不需要记住,遇到不懂的符号时回来查这个表就行了。
图像符号
- x0:原始清晰图片(下标 0 表示第 0 步,也就是没有加过噪声)
- xt:第 t 步的带噪声图片(t 越大,图越模糊)
- xt−1:第 t−1 步的图片,比 xt 稍微清晰一点
- xT:最终第 T 步的图片,全是噪声
概率符号
- q(后∣前):真实的前向或逆向分布(上帝视角,理论上存在但可能算不出来)
- q(xt∣xt−1):前向加噪分布,从 xt−1 到 xt(已知,很好算)
- q(xt−1∣xt):逆向去噪分布,从 xt 到 xt−1(未知,很难算)
- pθ(后∣前):神经网络预测的分布(替身,用来近似真实分布)
- θ:神经网络的参数
- pθ(xt−1∣xt):神经网络预测的逆向分布
噪声符号
- ϵ:标准高斯噪声,ϵ∼N(0,1)
- βt:第 t 步加的噪声强度(人为设定的小常数)
- αt:信号保留比例,定义为 1−βt
- αˉt:累积保留比例,定义为 α1×α2×⋯×αt
直观理解
前向过程(加噪):x0qx1qx2q⋯qxT
逆向过程(去噪):xTpθxT−1pθ⋯pθx0
现在开始我们的故事。
第一章:直觉的陷阱
最直观的想法
假设你想把一张清晰的图片变成噪声。最直观的做法就像撒盐一样,一步步往上叠加噪声。
设 x0 是原图。在每一时刻 t,在上一时刻 xt−1 的基础上加一点噪声 ϵ:
xt=xt−1+β⋅ϵ
其中 ϵ∼N(0,1),β 表示噪声强度。
这个公式描述的是前向过程:从清晰图 xt−1 加噪得到 xt。用概率论的语言,我们把这个加噪过程记作 q(xt∣xt−1) —— 也就是在给定 xt−1 的条件下,xt 的分布。
现在不用纠结这个符号,你只需要知道:q(xt∣xt−1) 就是我们前面写的那个加噪公式。
展开 t 步后:
xt=x0+tβ⋅ϵˉ
其中 ϵˉ 是合并后的噪声。
直觉的崩溃
这个公式有两个致命缺陷。
问题 1:均值漂移
- 均值:E[xt]=x0
- 无论加多少步噪声,图像的均值永远是原图
- 这意味着原图的底色永远消不掉
问题 2:方差爆炸
- 方差:Var(xt)=tβ
- 随着时间 t 增加,方差会趋向于无穷大
- 标准正态分布的方差必须固定为 1
结论:这个模型无法收敛到标准正态分布 N(0,1),它只是造出了一个无限模糊且数值巨大的废图。
第二章:能量守恒的启示
引入衰减系数
为了防止方差爆炸,我们需要引入能量守恒的概念:既然要注入噪声能量(方差),就必须按比例拿走一部分图像能量。
在 xt−1 前面加一个衰减系数。为了保证总方差维持在 1,系数必须满足勾股定理的形式:
xt=1−βt⋅xt−1+βt⋅ϵ
其中 βt∈(0,1) 是一个小的常数,表示每步添加的噪声比例。
为什么这样就对了?
通过这种缩放操作,可以保证 Var(xt)=1(假设 Var(xt−1)=1),无论迭代多少次,数据的方差始终被控制在 1 左右。
这就构成了 Variance Preserving(保方差)的扩散过程。
这个改进后的公式就是我们前向加噪分布 q(xt∣xt−1) 的核心形式。
第三章:寻找直达公式
工程需求
训练神经网络时,我们需要在任意时刻 t 采样带噪图,然后告诉网络:这幅图里加的噪声是什么。这需要一个关键能力:给定原图 x0 和任意时刻 t,直接算出对应的噪声 xt 和噪声 ϵ。
如果只能一步步递推算,我们就不知道当前这幅 xt 里到底加了多少噪声——因为噪声累积了 t 步,每一步的噪声都不同。
所以我们需要一个"直达公式":从 x0 和 t 一步到位算出 xt,这样就能清楚地知道这幅图里包含的噪声 ϵ 是什么。
变量定义
为了书写简洁,定义两个变量:
αt=1−βt
αˉt=∏i=1tαi=α1×α2×⋯×αt
- αt:第 t 步的信号保留比例
- αˉt:累积保留比例(从第 1 步到第 t 步所有 α 的连乘积,读作 Alpha Bar t)
递归推导
通过数学归纳法,推导规律:
- 当 t=1 时:x0 的系数是 α1
- 当 t=2 时:x0 的系数是 α1α2
- 当 t=3 时:系数变成 α1α2α3
规律已经很清晰了,但还需要处理噪声项的合并。
高斯分布的魔力
两个独立高斯分布 N(0,σ12) 和 N(0,σ22) 相加,等于一个新的高斯分布 N(0,σ12+σ22)。
利用这个性质,推导出噪声项可以合并为 1−αˉt⋅ϵˉ 的形式。
DDPM 核心公式
通过数学归纳法,推广到任意时刻 t:
xt=αˉt⋅x0+1−αˉt⋅ϵ=q(xt∣x0)
左边是具体的计算公式,右边是符号表示(在给定原图 x0 的条件下,第 t 步的带噪图 xt 的分布)。
验证收敛
来看看当 t→∞(扩散到最后)时,这个公式会发生什么。
由于 αt<1,连乘积 αˉt 会趋近于 0,因此 xT≈ϵ(纯标准正态分布)。
结论:前向过程完美收敛到标准正态分布 N(0,1)。
训练数据准备
现在我们有了直达公式,就可以准备训练数据了!
给定一张清晰图片 x0,训练样本是这样准备的:
- 随机选时刻 t∈{1,2,...,T}
- 生成噪声 ϵ∼N(0,1)
- 计算带噪图 xt=αˉt⋅x0+1−αˉt⋅ϵ
每个训练样本包含:
- 输入:(xt,t) —— 带噪图和时间步
- 标签:ϵ —— 真实噪声
神经网络的任务:看带噪图 xt 和时间 t,预测这幅图里的噪声 ϵ。
这就为后面的训练做好了准备。
第四章:逆向的困境
问题:能走回去吗?
前三章我们一直在讲前向过程:从清晰图逐步加噪,最后得到 q(xt∣x0) —— 可以直接从原图生成任意时刻的带噪图。
现在的问题是:能不能走回去?
给定一张满是噪点的图 xt,怎么推算出它上一秒稍微清晰一点的样子 xt−1?
用概率论的语言,我们想求的是逆向过程 q(xt−1∣xt) —— 注意,条件反过来了!不再是从 xt−1 到 xt,而是要从 xt 推回 xt−1。
根据贝叶斯公式:
q(xt−1∣xt)=q(xt)q(xt∣xt−1)⋅q(xt−1)
- q(xt∣xt−1):已知(我们前三章推导的单步加噪公式)
- q(xt−1) 和 q(xt):未知!这需要知道全世界所有图片的边缘分布,在数学上是不可计算的
困境:逆向过程算不出来!
解决方案:找个替身
既然算不出真实的 q(xt−1∣xt),我们就训练一个神经网络(参数为 θ)来近似它。我们把这个替身记作 pθ(xt−1∣xt)。
为什么要预测高斯分布?
这里有个关键的直觉:前向过程每次加的噪声极小(βt 很小),就像画画时每一笔只涂抹一点点。那么撤销这一笔的操作,大概率也只是在一个很小的范围内微调。
数学上这叫做 Feller 理论:当扩散步数 T→∞ 且每一步加噪幅度 βt→0 时,前向过程变成了连续的布朗运动。如果前向过程是高斯扩散,逆向过程在数学形式上也必然是一个高斯过程。
所以,神经网络不需要预测整张图 xt−1,只需要预测一个高斯分布。
高斯分布需要什么参数?
一个高斯分布 N(μ,σ2) 由两个参数决定:
- 均值 μ:分布的中心位置
- 方差 σ2:分布的分散程度
理论上,神经网络需要预测这两个值。
DDPM 的简化
但是 DDPM 论文发现了一个事实:方差不需要训练,直接固定成常数(和前向过程的 βt 相关)效果就很好。
因此,神经网络的任务被简化了:
- 不需要预测:方差 Σθ(固定为常数)
- 只需要预测:均值 μθ(xt,t)
这个均值 μθ(xt,t) 代表什么?直觉上理解,它就是神经网络对"上一张图 xt−1 应该长什么样"的猜想的中心点。给定当前噪点图 xt 和时间 t,神经网络告诉我们:往这个方向走,应该能找到更清晰的图。
第五章:ELBO 的登场
目标:让神经网络生成真图
为了让这个神经网络 pθ 能够生成像 x0 这样的真图,我们需要最大化对数似然:logpθ(x0)。
但正如之前所说,直接算这个太难。于是我们引入 ELBO(Evidence Lower Bound,证据下界)。
什么是下界?
这里要用到一个经典的变分推断技巧:引入一个辅助分布 q,在 log 里面玩点数学游戏。
你可能注意到公式里出现了 x1:T 和 x0:T 这种写法,这是一种简写符号:
- x1:T 表示从第 1 步到第 T 步的所有带噪图:x1,x2,...,xT
- x0:T 表示 x0,x1,...,xT
从我们的目标开始:
logpθ(x0)=log∑x1:Tpθ(x0:T)
这个公式的逻辑是:模型生成一张清晰图 x0 的概率,等于它沿着所有可能的去噪路径(从纯噪声 xT 到 x0)推导回来的概率总和。
按照从左到右的顺序:
- log:对概率取对数,将连乘转化为加法,便于优化
- ∑x1:T:对所有可能的中间路径进行边缘化——把所有能产生同一张 x0 的不同路径(x1,x2,...,xT 的各种组合)的概率全部累加
- pθ(x0:T):模型参数为 θ 的联合概率,描述一条完整去噪链路 {xT,xT−1,...,x1,x0} 的发生概率
好比计算"到达山顶的总人数":把从北坡、南坡、西坡等所有路径上山的人数加起来。
现在我们在分数里乘以 q(x1:T∣x0)/q(x1:T∣x0)=1:
logpθ(x0)=log∑x1:Tq(x1:T∣x0)⋅q(x1:T∣x0)pθ(x0:T)
这可以写成期望的形式:
logpθ(x0)=logEq[q(x1:T∣x0)pθ(x0:T)]
关键步骤:利用 Jensen 不等式(log 是凹函数,所以 logE[X]≥E[logX]):
logpθ(x0)≥Eq[logq(x1:T∣x0)pθ(x0:T)]
或者写成更熟悉的形式:
logpθ(x0)≥Eq[logpθ(x0:T)q(x1:T∣x0)]
- 左边是我想最大化的目标(很难算)
- 右边是一个下界(Lower Bound)(相对好算)
策略:如果我们拼命把右边的下界抬高,左边的目标自然也就被顶上去了。
在深度学习里,我们要 minimize Loss,所以我们取负号,变成 Minimize Negative ELBO。
拆解 Loss
把上面那个复杂的式子展开(利用 Markov 链性质),Loss 可以被拆解成三项:
L=LT+Lt−1+L0
LT(正则项):
DKL(q(xT∣x0)∣∣p(xT))
这里的 q(xT∣x0) 是第三章推导的那个直达分布:从原图 x0 出发,经过 T 步前向加噪后得到最终噪声图 xT 的概率分布。
根据第三章的核心公式,这实际上是一个高斯分布:
q(xT∣x0)=N(αˉT⋅x0,1−αˉT)
p(xT) 是标准高斯分布 N(0,1)。这一项比较的是:模型最终生成的噪声分布(q)和标准高斯噪声(p)有多接近。
因为前向过程是锁死的,当 T 足够大时,αˉT→0,所以 q(xT∣x0) 本来就非常接近标准高斯。这一项近似为 0,不用训练。
L0(重构项):
−logpθ(x0∣x1)
最后一步的解码。
Lt−1(去噪核心项):这就是我们要关注的重点!
∑t>1DKL(q(xt−1∣xt,x0)∣∣pθ(xt−1∣xt))
这个 KL 散度在衡量两个分布的距离。
左边:上帝视角的真实分布 q(xt−1∣xt,x0)
这是"给定原图 x0 和当前带噪图 xt 的条件下,上一张稍微清晰点的图 xt−1 的概率分布"。
关键点:多了 x0 这个条件!
为什么这很重要?回顾第四章,q(xt−1∣xt) 算不出来——因为只知道当前带噪图 xt,但不知道它原本是什么样,有无数种可能的 xt−1 都能产生这个 xt。就像只知道终点,不知道起点,无法确定路径。
但加了 x0 之后情况就完全不同了:如果我们知道原图 x0(训练时当然知道,因为 xt 就是从它算出来的),就能锁定唯一的"去噪路径"。此时逆向概率 q(xt−1∣xt,x0) 变得可计算。
**具体怎么算?**利用贝叶斯公式:
q(xt−1∣xt,x0)=q(xt∣x0)q(xt∣xt−1,x0)⋅q(xt−1∣x0)
看公式右边的三项:
-
q(xt∣xt−1,x0):因为马尔可夫性,给定 xt−1 后,xt 不再依赖 x0,所以等于 q(xt∣xt−1)。这是单步高斯加噪分布:xt=1−βt⋅xt−1+βt⋅ϵ
-
q(xt−1∣x0):从原图 x0 一步到位到 xt−1 的分布。用直达公式:xt−1=αˉt−1⋅x0+1−αˉt−1⋅ϵ,这是高斯分布
-
q(xt∣x0):从原图 x0 一步到位到 xt 的分布。同样用直达公式:xt=αˉt⋅x0+1−αˉt⋅ϵ,这也是高斯分布
核心差别:第 2 和第 3 项都是从原图 x0 出发的"前向"分布,我们有直达公式可以一步到位计算;而第 1 项是单步加噪,公式也很简单。
这三项都能算,这就是为什么加了 x0 之后整个贝叶斯公式变得可计算——每一项都是已知的高斯分布。
既然三项都是高斯分布,它们的贝叶斯组合仍然是高斯分布。通过代数推导可以得到:
q(xt−1∣xt,x0)=N(μ~t,σ~t2)
其中均值的具体形式是:
μ~t=αt1(xt−1−αˉt1−αt⋅ϵ)
这个公式不需要背,但需要理解每个参数是怎么来的:
公式里的参数
- xt:当前带噪图(已知,这就是我们要处理的图)
- x0:原图(已知,训练时当然知道,因为 xt 就是从它算出来的)
- αt:第 t 步的信号保留比例(预设常数,训练前就设定好了)
- αˉt:累积保留比例(可以预先计算,就是 α1×α2×⋯×αt)
- ϵ:关键!这是从 x0 生成 xt 时加的噪声(可以从第三章的直达公式反算出来:ϵ=1−αˉtxt−αˉt⋅x0)
核心洞察:公式中只有 ϵ 是"隐藏"的,但它可以通过 xt 和 x0 算出来。
这就是为什么说"要想算出均值,本质上只需要知道噪声 ϵ 是多少"——因为其他所有参数都是公开的预设值,只有噪声是需要推导的。
右边:神经网络预测的分布 pθ(xt−1∣xt)
这是神经网络预测的分布——看着带噪图 xt,猜上一张图 xt−1 长什么样。
网络不知道原图 x0,只能通过观察 xt 来推测。它需要预测一个高斯分布 N(μθ,Σθ),但由于 DDPM 的简化(方差固定),实际上只需要预测均值 μθ。
神经网络的输入输出
- 输入:(xt,t) —— 带噪图和时间步
- 输出:预测的均值 μθ(xt,t)
小结
KL 散度在衡量:神经网络的预测(pθ)和上帝视角的真实答案(q)有多接近。
训练的目标就是让 μθ 尽可能逼近 μ~t。
第六章:从均值到噪声的蜕变
现在我们的任务很明确了:让神经网络预测的均值 μθ,去逼近第五章那个上帝视角的真实均值 μ~t。
第五章末尾我们注意到一个关键洞察:均值公式的形式揭示了与噪声 ϵ 的直接关系——要想算出均值,本质上只需要知道噪声 ϵ 是多少。
现在深入理解这个洞察:为什么"求均值"等于"减去噪声"?
搞懂符号
先让我们把公式里的零件一个个拆下来。
μθ(xt,t) 是什么?
这是神经网络根据当前满是噪点的图 xt,猜测出来的"上一张稍微清晰点的图 xt−1"的中心位置。
- 为什么要输入 xt?你需要看着当前的图,才能猜上一张图
- 为什么要输入 t?你需要知道现在是第几步。第 1000 步全是噪点很难猜,第 5 步基本看清了只需微调。时间 t 告诉网络噪声的浓度
那 Σθ 呢?
DDPM 论文发现了一个巧妙的事实:方差其实不用训练!前向加噪时每一步的噪声大小 βt 是人为设定的,逆向的不确定性跟它高度相关。
所以作者直接把方差固定成常数,神经网络只需要管好均值就行了。
关键洞察
现在到了最关键的地方:为什么"求均值"等于"减去噪声"?
请盯着第五章那个上帝视角的均值公式看三秒钟:
μ~t=αt1(xt−1−αˉt1−αt⋅ϵ)
- xt:当前的图(已知)
- αt,βt:预设的常数(已知)
- ϵ:这幅图里包含的噪声(未知!)
发现了吗?要想算出均值,本质上只需要知道这幅图里的噪声 ϵ 是多少!
这是一个惊人的发现:神经网络预测均值 μθ,在数学上等价于预测噪声 ϵθ。
于是,神经网络的工作变得很简单:
- 输入:xt(带噪图)
- 任务:告诉我这图里加的噪声 ϵ 长什么样
- 计算:把预测出来的噪声套进公式,算出 xt−1 的均值
- 采样:在均值旁边随机抖一下,就得到了 xt−1
MSE 的诞生
现在你应该理解了:虽然理论上我们在拟合一个高斯分布:
pθ=N(μ,Σ)
但在实际代码里,神经网络直接预测噪声 ϵθ,然后用 xt 减去噪声的部分,就得到了去噪后的结果。
复杂的 KL 散度 Loss,最终被简化成了两个噪声向量的均方误差:
Lsimple=∥ϵ−ϵθ(αˉtx0+1−αˉtϵ,t)∥2
- ϵ:训练时生成的真噪声
- ϵθ:神经网络预测的噪声
这个简化太重要了。让我们回顾一下它是怎么来的:
- Feller 理论告诉我们:逆向过程是高斯分布
- DDPM 简化告诉我们:方差可以固定,只需求均值
- 贝叶斯推导告诉我们:求均值等价于求噪声
- 最终实现:神经网络看图预测噪声
每一步都自然流畅,每一步都环环相扣。
第七章:生成图片
神经网络训练好后(训练过程前面已经讲过),怎么用它生成新图片?
初始状态:从纯噪声开始,xT∼N(0,1)
去噪循环:从 t=T 倒推到 t=1
每一步的更新公式:
xt−1=αt1(xt−1−αˉt1−αt⋅ϵθ(xt,t))+σt⋅z
其中 z∼N(0,1) 是随机噪声(σt 是预设的方差系数)。
完整生成流程:
-
初始化:从标准正态分布采样 xT∼N(0,1) 作为起点(纯噪声)
-
逐步去噪:对于 t=T,T−1,...,2,1,每次迭代:
- 把当前带噪图 xt 和时间步 t 输入神经网络
- 网络预测噪声 ϵθ(xt,t)
- 用上面的去噪公式计算 xt−1
- 得到稍微清晰一点的图
-
得到结果:重复 T 次后,最终得到清晰图 x0
直觉理解:
- 网络看当前带噪图 xt,预测里面的噪声 ϵθ
- 从 xt 中减去预测的噪声,得到上一时刻的图 xt−1
- 加一点随机噪声 z(保持生成的多样性)
- 重复 T 次(比如 1000 次),逐步去噪,最终得到清晰图 x0
核心洞察
训练和推理的对称性:
- 训练时(第三章):我们知道 x0,用直达公式生成带噪图 xt,让网络学习预测噪声 ϵ
- 推理时(本章):我们从纯噪声开始,用训练好的网络预测噪声,逐步去除噪声得到清晰图 x0
训练时教网络"加噪是什么样",推理时让网络"把噪声去掉"——这就是扩散模型的优雅之处。
终章:全流程闭环
按照 DDPM 论文的逻辑,你现在应该彻底通透了。让我们回顾一下这个完整的故事。
故事脉络
- 起点:想算逆向过程 q(xt−1∣xt),但算不出来
- 方法:用神经网络 pθ 去拟合它
- 手段:最大化 ELBO(变分下界)来训练
- 技巧:引入 x0 作为条件,使得 KL 散度的目标分布 q(xt−1∣xt,x0) 变得可计算
- 化简:把直达公式代入进去,发现拟合分布的均值,本质上就是在拟合噪声
- 结果:Loss 就是预测噪声和真实噪声的 MSE
核心优势
这种方法的关键优势在于利用了高斯噪声良好的数学性质,使整个过程的可建模性和可控性大大提高:
- 数学优雅:前向过程有闭式解,可以快速生成训练数据
- 训练稳定:通过能量守恒保持方差稳定
- 推导清晰:从 ELBO 到 MSE 的每一步都有严格的数学推导
- 工程可行:最终简化的 Loss 就是普通的 MSE,易于实现
这就是扩散模型背后的完整故事——从最直观的叠加噪声想法,到引入能量守恒,再到用神经网络拟合逆向过程,最终简化为预测噪声的 MSE Loss,最后落地到训练和推理的具体实现。
每一步都自然流畅,每一步都环环相扣。
现在,你应该真正理解了扩散模型的数学之美。