博客深入
什么是扩散模型?(Lil'Log 扩散模型详解)
Lil'Log 博客上的一篇长文,系统讲解扩散模型:前向扩散过程、与随机梯度 Langevin 动力学的联系、反向扩散过程、训练损失的参数化与化简、与噪声条件得分网络(NCSN)的关联、β_t 与反向过程方差的参数化,以及分类器引导和无分类器引导的条件生成、采样加速(蒸馏、一致性模型)、潜变量空间,并设有模型架构与要点小结章节。文章自 2021 年发布后多次更新,陆续补充了 GLIDE、unCLIP、Imagen、潜在扩散模型和渐进蒸馏等内容,开头还对比了 GAN、VAE、流模型等生成模型的局限。适合有深度学习基础、想了解扩散模型原理与推导的读者阅读。
- 分级
- 值得看
- 所属主题
- 扩散与图像生成
- 收录时间
- 2026-10-29
中文精读
原文约 9,587 词 · 24 节
引言:扩散模型的定位
- 文章先回顾已有的三类生成模型:GAN、VAE 和基于流的模型(flow-based models)。三者在高质量样本生成上都很成功,但各有局限。
- GAN 因对抗训练而存在训练可能不稳定、生成多样性不足的问题;VAE 依赖替代损失(surrogate loss);流模型必须用专门的网络结构构造可逆变换。
- 扩散模型受非平衡热力学启发:定义一条马尔可夫链,逐步给数据加随机噪声,再学习逆转这一过程,从噪声重建样本。
- 与 VAE 和流模型不同,扩散模型按固定流程学习,且隐变量维度很高,与原数据维度相同。
什么是扩散模型
- 文章列举了思路相似的三类扩散式生成模型:扩散概率模型(diffusion probabilistic models,Sohl-Dickstein 等,2015)、噪声条件分数网络(NCSN,Yang & Ermon,2019)和去噪扩散概率模型(DDPM,Ho 等,2020)。
前向扩散过程
- 从真实数据分布采一个样本,在 T 步中逐步加入少量高斯噪声,得到带噪序列 x_1,…,x_T;每步步长由方差表(variance schedule)β_t ∈ (0,1) 控制。
- 每一步转移为高斯分布,均值为 √(1−β_t)·x_{t−1}、方差为 β_t·I,整条链是马尔可夫链;t 越大,样本可辨识的特征丢失越多,T 趋于无穷时 x_T 等价于各向同性高斯分布。
- 利用重参数化技巧(reparameterization trick),可在任意时刻 t 以闭式形式直接采样 x_t:q(x_t|x_0) 是均值为 √ᾱ_t·x_0、方差为 (1−ᾱ_t)I 的高斯分布。
- 两个独立高斯噪声合并后仍是高斯,方差相加,因此多步累积的噪声可以合并为单一噪声项;记 α_t = 1−β_t,ᾱ_t 为 α_1…α_t 的连乘。
- 样本越噪时可以承受越大的更新步长,所以通常取 β_1 < β_2 < … < β_T,于是 ᾱ_1 > … > ᾱ_T。
pythonq(x_t | x_{t-1}) = N(x_t; sqrt(1 - beta_t) x_{t-1}, beta_t I) q(x_{1:T} | x_0) = prod_{t=1}^{T} q(x_t | x_{t-1}) x_t = sqrt(alpha_t) x_{t-1} + sqrt(1 - alpha_t) eps_{t-1} = sqrt(alpha_t alpha_{t-1}) x_{t-2} + sqrt(1 - alpha_t alpha_{t-1}) eps_bar_{t-2} = ... = sqrt(alpha_bar_t) x_0 + sqrt(1 - alpha_bar_t) eps q(x_t | x_0) = N(x_t; sqrt(alpha_bar_t) x_0, (1 - alpha_bar_t) I)与随机梯度朗之万动力学的联系
- 朗之万动力学(Langevin dynamics)源自物理中为分子系统做统计建模。与随机梯度下降结合后,随机梯度朗之万动力学只需用到 ∇_x log p(x) 的梯度,就能在马尔可夫链式更新中从概率密度 p(x) 采样。
- 更新式为 x_t = x_{t−1} + (δ/2)∇_x log p(x_{t−1}) + √δ·ε_t,其中 δ 为步长、ε_t 是标准高斯噪声;当 T 趋于无穷、步长趋于 0 时,x_T 等于真实概率密度 p(x)。
- 与标准 SGD 相比,该方法在参数更新中注入高斯噪声,以避免陷入局部极小。
逆向扩散过程
- 若能逆转上述过程、从 q(x_{t−1}|x_t) 采样,就能由高斯噪声输入 x_T 重建真实样本;β_t 足够小时逆向条件分布同样是高斯。
- 但 q(x_{t−1}|x_t) 需要用到整个数据集,无法直接估计,所以要用一个模型 p_θ 近似这些条件概率,从而执行逆向扩散过程。
- p_θ 把逆过程分解为 p(x_T) 与各步条件高斯之积,每步均值为 μ_θ(x_t,t)、协方差为 Σ_θ(x_t,t)。
- 在给定 x_0 的条件下,逆条件分布是可解的:q(x_{t−1}|x_t,x_0) 为均值 μ̃ 的高斯,其方差为 β̃_t·I;用贝叶斯公式展开二次型可推出 β̃_t 与 μ̃_t 的闭式表达。
- 利用前向过程的闭式性质,把 x_0 用 x_t 和噪声 ε_t 表示并代入,可将 μ̃_t 改写为只含 x_t 与 ε_t 的形式,即 (1/√α_t)(x_t − (1−α_t)/√(1−ᾱ_t)·ε_t)。
- 该结构与 VAE 相似,因此可用变分下界(ELBO)优化负对数似然;用 KL 非负性或 Jensen 不等式均可得到 L_VLB ≥ −E log p_θ(x_0)。
逆向扩散过程(续)
- L_VLB 可拆成若干 KL 项与熵项之和:L_T、L_{T−1}、…、L_0;除 L_0 外每个 KL 项比较两个高斯,有闭式解;L_T 无学习参数、x_T 是高斯噪声,可视为常数。
- Ho 等(2020)用一个单独的离散解码器,从 N(x_0; μ_θ(x_1,1), Σ_θ(x_1,1)) 建模 L_0。
训练损失中 L_t 的参数化
- 希望神经网络 μ_θ 预测目标均值 μ̃_t;由于训练时 x_t 已知,可改为让网络从输入 x_t 与时间步 t 预测噪声 ε_t,再按同一公式换算出 μ_θ(x_t,t)。
- 据此 L_t 写成目标均值与预测均值之间的加权平方误差,换算后等价于对噪声预测误差 ‖ε_t − ε_θ(x_t,t)‖² 做加权,权重含 (1−α_t)²/(2α_t(1−ᾱ_t)‖Σ_θ‖²)。
- 式中 x_t 用 ᾱ_t 的闭式表达(√ᾱ_t·x_0 + √(1−ᾱ_t)·ε_t)代入,使损失只依赖 x_0、ε_t 和时间步。
简化
- Ho 等(2020)经实验发现,训练扩散模型时使用忽略权重项的简化目标效果更好:L_t^simple 就是噪声预测的平方误差的期望。
- 最终简单目标为 L_simple = L_t^simple + C,其中 C 为与 θ 无关的常数。
- 文中附上 DDPM 的训练与采样算法图,说明该简化目标对应的训练和采样流程。
与噪声条件分数网络(NCSN)的联系
- Song & Ermon (2019) 提出基于分数的生成建模:用分数匹配估计数据分布的分数(score,即 ∇_x log q(x)),再用 Langevin 动力学采样。
- 为使高维数据下可扩展,采用去噪分数匹配(denoising score matching,给数据加预设小噪声)或切片分数匹配(sliced score matching,用随机投影)。
- 流形假设下数据集中在低维流形,低密度区域分数估计不可靠;加小高斯噪声使扰动分布覆盖整个空间,训练更稳定。
- NCSN 用不同强度的噪声扰动数据,训练一个噪声条件分数网络联合估计各噪声级别的分数,噪声递增的安排类似前向扩散过程。
- 由 q(x_t|x_0) ~ N(√ᾱ_t x_0, (1-ᾱ_t)I) 可推出分数与噪声预测的关系:s_θ(x_t,t) = -ε_θ(x_t,t)/√(1-ᾱ_t)。
β_t 的参数化
- Ho et al. (2020) 把前向方差设为线性递增常数,从 β_1=10^-4 到 β_T=0.02,相对 [-1,1] 的归一化像素值较小。
- 其实验样本质量高,但对数似然仍不及其他生成模型。
- Nichol & Dhariwal (2021) 提出若干改进以降低 NLL,其中一项是余弦方差调度。
- 调度函数选择较自由,只要在训练中段近线性下降、在 t=0 与 t=T 附近变化平缓即可。
- 余弦形式以 f(t)=cos((t/T+s)/(1+s)·π/2)^2 定义 ᾱ_t=f(t)/f(0),β_t 为其相邻比值的裁剪;小偏移 s 防止 t≈0 时 β_t 过小。
反向过程方差 Σ_θ 的参数化
- Ho et al. (2020) 固定 β_t 为常数,令 Σ_θ=σ_t^2 I,σ_t 取 β_t 或 β̃_t=(1-ᾱ_{t-1})/(1-ᾱ_t)·β_t,不学习。
- 其原因是学习对角方差会导致训练不稳定、样本质量下降。
- Nichol & Dhariwal (2021) 改为学习 Σ_θ,用模型预测的混合向量 v 在 β_t 与 β̃_t 之间做对数插值。
- 由于 L_simple 不依赖 Σ_θ,他们构造混合目标 L_hybrid=L_simple+λL_VLB,λ=0.001,并在 L_VLB 中对 μ_θ 停梯度,只让 L_VLB 指导 Σ_θ。
- L_VLB 因梯度噪声较难优化,他们采用时间平均平滑版本加重要性采样。
- 改进后的 DDPM 在 bits/dim 的 NLL 上与其他基于似然的生成模型作了对比。
条件生成
- 在带条件信息的图像数据集(如 ImageNet)上训练生成模型时,常见做法是以类别标签或一段描述性文本为条件生成样本。
分类器引导扩散(Classifier Guided Diffusion)
- Dhariwal & Nichol (2021) 在噪声图像 x_t 上训练分类器 f_φ(y|x_t),用其梯度 ∇_x log f_φ(y|x_t) 修正噪声预测,把采样导向条件 y(如目标类别)。
- 把联合分布分数拆为 ∇log q(x_t)+∇log q(y|x_t),可得引导后的预测器:ε̄_θ=ε_θ(x_t,t)-√(1-ᾱ_t)∇log f_φ(y|x_t)。
- 再引入权重 w 乘在梯度项上,用于控制引导强度。
- 所得无引导的 ADM 与带分类器引导的 ADM-G 均优于当时的最优生成模型(如 BigGAN)。
- 配合 U-Net 结构改动(更深更宽、更多注意力头、多分辨率注意力、BigGAN 残差块用于上下采样、残差连接按 1/√2 缩放、AdaGN)后,性能超过 GAN。
无分类器引导(Classifier-Free Guidance)
- Ho & Salimans (2021) 不借助独立分类器:无条件模型 p_θ(x) 与条件模型 p_θ(x|y) 分别由 ε_θ(x_t,t) 与 ε_θ(x_t,t,y) 参数化,可用同一个网络学习。
- 训练时在配对数据 (x,y) 上随机周期性地丢弃条件 y,使模型也会无条件生成。
- 用条件与无条件分数估计之差表示隐式分类器的梯度,代入引导式后不再依赖单独分类器,得到 ε̄=(w+1)ε_θ(x_t,t,y)-wε_θ(x_t,t)。
- 实验显示无分类器引导能在 FID 与 IS 之间取得较好平衡。
- GLIDE 同时尝试 CLIP 引导与无分类器引导,发现后者更受偏好;作者推测 CLIP 引导是在对 CLIP 模型做对抗式利用,而非优化更匹配的图像生成。
加速扩散模型
- DDPM 需沿反向扩散马尔可夫链逐步采样,T 可达一千或数千步,采样非常慢。
- 文中引用 Song et al. (2020) 的数据:在 Nvidia 2080 Ti 上从 DDPM 采样 5 万张 32×32 图像约需 20 小时,而 GAN 不到一分钟。
更少的采样步数与蒸馏
- 简单做法是跨步采样调度(strided sampling):每 ⌈T/S⌉ 步做一次采样更新,把 T 步压缩为 S 步,新调度为 {τ_1,…,τ_S},满足 τ_1<τ_2<…<τ_S∈[1,T] 且 S<T。
- 另一做法是把 q_σ(x_{t-1}|x_t,x_0) 改写为由期望标准差 σ_t 参数化:利用前向边际,把 x_{t-1} 表示为 x_0 的估计、由 ε_θ^(t)(x_t) 给出的 ε_t 方向项和 σ_t ε 三部分,得到均值与 σ_t²I 方差的高斯形式。
- 与 q(x_{t-1}|x_t,x_0)=N(x_{t-1}; μ̃(x_t,x_0), β̃_t I) 对照可知 σ_t²=β̃_t=(1-ᾱ_{t-1})/(1-ᾱ_t)·β_t;令 σ_t²=η·β̃_t,用 η∈R+ 控制采样随机性,η=0 即确定性采样,即 DDIM。DDIM 的边际噪声分布与 DDPM 相同,但确定性地把噪声映射回原数据。
- 生成时不必走完 t=1,…,T 的整条链,只需取子集:对 s<t,DDIM 的更新为 q_{σ,s<t}(x_s|x_t,x_0)=N(x_s; √ᾱ_s·(x_t-√(1-ᾱ_t)ε_θ^(t)(x_t))/√ᾱ_t + √(1-ᾱ_s-σ_t²)ε_θ^(t)(x_t), σ_t²I)。
- 实验均以 T=1000 训练:S 小时 DDIM(η=0)样本质量最好,DDPM(η=1)明显更差;能跑满 S=T=1000 时 DDPM 更好。用 DDIM 可以用任意步数训练、只从子集中采样。
- DDIM 相比 DDPM:更少步数即可得到更高质量样本;生成确定性带来“一致性”,即同一隐变量条件下的多个样本应有相似高层特征;由此可在隐变量上做有语义的插值。
更少的采样步数与蒸馏(续)
- 渐进蒸馏(progressive distillation,Salimans & Ho, 2022)把已训练的确定性采样器蒸馏为采样步数减半的新模型:学生由教师初始化,目标是让学生一步 DDIM 对应教师两步,而不是去噪到原始样本 x_0;每次迭代步数减半。
一致性模型(接上节的蒸馏与少步采样)
- 一致性模型(consistency models,Song et al. 2023)学习把扩散采样轨迹上任意中间噪声点 x_t(t>0)直接映射回起点 x_0;因同一轨迹上任意点都映射到同一原点而称为自一致性,可单步生成,也可多步以计算换质量。
- 对轨迹 {x_t | t∈[ε,T]},一致性函数 f 定义为 f:(x_t,t)↦x_ε,并要求对任意 t,t'∈[ε,T] 有 f(x_t,t)=f(x_{t'},t')=x_ε;t=ε 时 f 为恒等映射。参数化为 f_θ(x,t)=c_skip(t)x+c_out(t)F_θ(x,t),其中 c_skip(ε)=1、c_out(ε)=0。
- 训练方式一是一致性蒸馏(CD):最小化同一轨迹上成对点输出的差异,损失为 L_CD^N=𝔼[λ(t_n)d(f_θ(x_{t_{n+1}},t_{n+1}), f_{θ⁻}(x̂^φ_{t_n},t_n))],其中 x̂^φ_{t_n}=x_{t_{n+1}}-(t_n-t_{n+1})Φ(x_{t_{n+1}},t_{n+1};φ),Φ 为一步 ODE 求解器的更新函数,n~U[1,N-1]。
- θ⁻ 为 θ 的 EMA 版本以稳定训练,d 可选 ℓ2、ℓ1 或 LPIPS,权重取 λ(t_n)=1。
- 训练方式二是独立训练的一致性训练(CT):CD 用预训练分数模型 s_φ 近似真实分数,CT 则需要自行估计,可用无偏估计 -(x_t-x)/t²,损失为 L_CT^N=𝔼[λ(t_n)d(f_θ(x+t_{n+1}z,t_{n+1}), f_{θ⁻}(x+t_n z,t_n))],z~N(0,I)。
- 实验结论:相同 N 下高阶 ODE 求解器估计误差更小,Heun 优于一阶 Euler;距离度量中 LPIPS 优于 ℓ1、ℓ2;N 小收敛快但样本差,N 大收敛慢但收敛后样本更好。CD 的最佳配置为 LPIPS 距离 + Heun 求解器 + N=18。
潜在变量空间
- 潜在扩散模型(LDM,Rombach & Blattmann 等,2022)在潜在空间而非像素空间里做扩散,训练成本更低、推理更快。动机是观察到图像的大部分比特只贡献感知细节,经过激进压缩后语义与概念构成仍然保留。
- LDM 把感知压缩和语义压缩拆开:先用自编码器去掉像素级冗余,再在学到的潜在表示上用扩散过程操控、生成语义概念;原文用压缩率与失真的权衡图说明这两级压缩。
- 感知压缩靠自编码器:编码器 E 把 x∈R^{H×W×3} 压成 z=E(x)∈R^{h×w×c},下采样率 f=H/h=W/w=2^m;解码器 D 由 z 重建 x̃=D(z)。为避免潜在空间方差任意变大,训练中探索了两种正则:KL-reg(对潜在表示加向标准正态分布的小 KL 惩罚,类似 VAE)和 VQ-reg(在解码器内用向量量化层,类似 VQVAE,但量化层被解码器吸收)。
- 扩散与去噪都在潜在向量 z 上进行,去噪模型是时间条件 U-Net,并加入交叉注意力以处理灵活的条件信息(类别标签、语义图、图像模糊版本等),相当于用交叉注意力把不同模态的表示融合进模型。
- 每类条件信息配一个领域专用编码器 τ_θ,把条件输入 y 投影为可映射进交叉注意力的中间表示 τ_θ(y)∈R^{M×d_τ};Q 由 φ_i(z_i) 线性变换得到,K、V 由 τ_θ(y) 线性变换得到。
textAttention(Q, K, V) = softmax(QK^T / sqrt(d)) · V where Q = W_Q^(i) · φ_i(z_i), K = W_K^(i) · τ_θ(y), V = W_V^(i) · τ_θ(y) and W_Q^(i) ∈ R^{d × d_ε^i}, W_K^(i), W_V^(i) ∈ R^{d × d_τ}, φ_i(z_i) ∈ R^{N × d_ε^i}, τ_θ(y) ∈ R^{M × d_τ}提升生成分辨率与质量
- Ho 等人(2021)提出用多个分辨率递增的扩散模型组成级联流水线来生成高分辨率高质量图像。级联模型之间的噪声条件增强(noise conditioning augmentation)对最终图像质量至关重要,做法是对每个超分辨率模型 p_θ(x|z) 的条件输入 z 施加强数据增强,以降低流水线中的复合误差;U-Net 是高分辨率扩散生成的常用架构。
- 他们发现最有效的噪声是低分辨率处加高斯噪声、高分辨率处加高斯模糊。此外还考察了两种需小幅修改训练流程的条件增强形式;注意条件噪声只在训练时加,推理时不加。
- 截断式条件增强:低分辨率上在 t>0 的某步提前停止扩散过程。非截断式条件增强:完整跑完低分辨率的逆过程到第 0 步,再用 z_t ~ q(x_t|x_0) 破坏它,把被破坏的 z_t 送入超分辨率模型。
- 两阶段扩散模型 unCLIP(Ramesh 等,2022)大量利用 CLIP 文本编码器生成高质量文本引导图像。给定预训练 CLIP 模型 c 和成对训练数据 (x, y)(x 为图像、y 为对应描述),可算出 CLIP 文本与图像嵌入 c^t(y) 和 c^i(x),并并行学习两个模型。
- 两个模型分别是:先验模型 P(c^i|y),由文本 y 输出 CLIP 图像嵌入 c^i;解码器 P(x|c^i,[y]),由 CLIP 图像嵌入(可选地加上原文 y)生成图像。由 P(x|y)=P(x,c^i|y)P(c^i|y)(c^i 在给定 x 时是确定的)可知二者支持条件生成。
- unCLIP 的生成分两步:先用 CLIP 由文本 y 得到文本嵌入 c^t(y),借助 CLIP 潜在空间实现零样本文本图像编辑;再由扩散或自回归先验 P(c^i|y) 构造图像先验,最后由扩散解码器 P(x|c^i,[y]) 基于先验生成图像;该解码器也能以输入图像为条件生成保持风格与语义的变体。
textP(x | y) = P(x, c^i | y) (c^i is deterministic given x) = P(x | c^i, y) P(c^i | y)提升生成分辨率与质量(续)
- Imagen(Saharia 等,2022)改用预训练大语言模型(冻结的 T5-XXL 文本编码器)编码文本。总体趋势是模型越大,图像质量与文图对齐越好;在 MS-COCO 上 T5-XXL 与 CLIP 文本编码器表现相近,但在 DrawBench(覆盖 11 类提示词)的人工评测中更偏好 T5-XXL。
- 用无分类器引导时,增大 w 可能改善文图对齐却降低图像保真度,原因是训练-测试不匹配:训练数据 x 落在 [-1,1] 内,测试数据也应如此。为此引入两种阈值策略:静态阈值(把 x 预测裁剪到 [-1,1])和动态阈值(每个采样步计算某个百分位的绝对像素值 s,若 s>1 则裁剪到 [-s,s] 并除以 s)。
- Imagen 把 U-Net 改成高效 U-Net:把参数从高分辨率块移到低分辨率块(给低分辨率加更多残差块);把跳跃连接乘以 1/√2;调换下采样与上采样的顺序(下采样移到卷积前、上采样移到卷积后)以加快前向。结论是噪声条件增强、动态阈值和高效 U-Net 对图像质量关键,但扩大文本编码器比扩大 U-Net 更重要。
模型架构
- 扩散模型有两种常见主干架构:U-Net 和 Transformer。U-Net(Ronneberger 等,2015)由下采样栈和上采样栈组成:下采样每步重复两次 3x3 卷积(无填充),每次后接 ReLU 和步长 2 的 2x2 最大池化,每步特征通道数翻倍。
- 上采样每步先上采样特征图再做 2x2 卷积,通道数减半。捷径连接把上采样层与下采样栈对应层拼接,为上采样提供必要的高分辨率特征。
- ControlNet(Zhang 等,2023)用于以 Canny 边缘、Hough 线、用户涂鸦、人体骨架、分割图、深度、法线等额外图像为条件生成图像。它在 U-Net 每个编码层中加入「三明治」式的零卷积层,连接原始权重的一个可训练副本。
- ControlNet 的具体做法:冻结原块参数 θ;克隆出参数可训练的副本 θ_c 并附加条件向量 c;用两个初始权重与偏置均为零的 1x1 零卷积层 Z_{θ_z1}、Z_{θ_z2} 连接两块,零卷积在训练初期通过消除梯度中的随机噪声来保护主干;最终输出为 y_c = F_θ(x) + Z_{θ_z2}(F_{θ_c}(x + Z_{θ_z1}(c)))。
- 扩散 Transformer(DiT,Peebles & Xie,2023)采用与 LDM 相同的设计空间,但作用于潜在 patch:把输入 z 的潜在表示作为输入;将 I×I×C 的噪声潜在「patchify」成大小为 p 的 patch,变为 (I/p)^2 个 patch 的序列;token 序列再经 Transformer 块处理。
- 对时间步 t、类别标签 c 等上下文条件,DiT 探索了三种设计,其中 adaLN(自适应层归一化)-Zero 最好,优于 in-context conditioning 和交叉注意力块:缩放与平移参数 γ、β 由 t 和 c 的嵌入向量之和回归得到,逐维缩放参数 α 也由回归得到,并在 DiT 块内任何残差连接之前应用。
texty_c = F_θ(x) + Z_{θ_z2}(F_{θ_c}(x + Z_{θ_z1}(c)))模型架构(续)
- Transformer 解码器输出噪声预测和一个对角协方差预测。Transformer 架构易于扩展,这是 DiT 的一大优势:实验显示其性能随算力提升,更大的 DiT 模型更省算力。
简要总结
- 优点:可解性(tractability)与灵活性是生成建模中相互冲突的两个目标。可解模型能解析评估、廉价拟合数据(如高斯或拉普拉斯),但难以描述丰富数据集的结构;灵活模型能拟合任意结构,但评估、训练或采样通常昂贵。扩散模型兼具可解性和灵活性。
- 缺点:扩散模型依赖很长的马尔可夫链式扩散步骤来生成样本,时间和算力开销较大。已有新方法让过程快得多,但采样仍比 GAN 慢。