知识蒸馏(Knowledge Distillation,KD)是一种训练方法:用能力较强的教师模型提供训练信号,让参数量或计算量更小的学生模型学习目标任务。它解决的是“如何训练学生”,不是推理时把教师和学生同时部署。
一个最小训练流程
训练样本 x ├─ 真实标签 y ─────────────┐ └─ 教师模型 teacher(x) ────┼─> 蒸馏损失 + 监督损失 └─> 更新 student 参数教师通常冻结参数,只负责产生输出;学生才通过反向传播更新。部署阶段可以只保留学生模型,但是否能达到目标,要以独立评测集验证。
硬标签和软标签
硬标签只告诉模型“正确类别是谁”。软标签是教师对多个类别的概率分布,包含“哪些错误更相近”的信息。例如,教师对一张图片输出猫0.75、狗0.20、狐狸0.05,学生学到的不只是猫这个答案,还能看到类别之间的相似结构。
常见的组合损失可以写成:
L = α × CE(student_logits, y) + β × T² × KL( softmax(student_logits / T), softmax(teacher_logits / T) )这里的 CE 是真实标签的交叉熵,KL 用于比较师生分布,T 是温度,α 和 β 是损失权重。这个公式是常见示意,不是所有蒸馏项目的统一实现。PyTorch官方教程也把温度解释为控制输出分布平滑程度的参数:T 越大,分布通常越平滑。
“用大模型生成数据”属于哪一类
在语言模型项目里,团队常让教师生成问答、分类解释或结构化结果,然后把结果清洗后用于学生训练。这是很实用的工程路线,但要区分三个对象:教师生成的原始结果、经过规则和人工验收的数据集、真正写入训练流程的样本。只保存第三个结果,会丢掉追溯信息。
建议至少保留:sample_id、原始输入、教师模型及版本、生成时间、输出、验收状态、拒绝原因和数据集版本。JSONL只是容器格式,不等于数据质量已经合格。
从公式落到训练代码时要注意什么
实现组合损失时,有几个细节容易被忽略。首先,教师模型应切换到评估模式并停止梯度计算,否则会浪费显存和计算。其次,教师与学生的logits必须对应同一批输入和同一标签空间。再次,KL散度的方向、归约方式以及T²补偿项会影响损失尺度,不能只复制一行公式而不检查框架API的具体定义。
下面是概念性的伪代码:
teacher.eval()forx,yintrain_loader:withtorch.no_grad():teacher_logits=teacher(x)student_logits=student(x)hard_loss=cross_entropy(student_logits,y)soft_loss=kl_divergence(log_softmax(student_logits/T),softmax(teacher_logits/T),)*(T*T)loss=alpha*hard_loss+beta*soft_loss loss.backward()optimizer.step()这段伪代码省略了设备迁移、清零梯度、混合精度和异常处理,只用于说明师生信号怎样汇合。正式实现应以所用框架的函数签名为准。
温度和权重怎样理解
当T=1时,使用的是原始softmax尺度;提高温度后,较小概率会变得更明显,学生能看到教师对非第一候选类别的相对判断。但温度过高也可能让分布过平,削弱有用差异。
alpha、beta和T没有脱离任务的通用最佳值。可以把未蒸馏学生作为基线,在相同数据划分、训练轮次和随机种子条件下做小规模对比。除了最终准确率,还应记录收敛速度、各类别表现和校准误差。若只报告一次运行的最高分,很难判断收益来自蒸馏还是随机波动。
语言模型蒸馏的数据管线
语言模型通常没有一个固定类别空间,工程链路会更接近:输入池构建、教师生成、规则验收、人工抽样、训练集冻结、学生微调、离线评测和灰度测试。
其中最容易失控的是数据版本。提示词改了一次、教师模型换了版本、过滤规则增加了一条,都可能改变样本分布。因此应让prompt_version、teacher_model、validator_version和dataset_version能够互相追溯。被拒绝的样本也不要立即删除,保留拒绝原因有助于判断问题来自教师、提示词还是验收器。
如何设计对照实验
最小对照至少包括三个对象:未经蒸馏的学生基线、完成蒸馏的学生、教师模型。三者使用同一份最终验收集。分类任务可以看准确率、召回率和类别混淆;生成任务还要看格式、事实性、长度、拒答与安全边界。
如果学生质量提高但推理资源没有明显变化,这仍可能是有效训练结果,却不能被描述成部署成本已经降低。反过来,模型变小但关键任务明显退步,也不能只凭吞吐提升宣布成功。
什么时候值得做
蒸馏更适合任务边界清楚、调用量较大、对延迟或资源有要求的项目。不适合把它当作“让小模型拥有教师全部能力”的快捷方式。开放式任务要特别检查幻觉、长文本一致性和知识时效。
放量前的四项检查
- 验收集是否与训练样本隔离?
- 学生输出是否满足格式和安全要求?
- 失败、重复和低质量样本是否能被定位?
- 是否比较过单位有效样本,而不是只比较生成条数?