一、加速扩散模型采样:DDIM 与渐进蒸馏

DDPM和DDIM

问题:DDPM 太慢

DDPM 需要 T=1000 步去噪,生成50k张32×32图像需要20小时,而GAN只需不到1分钟

方法一:跳步采样(Nichol & Dhariwal)

最简单的加速方式:不每一步都走,而是每隔 ⌊T/S⌋步跳一次,从 1000 步压缩到 S 步。

但治标不治本,跳步会损失精度,因为 DDPM 本质上是马尔可夫链,每步依赖上一步。

方法二:DDIM——重新推导采样公式

DDIM 的核心思路是:不改变训练,只改变采样方式。关键在于把采样公式重新参数化,引入一个控制随机性的超参数 \sigma_t

1、把 x_t 写成x_0 和噪声 ε 的形式,这是整个 DDIM 的基础。

表示当前噪声图其实是 原图+某个总噪声。其中\sqrt{\bar\alpha_t}:原图保留多少,\sqrt{1-\bar\alpha_t}:噪声占多少

DDPM中,模型学习,即当前x_t里的总噪声是什么,有了x_t\epsilon_\theta,就可以反推x_0

同理,

作者把\epsilon_{t-1}拆成

第一个:\epsilon_\theta(x_t)

是模型预测出的“方向”。表示:当前图里主要的噪声结构,是确定性的。

第二个:\sigma_t\epsilon

是新加入的随机噪声。

即DDPM 里那种:每一步随机抖一下

公式分三部分:

  • 第一项:用当前 x_t​ 和预测噪声反推出 x_0​ 的估计,再按 \bar\alpha_{t-1}​ 缩放
    目标是构造出"t−1 时刻应该有多少原始信号",因为正向过程中

    t 时刻,原始信号 x_0 被缩放了 \sqrt{\bar\alpha_t} 倍混入x_t。类比地,在 t−1 时刻,原始信号应该被缩放 \sqrt{\bar\alpha_{t-1}}​​ 倍。

  • 第二项:从估计的 x_0 朝 x_t方向走一步(确定性部分)
  • 第三项:加入随机噪声(可控)

η 参数:控制随机性

\sigma_t^2 = \eta \cdot \tilde\beta_t,通过调整 η 来控制采样的随机程度:

η 效果
η = 1 退化为原始 DDPM,完全随机
0 < η < 1 介于两者之间
η = 0 完全确定性,这就是 DDIM

当 η = 0 时,采样过程变成一个确定性的常微分方程(ODE),给定同一个初始噪声 x_T 必然生成同一张图像。

DDIM 的三大优势

1. 更少步数,更好质量

从表格可以看到,η=0(DDIM)在 S=10∼50步时 FID 远低于 η=1(DDPM)。DDPM 步数少时质量急剧下降,而 DDIM 用 20 步就能达到 DDPM 1000 步的近似效果。

2. 一致性(Consistency)

因为采样是确定性的,同一个初始噪声 x_T​ 总是生成同一张图。这意味着 x_T​ 就是图像的"编码",可以把它当作潜在表示来使用。

3. 潜在空间插值

由于一致性,可以在两个 x_T之间做插值,生成的图像也会在语义上平滑过渡——这是 DDPM 做不到的,因为 DDPM 每次采样都不同。

二、渐进蒸馏

变量含义

图中的 z_1,\ z_{3/4},\ z_{1/2},\ z_{1/4} 不是不同图片,而是同一张图在不同“噪声时间”下的状态,是 diffusion 论文里一种“连续时间写法”。

z_1​ 表示t=1 时的状态,也就是最强噪声,接近纯高斯噪声。

z_0(图里最终的 x)表示 t=0 时的状态。即:最终清晰图像。

z_{3/4}:时间走到 0.75 时的图。噪声比 z_1 少一点。

z_{1/2}:噪声更少,图像更清晰。

与普通diffusion的不同

普通 diffusion的target 是 x,真实图。

distillation的 target 不再是真实图,而是teacher model 的结果。

student 不再学习:“怎么恢复真实图”。而是学习:“如何一步模仿 teacher 的两步”。

背景与动机

DDPM 采样需要上千步,太慢。DDIM 虽然改善了,但步数仍然不少。渐进蒸馏通过知识蒸馏的方式,把步数指数级压缩

