一篇读懂知识蒸馏:大模型的本事怎么传给小模型

它解决什么问题

大模型的本事是有代价的:参数量大、显存占用高、推理延迟长,按 token 计费的 API 还会随调用量线性烧钱。而大多数真实业务——客服应答、信息抽取、领域内的数学与代码推理——并不需要前沿模型的全部潜力,需要的是一个小一号、跑得快、但本事尽量不小的模型。

把大模型「变小」有三条常被混为一谈的路径,分工其实很清楚:

  • 量化:把已经训好的权重从 FP16 换成 INT4 这类低精度数值,模型还是那个模型,只是存得更省(本站此前《模型量化的精度账:从 FP16 到 INT4 该怎么选》讲的就是它);
  • 剪枝:把权重里冗余的通道、神经元甚至整层删掉,模型瘦了,架构还是那个架构;
  • 蒸馏:不动教师模型一根手指,而是从一个小得多的基座出发重新训练一个学生模型,让它模仿教师的行为。

前两者压缩的是「已训好的权重」,蒸馏传递的是「能力」。权重本身搬不走——教师学到的知识以参数形式固化在它自己身上,学生拿不到。能搬走的是教师对输入的「判断方式」:给定同样的输入,它会怎么输出、对错误选项各给多大把握。蒸馏的全部目标,就是让学生的输出分布向教师对齐。

顺带说清一件容易误会的事:蒸馏和量化不互斥,反而经常组合使用——先蒸出一个结构更小的学生,再把学生量化到 INT4 上线;前者决定模型「多大」,后者决定模型「多省」。挑哪条路,取决于预算花在训练侧还是推理侧。

它怎么工作

软标签与暗知识

2015 年,Hinton、Vinyals 和 Dean 在《Distilling the Knowledge in a Neural Network》(arXiv:1503.02531)里给出了奠基性方案。出发点很反直觉:分类模型训练用 one-hot 硬标签,但训好的模型输出的完整概率分布里,藏着硬标签没有的信息。论文里的例子:手写数字「2」,模型可能给出它是「3」的概率是 10⁻⁶、是「7」的概率是 10⁻⁹——另一个版本的「2」则恰好相反。这些极小的概率说明「2 长得更像 3 而不像 7」,Hinton 称之为 dark knowledge(暗知识)。他打的比方:一辆宝马被认成垃圾车的概率很小,但仍远大于被认成胡萝卜的概率——错误答案之间的相对关系本身就是知识。

问题是这些概率太小,监督信号弱。于是引入温度 τ,把 softmax 改写为:

q_i = exp(z_i / τ) / Σ_j exp(z_j / τ)

τ > 1 时分布被「软化」,暗知识被放大。蒸馏损失取软硬两项的加权和:

L = α · τ² · KL(p_t^τ ‖ p_s^τ) + (1 − α) · CE(y, p_s^1)

前一项是在温度 τ 下学生对教师分布的 KL 散度,后一项是普通交叉熵,把学生拉回真实标签。两个细节值得注意:软损失的梯度幅度按 1/τ² 缩放,所以乘回 τ²,让调整温度时两项贡献的比例大致不变;论文的经验是硬目标那一项权重要「considerably lower」——语音实验里硬目标权重取 0.5,τ 在 {1, 2, 5, 10} 里试出 τ = 2 最好。还要记住:高温只是训练时的「放大镜」,推理时学生按 τ = 1 的正常分布输出。

效果有多实在?MNIST 上,2×1200 神经元的大网络错 67 个测试样本;2×800 的小网络直接训练错 146 个,只用教师软目标(τ = 20)做正则后错 74 个——错误数砍半,逼近大网络。语音实验里,10 个模型集成的提升有 80% 以上被蒸给了单个蒸馏模型。

整条流水线长这样:

flowchart LR
    D["训练数据 / 提示词"] --> T["教师模型(大,权重冻结)"]
    D --> S["学生模型(小,待训练)"]
    Y["硬标签"] --> L["总损失 = α·τ²·KL + (1-α)·CE"]
    T -- "软标签 / 生成文本" --> L
    S -- "学生预测" --> L
    L -- "反向传播,只更新学生" --> S

一段最小可运行的蒸馏损失

用 numpy 写核心的二十行,本地可直接跑:

import numpy as np

def softmax(logits, temperature=1.0):
    z = np.asarray(logits, dtype=float) / temperature
    z -= z.max()                      # 减最大值,防 exp 溢出
    e = np.exp(z)
    return e / e.sum()

def distillation_loss(student_logits, teacher_logits, label,
                      temperature=4.0, alpha=0.9):
    """软目标 KL 损失(乘 T^2)与硬标签交叉熵的加权和。"""
    t_soft = softmax(teacher_logits, temperature)   # 教师软标签
    s_soft = softmax(student_logits, temperature)
    # 软目标损失:KL(teacher || student);梯度按 1/T^2 缩放,按论文乘回 T^2
    soft = np.sum(t_soft * (np.log(t_soft + 1e-12) - np.log(s_soft + 1e-12)))
    soft *= temperature ** 2
    # 硬目标损失:T=1 的普通交叉熵
    s_hard = softmax(student_logits, 1.0)
    hard = -np.log(s_hard[label] + 1e-12)
    return alpha * soft + (1 - alpha) * hard, soft, hard

