GAN 用博弈换锐利,换来的是不稳定(4.4 );VAE 用似然换稳定,换来的是模糊(4.3 )。扩散模型 (diffusion model)给出第三条路:不要一次从噪声跳到样本,而是把它拆成几百上千步「稍微去一点噪声」的小任务 。
这个想法有两个直接收益:每一步的监督信号是我们亲手加进去的那份噪声 ——已知、无歧义,所以训练是回归任务而不是博弈,稳定、可复现;网络只被要求做「局部去一点噪声」这种小改动,比「从纯噪声一步生成样本」容易得多。代价也很直接:采样要跑很多次网络前向。
本节要把这条路线拆干净:前向加噪为什么有闭式解、反向过程为什么可以写成变分下界、下界又怎么化简成「预测噪声的 MSE」、DDPM 与 DDIM 的采样差在哪里、条件引导(CFG)在数学上到底是什么。
定义 4.5.1 · 前向加噪与反向去噪
前向加噪 (forward / diffusion process,无参数 ,纯固定过程):在 T T T 步内逐步往数据里注入高斯噪声,
q ( x t ∣ x t − 1 ) = N ( 1 − β t x t − 1 , β t I ) , t = 1 , … , T , q(x_t\mid x_{t-1})=\mathcal N\Bigl(\sqrt{1-\beta_t}\,x_{t-1},\ \beta_t I\Bigr),\qquad t=1,\dots,T, q ( x t ∣ x t − 1 ) = N ( 1 − β t x t − 1 , β t I ) , t = 1 , … , T ,
其中 { β t ∈ ( 0 , 1 ) } \{\beta_t\in(0,1)\} { β t ∈ ( 0 , 1 )} 是噪声调度 (noise schedule,常见设定如 β t \beta_t β t 从 1 0 − 4 10^{-4} 1 0 − 4 线性增长到 0.02 0.02 0.02 )。记 α t = 1 − β t \alpha_t=1-\beta_t α t = 1 − β t 、α ˉ t = ∏ s = 1 t α s \bar\alpha_t=\prod_{s=1}^{t}\alpha_s α ˉ t = ∏ s = 1 t α s ,则任意一步都能一步到位地写出(见 定理 4.5.1 ):
q ( x t ∣ x 0 ) = N ( α ˉ t x 0 , ( 1 − α ˉ t ) I ) ⟺ x t = α ˉ t x 0 + 1 − α ˉ t ε , ε ∼ N ( 0 , I ) . q(x_t\mid x_0)=\mathcal N\bigl(\sqrt{\bar\alpha_t}\,x_0,\ (1-\bar\alpha_t)I\bigr)\ \Longleftrightarrow\ x_t=\sqrt{\bar\alpha_t}\,x_0+\sqrt{1-\bar\alpha_t}\,\varepsilon,\quad \varepsilon\sim\mathcal N(0,I). q ( x t ∣ x 0 ) = N ( α ˉ t x 0 , ( 1 − α ˉ t ) I ) ⟺ x t = α ˉ t x 0 + 1 − α ˉ t ε , ε ∼ N ( 0 , I ) .
当 T T T 足够大、α ˉ T → 0 \bar\alpha_T\to0 α ˉ T → 0 时,x T x_T x T 已近似纯高斯噪声——这条链的终点是一个已知分布 ,这正是它能被用来生成的原因。
反向去噪 (reverse process,要学参数 ):让网络逐步把 x t x_t x t 还原成 x t − 1 x_{t-1} x t − 1 ,
p θ ( x t − 1 ∣ x t ) = N ( μ θ ( x t , t ) , Σ θ ( x t , t ) ) , p ( x T ) = N ( 0 , I ) . p_\theta(x_{t-1}\mid x_t)=\mathcal N\bigl(\mu_\theta(x_t,t),\ \Sigma_\theta(x_t,t)\bigr),\qquad p(x_T)=\mathcal N(0,I). p θ ( x t − 1 ∣ x t ) = N ( μ θ ( x t , t ) , Σ θ ( x t , t ) ) , p ( x T ) = N ( 0 , I ) .
前向链的三件事:契约、桥梁、终点
契约(加噪是固定的) :前向过程不含任何可学参数,它只是「把数据摧毁成噪声」的一段程序。我们随时可以对任意 x 0 x_0 x 0 采样出任意时刻的 x t x_t x t ——这意味着监督信号是自带的 (我们知道自己加了多少噪声),不需要任何标签,也不存在「两个网络互相追赶」。
桥梁(闭式解) :x t x_t x t 可以从 x 0 x_0 x 0 一步 得到,不必跑 t t t 次加噪。这条性质让训练成本与 T T T 无关(每次只随机抽一个 t t t ),是整个方法高效的关键。
终点(已知分布) :α ˉ T → 0 \bar\alpha_T\to0 α ˉ T → 0 时 x T ≈ ε x_T\approx\varepsilon x T ≈ ε 是标准高斯。于是采样有一个明确的起点:从 N ( 0 , I ) \mathcal N(0,I) N ( 0 , I ) 抽一个 x T x_T x T ,剩下的任务就是「逆着走回去」。
反向过程为什么需要均值与方差都学? 结构上写全是为了变分推导方便;实践中 Σ θ \Sigma_\theta Σ θ 常固定为 β t I \beta_t I β t I 或 β ~ t I \tilde\beta_t I β ~ t I ,只学均值——因为在 σ x 2 \sigma_x^2 σ x 2 尺度下学方差对样本质量的收益远小于它的训练代价(后续工作发现让网络同时预测方差也能提升,但那是额外的工程选择)。
定理 4.5.1 · 前向过程的一步到位闭式
设 q ( x t ∣ x t − 1 ) = N ( α t x t − 1 , β t I ) q(x_t\mid x_{t-1})=\mathcal N(\sqrt{\alpha_t}x_{t-1},\beta_t I) q ( x t ∣ x t − 1 ) = N ( α t x t − 1 , β t I ) ,α t = 1 − β t \alpha_t=1-\beta_t α t = 1 − β t ,α ˉ t = ∏ s = 1 t α s \bar\alpha_t=\prod_{s=1}^{t}\alpha_s α ˉ t = ∏ s = 1 t α s 。则对任意 t ≥ 1 t\ge1 t ≥ 1 ,
q ( x t ∣ x 0 ) = N ( α ˉ t x 0 , ( 1 − α ˉ t ) I ) . q(x_t\mid x_0)=\mathcal N\bigl(\sqrt{\bar\alpha_t}\,x_0,\ (1-\bar\alpha_t)I\bigr). q ( x t ∣ x 0 ) = N ( α ˉ t x 0 , ( 1 − α ˉ t ) I ) .
证明(对 t t t 归纳,用高斯线性组合)
t = 1 t=1 t = 1 :α ˉ 1 = α 1 \bar\alpha_1=\alpha_1 α ˉ 1 = α 1 ,q ( x 1 ∣ x 0 ) = N ( α 1 x 0 , β 1 I ) q(x_1\mid x_0)=\mathcal N(\sqrt{\alpha_1}x_0,\beta_1I) q ( x 1 ∣ x 0 ) = N ( α 1 x 0 , β 1 I ) ,与定义一致。
归纳步 :设 q ( x t − 1 ∣ x 0 ) = N ( α ˉ t − 1 x 0 , ( 1 − α ˉ t − 1 ) I ) q(x_{t-1}\mid x_0)=\mathcal N(\sqrt{\bar\alpha_{t-1}}x_0,(1-\bar\alpha_{t-1})I) q ( x t − 1 ∣ x 0 ) = N ( α ˉ t − 1 x 0 , ( 1 − α ˉ t − 1 ) I ) 。把两步合成一步:
x t = α t x t − 1 + β t ϵ 1 , x t − 1 = α ˉ t − 1 x 0 + 1 − α ˉ t − 1 ϵ 2 , x_t=\sqrt{\alpha_t}\,x_{t-1}+\sqrt{\beta_t}\,\boldsymbol\epsilon_1,\qquad x_{t-1}=\sqrt{\bar\alpha_{t-1}}\,x_0+\sqrt{1-\bar\alpha_{t-1}}\,\boldsymbol\epsilon_2, x t = α t x t − 1 + β t ϵ 1 , x t − 1 = α ˉ t − 1 x 0 + 1 − α ˉ t − 1 ϵ 2 ,
其中 ϵ 1 , ϵ 2 ∼ N ( 0 , I ) \boldsymbol\epsilon_1,\boldsymbol\epsilon_2\sim\mathcal N(0,I) ϵ 1 , ϵ 2 ∼ N ( 0 , I ) 独立。代入得
x t = α t α ˉ t − 1 ⏟ = α ˉ t x 0 + ( α t ( 1 − α ˉ t − 1 ) ϵ 2 + β t ϵ 1 ) ⏟ 零均值、独立高斯之和 . x_t=\underbrace{\sqrt{\alpha_t}\sqrt{\bar\alpha_{t-1}}}_{=\sqrt{\bar\alpha_t}}x_0+\underbrace{\bigl(\sqrt{\alpha_t(1-\bar\alpha_{t-1})}\,\boldsymbol\epsilon_2+\sqrt{\beta_t}\,\boldsymbol\epsilon_1\bigr)}_{\text{零均值、独立高斯之和}} . x t = = α ˉ t α t α ˉ t − 1 x 0 + 零均值、独立高斯之和 ( α t ( 1 − α ˉ t − 1 ) ϵ 2 + β t ϵ 1 ) .
两个独立零均值高斯线性组合仍是零均值高斯,方差相加(协方差恒同):
Var = α t ( 1 − α ˉ t − 1 ) I + β t I = ( α t − α t α ˉ t − 1 + β t ) I = ( 1 − α ˉ t ) I , \operatorname{Var}=\alpha_t(1-\bar\alpha_{t-1})I+\beta_t I=\bigl(\alpha_t-\alpha_t\bar\alpha_{t-1}+\beta_t\bigr)I=\bigl(1-\bar\alpha_t\bigr)I, Var = α t ( 1 − α ˉ t − 1 ) I + β t I = ( α t − α t α ˉ t − 1 + β t ) I = ( 1 − α ˉ t ) I ,
最后一步用了 α t − α t α ˉ t − 1 + β t = α t ( 1 − α ˉ t − 1 ) + 1 − α t = 1 − α t α ˉ t − 1 = 1 − α ˉ t \alpha_t-\alpha_t\bar\alpha_{t-1}+\beta_t=\alpha_t(1-\bar\alpha_{t-1})+1-\alpha_t=1-\alpha_t\bar\alpha_{t-1}=1-\bar\alpha_t α t − α t α ˉ t − 1 + β t = α t ( 1 − α ˉ t − 1 ) + 1 − α t = 1 − α t α ˉ t − 1 = 1 − α ˉ t 。故结论成立。■ \blacksquare ■
∎
闭式解的两个可直接使用的读法
读法一(训练时) :给定 x 0 x_0 x 0 、随机抽一个 t t t ,立刻能造出 x t x_t x t ,不必回放整条链。所以每步训练成本是 O ( 1 ) O(1) O ( 1 ) 次网络前向。
读法二(手算) :α ˉ t \sqrt{\bar\alpha_t} α ˉ t 是信号权重 ,1 − α ˉ t \sqrt{1-\bar\alpha_t} 1 − α ˉ t 是噪声权重 ,二者平方和为 1 1 1 。这意味着加噪过程保持「总能量」不变(在数据已归一到零均值单位方差的尺度下),因此不同 t t t 的输入尺度是可比、可控的——这也是为什么归一化范围(如 [ − 1 , 1 ] [-1,1] [ − 1 , 1 ] )必须训练与采样一致(见本节陷阱框)。
例 4.5.1 · 手算一次加噪系数
给定一个极简调度 T = 4 T=4 T = 4 、β 1 = β 2 = β 3 = β 4 = 0.1 \beta_1=\beta_2=\beta_3=\beta_4=0.1 β 1 = β 2 = β 3 = β 4 = 0.1 ,求 t = 4 t=4 t = 4 时 x 4 x_4 x 4 中信号与噪声各占多少权重;再求「t = 2 t=2 t = 2 到 t = 3 t=3 t = 3 的单步合成与一步到位是否一致」(用方差核对)。
解
① 累乘系数。 α t = 1 − β t = 0.9 \alpha_t=1-\beta_t=0.9 α t = 1 − β t = 0.9 (每步相同),故
α ˉ 1 = 0.9 , α ˉ 2 = 0.81 , α ˉ 3 = 0.729 , α ˉ 4 = 0.6561. \bar\alpha_1=0.9,\quad \bar\alpha_2=0.81,\quad \bar\alpha_3=0.729,\quad \bar\alpha_4=0.6561 . α ˉ 1 = 0.9 , α ˉ 2 = 0.81 , α ˉ 3 = 0.729 , α ˉ 4 = 0.6561.
② 代入闭式。 t = 4 t=4 t = 4 时
0.6561 = 0.81 , 1 − 0.6561 = 0.3439 ≈ 0.586. \sqrt{0.6561}=0.81,\qquad \sqrt{1-0.6561}=\sqrt{0.3439}\approx0.586 . 0.6561 = 0.81 , 1 − 0.6561 = 0.3439 ≈ 0.586.
即 x 4 = 0.81 x 0 + 0.586 ε x_4=0.81\,x_0+0.586\,\varepsilon x 4 = 0.81 x 0 + 0.586 ε :原始信号权重掉到 0.81 0.81 0.81 ,噪声权重升到约 0.586 0.586 0.586 。随 t t t 增大,α ˉ t \bar\alpha_t α ˉ t 单调下降,信号被越来越厚的噪声淹没——这正是「T T T 步后趋近纯噪声」的机制。
③ 一致性核对(单步 vs 一步到位)。 用归纳步的公式从 t = 2 t=2 t = 2 推 t = 3 t=3 t = 3 :α 3 α ˉ 2 = 0.9 × 0.81 = 0.729 = α ˉ 3 \sqrt{\alpha_3}\sqrt{\bar\alpha_2}=\sqrt{0.9\times0.81}=\sqrt{0.729}=\sqrt{\bar\alpha_3} α 3 α ˉ 2 = 0.9 × 0.81 = 0.729 = α ˉ 3 ✓;方差项
α 3 ( 1 − α ˉ 2 ) + β 3 = 0.9 × 0.19 + 0.1 = 0.271 = 1 − α ˉ 3 ✓ . \alpha_3(1-\bar\alpha_2)+\beta_3=0.9\times0.19+0.1=0.271=1-\bar\alpha_3\ \checkmark . α 3 ( 1 − α ˉ 2 ) + β 3 = 0.9 × 0.19 + 0.1 = 0.271 = 1 − α ˉ 3 ✓ .
两条都与一步到位的闭式吻合。
④ 到第几步就「几乎纯噪声」了? 用 1 − α ˉ t \sqrt{1-\bar\alpha_t} 1 − α ˉ t 逼近 1 1 1 的时刻衡量:α ˉ t = 0. 9 t \bar\alpha_t=0.9^t α ˉ t = 0. 9 t ,t = 20 t=20 t = 20 时 α ˉ 20 ≈ 0.122 \bar\alpha_{20}\approx0.122 α ˉ 20 ≈ 0.122 (噪声权重 ≈ 0.937 \approx0.937 ≈ 0.937 ),t = 40 t=40 t = 40 时 α ˉ 40 ≈ 0.015 \bar\alpha_{40}\approx0.015 α ˉ 40 ≈ 0.015 (噪声权重 ≈ 0.993 \approx0.993 ≈ 0.993 )。这个玩具调度比常见设定(线性到 0.02 0.02 0.02 、共 T = 1000 T=1000 T = 1000 )快得多,但形态相同:信噪比随 t t t 单调下降,在末尾几个百分点里数据被彻底淹没 。■ \blacksquare ■
∎
现在要把「逆着走回去」写成可优化的目标。思路与 VAE 完全一致(4.3 ):写一个变分下界,把不可解的积分换成可采样的期望。
定义 4.5.2 · 扩散的变分下界
把 x 0 : T x_{0:T} x 0 : T 看成一整条隐变量序列,则数据的对数似然为
log p θ ( x 0 ) = log ∫ p θ ( x 0 : T ) d x 1 : T , p θ ( x 0 : T ) = p ( x T ) ∏ t = 1 T p θ ( x t − 1 ∣ x t ) . \log p_\theta(x_0)=\log\int p_\theta(x_{0:T})\,dx_{1:T},\qquad p_\theta(x_{0:T})=p(x_T)\prod_{t=1}^{T}p_\theta(x_{t-1}\mid x_t). log p θ ( x 0 ) = log ∫ p θ ( x 0 : T ) d x 1 : T , p θ ( x 0 : T ) = p ( x T ) t = 1 ∏ T p θ ( x t − 1 ∣ x t ) .
用前向链 q ( x 1 : T ∣ x 0 ) = ∏ t = 1 T q ( x t ∣ x t − 1 ) q(x_{1:T}\mid x_0)=\prod_{t=1}^{T}q(x_t\mid x_{t-1}) q ( x 1 : T ∣ x 0 ) = ∏ t = 1 T q ( x t ∣ x t − 1 ) 作变分分布,Jensen 不等式给出(与 4.3 的 ELBO 同款推导)
log p θ ( x 0 ) ≥ E q [ log p θ ( x 0 : T ) q ( x 1 : T ∣ x 0 ) ] = − K L ( q ( x T ∣ x 0 ) ∥ p ( x T ) ) ⏟ L T − ∑ t = 2 T E q [ K L ( q ( x t − 1 ∣ x t , x 0 ) ∥ p θ ( x t − 1 ∣ x t ) ) ] ⏟ L t − 1 + E q [ log p θ ( x 0 ∣ x 1 ) ] ⏟ L 0 . \log p_\theta(x_0)\ \ge\ \mathbb E_{q}\Bigl[\log\frac{p_\theta(x_{0:T})}{q(x_{1:T}\mid x_0)}\Bigr] =-\underbrace{\mathrm{KL}\bigl(q(x_T\mid x_0)\,\|\,p(x_T)\bigr)}_{L_T} -\underbrace{\sum_{t=2}^{T}\mathbb E_q\bigl[\mathrm{KL}\bigl(q(x_{t-1}\mid x_t,x_0)\,\|\,p_\theta(x_{t-1}\mid x_t)\bigr)\bigr]}_{L_{t-1}} +\underbrace{\mathbb E_q\bigl[\log p_\theta(x_0\mid x_1)\bigr]}_{L_0}. log p θ ( x 0 ) ≥ E q [ log q ( x 1 : T ∣ x 0 ) p θ ( x 0 : T ) ] = − L T KL ( q ( x T ∣ x 0 ) ∥ p ( x T ) ) − L t − 1 t = 2 ∑ T E q [ KL ( q ( x t − 1 ∣ x t , x 0 ) ∥ p θ ( x t − 1 ∣ x t ) ) ] + L 0 E q [ log p θ ( x 0 ∣ x 1 ) ] .
写成「损失」形式:L V L B = E q [ − log p θ ( x 0 : T ) q ( x 1 : T ∣ x 0 ) ] = L T + ∑ t = 2 T L t − 1 − L 0 \mathcal L_{\mathrm{VLB}}=\mathbb E_q\bigl[-\log\frac{p_\theta(x_{0:T})}{q(x_{1:T}\mid x_0)}\bigr]=L_T+\sum_{t=2}^{T}L_{t-1}-L_0 L VLB = E q [ − log q ( x 1 : T ∣ x 0 ) p θ ( x 0 : T ) ] = L T + ∑ t = 2 T L t − 1 − L 0 ,最小化 VLB 即最大化似然下界 。
下界里的每一项在说什么
这个式子看起来吓人,但每一项的角色都很清楚:
L T L_T L T 没有可学参数 :它比较「前向链的终点」与「先验 N ( 0 , I ) \mathcal N(0,I) N ( 0 , I ) 」。只要 α ˉ T \bar\alpha_T α ˉ T 足够小,这一项就是常数(实践中直接忽略)。
L t − 1 L_{t-1} L t − 1 是主项 ,占 99% 以上的贡献:它要求「模型的反向分布 p θ ( x t − 1 ∣ x t ) p_\theta(x_{t-1}\mid x_t) p θ ( x t − 1 ∣ x t ) 去逼近真实的后验 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}\mid x_t,x_0) q ( x t − 1 ∣ x t , x 0 ) 」。注意这里出现了 x 0 x_0 x 0 ——知道原图之后,加噪过程是可以精确求逆的 (下面命题 4.5.1 给出闭式),而模型在采样时看不到 x 0 x_0 x 0 ,所以它必须学会「猜 x 0 x_0 x 0 或猜噪声」。
L 0 L_0 L 0 是最后一步的「像素级似然」,形式上是单独一项;实践中它与 L t − 1 L_{t-1} L t − 1 用同一套损失处理。
与 VAE 的对应关系 (这张对应表把两节串起来):
VAE(4.3 )
扩散(本节)
单层潜变量 z z z
T T T 层潜变量 x 1 , … , x T x_1,\dots,x_T x 1 , … , x T
编码器 q ϕ ( z ∣ x ) q_\phi(z\mid\boldsymbol x) q ϕ ( z ∣ x ) (要学的)
前向 q ( x t ∣ x t − 1 ) q(x_t\mid x_{t-1}) q ( x t ∣ x t − 1 ) (固定的 )
先验 p ( z ) = N ( 0 , I ) p(z)=\mathcal N(0,I) p ( z ) = N ( 0 , I )
终点先验 p ( x T ) = N ( 0 , I ) p(x_T)=\mathcal N(0,I) p ( x T ) = N ( 0 , I )
解码器 p θ ( x ∣ z ) p_\theta(\boldsymbol x\mid z) p θ ( x ∣ z )
反向链 p θ ( x t − 1 ∣ x t ) p_\theta(x_{t-1}\mid x_t) p θ ( x t − 1 ∣ x t )
重建项 + KL
L 0 L_0 L 0 + ∑ L t − 1 \sum L_{t-1} ∑ L t − 1
重参数化让采样可导
闭式 x t = α ˉ t x 0 + 1 − α ˉ t ε x_t=\sqrt{\bar\alpha_t}x_0+\sqrt{1-\bar\alpha_t}\varepsilon x t = α ˉ t x 0 + 1 − α ˉ t ε 让采样可导
一句话 :扩散 = 一个「编码器固定且分层、解码器分 T T T 步」的 VAE。
命题 4.5.1 · 真实后验的闭式(加噪可以精确求逆)
在前向过程下,给定 x 0 x_0 x 0 与 x t x_t x t 的条件分布是高斯:
q ( x t − 1 ∣ x t , x 0 ) = N ( μ ~ t ( x t , x 0 ) , β ~ t I ) , q(x_{t-1}\mid x_t,x_0)=\mathcal N\bigl(\tilde{\boldsymbol\mu}_t(x_t,x_0),\ \tilde\beta_t I\bigr), q ( x t − 1 ∣ x t , x 0 ) = N ( μ ~ t ( x t , x 0 ) , β ~ t I ) ,
μ ~ t ( x t , x 0 ) = α ˉ t − 1 β t 1 − α ˉ t x 0 + α t ( 1 − α ˉ t − 1 ) 1 − α ˉ t x t , β ~ t = 1 − α ˉ t − 1 1 − α ˉ t β t . \tilde{\boldsymbol\mu}_t(x_t,x_0)=\frac{\sqrt{\bar\alpha_{t-1}}\,\beta_t}{1-\bar\alpha_t}\,x_0+\frac{\sqrt{\alpha_t}(1-\bar\alpha_{t-1})}{1-\bar\alpha_t}\,x_t,\qquad \tilde\beta_t=\frac{1-\bar\alpha_{t-1}}{1-\bar\alpha_t}\,\beta_t . μ ~ t ( x t , x 0 ) = 1 − α ˉ t α ˉ t − 1 β t x 0 + 1 − α ˉ t α t ( 1 − α ˉ t − 1 ) x t , β ~ t = 1 − α ˉ t 1 − α ˉ t − 1 β t .
推导(配方,把两个高斯乘起来)
由马尔可夫性与贝叶斯公式,
q ( x t − 1 ∣ x t , x 0 ) = q ( x t ∣ x t − 1 ) q ( x t − 1 ∣ x 0 ) q ( x t ∣ x 0 ) ∝ exp [ − 1 2 ( A + B − C ) ] , q(x_{t-1}\mid x_t,x_0)=\frac{q(x_t\mid x_{t-1})\,q(x_{t-1}\mid x_0)}{q(x_t\mid x_0)}\ \propto\ \exp\Bigl[-\frac{1}{2}\bigl(A+B-C\bigr)\Bigr], q ( x t − 1 ∣ x t , x 0 ) = q ( x t ∣ x 0 ) q ( x t ∣ x t − 1 ) q ( x t − 1 ∣ x 0 ) ∝ exp [ − 2 1 ( A + B − C ) ] ,
其中(下略 I I I ,只写标量系数)
A = ∥ x t − α t x t − 1 ∥ 2 β t , B = ∥ x t − 1 − α ˉ t − 1 x 0 ∥ 2 1 − α ˉ t − 1 , C = ∥ x t − α ˉ t x 0 ∥ 2 1 − α ˉ t ( 与 x t − 1 无关,可当常数 ) . A=\frac{\lVert x_t-\sqrt{\alpha_t}x_{t-1}\rVert^2}{\beta_t},\quad B=\frac{\lVert x_{t-1}-\sqrt{\bar\alpha_{t-1}}x_0\rVert^2}{1-\bar\alpha_{t-1}},\quad C=\frac{\lVert x_t-\sqrt{\bar\alpha_t}x_0\rVert^2}{1-\bar\alpha_t}\ \ (\text{与 }x_{t-1}\text{ 无关,可当常数}). A = β t ∥ x t − α t x t − 1 ∥ 2 , B = 1 − α ˉ t − 1 ∥ x t − 1 − α ˉ t − 1 x 0 ∥ 2 , C = 1 − α ˉ t ∥ x t − α ˉ t x 0 ∥ 2 ( 与 x t − 1 无关,可当常数 ) .
把 A + B A+B A + B 中与 x t − 1 x_{t-1} x t − 1 有关的部分整理成 x t − 1 x_{t-1} x t − 1 的二次式:x t − 1 x_{t-1} x t − 1 的系数为
( α t β t + 1 1 − α ˉ t − 1 ) x t − 1 2 − 2 ( α t β t x t + α ˉ t − 1 1 − α ˉ t − 1 x 0 ) T x t − 1 . \Bigl(\frac{\alpha_t}{\beta_t}+\frac{1}{1-\bar\alpha_{t-1}}\Bigr)x_{t-1}^2 -2\Bigl(\frac{\sqrt{\alpha_t}}{\beta_t}x_t+\frac{\sqrt{\bar\alpha_{t-1}}}{1-\bar\alpha_{t-1}}x_0\Bigr)^{\mathrm T}x_{t-1}. ( β t α t + 1 − α ˉ t − 1 1 ) x t − 1 2 − 2 ( β t α t x t + 1 − α ˉ t − 1 α ˉ t − 1 x 0 ) T x t − 1 .
记二次系数 κ = α t β t + 1 1 − α ˉ t − 1 = α t ( 1 − α ˉ t − 1 ) + β t β t ( 1 − α ˉ t − 1 ) = 1 − α ˉ t β t ( 1 − α ˉ t − 1 ) \kappa=\frac{\alpha_t}{\beta_t}+\frac{1}{1-\bar\alpha_{t-1}}=\frac{\alpha_t(1-\bar\alpha_{t-1})+\beta_t}{\beta_t(1-\bar\alpha_{t-1})}=\frac{1-\bar\alpha_t}{\beta_t(1-\bar\alpha_{t-1})} κ = β t α t + 1 − α ˉ t − 1 1 = β t ( 1 − α ˉ t − 1 ) α t ( 1 − α ˉ t − 1 ) + β t = β t ( 1 − α ˉ t − 1 ) 1 − α ˉ t (分子用了 1 − α ˉ t = α t ( 1 − α ˉ t − 1 ) + β t 1-\bar\alpha_t=\alpha_t(1-\bar\alpha_{t-1})+\beta_t 1 − α ˉ t = α t ( 1 − α ˉ t − 1 ) + β t )。高斯密度的形式是 exp [ − κ 2 ∥ x t − 1 − m ∥ 2 ] \exp\bigl[-\frac{\kappa}{2}\lVert x_{t-1}-\boldsymbol m\rVert^2\bigr] exp [ − 2 κ ∥ x t − 1 − m ∥ 2 ] ,故方差 β ~ t = 1 / κ \tilde\beta_t=1/\kappa β ~ t = 1/ κ ,均值
μ ~ t = 1 κ ( α t β t x t + α ˉ t − 1 1 − α ˉ t − 1 x 0 ) = α ˉ t − 1 β t 1 − α ˉ t x 0 + α t ( 1 − α ˉ t − 1 ) 1 − α ˉ t x t . \tilde{\boldsymbol\mu}_t=\frac{1}{\kappa}\Bigl(\frac{\sqrt{\alpha_t}}{\beta_t}x_t+\frac{\sqrt{\bar\alpha_{t-1}}}{1-\bar\alpha_{t-1}}x_0\Bigr) =\frac{\sqrt{\bar\alpha_{t-1}}\beta_t}{1-\bar\alpha_t}x_0+\frac{\sqrt{\alpha_t}(1-\bar\alpha_{t-1})}{1-\bar\alpha_t}x_t . μ ~ t = κ 1 ( β t α t x t + 1 − α ˉ t − 1 α ˉ t − 1 x 0 ) = 1 − α ˉ t α ˉ t − 1 β t x 0 + 1 − α ˉ t α t ( 1 − α ˉ t − 1 ) x t .
即 q ( x t − 1 ∣ x t , x 0 ) = N ( μ ~ t , β ~ t I ) q(x_{t-1}\mid x_t,x_0)=\mathcal N(\tilde{\boldsymbol\mu}_t,\tilde\beta_tI) q ( x t − 1 ∣ x t , x 0 ) = N ( μ ~ t , β ~ t I ) ,逆过程是可以精确求的——只是它需要 x 0 x_0 x 0 ,而采样时我们恰好没有 。■ \blacksquare ■
∎
定理 4.5.2 · 简化训练目标(去噪噪声回归)
从 t ∼ U { 1 , … , T } t\sim\mathcal U\{1,\dots,T\} t ∼ U { 1 , … , T } 、x 0 ∼ p data x_0\sim p_{\text{data}} x 0 ∼ p data 、ε ∼ N ( 0 , I ) \varepsilon\sim\mathcal N(0,I) ε ∼ N ( 0 , I ) 、x t = α ˉ t x 0 + 1 − α ˉ t ε x_t=\sqrt{\bar\alpha_t}\,x_0+\sqrt{1-\bar\alpha_t}\,\varepsilon x t = α ˉ t x 0 + 1 − α ˉ t ε 中采样,最小化
L simple = E t , x 0 , ε [ ∥ ε − ε θ ( x t , t ) ∥ 2 ] . \mathcal L_{\text{simple}}=\mathbb E_{t,\,x_0,\,\varepsilon}\Bigl[\bigl\lVert\varepsilon-\varepsilon_\theta(x_t,t)\bigr\rVert^2\Bigr]. L simple = E t , x 0 , ε [ ε − ε θ ( x t , t ) 2 ] .
即:给网络看「加过噪的图」和「当前是第几步 t t t 」,让它把当初加进去的那份噪声 ε \varepsilon ε 猜出来 。它与完整 VLB 只差一个与 t t t 有关的权重:完整下界的每个 L t − 1 L_{t-1} L t − 1 项等价于 β t 2 2 σ t 2 α t ( 1 − α ˉ t ) ∥ ε − ε θ ∥ 2 \dfrac{\beta_t^2}{2\sigma_t^2\alpha_t(1-\bar\alpha_t)}\bigl\lVert\varepsilon-\varepsilon_\theta\bigr\rVert^2 2 σ t 2 α t ( 1 − α ˉ t ) β t 2 ε − ε θ 2 (σ t 2 \sigma_t^2 σ t 2 是反向方差),DDPM 的做法正是把这个权重置为 1 。
推导(从 KL 到噪声 MSE 的三步)
第一步:把 L t − 1 L_{t-1} L t − 1 里两个高斯都写成「以 x 0 , ε x_0,\varepsilon x 0 , ε 为参数」的形式。 真实后验的均值(命题 4.5.1 )把 x 0 = x t − 1 − α ˉ t ε α ˉ t x_0=\dfrac{x_t-\sqrt{1-\bar\alpha_t}\varepsilon}{\sqrt{\bar\alpha_t}} x 0 = α ˉ t x t − 1 − α ˉ t ε 代入,消掉 x 0 x_0 x 0 :
μ ~ t = α ˉ t − 1 β t 1 − α ˉ t ⋅ x t − 1 − α ˉ t ε α ˉ t + α t ( 1 − α ˉ t − 1 ) 1 − α ˉ t x t = 1 α t ( x t − β t 1 − α ˉ t ε ) . \tilde{\boldsymbol\mu}_t=\frac{\sqrt{\bar\alpha_{t-1}}\beta_t}{1-\bar\alpha_t}\cdot\frac{x_t-\sqrt{1-\bar\alpha_t}\varepsilon}{\sqrt{\bar\alpha_t}}+\frac{\sqrt{\alpha_t}(1-\bar\alpha_{t-1})}{1-\bar\alpha_t}x_t =\frac{1}{\sqrt{\alpha_t}}\Bigl(x_t-\frac{\beta_t}{\sqrt{1-\bar\alpha_t}}\,\varepsilon\Bigr). μ ~ t = 1 − α ˉ t α ˉ t − 1 β t ⋅ α ˉ t x t − 1 − α ˉ t ε + 1 − α ˉ t α t ( 1 − α ˉ t − 1 ) x t = α t 1 ( x t − 1 − α ˉ t β t ε ) .
模型的反向均值写成同样的形状(只把 ε \varepsilon ε 换成网络的预测 ε θ ( x t , t ) \varepsilon_\theta(x_t,t) ε θ ( x t , t ) ):
μ θ ( x t , t ) = 1 α t ( x t − β t 1 − α ˉ t ε θ ( x t , t ) ) . \mu_\theta(x_t,t)=\frac{1}{\sqrt{\alpha_t}}\Bigl(x_t-\frac{\beta_t}{\sqrt{1-\bar\alpha_t}}\,\varepsilon_\theta(x_t,t)\Bigr). μ θ ( x t , t ) = α t 1 ( x t − 1 − α ˉ t β t ε θ ( x t , t ) ) .
第二步:两个同方差高斯的 KL 就是均值差的平方。 取 Σ θ = σ t 2 I \Sigma_\theta=\sigma_t^2I Σ θ = σ t 2 I 、真实后验方差 β ~ t I \tilde\beta_tI β ~ t I ;当两者相同(或按固定方差近似)时
K L ( N ( μ θ , σ t 2 I ) ∥ N ( μ ~ t , β ~ t I ) ) = ∥ μ θ − μ ~ t ∥ 2 2 σ t 2 + const = 1 2 σ t 2 ⋅ β t 2 α t ( 1 − α ˉ t ) ∥ ε − ε θ ( x t , t ) ∥ 2 + const . \mathrm{KL}\bigl(\mathcal N(\mu_\theta,\sigma_t^2I)\,\|\,\mathcal N(\tilde{\boldsymbol\mu}_t,\tilde\beta_tI)\bigr)=\frac{\lVert\mu_\theta-\tilde{\boldsymbol\mu}_t\rVert^2}{2\sigma_t^2}+\text{const} =\frac{1}{2\sigma_t^2}\cdot\frac{\beta_t^2}{\alpha_t(1-\bar\alpha_t)}\bigl\lVert\varepsilon-\varepsilon_\theta(x_t,t)\bigr\rVert^2+\text{const}. KL ( N ( μ θ , σ t 2 I ) ∥ N ( μ ~ t , β ~ t I ) ) = 2 σ t 2 ∥ μ θ − μ ~ t ∥ 2 + const = 2 σ t 2 1 ⋅ α t ( 1 − α ˉ t ) β t 2 ε − ε θ ( x t , t ) 2 + const .
第三步:把所有项的权重统一。 于是完整的训练损失是
L V L B = ∑ t = 1 T β t 2 2 σ t 2 α t ( 1 − α ˉ t ) ⏟ = : w t E [ ∥ ε − ε θ ( x t , t ) ∥ 2 ] + const , \mathcal L_{\mathrm{VLB}}=\sum_{t=1}^{T}\underbrace{\frac{\beta_t^2}{2\sigma_t^2\alpha_t(1-\bar\alpha_t)}}_{=:\,w_t}\mathbb E\bigl[\lVert\varepsilon-\varepsilon_\theta(x_t,t)\rVert^2\bigr]+\text{const}, L VLB = t = 1 ∑ T =: w t 2 σ t 2 α t ( 1 − α ˉ t ) β t 2 E [ ∥ ε − ε θ ( x t , t ) ∥ 2 ] + const ,
其中 w t w_t w t 在 t t t 小时很小(β t 2 \beta_t^2 β t 2 小)、在 t t t 大时较大。DDPM 的实验发现:把 w t w_t w t 全部置为 1 (即 L simple \mathcal L_{\text{simple}} L simple )不仅能训练,而且样本质量明显更好——因为它在训练早期把注意力从「几乎无噪声的 t t t 」(w t w_t w t 极小、几乎不提供信号)那里挪开,转而均摊到所有噪声水平上。代价是它不再严格是似然的下界 :高噪声步被相对放大,低噪声步被相对缩小。
顺带一个漂亮结论(去噪 = 得分) :由 Tweedie 公式,最优的噪声预测器满足
E [ ε ∣ x t ] = ∇ x t log q ( x t ∣ x 0 ) ⟹ ∇ x t log p t ( x t ) = − 1 1 − α ˉ t E [ ε ∣ x t ] . \mathbb E[\varepsilon\mid x_t]=\nabla_{x_t}\log q(x_t\mid x_0)\quad\Longrightarrow\quad \nabla_{x_t}\log p_t(x_t)=-\frac{1}{\sqrt{1-\bar\alpha_t}}\,\mathbb E\bigl[\varepsilon\mid x_t\bigr]. E [ ε ∣ x t ] = ∇ x t log q ( x t ∣ x 0 ) ⟹ ∇ x t log p t ( x t ) = − 1 − α ˉ t 1 E [ ε ∣ x t ] .
也就是说,「预测噪声」等价于「估计对数密度的梯度(得分)」 ——扩散与 4.2.4 提到的去噪 AE、以及 4.1 的得分—能量路线在这里合流。■ \blacksquare ■
∎
「预测噪声」和「预测原图」是同一件事的两种参数化
三种参数化在数学上互相等价(都只是同一条件的重新参数化):
参数化
网络输出
与其他两个的关系
噪声预测 ε θ \varepsilon_\theta ε θ
ε ^ \hat\varepsilon ε ^
x ^ 0 = x t − 1 − α ˉ t ε ^ α ˉ t \hat x_0=\dfrac{x_t-\sqrt{1-\bar\alpha_t}\hat\varepsilon}{\sqrt{\bar\alpha_t}} x ^ 0 = α ˉ t x t − 1 − α ˉ t ε ^
原图预测 x 0 , θ x_{0,\theta} x 0 , θ
x ^ 0 \hat x_0 x ^ 0
ε ^ = x t − α ˉ t x ^ 0 1 − α ˉ t \hat\varepsilon=\dfrac{x_t-\sqrt{\bar\alpha_t}\hat x_0}{\sqrt{1-\bar\alpha_t}} ε ^ = 1 − α ˉ t x t − α ˉ t x ^ 0
速度预测 v θ v_\theta v θ
v ^ \hat v v ^
v ^ = α ˉ t ε ^ − 1 − α ˉ t x ^ 0 \hat v=\sqrt{\bar\alpha_t}\hat\varepsilon-\sqrt{1-\bar\alpha_t}\hat x_0 v ^ = α ˉ t ε ^ − 1 − α ˉ t x ^ 0 (( x 0 , ε ) (x_0,\varepsilon) ( x 0 , ε ) 坐标系里的「旋转」)
为什么工程上偏爱噪声预测? 因为在任意 t t t 上,ε \varepsilon ε 的边际分布始终是标准正态(尺度稳定),而 x 0 x_0 x 0 的量级依赖数据。用固定的 MSE 去回归一个尺度稳定 的目标,比回归尺度随 t t t 剧烈变化的目标更稳定——不需要按 t t t 调损失权重。速度预测(v v v -param)在极端信噪比下更稳,是后续一些工作(如 4.6 要讲的整流流近亲)的常用选择。
DDPM 采样(随机、T T T 步)
训练好 ε θ \varepsilon_\theta ε θ 后,采样就是一个固定步数的迭代 :先从纯噪声出发 x T ∼ N ( 0 , I ) x_T\sim\mathcal N(0,I) x T ∼ N ( 0 , I ) ,然后对 t = T , … , 1 t=T,\dots,1 t = T , … , 1 依次
x t − 1 = 1 α t ( x t − 1 − α t 1 − α ˉ t ε θ ( x t , t ) ) + σ t z , z ∼ N ( 0 , I ) ( t > 1 ) , z = 0 ( t = 1 ) . x_{t-1}=\frac{1}{\sqrt{\alpha_t}}\Bigl(x_t-\frac{1-\alpha_t}{\sqrt{1-\bar\alpha_t}}\,\varepsilon_\theta(x_t,t)\Bigr)+\sigma_t\,z,\qquad z\sim\mathcal N(0,I)\ (t\gt1),\quad z=0\ (t=1). x t − 1 = α t 1 ( x t − 1 − α ˉ t 1 − α t ε θ ( x t , t ) ) + σ t z , z ∼ N ( 0 , I ) ( t > 1 ) , z = 0 ( t = 1 ) .
每一步都做两件事:用网络估计当前噪声并减掉一部分 (把样本往高密度区推),再注入一点点新噪声 (σ t \sigma_t σ t 项,理论取 σ t 2 = β ~ t \sigma_t^2=\tilde\beta_t σ t 2 = β ~ t 或 β t \beta_t β t ;t = 1 t=1 t = 1 时不再加,避免最后一步破坏细节)。
DDIM 采样(确定性、可少步)
DDIM 用一族非马尔可夫 的前向过程作桥梁:
q σ ( x t − 1 ∣ x t , x 0 ) = N ( α ˉ t − 1 x 0 + 1 − α ˉ t − 1 − σ t 2 ⋅ x t − α ˉ t x 0 1 − α ˉ t , σ t 2 I ) , q_\sigma(x_{t-1}\mid x_t,x_0)=\mathcal N\Bigl(\sqrt{\bar\alpha_{t-1}}x_0+\sqrt{1-\bar\alpha_{t-1}-\sigma_t^2}\cdot\frac{x_t-\sqrt{\bar\alpha_t}x_0}{\sqrt{1-\bar\alpha_t}},\ \sigma_t^2I\Bigr), q σ ( x t − 1 ∣ x t , x 0 ) = N ( α ˉ t − 1 x 0 + 1 − α ˉ t − 1 − σ t 2 ⋅ 1 − α ˉ t x t − α ˉ t x 0 , σ t 2 I ) ,
它保持所有边际 q ( x t ∣ x 0 ) q(x_t\mid x_0) q ( x t ∣ x 0 ) 不变(因此可以用同一个训练好的 ε θ \varepsilon_\theta ε θ ),只改变「步与步之间的连接方式」。取 σ t = 0 \sigma_t=0 σ t = 0 得到确定性 采样:
x t − 1 = α ˉ t − 1 x ^ 0 ( x t ) + 1 − α ˉ t − 1 ε ^ ( x t ) , x ^ 0 = x t − 1 − α ˉ t ε θ ( x t , t ) α ˉ t , ε ^ = ε θ ( x t , t ) . x_{t-1}=\sqrt{\bar\alpha_{t-1}}\,\hat x_0(x_t)+\sqrt{1-\bar\alpha_{t-1}}\,\hat\varepsilon(x_t),\qquad \hat x_0=\frac{x_t-\sqrt{1-\bar\alpha_t}\,\varepsilon_\theta(x_t,t)}{\sqrt{\bar\alpha_t}},\quad \hat\varepsilon=\varepsilon_\theta(x_t,t). x t − 1 = α ˉ t − 1 x ^ 0 ( x t ) + 1 − α ˉ t − 1 ε ^ ( x t ) , x ^ 0 = α ˉ t x t − 1 − α ˉ t ε θ ( x t , t ) , ε ^ = ε θ ( x t , t ) .
实践的关键:可以把 t t t 的取值换成任意递增子序列 (如 1000 1000 1000 步里挑 50 50 50 步),用同样的公式跳着走。这就是「T T T 从上千压到几十」的来源。
DDIM 为什么能少步而 DDPM 不能
DDPM 的链是马尔可夫的 :x t − 1 x_{t-1} x t − 1 只依赖 x t x_t x t ,两者之间的「距离」固定为一个很小的步长。若直接跳过中间的步(从 t t t 接到 t − k t-k t − k ),加噪链与去噪链的统计就对不上,样本崩坏。
DDIM 把「步」重新参数化成一条连续路径上的点 :由 x ^ 0 \hat x_0 x ^ 0 与 ε ^ \hat\varepsilon ε ^ 这两个量可以算出路径上任意位置 t ′ t' t ′ 的样本(下面这个式子就是全部秘密):
x t ′ = α ˉ t ′ x ^ 0 ⏟ 信号部分 + 1 − α ˉ t ′ ε ^ ⏟ 噪声部分 , 对任意 t ′ < t . x_{t'}=\underbrace{\sqrt{\bar\alpha_{t'}}\,\hat x_0}_{\text{信号部分}}+\underbrace{\sqrt{1-\bar\alpha_{t'}}\,\hat\varepsilon}_{\text{噪声部分}},\qquad \text{对任意 } t'\lt t . x t ′ = 信号部分 α ˉ t ′ x ^ 0 + 噪声部分 1 − α ˉ t ′ ε ^ , 对任意 t ′ < t .
只要 t ′ t' t ′ 在 [ 0 , t ] [0,t] [ 0 , t ] 之间,这样外推出来的 x t ′ x_{t'} x t ′ 就是自洽的 ——因为它只是把同一个 ( x ^ 0 , ε ^ ) (\hat x_0,\hat\varepsilon) ( x ^ 0 , ε ^ ) 分解在另一个信噪比上。于是「跳步」不再破坏结构,只是把路径采样得更稀疏。
确定性带来的额外好处 :同一起点 x T x_T x T 始终给出同一个样本(可复现);且因为确定性映射在数学上对应一个 ODE 的欧拉离散,才出现了「用更高阶 ODE 求解器加速」这一整条技术线(4.6 的整流流会把它推到极致)。
代价 :σ t = 0 \sigma_t=0 σ t = 0 时样本多样性略降(少了那一点随机注入),且更依赖 x ^ 0 \hat x_0 x ^ 0 的准确度——步数太少时,x ^ 0 \hat x_0 x ^ 0 的单次估计误差会被放大成可见的失真 。这是在 10 10 10 步、20 20 20 步、50 50 50 步之间做取舍的核心矛盾。
采样步数—质量—成本对照(量级示意,用于建立方向感)
下表给出「同一个训练好的模型、不同采样器 / 步数」的典型关系(具体数字随数据与模型而变,此表只描述趋势 ):
采样器
网络前向次数
随机性
质量趋势
成本(相对 T = 1000 T=1000 T = 1000 的 DDPM)
DDPM
T T T (常 1000)
随机
基线质量
1 × 1\times 1 ×
DDIM
50 ∼ 100 50\sim100 50 ∼ 100
确定性
与 DDPM 相当或更好(同样步数下)
0.05 ∼ 0.1 × 0.05\sim0.1\times 0.05 ∼ 0.1 ×
DDIM
10 ∼ 20 10\sim20 10 ∼ 20
确定性
细节开始退化(糊、纹理丢失)
0.01 ∼ 0.02 × 0.01\sim0.02\times 0.01 ∼ 0.02 ×
蒸馏 / 一致性模型(4.6 )
1 ∼ 4 1\sim4 1 ∼ 4
随机或确定性
少步质量明显优于同步数 DDIM
0.001 ∼ 0.004 × 0.001\sim0.004\times 0.001 ∼ 0.004 ×
整流流重流化后(4.6 )
1 ∼ 8 1\sim8 1 ∼ 8
确定性
直线化后少步误差小
同上量级
读表方式 :这张表的行间差异不是「谁更好」,而是「把训练成本挪到哪」。一致性模型与蒸馏要额外训练一个学生网络,换来推理时的常数级前向;DDIM 不改训练,只用更聪明的路径参数化换步数。先决定推理预算(延迟 / 吞吐),再决定用哪一档。
定义 4.5.3 · 无分类器引导(classifier-free guidance, CFG)
把条件 c c c (文本、类别、动作)作为额外输入喂给网络,得到条件噪声预测 ε θ ( x t , t , c ) \varepsilon_\theta(x_t,t,c) ε θ ( x t , t , c ) 。训练时以一定概率把 c c c 置为空标记 ∅ \varnothing ∅ (如 10 % 10\% 10% 的样本),使同一个网络同时学会条件与无条件两个预测 。采样时用两者之差外推:
ε ~ θ ( x t , t , c ) = ε θ ( x t , t , ∅ ) + w ( ε θ ( x t , t , c ) − ε θ ( x t , t , ∅ ) ) , \tilde\varepsilon_\theta(x_t,t,c)=\varepsilon_\theta(x_t,t,\varnothing)+w\bigl(\varepsilon_\theta(x_t,t,c)-\varepsilon_\theta(x_t,t,\varnothing)\bigr), ε ~ θ ( x t , t , c ) = ε θ ( x t , t , ∅ ) + w ( ε θ ( x t , t , c ) − ε θ ( x t , t , ∅ ) ) ,
其中 w ≥ 0 w\ge0 w ≥ 0 是引导尺度 。w = 1 w=1 w = 1 回到普通条件采样;w > 1 w\gt1 w > 1 放大「条件方向」,样本更贴合提示;w w w 过大时多样性下降、画面过饱和 / 结构僵化。
w w w 的作用:沿着「条件的方向」多走几步
从贝叶斯公式出发可以看清它在做什么。真实的条件得分满足
∇ x t log p ( x t ∣ c ) = ∇ x t log p ( x t ) + ∇ x t log p ( c ∣ x t ) , \nabla_{x_t}\log p(x_t\mid c)=\nabla_{x_t}\log p(x_t)+\nabla_{x_t}\log p(c\mid x_t), ∇ x t log p ( x t ∣ c ) = ∇ x t log p ( x t ) + ∇ x t log p ( c ∣ x t ) ,
而 CFG 的那条差 ε θ ( ⋅ , c ) − ε θ ( ⋅ , ∅ ) \varepsilon_\theta(\cdot,c)-\varepsilon_\theta(\cdot,\varnothing) ε θ ( ⋅ , c ) − ε θ ( ⋅ , ∅ ) (乘上 − 1 1 − α ˉ t -\frac{1}{\sqrt{1-\bar\alpha_t}} − 1 − α ˉ t 1 )正是 ∇ x t log p ( c ∣ x t ) \nabla_{x_t}\log p(c\mid x_t) ∇ x t log p ( c ∣ x t ) 的一个无需分类器的估计 ——它把「c c c 指向哪个方向」直接算了出来。于是 CFG 的更新相当于
∇ log p ( x t ) + w ∇ log p ( c ∣ x t ) \nabla\log p(x_t)+w\nabla\log p(c\mid x_t) ∇ log p ( x t ) + w ∇ log p ( c ∣ x t )
在采样步上做外推:先沿着「像数据」的方向走,再额外沿「像 c c c 」的方向多走 ( w − 1 ) (w-1) ( w − 1 ) 倍 。这就是「w w w 越大越听话」的机制来源。
它为什么是一个「取舍旋钮」而不是「越大越好」 :w w w 放大的是条件方向,同时也放大了该方向上的一切误差。w w w 过大时,采样轨迹被推到条件似然极高的狭窄区域(那里数据似然很低),于是出现常见的三种退化——色彩过饱和 / 对比度异常、构图僵化重复、多样性显著下降 。工程上的经验做法是固定一组提示词,扫 w ∈ { 1 , 3 , 5 , 7.5 , 12 } w\in\{1,3,5,7.5,12\} w ∈ { 1 , 3 , 5 , 7.5 , 12 } 看「对齐度—多样性」曲线的拐点(具体最优值随模型与数据而变,需实测 )。
与 4.3.7 CVAE 的对照 :CVAE 把条件写进网络结构(q ϕ ( z ∣ x , c ) q_\phi(z\mid\boldsymbol x,c) q ϕ ( z ∣ x , c ) 、p θ ( x ∣ z , c ) p_\theta(\boldsymbol x\mid z,c) p θ ( x ∣ z , c ) ),CFG 则不加结构、只改采样公式——代价是训练时要随机丢条件(否则学不出无条件分支),换来推理时可自由调节引导强度。
CFG 与「分类器引导」的区别,以及为什么后者被淘汰
早期的分类器引导 (classifier guidance)是另训一个噪声分类器 p ϕ ( c ∣ x t ) p_\phi(c\mid x_t) p ϕ ( c ∣ x t ) ,用它的梯度 ∇ x t log p ϕ ( c ∣ x t ) \nabla_{x_t}\log p_\phi(c\mid x_t) ∇ x t log p ϕ ( c ∣ x t ) 来推样本。它有效,但有两个硬伤:① 分类器必须在每个噪声水平 上都能工作(要额外训练一整套噪声条件分类器);② 训练分类器需要带标签数据,而生成模型的大规模优势恰恰来自无标签 / 弱标签数据。CFG 用「同一网络的条件与无条件之差」替代了分类器,去掉了这两个约束——这也是它成为事实标准的直接原因 。
代价也有:训练时必须随机丢条件 ,因此模型有一部分容量被花在「无条件生成」上;且 w w w 的最优点依赖任务,没有普适值。
以 64 × 64 × 3 64\times64\times3 64 × 64 × 3 图像的像素空间扩散为例(批 B = 16 B=16 B = 16 ):
量 形状 说明
x t x_t x t 16 × 3 × 64 × 64 16\times3\times64\times64 16 × 3 × 64 × 64 与数据同形状;扩散在像素空间 直接操作(潜空间版见 [4.6](sec46.md))
t t t 16 16 16 (标量时间步)经正弦位置编码后注入网络(与 Transformer 的位置编码同族)
条件 c c c 16 × L × d c 16\times L\times d_c 16 × L × d c 文本 token 序列;L L L 为提示长度
U-Net 编码器各级 16 × 64 × 32 × 32 → 16 × 128 × 16 × 16 → 16 × 256 × 8 × 8 16\times64\times32\times32\ \to\ 16\times128\times16\times16\ \to\ 16\times256\times8\times8 16 × 64 × 32 × 32 → 16 × 128 × 16 × 16 → 16 × 256 × 8 × 8 每级「残差块 + 下采样」;通道翻倍、空间减半
瓶颈 + 注意力 16 × 512 × 4 × 4 16\times512\times4\times4 16 × 512 × 4 × 4 条件通过交叉注意力注入
U-Net 解码器各级 与编码器镜像(含跳连) 跳连保留高频细节——这是它比纯编码—解码强的关键
输出 ε θ \varepsilon_\theta ε θ 16 × 3 × 64 × 64 16\times3\times64\times64 16 × 3 × 64 × 64 与输入 x t x_t x t 同形状 (噪声预测是逐像素的)
训练时每步网络前向次数 1 1 1 随机抽一个 t t t ,一次前向、一次反向
采样时网络前向次数 S S S (DDPM 时 S = T S=T S = T )CFG 时每步 2 次 前向(条件 + 无条件)或 1 次批量前向
显存与算力的第一遍估算
三条足以做首轮决策的算术:
训练显存 ≈ 激活值(与「图像面积 × 通道 × 批大小 × 层数」成正比)+ 参数与优化器状态。像素空间扩散在 64 × 64 64\times64 64 × 64 上尚可,到 1024 × 1024 1024\times1024 1024 × 1024 时激活显存按面积增长 256 256 256 倍——这是 4.6 的 LDM 出现的最直接经济原因(潜空间把空间尺寸降 8 8 8 倍,即面积降 64 64 64 倍)。
采样总前向次数 = S × ( CFG 是否为 2 ) × ( 样本数 ) =S\times(\text{CFG 是否为 2})\times(\text{样本数}) = S × ( CFG 是否为 2 ) × ( 样本数 ) 。1000 1000 1000 步 × 无 CFG × 单张图 = 1000 1000 1000 次前向;这是「扩散比 GAN 慢三个数量级」的由来,也是所有少步方法要解决的问题。
推理成本与样本质量不是线性关系 :从 1000 1000 1000 步降到 100 100 100 步(DDIM)质量几乎不变,从 20 20 20 步降到 4 4 4 步则必须换模型(蒸馏 / 一致性 / 整流流),而不是继续压步数。
import torch, torch.nn as nn
def make_schedule(T=1000, beta_start=1e-4, beta_end=0.02):
"""线性噪声调度:返回前向计算所需的五个常量张量。"""
betas = torch.linspace(beta_start, beta_end, T)
alphas = 1.0 - betas
alphas_cumprod = torch.cumprod(alphas, dim=0) # ᾱ_t
return dict(
betas=betas,
alphas=alphas,
alphas_cumprod=alphas_cumprod,
sqrt_alphas_cumprod=alphas_cumprod.sqrt(), # √ᾱ_t:信号权重
sqrt_one_minus=torch.sqrt(1.0 - alphas_cumprod), # √(1-ᾱ_t):噪声权重
)
def q_sample(x0, t, sch):
"""定理 4.5.1 的闭式:一步从 x0 得到 x_t(不需要回放整条链)。"""
a = sch["sqrt_alphas_cumprod"][t].view(-1, 1, 1, 1) # 按样本广播
b = sch["sqrt_one_minus"][t].view(-1, 1, 1, 1)
eps = torch.randn_like(x0) # 标准正态噪声(尺度稳定 → 固定 MSE 即可)
return a * x0 + b * eps, eps # 返回 eps 作为监督目标
def train_step(model, x0, sch, T=1000, p_uncond=0.1, cond=None):
"""一次扩散训练步:随机抽 t → 加噪 → 预测噪声 → MSE。"""
B = x0.shape[0]
t = torch.randint(0, T, (B,), device=x0.device)
x_t, eps = q_sample(x0, t, sch)
if cond is not None:
# CFG 训练:以 p_uncond 的概率把条件置空,让同一网络学会无条件分支
mask = (torch.rand(B, device=x0.device) < p_uncond).view(-1, 1, 1)
cond_in = torch.where(mask, torch.zeros_like(cond), cond)
else:
cond_in = None
eps_pred = model(x_t, t, cond_in) # 输出与 x_t 同形状
return nn.functional.mse_loss(eps_pred, eps) # 这就是 L_simple
@torch.no_grad()
def ddpm_sample(model, sch, shape, T=1000, guidance_w=1.0, cond=None):
"""DDPM 采样(随机)。CFG:每步调用两次网络(条件 / 无条件)并按式外推。"""
x = torch.randn(shape)
betas, alphas, ac = sch["betas"], sch["alphas"], sch["alphas_cumprod"]
for t in reversed(range(T)):
tt = torch.full((shape[0],), t, dtype=torch.long)
if cond is not None and guidance_w != 1.0:
e_u = model(x, tt, None) # 无条件预测
e_c = model(x, tt, cond) # 条件预测
eps = e_u + guidance_w * (e_c - e_u) # CFG(定义 4.5.3)
else:
eps = model(x, tt, cond)
# 反向均值:μ_θ = (1/√α_t)(x_t − (1−α_t)/√(1−ᾱ_t) · ε_θ)
mean = (x - (1 - alphas[t]) / sch["sqrt_one_minus"][t] * eps) / alphas[t].sqrt()
if t > 0:
var = betas[t] # 理论取 β_t 或 β̃_t;两者常被混用
x = mean + var.sqrt() * torch.randn_like(x) # 注入新噪声(最后一步不加)
else:
x = mean
return x
@torch.no_grad()
def ddim_sample(model, sch, shape, steps=50, T=1000, eta=0.0, cond=None):
"""DDIM 采样(确定性,eta=0):在任意递增子序列上跳着走。"""
ac = sch["alphas_cumprod"]
ts = torch.linspace(T - 1, 0, steps).long() # 从 T-1 递减到 0 的子序列
x = torch.randn(shape)
ts_next = torch.cat([ts[1:], torch.tensor([-1])]) # 每步的「前一时刻」
for t, t_prev in zip(ts, ts_next):
tt = torch.full((shape[0],), int(t), dtype=torch.long)
eps = model(x, tt, cond)
x0_hat = (x - (1 - ac[t]).sqrt() * eps) / ac[t].sqrt() # 估计的原图
x0_hat = x0_hat.clamp(-1, 1) # 数值稳定:限制在数据范围
if int(t_prev) >= 0:
a_prev, a_cur = ac[t_prev], ac[t]
# x_{t'} = √ᾱ_{t'} · x̂₀ + √(1 − ᾱ_{t'}) · ε̂ ,η=0 时为确定性路径
x = a_prev.sqrt() * x0_hat + torch.sqrt(1 - a_prev) * eps
else:
x = x0_hat
return x
本节五个高频误解
「扩散模型采样一步到位」 :DDPM 需要上百到上千步迭代去噪,单步从纯噪声直接预测样本不可行(那相当于要求网络完成整条链的复合映射)。想加速要用 DDIM、蒸馏或潜空间扩散(4.6 ),而不是「一步生成」。
「训练与采样可以各自用不同的噪声调度 / 数值范围」 :β t \beta_t β t 、α ˉ t \bar\alpha_t α ˉ t 与像素归一化(例如归到 [ − 1 , 1 ] [-1,1] [ − 1 , 1 ] )必须训练与推理一致 ,否则加噪/去噪的统计对不上,采样结果直接崩坏。这是新手最常踩的一脚,而且症状很剧烈(输出全灰噪声)。
「L simple \mathcal L_{\text{simple}} L simple 就是变分下界」 :它是把下界各项权重置为 1 后的加权版本 (定理 4.5.2 )。它的样本质量更好,但不再是似然下界 ——若你要报似然数字(如 bits/dim),必须用完整的 w t w_t w t 重新计算。
「CFG 的 w w w 越大越好」 :w w w 放大的是条件方向连同其误差,过大时多样性下降、过饱和。而且 w = 1 w=1 w = 1 并不是「没有引导」的默认值——很多模型的甜点区在 3 ∼ 8 3\sim8 3 ∼ 8 (需实测),写代码时必须把它当超参而不是常数。
「DDIM 是另一个模型」 :DDIM 只改了采样时的路径参数化 (非马尔可夫桥梁 + 跳步),前向边际 q ( x t ∣ x 0 ) q(x_t\mid x_0) q ( x t ∣ x 0 ) 完全不变,因此可以复用同一个训练好的 ε θ \varepsilon_\theta ε θ 。这也是它在发布后立刻被广泛采用的原因:零训练成本换 20 ∼ 50 20\sim50 20 ∼ 50 倍的采样加速。
即时自测 · 4.5
Q1 写出前向过程的单步形式与一步到位形式,并说明后者为什么让训练成本与 T T T 无关。
Q2 用一句话说明 L T L_T L T 、L t − 1 L_{t-1} L t − 1 、L 0 L_0 L 0 各自在约束什么;哪个项占主导?
Q3 给定 T = 3 T=3 T = 3 、β 1 = 0.1 \beta_1=0.1 β 1 = 0.1 、β 2 = 0.2 \beta_2=0.2 β 2 = 0.2 、β 3 = 0.4 \beta_3=0.4 β 3 = 0.4 ,求 α ˉ 3 \bar\alpha_3 α ˉ 3 与 x 3 x_3 x 3 中信号 / 噪声的权重。
Q4 DDIM 为什么可以跳步而 DDPM 不能?跳步的代价是什么?
Q5 CFG 中 w = 1 w=1 w = 1 与 w = 7.5 w=7.5 w = 7.5 的样本会有什么可观察的差别?为什么会出现这种差别?
参考要点
Q1 单步:q ( x t ∣ x t − 1 ) = N ( 1 − β t x t − 1 , β t I ) q(x_t\mid x_{t-1})=\mathcal N(\sqrt{1-\beta_t}x_{t-1},\beta_tI) q ( x t ∣ x t − 1 ) = N ( 1 − β t x t − 1 , β t I ) 。一步到位:x t = α ˉ t x 0 + 1 − α ˉ t ε x_t=\sqrt{\bar\alpha_t}x_0+\sqrt{1-\bar\alpha_t}\varepsilon x t = α ˉ t x 0 + 1 − α ˉ t ε (α ˉ t = ∏ s ≤ t ( 1 − β s ) \bar\alpha_t=\prod_{s\le t}(1-\beta_s) α ˉ t = ∏ s ≤ t ( 1 − β s ) )。因为可以从 x 0 x_0 x 0 直接采样任意 t t t 的 x t x_t x t ,训练时只需「随机抽一个 t t t 、一次加噪、一次预测、一次 MSE」,不需要前向链的递推,所以每步成本是 O ( 1 ) O(1) O ( 1 ) 且与 T T T 无关。
Q2 L T L_T L T 约束「前向链终点与先验 N ( 0 , I ) \mathcal N(0,I) N ( 0 , I ) 的匹配」(无可学参数,α ˉ T → 0 \bar\alpha_T\to0 α ˉ T → 0 时为常数);L t − 1 L_{t-1} L t − 1 约束「反向分布逼近真实后验 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}\mid x_t,x_0) q ( x t − 1 ∣ x t , x 0 ) 」(主项 ,承担绝大部分贡献);L 0 L_0 L 0 是最后一步的像素级似然(log p θ ( x 0 ∣ x 1 ) \log p_\theta(x_0\mid x_1) log p θ ( x 0 ∣ x 1 ) )。主项是 L t − 1 L_{t-1} L t − 1 (t = 2 , … , T t=2,\dots,T t = 2 , … , T 的和)。
Q3 α 1 = 0.9 , α 2 = 0.8 , α 3 = 0.6 \alpha_1=0.9,\alpha_2=0.8,\alpha_3=0.6 α 1 = 0.9 , α 2 = 0.8 , α 3 = 0.6 ,故 α ˉ 3 = 0.9 × 0.8 × 0.6 = 0.432 \bar\alpha_3=0.9\times0.8\times0.6=0.432 α ˉ 3 = 0.9 × 0.8 × 0.6 = 0.432 。信号权重 0.432 ≈ 0.657 \sqrt{0.432}\approx0.657 0.432 ≈ 0.657 ,噪声权重 1 − 0.432 = 0.568 ≈ 0.754 \sqrt{1-0.432}=\sqrt{0.568}\approx0.754 1 − 0.432 = 0.568 ≈ 0.754 。核对:0.65 7 2 + 0.75 4 2 = 0.432 + 0.568 = 1 0.657^2+0.754^2=0.432+0.568=1 0.65 7 2 + 0.75 4 2 = 0.432 + 0.568 = 1 ✓。
Q4 DDPM 的链是马尔可夫的,步长固定,跳步会让加噪链与去噪链的统计失配;DDIM 用非马尔可夫桥梁把「步」重新参数化成同一路径上的点,由 ( x ^ 0 , ε ^ ) (\hat x_0,\hat\varepsilon) ( x ^ 0 , ε ^ ) 可以外推任意 t ′ t' t ′ 处的样本 x t ′ = α ˉ t ′ x ^ 0 + 1 − α ˉ t ′ ε ^ x_{t'}=\sqrt{\bar\alpha_{t'}}\hat x_0+\sqrt{1-\bar\alpha_{t'}}\hat\varepsilon x t ′ = α ˉ t ′ x ^ 0 + 1 − α ˉ t ′ ε ^ ,因此跳步仍自洽。代价:η = 0 \eta=0 η = 0 时采样确定性、多样性略降;步数过少时 x ^ 0 \hat x_0 x ^ 0 的单次估计误差被放大成可见失真。
Q5 w = 1 w=1 w = 1 :普通条件采样,样本多样、与提示的贴合度一般。w = 7.5 w=7.5 w = 7.5 :更贴合提示、对比度与饱和度更高、同一提示下的样本差异变小(多样性下降),极端情况下构图僵化或出现重复纹理。原因:w w w 放大的是 ∇ log p ( c ∣ x t ) \nabla\log p(c\mid x_t) ∇ log p ( c ∣ x t ) 这一「条件方向」连同其误差,把轨迹推向条件似然高但数据似然低的狭窄区域。
延伸阅读
Sohl-Dickstein et al., Deep Unsupervised Learning using Nonequilibrium Thermodynamics (2015,arXiv:1503.03585)——扩散思想的原始论文(从非平衡热力学类比而来),读它可以看清「前向破坏 / 反向恢复」这一构想的来源。
Ho, Jain & Abbeel, Denoising Diffusion Probabilistic Models (2020,arXiv:2006.11239)——DDPM 现代形式;本节 4.5.2 、4.5.3 的推导与它附录 A 的写法一致,值得对照。
Song, Meng & Ermon, Denoising Diffusion Implicit Models (2020,arXiv:2010.02502)——DDIM 原始论文;非马尔可夫桥梁与跳步采样都在其第 4 节。
Song et al., Score-Based Generative Modeling through Stochastic Differential Equations (2020,arXiv:2011.13456)——把离散 t t t 推广到连续 SDE,统一了「去噪」与「得分匹配」两条线;4.6 的整流流与一致性模型都建立在这个连续时间视角上。
Ho & Salimans, Classifier-Free Diffusion Guidance (2022,arXiv:2207.12598)——CFG 原始论文(含 w w w 的消融实验)。
Dhariwal & Nichol, Diffusion Models Beat GANs on Image Synthesis (2021,arXiv:2105.05233)——分类器引导与 U-Net 结构改进,是「扩散质量超越 GAN」的转折点论文。
Nichol & Dhariwal, Improved Denoising Diffusion Probabilistic Models (2021,arXiv:2102.09672)——余弦噪声调度与「让网络学习方差」的系统实验(本节形状表里 Σ θ \Sigma_\theta Σ θ 的实践依据)。
本节小结 :扩散把生成拆成「固定的加噪链 + 要学的去噪链」。前向有闭式 x t = α ˉ t x 0 + 1 − α ˉ t ε x_t=\sqrt{\bar\alpha_t}x_0+\sqrt{1-\bar\alpha_t}\varepsilon x t = α ˉ t x 0 + 1 − α ˉ t ε (定理 4.5.1 ),因此训练成本与 T T T 无关;反向过程通过变分下界训练,下界的主项是「反向分布逼近真实后验 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}\mid x_t,x_0) q ( x t − 1 ∣ x t , x 0 ) 」,把权重统一后化简为预测所加噪声的 MSE (定理 4.5.2 ),而这个任务在数学上等价于估计对数密度的梯度(去噪 = 得分)。采样有两条路线:DDPM 的随机 T T T 步,与 DDIM 的确定性可跳步(4.5.4 )。条件生成用 CFG:训练时随机丢条件、采样时用「条件 − 无条件」的差外推,w w w 是「贴合度 vs 多样性」的旋钮。结构上,扩散 = 编码器固定且分层、解码器分 T T T 步的 VAE——这也解释了它与 4.2.4 去噪 AE、4.1 得分路线的关系。
扩散唯一的短板是采样步数。下一节处理三件事:把扩散搬到 VAE 潜空间里 (省算力)、用 Transformer 替换 U-Net (吃到架构红利)、把「多步去噪」压缩成一步或几步 (一致性模型与整流流)。