扩散模型:一步生成、蒸馏与整流

扩散模型:一步生成、蒸馏与整流

Charles Lv7

DDIMEulerDPM-Solver 已经把推理压到几十步后,下一步问题就变成了:能不能直接把几十步教师,压缩成几步甚至一步学生。

DMD 原论文的核心图很适合说明“少步/一步生成”为什么不能只靠删采样步:student generator 需要同时接受回归信号和分布匹配信号,目标不是机械复刻 teacher 的每个中间状态,而是让最终生成分布靠近 teacher / data 分布。

DMD overview 原论文图

图源:One-step Diffusion with Distribution Matching Distillation,Figure 2。原论文图意:一步生成器 GθG_\theta 从噪声生成 fake image;一条支路用预计算 noise-image pairs 做 regression loss,另一条支路通过 real / fake score 差异形成 distribution matching gradient。

图解:DMD 方法图里的两条训练信号

图中 GθG_\theta 是一步 generator,它直接把噪声映射成 fake image。上方 regression branch 用预计算的 teacher pairs 稳住单样本对应关系,避免学生完全偏离教师轨迹;下方 distribution matching branch 把 fake image 加噪后交给 real / fake score models,用两者差异给 generator 一个“整体分布应该往哪里移动”的梯度。少步生成不是单纯把采样步数删掉;越接近一步生成,越需要重新验证文本对齐、细节锐度、模式覆盖和长尾稳定性。

有趣例子:把慢教程压成速成课

Teacher 像一门 50 节课的绘画教程,每节只教一点构图、线条、明暗和细节。Student 若只上 4 节课,就不能简单删掉 46 节,而要把关键步骤重新编排成更大的学习跳跃。少步扩散蒸馏也是在重新组织这条学习路径。

