系列:推理系统基础设施手记

推理系统基础设施手记(四):知识蒸馏 —— 把大模型的「暗知识」传给小模型

0. 一句话定位

知识蒸馏(Knowledge Distillation, KD) = 让大模型(Teacher)把「暗知识」教给小模型(Student),让小模型在参数量大幅减少的情况下逼近大模型性能。

它解决的核心问题:模型能力 ≠ 部署成本。大模型很强,但推理贵;小模型便宜,但训练数据不够时学不到那么好。蒸馏让小模型「站在巨人肩膀上」。

1. 为什么叫「暗知识」?

假设一张图分类任务,Teacher 输出:

猫:0.70
狗:0.20
桌子:0.05
椅子:0.05

Hard label 只会告诉模型「这是猫」。但 Teacher 的 soft label 还隐含了「这张图像猫又像狗,不太像家具」。这些类间相似性信息就是暗知识。Student 学这些暗知识,比只学 one-hot 标签泛化更好。

2. 经典 Hinton 蒸馏

知识蒸馏:暗知识传递 Teacher 大模型 输出 soft label Temperature T 软化概率分布 Student 小模型 学习 soft + hard Loss α·KL + (1-α)·CE p_T = softmax(z_T / T) p_S = softmax(z_S / T) L_distill = T² · KL(p_T || p_S) L_total = α · L_distill + (1-α) · CE(y, p_S_hard)

图:知识蒸馏把 Teacher 的 soft target 用温度 T 软化后,作为 Student 的训练目标。

3. 温度 T 的作用

T = 1:  接近原始分布,暗知识较少
T = 4~10: 分布更平滑,类间关系更明显,暗知识丰富
T → ∞: 分布趋于均匀,失去区分度

经验值:T = 4~10,配合蒸馏权重 α = 0.5~0.9。

4. 为什么比直接训练小模型好?

训练方式信息来源泛化能力
直接训练Hard label(one-hot)弱:丢失类间关系
知识蒸馏Teacher soft label + hard label强:继承 Teacher 的暗知识与排序

典型收益:Student 参数减 10–50×,精度损失 1–3%。

5. 代表工作与实测收益

工作TeacherStudent关键结果
DeepSeek R1 蒸馏R1 671B MoEQwen2.5 / Llama 7B–70B7B 在 MATH-500 达 92.8%(原 58.8%)
Meta Muse GlimmerMuse Spark 1.230B denseSWE-Bench Verified 76.0,RTX 5090 + DFlash 3.1× 加速
DistilBERTBERT-base40% 参数快 60%,保留 97% 性能
MiniMax 端侧蒸馏MoE 大模型Dense 小模型用于端侧部署

6. 与 DeepSeek V4 OPD 的关系

DeepSeek V4 用了 OPD(On-Policy Distillation,同策略蒸馏):主模型在线蒸馏「领域专家」小模型,把专项能力压缩进统一模型。

与传统离线蒸馏的区别:

离线蒸馏:Teacher 固定 → 生成 soft label → Student 学
在线蒸馏:Teacher 和 Student 同时训练,Student 的输入分布随策略更新而更新

OPD 避免分布偏移,适合多任务、多领域统一模型。

7. 具身智能关联:VLA 端侧部署

机器人 onboard 算力有限(如 Jetson Orin 几十到一百多 TOPS),无法跑 7B+ VLA。蒸馏是关键路径:

云端大 VLA(Teacher)
    ↓ 蒸馏
端侧小 VLA(Student)
    ↓ 部署到机器人
实时动作推理

NVIDIA GR00T 的「三计算机架构」中,DGX 训练大模型,蒸馏后部署到 Jetson。这也是国产 VLA 公司(智元、宇树、傅利叶等)必须走的路。

8. 常见坑

  1. T 太小:接近 hard label,暗知识没传过去;
  2. T 太大:分布太平,Student 学不到区分度;
  3. Student 架构与 Teacher 差异过大:能力 gap 太大,蒸馏效率低;
  4. 蒸馏数据分布不对:要覆盖 Teacher 的能力边界,而不是随便抽数据;
  5. 只蒸馏最终输出:中间层特征蒸馏(feature distillation)能传递更多信息;
  6. 忽视 hard label:完全用 soft label 会让 Student 失去对 ground truth 的强约束。

9. 伪代码

import torch.nn.functional as F

def distill_loss(teacher_logits, student_logits, labels, T=4.0, alpha=0.7):
    # soft target
    p_t = F.softmax(teacher_logits / T, dim=-1)
    p_s = F.log_softmax(student_logits / T, dim=-1)
    loss_kl = F.kl_div(p_s, p_t, reduction='batchmean') * (T * T)

    # hard label
    loss_ce = F.cross_entropy(student_logits, labels)

    return alpha * loss_kl + (1 - alpha) * loss_ce

10. 总结

问题知识蒸馏的答案
大模型太贵蒸馏出小模型,成本 ↓10×–50×
小模型不够强继承 Teacher 暗知识,泛化 ↑
端侧部署VLA 大模型 → 小模型 → Jetson/机器人芯片
多任务统一OPD 在线蒸馏避免分布偏移

一句话记住:蒸馏不是把大模型变小,而是把大模型「知道但没说出口的东西」教给小模型。

觉得有用?欢迎点赞、收藏,或请作者喝咖啡 ☕️

支付宝收款码

支付宝

微信收款码

微信

💬 留言

评论由 Giscus 驱动(基于 GitHub Discussions)。 当前仓库 NaphJohn/LLM-blog 尚未启用 Discussions:请在 GitHub 仓库 Settings → General → Features 勾选 Discussions 后刷新本页,评论区即自动显示。