teacher = [8.0, 6.0, 2.0, 0.5]   # 教师笃信「猫」,且认为「狗」其次像
student = [1.0, 1.5, 0.5, 0.2]   # 学生一开始把「狗」排第一
label = 0                        # 真实标签:猫

for T in (1.0, 4.0, 20.0):
    print(f"教师软标签 T={T:4.1f} -> {np.round(softmax(teacher, T), 4)}")
    total, soft, hard = distillation_loss(student, teacher, label, T)
    print(f"  软={soft:.4f}  硬={hard:.4f}  总={total:.4f}")

跑出来的结果(本文实测)直观展示了温度在做什么:

教师软标签 T= 1.0 -> [0.8785 0.1189 0.0022 0.0005]
  软=0.8675  硬=1.3096  总=0.9117
教师软标签 T= 4.0 -> [0.5043 0.3059 0.1125 0.0773]
  软=2.9436  硬=1.3096  总=2.7802
教师软标签 T=20.0 -> [0.3    0.2715 0.2223 0.2062]
  软=3.4417  硬=1.3096  总=3.2285

τ = 1 时教师分布接近 one-hot,「猫像狗、不像鱼」的暗知识只剩千分位;τ = 4 之后类间相似性浮出水面,学生能从「狗排第二、猫狗更像」里学到比硬标签多得多的东西。

LLM 时代:白盒 logits 与黑盒合成数据

到了大模型时代,蒸馏分化成两种形态。《Survey on Knowledge Distillation for Large Language Models》(arXiv:2407.01885)的分类是:

  • 白盒蒸馏:拿得到教师的内部状态——logits、隐藏层激活。经典 KL 蒸馏属于此类,BERT 时代的 DistilBERT、TinyBERT 与大模型时代的 MiniLLM、GKD 都是代表。前提是教师开源,你得能亲自跑一遍它的前向计算。
  • 黑盒蒸馏:只有教师的输出文本可用——"knowledge is transferred solely through the teacher model's predictions"。最自然的做法是让教师批量生成指令-回答对或带思维链的推理过程,再拿这些合成数据对学生做一次普通 SFT。

当下主流是黑盒,原因很直接:最强的教师往往拿不到 logits。闭源前沿模型只开放 API,综述里说得明白——"many modern large-scale closed-source models do not provide access to internal data"。而黑盒蒸馏的训练流程与普通 SFT 完全一致,只是数据从人工标注换成教师生成,整套 SFT/RLHF 基础设施原样复用,工程门槛低得多。

标志性案例是 DeepSeek-R1(2025 年 1 月发布):把 R1 精选的 80 万条样本(约 60 万条推理数据 + 20 万条非推理数据)直接拿去 SFT 开源小模型——Qwen2.5-Math-1.5B/7B、Qwen2.5-14B/32B、Llama-3.1-8B、Llama-3.3-70B(选 3.3 而非 3.1,报告的解释是它的推理能力略好)。技术报告原话:"For distilled models, we apply only SFT and do not include an RL stage"。成绩单(pass@1)[1]:R1-Distill-Qwen-7B 在 AIME 2024 拿 55.5、MATH-500 拿 92.8,报告称全面超过 GPT-4o-0513;R1-Distill-Qwen-32B 与 R1-Distill-Llama-70B 在多数基准上显著超过 o1-mini。一个 7B 模型靠 80 万条教师生成的数据走到这一步,黑盒路线的说服力无需多言。

([1] 数字出自 DeepSeek-R1 技术报告 Table 5,arXiv:2501.12948,2025 年 1 月版本。)

边界在哪

学生上限受容量与基座制约。 同一批 80 万条样本,AIME 2024 上 1.5B 学生只得 28.9,7B 得 55.5,70B 得 70.0——教材一样,学得进多少取决于学生自己的参数容量和基座底子。蒸馏不是点石成金:教师再强,也蒸不出超出学生架构容量的本事。实践里,选对基座与选好蒸馏数据同等重要。

蒸馏传「技能」易,传「知识面」难。 蒸馏传递的是教师的行为模式——怎么推理、怎么组织答案;教师预训练阶段吞下的海量知识,并不会随 80 万条样本自动进入学生。R1 蒸馏系列强在数学与代码推理,不等于学生复刻了教师的全部知识面。想要知识面,靠的还是学生自己的预训练;想要特定技能,蒸馏才是那条高效通道(本文作者的概括,非论文原话)。

用闭源模型输出训练有合规与 ToS 风险。 OpenAI 的使用条款在「不允许」清单里明文写着 "Use Output to develop models that compete with OpenAI"——用其输出训练与之竞争的模型被直接禁止;Anthropic 也有类似条款。条款措辞有解释空间(比如「竞争」如何界定),拿合成数据做微调在业内也确实普遍,但对准备商业化的项目,这层风险实打实存在。这也是为什么严肃的蒸馏项目倾向用开源或自家强模型当教师——DeepSeek 用自家 R1 蒸 Qwen/Llama,既无条款障碍,也顺手推动了自家基座的生态。

一句话收束:量化与剪枝让一个成型的模型「瘦身」,蒸馏则让小模型在教师的影子下「重学」。前者省的是推理的账,后者传的是能力的种——部署预算紧张时算清前一笔,追平大模型某项本事时用好后一条。

参考资料

← 返回资讯列表

读者留言

COMMENTS 暂无
仅本站原创文章开放留言 · 请勿留下手机号、邮箱等个人信息

还没有留言,来说第一句?