少步蒸馏:从多步教师到 1-8 步学生 { #few-step-distillation }

少步蒸馏要解决的问题很具体:已经有一个质量可靠但很慢的 teacher diffusion model,它可能需要 20、30、50 步甚至更多步才能生成一张图;现在希望训练一个 student,让它只用 1、2、4 或 8 步就达到接近教师的结果。

这件事不能理解成“把采样循环里的步数删掉”。如果原模型是在 30 步里逐渐修正构图、纹理、边缘、文字和条件对齐,那么删到 4 步后,每一步都必须承担原来好几步的信息量。少步蒸馏的核心,就是重新定义训练信号,让学生学会这种“粗粒度跳跃”。

DMD2 method 原论文图

图源:Improved Distribution Matching Distillation for Fast Image Synthesis,Figure 3。原论文图意:DMD2 交替训练 generator、fake score function 和 GAN discriminator;generator 同时接收 distribution matching gradient 与 GAN loss。

图解:DMD2 为什么多了 fake score 和 GAN 分支

DMD2 图里有三组角色:generator 负责产生少步样本,fake score function 追踪当前 generator 的 fake distribution,GAN discriminator 额外约束视觉真实感。这样做的原因是 teacher 的轨迹细、慢、稳定,而 student 的轨迹粗、快、风险更高;只把 teacher 输出当标签会过于僵硬,只做分布匹配又容易不稳。fake score、real score 和 discriminator 合在一起,是在同时管训练信号稳定、分布覆盖和视觉锐度。

1. 为什么少步蒸馏和普通 teacher-student 不一样

普通分类蒸馏里,teacher 给一个 soft label,student 学这个 label 就可以。扩散少步蒸馏更麻烦,因为 teacher 的输出不是一个静态答案,而是一条从噪声到图像的轨迹:

xTxt1xt2x0.x_T \rightarrow x_{t_1} \rightarrow x_{t_2} \rightarrow \cdots \rightarrow x_0.

如果 student 只有 KK 步,就要学习一个更大的跳跃:

xTxτ1x0,KT.x_T \rightarrow x_{\tau_1} \rightarrow \cdots \rightarrow x_0,\qquad K \ll T.

这意味着 student 不只是在模仿 teacher 的单步预测,而是在学习 teacher 多步复合后的结果。直觉上,teacher 每一步像“慢慢擦掉噪声”,student 每一步像“直接跨过一大片噪声区间”。跨度越大,训练目标越难,越需要额外的稳定手段。

2. 三类常见蒸馏信号

蒸馏信号 学什么 代表路线 优点 风险
轨迹压缩 学 teacher 两步或多步采样后的状态 Progressive Distillation 直觉清楚,适合逐级从 32 到 16、8、4 步 步数越低,误差累积越明显
终点一致性 同一 PF-ODE 轨迹上的不同噪声点映射到一致结果 Consistency Models、LCM 适合 1-4 步快速生成,和 latent diffusion 结合自然 容易牺牲细节或强条件控制
分布匹配 不要求逐点模仿 teacher,只要求 student 生成分布接近目标 DMD、DMD2、Phased DMD 更适合一步生成和极低步数 训练稳定性、模式覆盖和锐度都更难管

工程上可以先这样判断:如果目标是 4-8 步,轨迹压缩和一致性路线通常更稳;如果目标是一两步,并且能接受更复杂训练和更严格回归,再看 DMD/DMD2 这类分布匹配路线。

3. 一个简化的少步蒸馏训练流程

下面的伪代码不是照搬某一篇论文,而是把少步蒸馏的共同骨架抽出来:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Algorithm: Few-Step Diffusion Distillation

Input:
teacher T # 多步扩散模型或高精度采样器
student S # 目标少步模型
step budget K # 例如 1, 2, 4, 8
prompts / conditions c

repeat:
1. 采样噪声 x_T 和条件 c
2. 用 teacher 从 x_T 生成高质量轨迹:
x_T -> ... -> x_0^teacher
3. 选择 student 的粗时间点:
tau_K > ... > tau_1 > 0
4. 构造训练目标:
path target: teacher 多步结果
consistency target: 同轨迹终点
distribution target: teacher/真实分布的 score 差
5. 更新 student:
L = L_path + lambda_c L_consistency + lambda_d L_distribution
6. 用 K 步真实推理回放验证:
quality, prompt fidelity, control, latency

until validation passes

真正做实验时,第 6 步非常关键。少步模型训练 loss 看起来下降,并不代表真实 4 步或 1 步推理就稳。因为训练时看到的 xtx_t 分布和 student 自己推理时产生的中间状态可能不一样,这就是很多少步路线会遇到的 train-inference mismatch。

4. 一个例子:把 50 步文生图压到 4 步

假设 teacher 是一个 50 步 latent diffusion 文生图模型。原流程大致是:

  1. 前 10 步确定整体构图和主体位置;
  2. 中间 20 步逐渐补物体关系、材质和局部结构;
  3. 最后 20 步修边缘、纹理、文字和高频细节。

如果 student 只有 4 步,就不能指望它按原来的细节节奏慢慢修。更现实的分工是:

  1. 第 1 步先把大构图和主要对象拉出来;
  2. 第 2 步把对象关系、颜色和光照压稳;
  3. 第 3 步补关键细节和条件对齐;
  4. 第 4 步做局部锐化和伪影修复。

这就是少步蒸馏最难的地方:student 的每一步不再是“微小去噪”,而是带有阶段性规划意义的大跳跃。步数越少,它越像一个非自回归生成器,而不是传统意义上的逐步扩散采样器。

5. 少步蒸馏最该验什么

只比较“生成速度快了多少”是不够的。少步蒸馏至少要固定 teacher-student 同 seed、步数桶、强条件、长尾 prompt 和真实延迟几类对照:同一个 prompt、seed、guidance 下看退化来自哪里;1、2、4、8 步分别测,不要只展示最好看的那一档;文本、ControlNet、参考图、局部编辑、风格约束要分开测;多对象、计数、空间关系、文字、复杂材质最容易暴露问题;端到端时延也要报告,而不只是 UNet 前向次数。

如果一个少步学生在平均视觉指标上接近 teacher,但在复杂 prompt 里丢对象、文字糊、结构控制漂移,那么它还不能算真正可替代 teacher,只能算快速预览或低风险场景的候选。

6. 相关论文入口

  1. Progressive Distillation: Progressive Distillation for Fast Sampling of Diffusion Models
  2. Consistency Models: Consistency Models / 官方 GitHub
  3. LCM: Latent Consistency Models
  4. DMD: One-step Diffusion with Distribution Matching Distillation
  5. DMD2: Improved Distribution Matching Distillation for Fast Image Synthesis

1. Progressive Distillation

它的思想可以写成

student(xt,t)teacher(2)(xt,t)\text{student}(x_t, t) \approx \text{teacher}^{(2)}(x_t, t)

也就是让学生学会“教师两步完成的事”。不断重复后,步数可以从 NN 压到 N/2N/2N/4N/4 甚至更低。

这条路线的价值,在于它尽量保留了原始扩散教师的行为方式。学生不是从零发明一条新路径,而是在教师已经验证过的多步轨迹上逐级压缩。这样做的优点是直觉清楚、过渡自然,也更容易和原有训练框架兼容。

但它的局限也很明确。因为学生始终在模仿教师的压缩版本,所以一旦目标步数压得非常低,误差会层层累积。换句话说,它非常适合把 32 步压到 16、8、4 这种区间,却不一定天然擅长“高质量一步生成”。

例子:学徒画师

老师原本需要 16 笔画完一张苹果静物,学徒先学“两笔合成一笔”,再学“四笔合成一笔”,最后压缩成 4 笔或 2 笔完成。

2. Consistency / LCM

一致性路线希望直接学会

fθ(xt,t)fθ(xs,s),当 xt,xs 属于同一数据轨迹f_\theta(x_t, t) \approx f_\theta(x_s, s), \qquad \text{当 } x_t, x_s \text{ 属于同一数据轨迹}

直觉上,不同噪声层级的点,只要它们对应同一个真实样本,就应该被映射到接近的干净结果。

这类方法适合一步或少步采样,也适合保留与大教师模型的一致性,并与 latent diffusion 结合。

一致性路线真正吸引人的地方,是它不再执着于“严格走完整条教师轨迹”,而是希望不同噪声层级上的点能被直接收束到相近的干净结果。这样一来,模型在推理时就不必重演那么多中间步骤,而可以更像一个“跨层级纠偏器”。

这类方法因此特别适合交互式预览、少步 latent diffusion 和需要快速试错的产品场景。风险则在于,一旦一致性目标定义得不够稳,学生很容易在高难 prompt、强 guidance 或长尾视觉模式上丢掉细节和条件敏感性。

3. DMD:从轨迹模仿转向分布匹配

DMD 的关键不是“模仿教师每一步动作”,而是直接优化学生分布与目标分布的差异。

可以把它粗略理解为最小化

D(pstudent(x),ptarget(x))D\left(p_{\text{student}}(x), p_{\text{target}}(x)\right)

论文中利用真实分布侧和生成分布侧的 score 差来构造训练信号。直觉上,如果学生样本分布偏离真实数据,两个 score 会给出方向差,并推动一步生成器朝正确分布移动。

DMD 的关键突破,不是简单让学生“少走几步”,而是把问题改写成“学生最终落到的分布对不对”。这会带来一种完全不同的蒸馏哲学:不再要求学生逐帧模仿老师,而是允许它用自己的方式,只要最终分布足够接近目标。

这也正是一步生成难度陡增的地方。因为你抛开了轨迹监督之后,学生获得了更大自由度,但训练稳定性、模式覆盖和锐度也更容易一起失控。

例子:做面包而不是背配方

传统轨迹蒸馏像让学徒严格模仿师傅每一步揉面、发酵、烘烤。

DMD 更像只看最终面包是否外形、口感和香气都接近目标产品,然后用“结果差异”反推哪里需要改。

4. DMD2:解决模糊与训练不稳

DMD2 延续分布匹配思路,但更强调稳定性。可以用一个近似的总目标来理解:

L=Ldist-match+λganLgan\mathcal{L} = \mathcal{L}_{\text{dist-match}} + \lambda_{\text{gan}}\mathcal{L}_{\text{gan}}

这里的直觉是:分布匹配负责把总体分布拉对,对抗损失负责提升清晰度和锐度。

这很像图像生成里常见的分工:一个目标保“方向对”,另一个目标保“画面利”。

DMD2 更像是在承认一个现实:只靠分布级别的方向信号,往往还不足以把视觉清晰度和细节锐度也一起拉起来。于是它通过更稳定的训练耦合和更清楚的损失分工,把“分布对齐”和“视觉可用”重新接到一起。

从方法演化上看,DMD2 说明一步生成真正困难的,不是目标本身够不够激进,而是训练信号是否既能管大方向,又能管高频细节。只要这两者失衡,结果不是糊,就是不稳。

5. Phased DMD:把一步难题拆成多个阶段

Phased DMD 把噪声空间按 phase 划开,每个 phase 内再做局部分布匹配。可以写成:

Ltotal=k=1K(λkLdm(k)+γkLscore(k))\mathcal{L}_{\text{total}} = \sum_{k=1}^{K} \left(\lambda_k \mathcal{L}_{\text{dm}}^{(k)} + \gamma_k \mathcal{L}_{\text{score}}^{(k)}\right)

这里 kk 表示不同阶段。这样做的好处是让早期 phase 先学大结构,中期 phase 学物体关系和构图,后期 phase 再盯住纹理与细节。

例子:画一辆赛车

如果要求学生一步完成,很可能只画出“像车”的轮廓,赞助商贴纸、轮胎纹理、反光材质会丢失。

如果分阶段学,第一阶段可以先把赛车姿态、车头、轮胎位置定住,第二阶段学习车壳分色和赛道背景,第三阶段再补 logo、反射和运动模糊。

这比硬做一步往往稳得多。

5.1 从 Phased DMD 图里理解“少步不等于一步”

少步蒸馏最容易被误解成“把采样步数砍掉”。Phased DMD 的图正好能纠正这个误解:4 步生成仍然可以有阶段分工,高噪声阶段负责大结构和运动,低噪声阶段负责纹理和细节。真正要防止的是训练过程把每一步都逼成“一步解决全部问题”的学生。

Phased DMD schematic

图源:Phased DMD: Few-step Distribution Matching Distillation via Score Matching within Subintervals,Figure 1。原论文图意:对比 vanilla few-step DMD、DMD2/SGTS、4-phase Phased DMD 和结合 SGTS 的 2-phase Phased DMD;红色表示记录梯度的 generator step,蓝色表示不记录梯度的 forward step。

这张图帮你补哪块基础

红色 step 表示训练信号真正反传到哪里,蓝色 step 表示只是向前跑出中间状态。DMD2 / SGTS 通过只记录最后一步梯度来省显存,但随机截断有时会让训练样本退化成近似 one-step distillation。Phased DMD 的补丁是把 SNR 路径切成 phase,让每个 expert 只负责一个子区间。这样少步模型仍保留“先定大局、再修细节”的分工。

这件事和 Wan2.2 的 high-noise / low-noise MoE 设计也能连起来理解。视频里的大运动、镜头变化、主体位置,往往在高噪声 / 低 SNR 阶段先被决定;低噪声 / 高 SNR 阶段再补纹理和局部细节。如果少步蒸馏总把训练压成一跳,模型就可能先保画面稳定,却牺牲运动幅度和多样性。

因此,少步蒸馏的验收不能只看“几步出图”和平均画质,还要看视频 motion intensity 有没有被压慢、不同 seed 的多样性有没有塌缩、复杂镜头和动作 prompt 是否还可控、文字 / logo / 边缘 / 高频细节是否被低步数牺牲,以及每个 phase 的训练目标是否真的对应正确的噪声子区间。

6. Rectified Flow / Rectified Diffusion

这条路线并不是主要做“教师蒸馏”,而是重新设计从噪声到数据的生成路径,让它更适合少步离散。

可以把目标想成:学习一条更平直、更容易数值积分的轨迹

dxdt=vθ(x,t)\frac{dx}{dt} = v_\theta(x,t)

若轨迹足够规则,一步或少步 Euler 就可能已经足够。

Rectified Diffusion 进一步说明:真正关键的不一定是几何意义上的“绝对直”,而是轨迹和配对方式是否适合粗离散。

这条路线值得单独看,是因为它把重点从“如何蒸馏教师”转成了“如何让路径本身更适合少步求解”。也就是说,它不是首先回答“老师怎么教学生”,而是先回答“从噪声走到数据,什么样的路更适合用很少步数走完”。

因此 rectified 路线和 DMD 路线虽然都在追求极少步,但关注点并不一样。前者更像重画道路,后者更像在结果空间里直接纠偏。

7. 什么时候选哪条路线

你不想重训

看求解器,不看蒸馏。

这种场景最常见于:模型已经训完、部署链路已经跑通、团队只想在当前权重上把推理速度再压一点。此时蒸馏和整流的训练成本通常不划算,因为它们会把问题从“推理调优”升级成“重新训练并重新验收”。所以更稳妥的路径仍然是先换 solver,再看是否真的有必要进入学生模型路线。

你要 4 到 8 步

优先看 Progressive Distillation、Consistency / LCM 和 Rectified 路线。

这一档通常是工程上最有现实吸引力的区间。因为 4 到 8 步已经足够明显地降低时延和成本,但又没有一步生成那么极端,因此更容易兼顾质量、控制性和稳定性。很多真实产品若不是强追求一步,往往会在这个区间找到更好的性价比。

你要 1 步并且追求很高质量

重点看 DMD、DMD2 和 Phased DMD。

这类目标往往只在两种情况下值得认真投入:一是交互预算极紧,二是推理成本极敏感。因为一步生成不是“更快一点”,而是会显著改变训练、评测和回退设计。只要你决定走这条路,就等于接受了更复杂的训练流程和更严格的长尾验收要求。

8. 一个总判断

一步生成的难点,不是“把 20 步删成 1 步”,而是如何保住分布正确性、高频细节、模式覆盖和文本条件。

所以 DMD2Phased DMDRectified Diffusion 本质上都在回答同一个问题:极少步下,怎样既快又不崩。

快速代码示例

1
2
3
4
5
6
7
8
import torch
import torch.nn.functional as F

def distill_step(student, teacher, x_t, t, cond):
with torch.no_grad():
target = teacher(x_t, t, cond=cond).sample
pred = student(x_t, t, cond=cond).sample
return F.mse_loss(pred, target)

这段代码给出最小 teacher-student 蒸馏步:用 teacher 生成目标噪声(或速度)预测,student 直接回归。一步或少步扩散蒸馏通常都以这类“轨迹/分布对齐”损失为核心,再叠加对抗或感知约束稳住细节。

工程收束

一步生成、蒸馏与整流要按 teacher-student 差距、步数压缩、模式覆盖、稳定性和部署收益来验收。最容易踩坑的是蒸馏后快了但控制性变差、只看单一视觉指标、teacher 偏差继承到 student;少步学生尤其容易在强条件控制、高频细节和长尾 prompt 上露怯。上线前应固定 teacher-student、步数桶、控制桶和回退门槛四类对照。

  • Title: 扩散模型:一步生成、蒸馏与整流
  • Author: Charles
  • Created at : 2025-05-05 09:00:00
  • Updated at : 2025-05-05 09:00:00
  • Link: https://charles2530.github.io/2025/05/05/ai-files-diffusion-distillation/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments