蒸馏——把剪掉的知识蒸回来
这一章讲三件事: 为什么「删哪块」的决定决定了恢复的成本和上限;三路信号合成的总误差(行话叫损失——机器答完与目标之间的差距;三份各是:硬标签——练习册的标准答案,软标签——老师的把握表,隐藏状态——中间步骤的状态)怎么配平;以及进阶技巧在什么数据量下才值得开。 第 02 章的蒸馏只对齐了最终输出;本章把「过程」也纳入教学——为此必须先解决一个新问题:老师和学生层数不一样,中间层怎么一一对齐?
1. 这一章讲什么
第四、五章的剪枝必然掉能力,本章负责找回来。全书的方法论顺序在这里最明显:恢复不是从训练循环开始的,是从决定删哪块开始的——作者复盘自己最早的实验:同样删四块,按重要性删的模型恢复耗时明显更短1。
它在全书链条里的位置: 它是剪枝(第四、五、八、九章)的通用善后,也是管线里唯一一章「同时消费前两章成果」的:删块用第四章的选法,恢复数据配平用第五章的教训。特化(第七章)则在它之后,免得在受伤的模型上做微调。
2. 顶层全景
第一步 选块(决定恢复的成本与上限)
四种策略同台:数据驱动散选 / 连续选 / 删尾 / 删尾保尾
→ 起点保留 78.6% 的那个,永远先到终点
第二步 对齐(老师 18 块,学生 14 块)
三种层映射:uniform(按比例)/ last(贴尾部)/ original(原索引)
第三步 训练(三信号复合损失)
total = α·硬标签 + β·软分布 + γ·隐藏状态对齐
默认 0.4 / 0.4 / 0.2;温度软化软分布;Skew KLD 与 FDD 按数据量加开
验收:困惑度 + 能力保留率 + LAMBADA(最难恢复的单项)
3. 核心原理
3.1 选块实验:起点决定终点
实验设定:gemma-3-270m,18 块删 4(约 22% 深度),恢复教材用 Cosmopedia——Hugging Face 出品的高质量合成数据(机器生成的教材),无噪声、四种文体混装2。四种删法先比「剪完还没恢复」的惨状,再比「2 千条样本、5 遍恢复」后的回升3:
| 删法 | 删掉的块 | 剪后困惑度(老师 13.38) | 剪后能力保留 | 恢复后保留 |
|---|---|---|---|---|
| 数据驱动散选 | [9,8,14,16] | 126(约 9 倍) | 78.6% | 86.7% |
| 数据驱动连续选 | [8,9,10,11] | 490(约 36 倍) | 65.8% | 86.4% |
| 删尾 4 块 | [14-17] | 264 | 66.6% | 82.4% |
| 删尾保尾 2 块 | [12-15] | 464 | 67% | 86% |
两个结论。第一,保尾假设在这模型上垫底:保住末两块,剪后困惑度反而 464——如果删掉的中层本身关键,保尾巴救不了你4。第二,恢复增益与起点成反比:连续选恢复增益 +31.31 个百分点(起点太惨),散选只 +10.31——但散选的终点最好。「起点好的学生,不用补那么多课」5。
工程红线顺手带走:老师要冻结(锁住不许动)、关梯度;学生从老师深拷贝来,记得解冻——不解除冻结,训练静默失败,一个参数都不会动6。数据要切 90/10 的训练/验证:拿训练数据验恢复,测出的是背诵不是抽象7。
3.2 层映射:14 块的学生怎么跟 18 块的老师对暗号
要对齐中间层,先回答「学生的第 i 块跟老师的第几块学」。三种映射8:
- uniform(按比例): 学生第 7 块(正中)对老师第 9 块(也差不多正中)。学生能吸收老师全深的养分;
- last(贴尾部): 学生整体后移四位,学生第 0 块对老师第 4 块。赌「最精炼的知识在深处」;
- original(原索引): 学生每块对老师里原来就在那个位置的块,被删的位置留空。保住剪枝前的对应关系。
3.3 主走查:一轮蒸馏训练里发生什么
走查对象:同一批(比如 8 条一起送)训练文本。 六步,每步带具体的数:
① 学生前向:算出每个位置上「下一个词」的分数(logits),
顺带要求返回每一块的中间状态(γ>0 时才要,省显存)
② 老师前向:同样的事,但关梯度——显存直接省一半[^9]
③ 硬标签损失(α 份):学生的 logits 错位一格跟答案对齐
——logits 第 0 位预测第 1 个词,所以 logits 去尾、标签去头
("Work hard play hard" 要预测的是 [hard, play, hard, <eos>])[^10]
padding 位标成 -100,不计损失(不许学补位)[^11]
④ 软标签损失(β 份):两个分布算 KL 散度,再乘温度的平方
——除以温度会让梯度变小,乘 T² 补偿回来[^12]
⑤ 隐藏状态损失(γ 份):按层映射逐对取中间状态,
各自归一化后算余弦,损失 = 1 − 相似度,对所有对取平均[^13]
⑥ 合计:total = α·③ + β·④ + γ·⑤,反向传播只更新学生
温度——软化 打分的旋钮——在 ④ 里干的事,值得单独看一眼。 输入「Work hard play」,老师原装的分布:hard 94.5%、well 3.7%、good 0.3%、harder 0.2%——照这个学,学生只知道「hard 对」。
把 logits(每个候选词的原始打分)除以温度 2.0 再 softmax:hard 掉到 23.9%,well 升到 4.7%,good 1.3%,harder 1.2%——学生第一次看见:老师也认真考虑过别的词。「答案表里老师知道的第二名」正是软标签的全部价值9。
为什么隐藏状态只给 20% 的权重? 这些中间表示当初训练时只是为了「合力预测下一个词」,并不是设计来单独给人看的;给 20%,是借老师消化过的语义结构给学生托底,又不至于把它捆死在老师的思考路线上10。什么时候调高?当中间表示本身就是产品——embedding 模型、吃向量的分类器(拿数值特点判类别的部件)——γ 提到 0.3-0.4。
纯生成模型(只管往下写文字的)反而可以压到 0.1 甚至 0,让学生自由发挥11。
为什么三个权重加起来要等于 1? 不是硬性规定,是读数习惯:加起来超 1 等于放大梯度、训练发飘,不足则学得没劲;动一个,记得另一个往回补12。
成绩单(2K / 15K / 40K 条 Cosmopedia,老师对照): 老师困惑度 13.38→12.96→12.91;剪后残模型 125.6,能力保留 78.6%,LAMBADA 只有 0.177(老师 0.43)。只开 α+β(纯标签蒸馏):18.86 → 12.65 → 11.73——15K 时困惑度反超老师(12.96),40K 能力保留 90.1%13。加上隐藏状态对齐与进阶件(FDD+Skew KLD):40K 困惑度 11.54,比纯标签再低 0.19,代价是约 15% 的额外训练时间,能力保留几乎不动14。LAMBADA 全员没有恢复满:最好的也只到 0.335——长程语言是删层伤得最重、也最难完全复原的能力,这条结论在第九章会再次出现15。
3.4 进阶件:什么时候值得开
Skew KLD(修正分布落差)。 刚剪完的学生分布离老师很远:老师给「France」70%,残废的学生只给 30%,标准 KL 会产生过陡的梯度,逼学生一步到位地装老师。Skew 的改法:不跟老师直接比,跟一个混合目标比——90% 老师 + 10% 学生(skew_alpha=0.1)。学生差的时候,那 10% 的「自己的声音」缓冲惩罚;学生变好,混合目标自动收紧16。
FDD(Feature Dynamics Distillation,对齐变化率)。 隐藏状态对齐问的是「你的第 5 层像不像我的第 9 层」;FDD 问的是**「你从第 5 层到第 6 层的变化方向,像不像我从第 9 层到第 10 层的变化方向」**——把相邻两层的状态差(delta)拿来算余弦。状态可以不同,处理信息的「方式」要一致17。
什么时候开?书里的经验刻度:<10K 条样本,两个都不开,基础蒸馏一样好还便宜;15K 起 Skew KLD 开始稳定占优;>30K 两个都开,困惑度优势随数据量继续放大18。反过来一句更重要:数据嘈杂或者块选错了,任何损失函数(就是上面那种总误差公式)都救不回来19。
3.5 现成配置表
书里给了一张起点表(抄录要点,完整表见原文地图):
| 场景 | α | β | γ | Skew | FDD |
|---|---|---|---|---|---|
| 通用模型,数据 >30K | 0.4 | 0.4 | 0-0.2 | 0.1 | 0.1 |
| 通用模型,15K-30K | 0.4 | 0.4 | 0-0.2 | 0.1 | 0 |
| 通用模型,<10K | 0.4 | 0.4 | 0.2 | 0 | 0 |
| 激进剪枝(>20% 块) | 0.25 | 0.45 | 0.2 | 0.1-0.15 | 0.1 |
| embedding/RAG 模型 | 0.25 | 0.25 | 0.4 | 0.1 | 0.1-0.2 |
| 高质量任务数据 | 0.5 | 0.3 | 0.1 | 0 | 0.1 |
温度的经验值:2.0 通用;老师分布特别尖(单 token 超 90%)时升到 2.5-3.5;老师本来就平,降到 1.0-2.020。与宽度剪枝完全兼容——宽度剪枝不动隐藏维,块级输入输出尺寸不变,对齐照常;先宽后深再蒸馏,可叠21。
4. 作者的判断与证据
给了证据的: 四策略对比、三档数据量的完整表格全部来自作者在 A100 上的可复现实验(书里连跑一轮 KD 需要几分钟都写了);「纯标签蒸馏在 15K 以上反超老师」是从表中直接读出的事实。
书外 anchoring(行业对照): 本章的做法与 NVIDIA Minitron(2024)和 Mistral Ministral 3(2026)一致——这两家都发现蒸馏式恢复稳定优于普通微调,Mistral 甚至发现纯 logits 蒸馏目标好过任何混合(暗示硬标签可选);作者保留 α 是为了特定任务更早收敛(训练到成绩稳定、不再明显提升的状态)。层数映射上,NVIDIA 的经验是压缩不到一半用 uniform,删过半才轮到 last;注意 NVIDIA 说的「激进」 是删 50%+,本书 270m 删 20% 就算激进——模型越大越扛删22。作者的社区挑战模型(gemma-3-270m-14L-distilled,A100 上 68 分钟)做到保留 89.5%、困惑度 10.85,当练习靶子23。
5. 边界与局限
- LAMBADA 恢复不满是系统性现象(0.177→0.32-0.335,老师 0.43),不是调参能解决的;对长文档任务要有心理预期。
- 配置表是起点不是定律,作者原话:每个模型和数据集都有自己的脾气,数值要靠验证集调24。
- 恢复的天花板由选块决定,本章开头就是证据;蒸馏技巧不能倒推补救一次糟糕的剪枝。
- 硬件口径: 主实验在 A100;T4 免费档可跑的是精简版,数字会浮动。
- 进阶件的收益度量是困惑度;如果你的验收指标是任务准确率,γ/进阶件的取舍要重新算。
6. 可带走的
- 恢复成本在删块那一步就定了:起点保留多的学生,终点又好又便宜;
- 三种层映射:压缩不到一半用 uniform;别默认「贴着尾部学」最好;
- 三信号配平:硬标签教「答对」,软标签教「老师的犹豫」,隐藏状态教「思路」;生成模型 γ 可低,embedding 模型 γ 拉高;
- 温度不是生成参数,是教学参数:把 94.5% 软化,学生才看得见第二名;
- token shifting 与 -100:logits 去尾标签去头;padding 不许学;
- KL 损失乘温度平方——除法欠的梯度要还;
- 进阶件按数据量开关:<10K 全关;>30K 双开;数据差,啥都救不了;
- LAMBADA 是恢复的照妖镜:它恢复不满,说明长程能力最先受伤、最后痊愈;
- 蒸馏式恢复优于普通微调——这是 NVIDIA 和 Mistral 用生产管线背书的结论。
7. 原文地图
| 主题 | 原书章 | 原文位置 |
|---|---|---|
| 恢复始于选块 | 6 Knowledge recovery through distillation | text/20-ch06-6-knowledge-recovery-through-distillation.txt:44(搜「significantly less training time」) |
| 三信号预告 | 6 Knowledge recovery through distillation | text/20-ch06-6-knowledge-recovery-through-distillation.txt:62(搜「intermediate blocks」) |
| 四策略与实验设定 | 6.1 Choosing what to prune | text/21-ch06-01-6-1-choosing-what-to-prune.txt:31(搜「22%」) · text/21-ch06-01-6-1-choosing-what-to-prune.txt:84(搜「Data-driven individual」) · text/21-ch06-01-6-1-choosing-what-to-prune.txt:19(搜「recovery ceiling」) |
| Cosmopedia 与冻结/解冻 | 6.1 Choosing what to prune | text/21-ch06-01-6-1-choosing-what-to-prune.txt:135(搜「high-quality synthetic dataset」) · text/21-ch06-01-6-1-choosing-what-to-prune.txt:245(搜「Freezes all teacher parameters」) · text/21-ch06-01-6-1-choosing-what-to-prune.txt:677(搜「silent training failure」) · text/21-ch06-01-6-1-choosing-what-to-prune.txt:362(搜「90/10」) |
| 剪后对比与恢复后对比 | 6.1 Choosing what to prune | text/21-ch06-01-6-1-choosing-what-to-prune.txt:450(搜「126」) · text/21-ch06-01-6-1-choosing-what-to-prune.txt:506(搜「protection hypothesis」) · text/21-ch06-01-6-1-choosing-what-to-prune.txt:564(搜「86.7」) · text/21-ch06-01-6-1-choosing-what-to-prune.txt:620(搜「not a contradiction」) |
| 三种层映射 | 6.2 Aligning Teacher and Student | text/22-ch06-02-6-2-aligning-teacher-and-student.txt:26(搜「uniform mapping」) · text/22-ch06-02-6-2-aligning-teacher-and-student.txt:57(搜「last mapping」) · text/22-ch06-02-6-2-aligning-teacher-and-student.txt:83(搜「original mapping」) |
| 复合损失结构与配平 | 6.3 Recovering the knowledge | text/23-ch06-03-6-3-recovering-the-knowledge.txt:84(搜「alpha * loss_task」) · text/23-ch06-03-6-3-recovering-the-knowledge.txt:106(搜「secondary stabilizer」) · text/23-ch06-03-6-3-recovering-the-knowledge.txt:112(搜「sum to 1.0」) |
| 温度软化算例 | 6.3 Recovering the knowledge | text/23-ch06-03-6-3-recovering-the-knowledge.txt:131(搜「94.5%」) |
| token shifting 与 padding | 6.3 Recovering the knowledge | text/23-ch06-03-6-3-recovering-the-knowledge.txt:187(搜「token shifting」) · text/23-ch06-03-6-3-recovering-the-knowledge.txt:200(搜「-100」) |
| 软标签损失与 log 空间 | 6.3 Recovering the knowledge | text/23-ch06-03-6-3-recovering-the-knowledge.txt:233(搜「temperature ** 2」) · text/23-ch06-03-6-3-recovering-the-knowledge.txt:251(搜「log space」) · text/23-ch06-03-6-3-recovering-the-knowledge.txt:264(搜「0.659」) |
| 隐藏状态损失与权重取舍 | 6.3 Recovering the knowledge | text/23-ch06-03-6-3-recovering-the-knowledge.txt:290(搜「10, 20, 30」) · text/23-ch06-03-6-3-recovering-the-knowledge.txt:352(搜「three mapping strategies」) · text/23-ch06-03-6-3-recovering-the-knowledge.txt:537(搜「semantic structures」) · text/23-ch06-03-6-3-recovering-the-knowledge.txt:556(搜「0.3 or 0.4」) |
| 训练循环工程细节 | 6.3 Recovering the knowledge | text/23-ch06-03-6-3-recovering-the-knowledge.txt:740(搜「approximately half」) · text/23-ch06-03-6-3-recovering-the-knowledge.txt:746(搜「embedding layer」) · text/23-ch06-03-6-3-recovering-the-knowledge.txt:752(搜「64 rows」) |
| 三档数据成绩 | 6.3 Recovering the knowledge | text/23-ch06-03-6-3-recovering-the-knowledge.txt:865(搜「0.177」) · text/23-ch06-03-6-3-recovering-the-knowledge.txt:876(搜「12.65」) · text/23-ch06-03-6-3-recovering-the-knowledge.txt:876(搜「11.73」) · text/23-ch06-03-6-3-recovering-the-knowledge.txt:949(搜「surpasses the teacher」) · text/23-ch06-03-6-3-recovering-the-knowledge.txt:961(搜「15% more training time」) |
| Skew KLD | 6.4 Advanced recovery techniques (FDD/ Skew KLD) | text/24-ch06-04-6-4-advanced-recovery-techniques-fdd-skew-kld.txt:87(搜「steep gradient」) · text/24-ch06-04-6-4-advanced-recovery-techniques-fdd-skew-kld.txt:93(搜「90% teacher and 10% student」) · text/24-ch06-04-6-4-advanced-recovery-techniques-fdd-skew-kld.txt:140(搜「mixed_probs」) · text/24-ch06-04-6-4-advanced-recovery-techniques-fdd-skew-kld.txt:160(搜「softens the penalty」) · text/24-ch06-04-6-4-advanced-recovery-techniques-fdd-skew-kld.txt:172(搜「fewer than 10,000 samples」) |
| FDD 与结果刻度 | 6.4 Advanced recovery techniques (FDD/ Skew KLD) | text/24-ch06-04-6-4-advanced-recovery-techniques-fdd-skew-kld.txt:190(搜「rate at which」) · text/24-ch06-04-6-4-advanced-recovery-techniques-fdd-skew-kld.txt:286(搜「transformation vectors」) · text/24-ch06-04-6-4-advanced-recovery-techniques-fdd-skew-kld.txt:479(搜「0.19 points」) · text/24-ch06-04-6-4-advanced-recovery-techniques-fdd-skew-kld.txt:485(搜「hardest to fully recover」) |
| 配置表与温度刻度 | 6.5 Practical guidelines for knowledge recovery | text/25-ch06-05-6-5-practical-guidelines-for-knowledge-recovery.txt:37(搜「2.5-3.5」) · text/25-ch06-05-6-5-practical-guidelines-for-knowledge-recovery.txt:55(搜「15,000 or more samples」) · text/25-ch06-05-6-5-practical-guidelines-for-knowledge-recovery.txt:188(搜「Prioritize imitating」) · text/25-ch06-05-6-5-practical-guidelines-for-knowledge-recovery.txt:205(搜「hidden states are the final product」) |
| 与宽度剪枝组合 | 6.5 Practical guidelines for knowledge recovery | text/25-ch06-05-6-5-practical-guidelines-for-knowledge-recovery.txt:67(搜「remains intact」) · text/25-ch06-05-6-5-practical-guidelines-for-knowledge-recovery.txt:80(搜「recover lost knowledge」) |
| 行业对照 | 6.6 From paper to practice | text/26-ch06-06-6-6-from-paper-to-practice.txt:13(搜「2601.08584」) · text/26-ch06-06-6-6-from-paper-to-practice.txt:37(搜「consistently outperforms」) · text/26-ch06-06-6-6-from-paper-to-practice.txt:43(搜「any weighted combination」) · text/26-ch06-06-6-6-from-paper-to-practice.txt:61(搜「moderate compression ratios」) · text/26-ch06-06-6-6-from-paper-to-practice.txt:74(搜「larger the model」) · text/26-ch06-06-6-6-from-paper-to-practice.txt:107(搜「no loss function will fully compensate」) |
| 挑战基线 | 6.7 Hands-on lab | text/27-ch06-07-6-7-hands-on-lab.txt:13(搜「10.85 perplexity」) |