《生成扩散模型漫谈(一):DDPM = 拆楼 + 建楼》 —— 苏剑林
记号约定
原文把单步正向过程写成 xt=αtxt−1+βtεt,并规定 αt2+βt2=1。其中 εt∼N(0,I),αt 是保留原信号的系数,βt 是加入新噪声的系数。
这套记号与 DDPM 论文和常见教程不完全相同:
| 含义 | 本文记号 | 常见 DDPM 记号 |
|---|
| 单步信号系数 | αt | αtstd |
| 单步噪声系数 | βt | 1−αtstd=βtstd |
| 累计信号系数 | αˉt | αˉtstd |
| 累计噪声系数 | βˉt | 1−αˉtstd |
看其他资料时不能只按符号名字对照,要先判断它表示的是系数、方差还是累计乘积。
一、正向过程:从 xt−1 到 xt
每一步先缩小上一时刻的信号,再加入一份新的独立高斯噪声:
xt=αtxt−1+βtεt,εt∼N(0,I).(1)
若 xt−1 具有单位方差并且与 εt 独立,那么 Var(xt)=αt2+βt2=1。因此,αt2+βt2=1 的作用是让信号和噪声的比例不断变化,但总体尺度保持稳定。
从单步公式得到任意时刻的 xt
以两步为例:
x2=α2x1+β2ε2=α2α1x0+α2β1ε1+β2ε2.
展开到任意 t,信号部分的系数始终是所有 α 的乘积,因此记 αˉt=∏s=1tαs。剩余部分则是多个相互独立的高斯噪声的加权和;这个加权和仍然服从高斯分布,所以可以把它写成“一个总系数乘以一个标准高斯噪声”。由此定义 βˉt 和 εˉt:
xt=αˉtx0+βˉtεˉt,εˉt∼N(0,I)(2)
这里的 βˉt 表示所有历史噪声合并后的总系数,并不是 β1β2⋯βt。它的具体取值还需要从递推关系中算出来。
已知每一步都有 αt2+βt2=1,为什么累计后仍然能写成 αˉt2+βˉt2=1?
这个关系可以用递推来验证。当 t=1 时,αˉ1=α1、βˉ1=β1,所以它就是已知条件 α12+β12=1。再假设 t−1 时关系成立,即 αˉt−12+βˉt−12=1,并把 xt−1=αˉt−1x0+βˉt−1εˉt−1 代入单步正向公式 (1):
xt=αtαˉt−1x0+αtβˉt−1εˉt−1+βtεt.
历史噪声与当前噪声相互独立,所以它们合并后的方差等于两个系数的平方和:
βˉt2=αt2βˉt−12+βt2(3)
利用归纳假设、单步条件 αt2+βt2=1,以及 αˉt=αtαˉt−1:
αt2βˉt−12+βt2=αt2(1−αˉt−12)+βt2=(αt2+βt2)−αt2αˉt−12=1−αˉt2.
因此 βˉt=1−αˉt2,也就得到 αˉt2+βˉt2=1。公式 (2) 表示的是分布意义上的等价,不是说合并前后的每次采样数值都相同。它的实际价值是:训练时不必依次计算 x1,x2,…,xt,给定 x0 和 t 后,一次采样就能直接得到 xt。
Noise Scheduler 会让 αˉT≈0,所以终点近似为 xT∼N(0,I)。
二、反向过程:从 xt 重建 xt−1
正向过程已经确定,生成时需要学习相反方向的 xt→xt−1。最直接的训练方式,是让模型 μθ(xt,t) 最小化 ∥xt−1−μθ(xt,t)∥2。
由单步正向公式 (1) 可以反解出 xt−1=αt1(xt−βtεt)。因此把反向模型写成下面的形式:
μθ(xt,t)=αt1[xt−βtgθ(xt,t)].(4)
代回重建损失后,只剩下一个与模型参数无关的系数:
∥xt−1−μθ(xt,t)∥2=αt2βt2∥εt−gθ(xt,t)∥2.
所以,重建 xt−1 可以等价地参数化为预测第 t 步加入的噪声 εt。
最初的训练目标为什么需要两个噪声
此时模型要预测的是最后一步噪声 εt,因此构造输入时必须保留它与 xt 的真实关系:
xt=αˉtx0+αtβˉt−1εˉt−1+βtεt.
于是最初的损失是:
L1=εt−gθ(αˉtx0+αtβˉt−1εˉt−1+βtεt,t)2.(5)
这个目标是正确的,但一次训练需要采样数据 x0、时间步 t,以及两份高斯噪声 εˉt−1 和 εt。要采样的随机变量越多,就越难用一个 batch 准确估计损失,表现为每次估计的波动(方差)更大。如果能对其中一份噪声直接求期望,就不必再用随机采样近似它,也就能降低损失估计的方差。
下一节并不是要改变正向过程或预测任务,而是要把公式 (5) 中一部分可以精确计算的随机性直接平均掉,减少用随机采样近似期望的次数。
三、降低方差:从两份噪声到 ε
输入 xt 中的两份噪声可以根据正态分布的叠加性合并,但损失的目标仍然是其中的 εt。真正的难点不是“怎样合并输入”,而是“合并之后怎样继续保持输入与目标之间原有的相关性”。
先只看 aU+bV 与预测目标 V
为了看清结构,临时使用下面四个简写:
| 临时记号 | 原变量 | 含义 |
|---|
| a | αtβˉt−1 | 历史噪声进入 xt 的系数 |
| b | βt | 当前噪声进入 xt 的系数 |
| U | εˉt−1 | 历史累计噪声 |
| V | εt | 当前噪声,也是预测目标 |
把这些简写代入公式 (5),损失可以写成:
L1=∥V−gθ(αˉtx0+aU+bV,t)∥2.
这一步只是换了记号,没有改变损失。现在可以直接看出,模型输入中的噪声是 aU+bV,预测目标是 V;接下来的变换必须同时处理二者,不能只保证输入的分布不变。
由累计噪声关系 (3) 可知 a2+b2=βˉt2,所以输入噪声的边缘分布可以写成 aU+bV=dβˉtε。
既然输入中的两份噪声已经可以合并成一个 ε,为什么不能再独立采样一个 V 作为预测目标?
因为输入噪声与目标并不独立:Cov(aU+bV,V)=bI。如果重新独立采样 V,协方差会变成 0,训练数据的联合关系就被改变了。
另一方面,知道 aU+bV 也无法唯一恢复 V。例如 a=b=1 时,即使知道 U+V=0,(U,V) 仍然可以有无数种取值。输入中包含一部分关于 V 的信息,但没有包含完整的 V。因此,还需要表示“给定输入后,V 剩余的不确定性”。
补回 V 中剩余的不确定性
为表示这部分不确定性,在输入方向 aU+bV 之外,再取一个与它正交的组合,并把它记为 ω:
ε=βˉtaU+bV,ω=βˉtbU−aV.
这只是把原来的 (U,V) 旋转成新坐标 (ε,ω),没有增加新的随机性。由于旋转矩阵是正交矩阵,ε 和 ω 仍然是相互独立的标准高斯变量。
反解目标 V:
V=输入中能够确定的部分βˉtbε−给定输入后仍不确定的部分βˉtaω(6)
公式 (6) 说明了 ω 的作用:ω 本身与输入独立,但用它构造出来的 V 仍然与输入保持原有的相关性。
如果直接令 V=βˉtbε,虽然保留了相关部分,但 V 的方差只有 βˉt2b2I,不再是单位方差;缺少的方差正是 −βˉtaω 提供的。
对 ω 求期望
将公式 (6) 代回原损失,模型输入只依赖 ε:
Eω[βˉtbε−βˉtaω−gθ(αˉtx0+βˉtε,t)2]=βˉtbε−gθ(αˉtx0+βˉtε,t)2+βˉt2a2E∥ω∥2.
这里先固定 ε,只对 ω 求期望。交叉项因为 E[ω]=0 而消失,最后一项又与模型参数无关,因此训练时不需要真的采样 ω。
再缩放网络输出,令 ε^θ=βtβˉtgθ。与模型有关的部分会变成下面的形式,前面还带有一个只依赖 t 的权重。常见的简化目标会去掉这个权重:
Lsimple=ε−ε^θ(αˉtx0+βˉtε,t)2(7)
坐标旋转本身并没有减少采样数量:原来采样 (U,V),旋转后仍然要采样 (ε,ω)。真正降低方差的是利用平方损失精确计算 Eω,最终只需要采样 ε。去掉随 t 变化的权重还会改变不同时间步在总损失中的相对重要性,所以公式 (7) 是常用的简化训练目标,不是与原损失完全相等的代数变形。
四、最终的训练与生成
训练。 根据直接采样公式 (2),一次训练只需要:
采样真实数据 x₀
采样时间步 t
采样 ε ~ N(0, I)
xₜ = ᾱₜ x₀ + β̄ₜ ε
ε̂ = ε̂θ(xₜ, t)
loss = ||ε - ε̂||²
最终网络预测的是从 x0 一步构造 xt 时使用的累计噪声 ε,不是推导开始时的最后一步噪声 εt。两种参数化之间的缩放已经吸收到 ε^θ 的定义中。
生成。 从 xT∼N(0,I) 开始。把 gθ=βˉtβtε^θ 代入反向参数化公式 (4),得到:
μθ(xt,t)=αt1[xt−βˉtβt2ε^θ(xt,t)](8)
确定性地取均值时令 xt−1=μθ(xt,t);随机采样时令 xt−1=μθ(xt,t)+σtz,其中 z∼N(0,I)。从 t=T 迭代到 1,最终得到 x0。
σt 的选择属于反向分布方差的设计。原文为了说明主线,使用了 σt=βt 这一简单选择。
五、步数与 Noise Scheduler
DDPM 原论文取 T=1000。把原论文的设置换成本文的记号,αt 大致可以写成:
αt=1−T0.02t.
它是一个单调递减函数:越往后,单步保留的信号越少,加入的噪声越多。这个设置与较大的 T 可以放在一起理解。
为什么需要较大的 T。 这里使用欧氏距离的平方学习 xt 到 xt−1 的重建。欧氏距离不是衡量图像真实程度的好指标,VAE 使用欧氏距离做重建时往往会得到模糊的结果;只有输入、输出两张图像足够接近时,欧氏距离才比较容易得到清晰的重建。增大 T 可以缩小相邻状态之间的差距,让每一步的重建任务更适合使用欧氏距离。代价是生成时需要反复调用网络,原始 DDPM 的采样因此很慢。
为什么 αt 单调递减。 当 t 较小时,xt 仍然接近真实图像,需要让 xt−1 与 xt 尽可能接近,因此使用较大的 αt。当 t 较大时,xt 已经接近纯噪声,欧氏距离带来的模糊问题不再重要,可以用较小的 αt 增大单步变化。
能不能从头到尾都使用较大的 αt?
可以,但这意味着每一步加入的噪声都很少,因此需要更大的 T 才能满足 αˉT≈0。对于上面的设置,可以估算:
logαˉT=t=1∑Tlogαt=21t=1∑Tlog(1−T0.02t)<−0.005(T+1).
代入 T=1000,可以得到 αˉT 大约在 e−5 的量级,已经可以近似看成 0。如果始终使用更大的 αt,要达到相同的终点就只能继续增加步数。
不同时间步对应不同噪声强度,本来需要不同的去噪模型。DDPM 共享同一套网络参数,并把 t 作为条件输入,让网络知道当前处于哪一个噪声阶段。
容易混淆的地方
- aU+bV=dβˉtε 只说明输入噪声的边缘分布相同,不代表它与预测目标 V 的联合关系也自动保留。
- 输入中“含有 V”不等于能够恢复完整的 V。给定输入后,V 仍有剩余的不确定性。
- 独立的是 ε 与 ω,不是模型输入与 V。构造出的 V 必须继续与输入相关。
- 引入 ω 只是为了正确重写联合分布;真正减少采样的是随后精确计算关于 ω 的期望。
- 推导开始时 gθ 预测单步噪声 εt,最终的 ε^θ 预测累计噪声 ε,两者之间存在随 t 变化的缩放。