Skip to content

Commit 05fd005

Browse files
authored
Codex/paper note distilling diversity control (#13)
* init * refine * refine ---------
1 parent 06cdf85 commit 05fd005

4 files changed

Lines changed: 124 additions & 0 deletions

File tree

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,6 @@ package-lock.json
2323
# Misc
2424
_sass/vendors
2525
assets/js/dist
26+
27+
.claude
28+
.claude-plugin

_posts/2025-11-21-code-to-style-image.md renamed to _posts/ai-auto-note/paper-reading/2025-11-21-code-to-style-image.md

File renamed without changes.

_posts/2026-03-23-distilled-diffusion-quantization.md renamed to _posts/ai-auto-note/paper-reading/2026-03-23-distilled-diffusion-quantization.md

File renamed without changes.
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
---
2+
title: "蒸馏模型生成的图都一样?"
3+
date: 2026-04-12 19:00:00 +0800
4+
categories: ["ai-auto-note", "paper-reading"]
5+
tags: [diffusion-models, distillation, diversity, generative-models]
6+
math: true
7+
---
8+
9+
最近被反馈了一个问题:同一个 prompt,随机 seed,出来的图长得都差不多。Base model 就没有这个问题。
10+
11+
我起初以为是量化产生的问题,排查后发现是因为用了蒸馏 lora。于是顺着这个线索查到了这篇论文。
12+
13+
## TL; DR
14+
15+
蒸馏模型把 timestep 压缩了,同一个 prompt 换 seed 出来的图都差不多。但奇怪的是 FID 反而比 base 好——至少说明整体分布指标没有一起坏掉,问题更集中在同一个 prompt 下的 sample diversity。论文问的就是:为什么?
16+
17+
结论:
18+
- 多样性问题不只是在"学没学到",更在"怎么生成"。论文结果说明,蒸馏模型里仍保留了不少和控制、多样性相关的表示能力
19+
- 蒸馏模型在第一个 timestep 就把图像结构拍板了,而 base model 是慢慢想的,所以多样性主要卡在第一步
20+
- 只要把第一步交给 base model、剩下的交给蒸馏模型,多样性就恢复了,而且总步数不变,推理速度也几乎不变(0.64s vs 9.22s)
21+
22+
## "没学到"还是"没用到"?
23+
24+
论文上来先问了一个很自然的问题:蒸馏过程是不是把 base model 的概念表示给破坏了?如果模型内部就没有多样性的"素材",那自然出不了多样的图。
25+
26+
这个假设很合理。蒸馏的代价是压缩,压缩的代价是丢信息——"丢掉了多样性相关的表示"听起来再正常不过了。
27+
28+
然后论文做了一组迁移实验来验证:把在 base model 上训练的控制机制直接搬到蒸馏模型上,看能不能用。
29+
30+
| 控制方法 | 类型 | Base→DMD | Base→LCM | Base→Turbo | Base→Lightning |
31+
| --- | --- | --- | --- | --- | --- |
32+
| Concept Slider (Age) | 属性控制 |||||
33+
| Concept Slider (Smile) | 属性控制 |||||
34+
| Custom Diffusion (Lego) | 个性化定制 |||||
35+
| SliderSpace (Direction 1) | 多样性方向 |||||
36+
37+
注:`Base` 指原始的多步扩散 teacher;`Base→DMD / LCM / Turbo / Lightning` 表示将 `Base` 上学到的控制方法直接迁移到对应蒸馏 student 上。这里的 `DMD``Distribution Matching Distillation``LCM``Latent Consistency Models``Turbo` 通常指基于 `Adversarial Diffusion Distillation``SDXL Turbo` 类模型,`Lightning` 指基于 `Progressive Adversarial Diffusion Distillation``SDXL Lightning` 类模型。它们都是把多步扩散压缩成少步生成的不同蒸馏路线。
38+
39+
这张表真正想问的不是"这些蒸馏方法谁更强",而是:**不管 student 是用哪条蒸馏路线训出来的,base model 学到的控制能力能不能直接继承过去?**
40+
41+
全部可以直接迁移,不需要任何重新训练。
42+
43+
特别值得关注的是 SliderSpace——这个东西本身就是从 base model 里分解出多样性的方向,它居然也能在蒸馏模型上用。也就是说,蒸馏模型并不是没有"多样性的方向",它有,只是默认生成的时候没有往这些方向走。
44+
45+
这把问题的定位从"表示层面"挪到了"生成动力学层面":**蒸馏模型里还保留着不少和多样性相关的"开关",只是默认采样轨迹没有把这些开关真正调动起来。**
46+
47+
## 既然没丢,那是什么时候丢的?
48+
49+
既然不是"没学到",那就得看"怎么生成的"——多样性是不是在生成过程中被磨掉的。
50+
51+
论文用了一个很直觉的可视化方法:在去噪过程中,每一步都把模型对最终图像的预测 $\hat{\mathbf{x}}_{0|t}$ 解码出来看。具体来说,扩散模型在第 $t$ 步预测噪声 $\epsilon_\theta(\mathbf{x}_t, t)$,由此可以估计模型认为最终图像长什么样:
52+
53+
$$
54+
\hat{\mathbf{x}}_{0|t} = \frac{\mathbf{x}_t - \sqrt{1 - \bar\alpha_t}\,\epsilon_\theta(\mathbf{x}_t, t)}{\sqrt{\bar\alpha_t}}
55+
$$
56+
57+
为什么要看这个?因为 $\hat{\mathbf{x}}_{0|t}$ 本质上就是模型在每一步对最终结果的"猜测"。如果某一步之后 $\hat{\mathbf{x}}_{0|t}$ 就不怎么变了,那说明模型在那一步就已经"想好了";如果 $\hat{\mathbf{x}}_{0|t}$ 一直在变,说明模型还在犹豫。
58+
59+
把每一步的 $\hat{\mathbf{x}}_{0|t}$ 串起来看,结论非常明显:
60+
61+
- **Base model**:前面相当一段 step 都在慢慢塑造图像结构,$\hat{\mathbf{x}}_{0|t}$ 从模糊逐步变清晰,过程中结构一直在变
62+
- **蒸馏模型**:第一步 $\hat{\mathbf{x}}_{0|t}$ 就已经和最终输出非常接近了,后面几步基本只做细节微调
63+
64+
换成人话:**蒸馏模型第一步就拍板了,后面只是润色。** 而 base model 是边走边想的。
65+
66+
第一步就定死了,那随机噪声带来的多样性就全被压在第一步里了——但蒸馏模型的压缩过程又正好把这一步的多样性给磨掉了。
67+
68+
## 把第一步换回来试试
69+
70+
如果第一步真的是瓶颈,那把第一步换回 base model 是不是就行了?
71+
72+
论文就这么做了:
73+
74+
1. 第一步用 base model 跑
75+
2. 后面几步用蒸馏模型跑
76+
77+
结果:
78+
79+
| | Sample Diversity ↑ | FID ↓ | 时间 (s) ↓ |
80+
| --- | --- | --- | --- |
81+
| Base | 0.337 | 12.74 | 9.22 |
82+
| Distilled | 0.264 | 15.52 | 0.64 |
83+
| **Hybrid (替换第一步)** | **0.350** | **10.79** | **0.64** |
84+
85+
只换了第一步,多样性不仅恢复了,还比 base model 稍高一点。FID 也更好。推理速度几乎不变,因为总步数没变,只是把原本蒸馏模型的第一步替换成了 base model。
86+
87+
反向验证也做了:如果保持蒸馏模型的第一步,把后面的 step 换成 base model——多样性完全恢复不了。这进一步证死了"多样性就是被第一步卡死的"这个判断。
88+
89+
## 为什么偏偏是第一步?
90+
91+
论文还给了一个理论视角来解释这个现象。直觉上理解的话:蒸馏训练本质上是用 MSE 去拟合 teacher 的输出,而 MSE 的最小化目标是条件均值 $\mathbb{E}[Y \mid X]$——这会让 student 更容易学到 teacher 输出的"平均情况",从而压缩掉一部分条件方差。
92+
93+
但为什么偏偏是第一步受影响最大?看 $\hat{\mathbf{x}}_{0|t}$ 对噪声预测误差的放大因子:
94+
95+
$$
96+
A_t = \sqrt{\frac{1 - \bar\alpha_t}{\bar\alpha_t}}
97+
$$
98+
99+
在早期 timestep,$\bar\alpha_t \approx 0$,所以 $A_t$ 非常大。这意味着:**同样的多样性损失,越早的 step 被放大得越狠。**
100+
101+
第一步多样性丢了,就是丢了;后面 step 的多样性本来就被噪声压着,丢也丢不了多少。
102+
103+
## 最后
104+
105+
这篇论文的思路很清晰:先排除"表示层面"的问题,再用可视化定位"什么时候出了问题",最后用 hybrid 推理验证。
106+
107+
和我[之前写的那篇蒸馏量化的文章]({% post_url ai-auto-note/paper-reading/2026-03-23-distilled-diffusion-quantization %})可以对照着看。那篇讨论了为什么蒸馏模型反而更好量化——核心也是"蒸馏改变了生成动力学"。这篇论文给出了一个更具体的说法:第一步就拍板。
108+
109+
有个部署上的现实问题:这个 hybrid 方案需要同时加载 base 和 distilled 两个模型,显存直接翻倍。对实际部署来说不太友好,更像是一个验证机制,而不是没有代价的免费优化。
110+
111+
另一个角度:这个发现其实暗示了训练蒸馏模型的一个方向——如果在蒸馏训练的时候有意保住第一步的多样性(比如不对第一步做 MSE 压缩,或者对第一步加多样性 loss),是不是就不需要这种 hybrid 方案了?
112+
113+
## 参考资料
114+
115+
- 论文: [Distilling Diversity and Control in Diffusion Models](https://arxiv.org/abs/2503.10637)
116+
- 项目主页: [distillation.baulab.info](https://distillation.baulab.info/)
117+
- 代码: [github.com/rohitgandikota/distillation](https://github.com/rohitgandikota/distillation)
118+
- DMD: [One-step Diffusion with Distribution Matching Distillation](https://arxiv.org/abs/2311.18828)
119+
- LCM: [Latent Consistency Models: Synthesizing High-Resolution Images with Few-Step Inference](https://arxiv.org/abs/2310.04378)
120+
- Turbo / ADD: [Adversarial Diffusion Distillation](https://stability.ai/research/adversarial-diffusion-distillation)
121+
- Lightning: [SDXL-Lightning: Progressive Adversarial Diffusion Distillation](https://arxiv.org/abs/2402.13929)

0 commit comments

Comments
 (0)