核心思想

用知识蒸馏的方式训练一个学生模型,让它一步实现教师模型两步的结果。每轮蒸馏步数减半,反复迭代:

1000步→500步→250步→⋯→1步

与普通蒸馏的区别

普通蒸馏是让学生模型模仿教师对原始数据 x_0 的预测。

Progressive Distillation 不一样:学生的训练目标不是 x_0,而是教师走两步之后的结果

具体来说,给定当前 z_t

  1. 教师走第一步:z_t \to z_{t'}
  2. 教师再走一步:z_{t'} \to z_{t''}
  3. z_{t''} 反推出等价的 \hat{x}_0​ 作为目标
  4. 让学生一步z_t​ 直接达到这个目标

关键设计:

"局部轨迹对齐"而不是"最终结果对齐"

如果只要求学生的最终生成质量和教师一样,约束太弱,学生需要在巨大的搜索空间里自己摸索,很难训练。

"每步对齐教师两步"的约束强得多——教师为学生规划了每一步具体应该走到哪里,学生只需要学会"抄近路",任务明确,训练稳定。

训练流程

每轮 K 次迭代:

初始化:学生从教师模型权重出发(θ←η)

两层循环:

外层(每轮产生新的师生关系):

  1. 用当前教师权重初始化学生(学生从一个已经很好的起点出发,只需微调)
  2. 内层训练学生收敛
  3. 学生成为下一轮教师,步数减半

内层(训练当前学生):

  1. 采样数据 x,构造带噪 z_t
  2. 教师从 z_t 走两步 DDIM,得到 z_{t''}
  3. z_{t''} 反推目标 \tilde{x}
  4. 训练学生一步预测这个目标,最小化 \|\tilde{x} - \hat{x}_\theta(z_t)\|^2

每轮结束

学生变成下一轮的教师(η←θ)、步数减半(N←N/2)

为什么学生从教师权重初始化

教师已经是能生成高质量图像的好模型,学生从它出发只需微调来适应步数减半的目标,比从随机初始化训练快得多也更稳定。

一句话总结

渐进蒸馏的本质是"接力压缩":每轮用局部轨迹对齐的方式训练学生抄教师的近路,步数指数级减少,最终实现极少步数的高质量生成。

三、Consistency Models:直接从任意噪声一步还原原图

核心思想

不再学习“下一步怎么走”,而是学习“无论现在在哪,直接告诉你最终图像是什么”,模型直接输出x_\epsilon,即最终干净图(ϵ是一个很小的、接近0的正数

扩散模型的采样轨迹上,每一个点 (x_t, t) 理论上都对应同一个原始图像x_0

Consistency Model 就是学习这个映射:

f_\theta(x_t, t) = x_0 \quad 对轨迹上任意 t 成立

这就是"自洽性"(self-consistency)的含义——同一条轨迹上所有点都映射到同一个 x_0

模型结构

不是让网络从0开始预测,而是保留输入的一部分+网络只负责修正

为了保证边界条件( t=ϵ 时模型应该是恒等映射,即 f(x_\epsilon, \epsilon) = x_\epsilon ),模型被设计成:

其中 c_\text{skip}(\epsilon) = 1c_\text{out}(\epsilon) = 0,保证在 t=ϵ 时退化为恒等函数。此时,意思是:图像几乎没有噪声时(t 接近0),模型应该直接返回输入本身,不做任何改变——这是最自然的约束。

此处的ϵ不代表噪声,而是一个很接近0的正数,如0.002,是时间起点

Consistency Model 的时间轴是从 ϵ 到 T、,而不是从 0 到 T。

原因是 t=0 时理论上图像完全无噪声,恒等映射是trivial的但在数值上不稳定,所以用一个很小的 ϵ作为起点来避免这个问题。

两种训练方式

1. Consistency Distillation(CD):从预训练扩散模型蒸馏

预训练的扩散模型已经知道如何逐步去噪,于是consistency model 学如何直接到终点

思路:同一条轨迹上相邻两点 x_{t_n} 和 x_{t_{n+1}} 应该映射到同一个 x_0​,所以让两者的模型输出尽量一致:

其中:

  • \hat{x}_{t_n}​​ 是用预训练扩散模型(ODE solver)从 x_{t_{n+1}}​​ 走一步得到的
  • \theta^- 是 θ 的 EMA 版本,起到稳定训练的作用(类似 DQN 的目标网络)
  • d(⋅ , ⋅)是距离度量函数,实验发现 LPIPS 效果最好

 ODE:Ordinary Differential Equation,常微分方程:本质是在描述一个状态如何连续变化,通常是

需要预训练的扩散模型,但蒸馏后采样极快。

2. Consistency Training(CT):独立训练,不依赖预训练模型

不需要预训练模型,用 score function 的无偏估计 -\frac{x_t - x}{t^2}​ 来替代,损失函数类似:

完全从头训练,不依赖任何外部模型。

与渐进蒸馏的对比

渐进蒸馏 Consistency Distillation
目标 学生一步 = 教师两步 轨迹上任意两点映射到同一x_0
约束范围 局部(相邻两步) 全局(整条轨迹)
自洽性 有,可以多步精炼

采样的灵活性

Consistency Model 支持两种采样模式:

一步生成:直接 f_\theta(x_T, T) = x_0​,极快但质量略低。

多步精炼:生成 \hat{x}_0​ 后,加少量噪声再还原,反复迭代,用更多计算换更好质量——这是渐进蒸馏做不到的灵活性。


实验结论
  • ODE solver 用 Heun(二阶)比 Euler(一阶)好,估计误差更小
  • 距离度量用 LPIPS\ell_1\ell_2 好(更符合人类感知)
  • N 较小收敛快但质量差,N 较大收敛慢但质量好;自适应 N 是较好的折中

总结

Consistency Model 通过强制同一条去噪轨迹上所有点都映射到同一个原图,学会了"从任意噪声程度一步直达原图"的能力,同时保留了多步精炼的灵活性。

四、提升生成分辨率与质量

1、级联扩散模型(Cascaded Diffusion Models)

直接生成大图,因为像素太多,使用diffusion容易结构混乱、细节崩、算力爆炸,所以作者想到“先画草图,再逐步细化”,设计了多阶段diffusion pipeline。

核心思路: 用多个扩散模型串联,逐步提升图像分辨率。

如图15所示,流程为:

类别ID → 32×32(模型1)→ 64×64(模型2)→ 256×256(模型3)

后面的模型不是重新生成图像,而是条件生成高分辨率细节
低分辨率负责构图、姿态、大结构,高分辨率负责毛发、纹理、眼睛等细节。

因为super-resolution 模型很容易“过拟合完美低清输入”,所以给低分辨率图加高斯噪声、模糊、

corruption,让模型学会面对不完美输入也能修复。

噪声条件增强(Noise Conditioning Augmentation) :

  • 对每个超分辨率模型的条件输入 z 施加强数据增强
  • 目的是减少级联过程中的误差累积
  • 常用 U-Net 作为模型架构

两种增强策略:

策略 说明
截断式 在步骤 t > 0 时提前停止扩散过程(低分辨率用)
非截断式 跑完完整的低分辨率逆过程,再对结果加噪后送入超分模型

2、unCLIP:用 CLIP 做图像生成

CLIP 是什么?

CLIP 是 OpenAI 训练的模型,将文字和图像映射到同一个向量空间,使得"一只猫"的文字嵌入和猫的图片嵌入在空间上非常接近。

unCLIP 

第一阶段:文本 → 图像嵌入(Prior)

  • 输入文字 y,CLIP 文本编码器对齐文本和图像embedding 生成文本嵌入 c^t(y)
  • Prior 模型(扩散模型或自回归模型)以文本嵌入为条件,输出图像嵌入c^i其训练目标来自 冻结的 CLIP Image Encoder:对于训练数据中的每一对 (x,y),用 CLIP Image Encoder 提取真实图片的图像嵌入 c^i(x) 作为 GT,监督 Prior 的输出

第二阶段:图像嵌入 → 真实图像(Decoder)

  • Decoder 以图像嵌入为条件,从噪声图像(训练阶段是对CLIP中输入的真实图像随机加噪得到的x_t,推理阶段是随机采样的纯高斯噪声)出发,逐步去噪生成最终像素图像
  • 也可以输入一张真实图片的嵌入,生成风格/语义相似的变体图
为什么叫"unCLIP"?

CLIP 是将图像→嵌入(编码),unCLIP 是将嵌入→图像(解码),方向相反,故名。

3、ControlNet:给扩散模型加条件控制

背景

原始扩散模型只能接受文字作为条件,但很多时候需要更精确的空间控制:

"帮我生成一张人物图" ← 文字控制,结果随机性很大

更精确的需求:
    给定人体骨骼姿态图 → 生成对应姿态的人物
    给定边缘检测图    → 生成对应结构的场景
    给定深度图        → 生成对应空间关系的图像

ControlNet 就是为了解决这个问题——在不破坏原模型的前提下,注入额外的空间条件控制。

ControlNet 的四步操作

对照图18(b),逐步解释:

Step 1:冻结原始模型

原始 U-Net 的参数 θ 全部冻结
保证原有的生成能力不被破坏

Step 2:克隆一个可训练副本

将原始 U-Net 的每个编码器块完整复制一份
副本参数 \theta _c 可以被训练更新
额外接收条件输入 c(如骨骼图、边缘图)

Step 3:用零卷积层连接两个分支

零卷积(Zero Convolution)是 1×1 卷积,初始化时权重和偏置全为 0

为什么要用零卷积?

训练刚开始时:
    零卷积输出 = 0
    ControlNet 分支对原模型的影响 = 0
    → 原模型行为完全不变,生成质量有保证

随着训练进行:
    零卷积的权重从 0 开始慢慢学习
    ControlNet 分支逐渐发挥作用
    → 平滑地引入条件控制,不会引入噪声梯度破坏训练

两个零卷积的位置:

第一个 Z_{\theta_{z1}}:在条件 c 进入可训练副本之前
    作用:对条件信号做尺度调整

第二个 Z_{\theta_{z2}}:在可训练副本输出之后
    作用:对副本输出做尺度调整,再加回原模型

Step 4:最终输出公式

拆解来看:

F_\theta (x)                          ← 原始冻结模型的输出(不变)

Z_{\theta_{z1}}(c)                        ← 条件 c 经第一个零卷积处理

x + Z_{\theta_{z1}}(c)                ← 原始输入 与 处理后的条件 相加
                                   (把条件信息融入输入)

F_{\theta_c}(x + Z_{\theta_{z1}}(c))       ← 可训练副本处理融合后的输入

Z_{\theta_{z2}}(...)                       ← 副本输出经第二个零卷积缩放

最终输出 = 原模型输出 + 副本输出  ← 残差式融合

ControlNet 支持的条件类型

条件类型 输入形式 控制效果
Canny 边缘 边缘检测二值图 控制物体轮廓和结构
Hough 线条 直线检测图 控制建筑、几何结构
人体骨骼 关键点连线图 控制人物姿态
深度图 灰度深度图 控制三维空间关系
分割图 语义分割标注 控制各区域内容
用户涂鸦 手绘草图 按草图生成图像

设计精妙之处总结

原始模型(冻结)          ControlNet 分支(可训练)
      ↓                           ↓
  保留生成能力              学习理解条件输入
      ↓                           ↓
      └──────────── + ────────────┘
                   ↓
           受控的生成结果

ControlNet 最聪明的地方在于:

  1. 零卷积初始化 → 训练初期完全不干扰原模型,避免灾难性遗忘
  2. 残差式融合 → 条件控制以"增量"形式加入,原能力完整保留
  3. 克隆而非修改 → 原模型权重永远不变,可以随时插拔 ControlNet

五、Diffusion Transformer (DiT)

之前讲的扩散模型都用 U-Net 作为骨干网络,但 U-Net 有一个明显的局限:

U-Net 的问题:
    规模扩展性差——增大模型很麻烦,需要手动设计每一层
    卷积结构天然是局部感受野,捕捉全局关系能力弱

Transformer 的优势:
    规模扩展性极好——只需堆叠更多 Block
    Self-Attention 天然是全局感受野
    在语言、视觉领域已被反复证明"越大越好"

DiT 的核心思想就是:把扩散模型的 U-Net 骨干换成 Transformer,同时在隐空间(Latent Space)操作,也就是 LDM(Latent Diffusion Model)的设计。

流程

DiT Block 的改动:adaLN-Zero

普通 Layer Norm 的归一化参数(scale γ 和 shift β)是固定的可学习参数,与输入无关。

Adaptive Layer Norm(adaLN) 的关键改进:

条件向量 c_embed(由 t 和 y 的嵌入相加得到)
    ↓ MLP 回归
    ↓
γ₁, β₁  → 控制 Self-Attention 前的 Layer Norm
γ₂, β₂  → 控制 Feedforward 前的 Layer Norm
α₁      → 控制 Self-Attention 输出的缩放
α₂      → 控制 Feedforward 输出的缩放

具体计算:

adaLN 的归一化过程:

普通 LN:  output = γ · normalize(x) + β
              (γ、β 是固定参数)

adaLN:    output = γ(c) · normalize(x) + β(c)
              (γ、β 由条件 c 动态生成)

Zero 的含义: 初始化时,所有 α(缩放参数)初始化为 0

训练初始:
    α₁ = 0 → Self-Attention 输出 × 0 = 0
    α₂ = 0 → Feedforward 输出 × 0 = 0
    整个 DiT Block 输出 = 输入(恒等映射)

训练过程中:
    α 从 0 开始慢慢学习
    Block 逐渐发挥作用

这和 ControlNet 的零卷积思路完全一致——训练初期保持稳定,避免随机初始化带来的噪声梯度

完整 DiT Block 数据流

输入 token x
    │
    ├─ Layer Norm
    │      ↓ 用 γ₁,β₁ 做自适应归一化(由条件c控制)
    │  Multi-Head Self-Attention
    │      ↓ 输出 × α₁(初始为0)
    └──────⊕ 残差连接
    │
    ├─ Layer Norm
    │      ↓ 用 γ₂,β₂ 做自适应归一化(由条件c控制)
    │  Pointwise Feedforward(MLP)
    │      ↓ 输出 × α₂(初始为0)
    └──────⊕ 残差连接
    │
输出 token x'

三种条件注入方式的对比

论文探索了三种把时间步 t 和类别 c 注入 Transformer 的方式:

方式 做法 问题
In-context conditioning 把 t、c 的嵌入作为额外 token 加入序列 条件信息与图像 token 混在一起,影响有限
Cross-Attention Block 图像 token 通过 cross-attention 查询条件信息 增加计算量,效果提升有限
adaLN-Zero 条件动态控制每层的归一化参数 无(效果最好)

adaLN-Zero 效果最好的直觉理解:

归一化层控制着每一层"信息流的尺度和偏移"
让条件 c 直接控制这个尺度 → 条件信息渗透进每一层的特征处理
比"加几个 token"或"偶尔做 cross-attention"影响更深入、更全面

DiT 相比 U-Net 的核心优势

U-Net                          DiT
─────────────────────────────────────────
像素/特征空间操作              隐空间操作(更高效)
卷积(局部感受野)             Self-Attention(全局感受野)
手动设计各层结构               统一堆叠 Block,扩展简单
扩展性一般                     扩展性极好(更大=更好)

DiT 的实验结论:模型越大、计算量越多,生成质量持续提升,这正是 Transformer 架构在语言模型领域已经反复验证过的规律,现在被成功迁移到图像生成领域。这也是 Sora 等视频生成模型采用 DiT 架构的根本原因。

六、扩散模型的优缺点

优点:兼顾可解析性与灵活性

生成模型面临一个根本矛盾:

可解析模型(如高斯分布):
    ✓ 数学上易于分析和训练
    ✗ 无法描述复杂数据的丰富结构

灵活模型(如 GAN):
    ✓ 能拟合任意复杂分布
    ✗ 训练不稳定,评估困难

扩散模型:
    ✓ 可解析——前向加噪过程有闭合形式,训练目标简单(预测噪声)
    ✓ 灵活——能生成极其复杂、高质量的图像
    两者兼得!
缺点:采样速度慢
GAN 生成一张图:
    随机噪声 → [一次前向传播] → 图像
    速度极快

扩散模型生成一张图:
    x_T → x_{T-1} → ... → x_0
    需要 T 步(通常 50~1000 步)前向传播
    速度慢很多

目前有 DDIM、DPM-Solver 等加速采样方法,但仍比 GAN 慢。

 参考:What are Diffusion Models?

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