Skip to content

知识蒸馏

本页速览 知识蒸馏(Hinton 2015)让大模型(teacher)教小模型(student),把"暗知识"通过 soft label 传下来。本文讲透三类监督(soft/hard/feature)、温度 T 的作用、LLM 蒸馏(GPT-4 蒸馏小模型、MiniLLM 白盒蒸馏)、以及"压缩三件套"中蒸馏的角色。

知识蒸馏

概念定义:把"暗知识"传给小模型

**知识蒸馏(Knowledge Distillation, KD)**由 Hinton et al. (2015) 系统化提出:用一个大的、表现好的 teacher 模型指导一个小的 student 模型训练,让 student 不仅学到 ground truth,还能学到 teacher 的输出分布——后者包含 teacher 多年训练积累的"暗知识"(dark knowledge)。

理解 KD 的两个关键认知:

  1. soft label 比 hard label 信息多得多——hard label "这是猫",soft label "猫 0.7、狗 0.2、汽车 0.001",后者告诉 student "猫和狗有点像、和汽车差很多",这种类间关系是 hard label 学不到的;
  2. 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) * ce
  • T*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 的实操路径

  1. 有 teacher 模型权重 → 白盒 KD(MiniLLM 流程)→ 精度最佳;
  2. 只有 teacher API → 黑盒 KD(生成数据 fine-tune)→ 简单可行;
  3. 能力专项蒸馏 → teacher 生成合成数据 → student fine-tune 该能力;
  4. 蒸馏后量化 + 剪枝部署。

四、压缩三件套:蒸馏的位置

蒸馏、量化、剪枝不是竞争关系,是互补

技术改变什么训练成本收益典型叠加
蒸馏模型架构(大 → 小)高(要 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.7hard label 简单任务低 α;soft label 复杂任务高 α
温度 T2-10大模型用高 T(logits 尖锐);小模型用低 T

六、蒸馏的局限与陷阱

  1. 能力天花板是 teacher——student 学不到 teacher 不会的(GPT-4 不会做数学的,蒸馏出来的 student 也做不了数学);
  2. 分布漂移——student 在 teacher 输出上 fine-tune,但推理时输入分布不同 → "exposure bias",需要 GKD/on-policy 蒸馏;
  3. 暗知识被低估——很多蒸馏只用 hard label(teacher 输出文本),丢掉了 logits 信息,效果差很多;
  4. teacher 的偏见被继承——teacher 有偏见(如政治倾向、安全过滤)→ student 也继承,无法清洗;
  5. 法律与许可——很多闭源 API 的 ToS 禁止用输出去训练模型(OpenAI ToS 明确禁止),黑盒蒸馏前要查许可。

GPT-4 蒸馏的法律风险

  • OpenAI ToS 明确禁止用 ChatGPT/GPT-4 输出训练竞争模型;
  • 一些开源数据集(如 ShareGPT)是从用户对话中收集的,许可灰色;
  • 商用 LLM 服务蒸馏前查 ToS——否则上线时收到停止信函。

七、权衡与取舍

  • 量化 vs 蒸馏:量化便宜,蒸馏贵——能量化就量化;要小模型/特定能力才蒸馏;
  • 白盒 vs 黑盒:白盒精度高,但要 teacher 权重;黑盒简单但效果差;
  • 整体蒸馏 vs 任务蒸馏:通用模型用整体蒸馏;专项能力(数学、代码、工具)用任务蒸馏;
  • 蒸馏 vs 直接训小模型:蒸馏通常胜过直接从零训同尺寸 student(有 teacher 监督);
  • 蒸馏 + LoRA:在量化模型上做 LoRA + 蒸馏 → 兼顾小模型与微调能力。

延伸阅读

参考资料