外观
知识蒸馏
概念定义:把"暗知识"传给小模型
**知识蒸馏(Knowledge Distillation, KD)**由 Hinton et al. (2015) 系统化提出:用一个大的、表现好的 teacher 模型指导一个小的 student 模型训练,让 student 不仅学到 ground truth,还能学到 teacher 的输出分布——后者包含 teacher 多年训练积累的"暗知识"(dark knowledge)。
理解 KD 的两个关键认知:
- soft label 比 hard label 信息多得多——hard label "这是猫",soft label "猫 0.7、狗 0.2、汽车 0.001",后者告诉 student "猫和狗有点像、和汽车差很多",这种类间关系是 hard label 学不到的;
- KD 不是单纯模仿,是更密集的监督信号——teacher 的 logits / 中间特征 / 行为轨迹都是 student 可以模仿的"老师笔记"。
KD 与量化、剪枝合称模型压缩三件套:量化减字节、剪枝减参数、蒸馏减模型大小——三者可叠加(如先用蒸馏得小模型,再量化部署)。
一、为什么 soft label 有用
信息的密度差异
text
Hard label(one-hot): [0, 1, 0, 0, 0] # 1 bit 信息
Soft label(teacher): [0.01, 0.7, 0.2, 0.08, 0.01] # 类间关系、置信度Hard label 只告诉 student "正确答案是第 2 类",soft label 还告诉它:
- 第 2 类置信度 0.7(不是绝对,存在歧义);
- 第 3 类(0.2)和第 2 类相似,容易混淆;
- 第 4 类(0.08)也有点像;
- 第 1、5 类完全不像。
这些"非正确类的相对概率"就是暗知识——每个样本相当于多了 4 个"软监督",信息量是 hard label 的几倍。
温度 T:让分布更"软
teacher 的原始 softmax 输出经常很尖锐(一个类 0.99,其他都 0.001)——这样的 soft label 几乎退化成 hard label,没信息量。引入温度 T 软化分布:
text
普通 softmax: p_i = exp(z_i) / Σ_j exp(z_j)
带温度 softmax: p_i = exp(z_i / T) / Σ_j exp(z_j / T)T 越大分布越平(极端 T→∞ 时退化为均匀分布),T=1 是普通 softmax。Hinton 推荐 T=2-10(让分布适度软化,类间关系显化但又不至于完全平均)。
温度的几何意义
T 是 logits 的"温度计"——T 高 = 分子热运动激烈 = 分布更平均("热"),T 低 = 分布更尖锐("冷")。蒸馏时 teacher 用高 T 输出软分布,student 用同样的高 T 学习模仿;推理时 student 用 T=1 输出尖锐预测。
二、三类监督信号
KD 不止"模仿输出"一种形式,根据模仿对象不同分三类:
| 监督类型 | student 学什么 | 形式 | 适用 |
|---|---|---|---|
| Soft label(输出) | teacher 的 logits 分布 | L_student = α·CE(hard) + (1-α)·KL(soft) | 通用 |
| Hard label + soft label 混合 | 正确答案 + 类间关系 | 同上,α 调权 | 通用 |
| Intermediate feature(中间表示) | teacher 中间层激活 | L = | |
| Behavior(行为/轨迹) | teacher 的输出序列/决策 | RL 中的 reward shaping | 强化学习、LLM 对话 |
1. Soft label KD(经典 Hinton)
python
# 简化版 KD loss
def kd_loss(student_logits, teacher_logits, labels, T=4, alpha=0.5):
soft_targets = F.softmax(teacher_logits / T, dim=-1)
soft_pred = F.log_softmax(student_logits / T, dim=-1)
kd = F.kl_div(soft_pred, soft_targets, reduction='batchmean') * (T * T)
ce = F.cross_entropy(student_logits, labels)
return alpha * kd + (1 - alpha) * ceT*T是温度缩放补偿——KL 散度对 logit 做了 1/T 缩放,loss 数值也缩小 T 倍,乘回 T² 才能与 CE 同量级;- α 通常 0.5(soft / hard 各半),任务简单可调高 α,任务难可调低 α。
2. Intermediate Feature KD(FitNet)
让 student 模仿 teacher 中间层激活——把"表示"也传过去:
text
L_total = L_KD(soft) + β · ||proj(feat_s) - feat_t||²
↑
可能有投影层(student 维度小,要对齐 teacher 维度)- 优势:表示空间被压缩,student 学到的不仅是分类边界,还有特征结构;
- 适用:student 与 teacher 架构不同但要做表示任务(如检索)。
3. Behavior / Sequence KD
不只模仿输出 logits,模仿生成轨迹——让 student 学 teacher 的"说什么、按什么顺序说":
- Sequence-level KD:teacher 用 beam search 生成最优输出,student 直接 fine-tune 模仿这些输出("exposure bias" 问题需注意);
- Token-level KD:teacher 每步的 next-token 分布作为 student 的 soft target;
- Action-level KD:强化学习里 teacher 的 Q 值作为 student 的辅助 reward。
三、LLM 时代的知识蒸馏
LLM 体量大、训练贵、闭源模型(GPT-4)只能 API 调用——这反而让蒸馏焕发新生:
1. 黑盒蒸馏:用 API 模型当 teacher
GPT-4 / Claude 等闭源 LLM 不能拿到 logits,只能拿到生成文本——用它们的输出做 fine-tune 数据:
text
原始 prompt → GPT-4 → GPT-4 输出
↓
student (7B/13B) 在这些样本上 fine-tune典型工作:
- Alpaca:用 GPT-3.5 输出指令数据 fine-tune LLaMA 7B → 一度开源最强;
- Vicuna:用 GPT-4 对话数据 fine-tune LLaMA → 接近 ChatGPT;
- WizardLM:复杂指令数据蒸馏;
- Tabby:代码场景蒸馏 Codex。
局限:teacher 的 logit 分布拿不到(黑盒),只能学最终输出,没有暗知识——效果远不如白盒。
2. 白盒蒸馏:拿 logits 模仿
如果 teacher 是开源的(LLaMA、Qwen、DeepSeek),可以拿到 logits——直接做 Hinton 式 soft label KD:
- MiniLLM(Gu et al., 2024):对 LLM 设计的 KL 散度反向传播(普通 KL 在 student 输出概率低处梯度消失),用 Diverse Beam Search + KL 最小化;
- GKD(Generalized KD):student 在自己生成的轨迹上学习,避免 distribution mismatch;
- MiniMA:用"asymmetric KL"(student 模仿 teacher)压缩 LLaMA-2-13B 到 ~7B 量级。
3. 任务蒸馏:专项能力传
teacher 不直接教 student 一切,而是专门传授某项能力:
- 数学蒸馏:让 teacher(如 GPT-4 + CoT)生成数学推理数据,student 学数学能力(如 MetaMath、Mammoth);
- 工具使用蒸馏:teacher 演示如何调用工具,student 模仿;
- 代码蒸馏:teacher 生成代码 + 测试用例,student 学编程;
- 多模态蒸馏:teacher(如 GPT-4V)教 student(如 LLaVA)视觉理解。
这种"窄领域 + 强 teacher + 大量合成数据"的蒸馏方式,催生了一批 SOTA 小模型。
蒸馏 LLM 的实操路径
四、压缩三件套:蒸馏的位置
蒸馏、量化、剪枝不是竞争关系,是互补:
| 技术 | 改变什么 | 训练成本 | 收益 | 典型叠加 |
|---|---|---|---|---|
| 蒸馏 | 模型架构(大 → 小) | 高(要 teacher) | 模型变小,可定制能力 | 第一步:从 70B 蒸馏到 7B |
| 量化 | 数据格式(FP16 → INT4) | 低(PTQ 几小时) | 显存 4×、速度 3-4× | 第二步:7B 量化到 4bit |
| 剪枝 | 参数数量(移除冗余) | 中(需微调) | 模型再小、稀疏加速 | 第三步:2:4 稀疏叠加 |
工程顺序建议:
text
选 teacher → 蒸馏得 small model → 量化 → 剪枝(可选) → 部署先蒸馏换小架构(决定模型大小)→ 再量化减字节(决定部署速度)→ 必要时剪枝叠加(极致压缩)。
不要先量化再蒸馏
顺序错了事倍功半:
- 先量化:teacher 量化精度受损,蒸馏出来的 student 是次品;
- 先剪枝:剪枝破坏结构,蒸馏时 student 学不到稳定表示; 先蒸馏换架构,再量化/剪枝叠加是工程正解。
五、蒸馏的工程权衡
| 问题 | 选项 | 经验 |
|---|---|---|
| teacher 选多大 | GPT-4 / LLaMA-70B / Qwen-72B | 越大越好,但要平衡 API 成本 / 训练资源 |
| student 选多大 | 1.5B / 7B / 13B | 部署目标决定,边缘选 1.5B,服务选 7B |
| 数据量 | 5K - 1M 条 | 数据质量 > 数量;100K 高质量样本 > 1M 噪声样本 |
| 训练轮数 | 2-5 epoch | 早停防过拟合 |
| α 权重 | 0.3-0.7 | hard label 简单任务低 α;soft label 复杂任务高 α |
| 温度 T | 2-10 | 大模型用高 T(logits 尖锐);小模型用低 T |
六、蒸馏的局限与陷阱
- 能力天花板是 teacher——student 学不到 teacher 不会的(GPT-4 不会做数学的,蒸馏出来的 student 也做不了数学);
- 分布漂移——student 在 teacher 输出上 fine-tune,但推理时输入分布不同 → "exposure bias",需要 GKD/on-policy 蒸馏;
- 暗知识被低估——很多蒸馏只用 hard label(teacher 输出文本),丢掉了 logits 信息,效果差很多;
- teacher 的偏见被继承——teacher 有偏见(如政治倾向、安全过滤)→ student 也继承,无法清洗;
- 法律与许可——很多闭源 API 的 ToS 禁止用输出去训练模型(OpenAI ToS 明确禁止),黑盒蒸馏前要查许可。
GPT-4 蒸馏的法律风险
- OpenAI ToS 明确禁止用 ChatGPT/GPT-4 输出训练竞争模型;
- 一些开源数据集(如 ShareGPT)是从用户对话中收集的,许可灰色;
- 商用 LLM 服务蒸馏前查 ToS——否则上线时收到停止信函。
七、权衡与取舍
- 量化 vs 蒸馏:量化便宜,蒸馏贵——能量化就量化;要小模型/特定能力才蒸馏;
- 白盒 vs 黑盒:白盒精度高,但要 teacher 权重;黑盒简单但效果差;
- 整体蒸馏 vs 任务蒸馏:通用模型用整体蒸馏;专项能力(数学、代码、工具)用任务蒸馏;
- 蒸馏 vs 直接训小模型:蒸馏通常胜过直接从零训同尺寸 student(有 teacher 监督);
- 蒸馏 + LoRA:在量化模型上做 LoRA + 蒸馏 → 兼顾小模型与微调能力。
延伸阅读
- 剪枝与稀疏化——压缩三件套的"减参数"手段
- 量化基础——压缩三件套的"减字节"手段
- 权重量化与混合精度——蒸馏后小模型的部署加速
- 模型服务化与编排——小模型的部署与编排
- 实践指南——LoRA + 蒸馏的实操路径
- 核心论文清单——KD/MiniLLM/Alpaca 论文链接
- 前沿论文——最新蒸馏算法进展
参考资料
- Hinton, Vinyals, Dean. Distilling the Knowledge in a Neural Network(NeurIPS Workshop 2015) —— 知识蒸馏奠基论文
- Romero et al. FitNets: Hints for Thin Deep Nets(ICLR 2015) —— 中间层蒸馏
- Sanh et al. DistilBERT: A distilled version of BERT(2019) —— BERT 蒸馏工程范例
- Gu et al. MiniLLM: Knowledge Distillation of Large Language Models(ICLR 2024) —— LLM 白盒蒸馏
- Taori et al. Alpaca: A Strong, Replicable Instruction-Following Model(2023) —— 黑盒蒸馏 LLM 经典
- Mukherjee et al. SeqKD: Systematic Generalization Distillation —— 序列级 KD
- Agarwal et al. On-Policy Distillation of Language Models(2024) —— GKD/on-policy KD
- Wang et al. MetaMath: Bootstrap Your Mathematical Questions(2024) —— 任务蒸馏范例