模型蒸馏
训练一个小模型去模仿大模型。这通常比从头训练小模型效果更好,也是便宜模型变好用的原因。
你有一个跑得通、但服务成本太高的大模型。你想要一个小模型来干同样的事。
用原始数据从头训练小模型,效果平平。训练它去模仿大模型,效果好得多。
这就是蒸馏(distillation),它也在很大程度上解释了小模型为什么进步得这么快。
为什么模仿胜过用原始数据
关键洞察在于大模型的输出里包含了什么。
原始训练数据每个样本只给一个正确答案。大模型给出的是在所有可能答案上的完整概率分布——而这个分布编码的信息多得多。
给一张狼的图片,标签只说「狼」。训练好的模型会说:狼 0.7,狗 0.2,郊狼 0.08,猫 0.001。这告诉学生模型(student)的不只是答案,还有问题的结构——哪些错误是合理的,哪些离谱,该有多大把握。
这些有时被称为软标签(soft targets),从中学到的信号比从标签里学到的更丰富。学生模型拿到的不只是教师模型(teacher)的结论,还有它的不确定性。
三种做法
logit 蒸馏训练学生模型去匹配教师模型的完整输出分布。这需要拿到教师模型的原始分数,所以要求权重开放。
序列级蒸馏让教师模型生成输出,再把这些输出当作普通的微调目标去训练学生模型。只需要教师模型的文本——所以这是闭源模型唯一可行的路子,也是实践中远远最常用的一种。
推理蒸馏是近期真正重要的那一种。让推理模型产出完整的逐步思考过程,再用这些过程去训练一个更小的模型。学生模型学到的是长篇推理,而不只是给出答案。这让小模型在数学和代码上的能力实打实地跳了一级,因为那些过程里含有光秃秃的答案所省略掉的中间结构。
收益最大的场景
窄任务。 为一个分类任务蒸馏出来的小模型,可以逼近一个大得多的、靠 prompt 驱动的模型,而每次调用的成本只是零头。
延迟。 小模型生成更快,这改变了交互界面里能做什么。
端侧部署。 大模型根本跑不起来的地方。
规模化成本。 整套论证在规模上的答案。
局限
教师模型就是天花板。 在蒸馏所覆盖的分布上,学生模型很少超过它的教师。错误会被继承,包括幻觉的模式。
广度扛不住压缩。 小模型可以在一个窄任务上追平大教师,但不可能在所有事上都追平。把通用能力蒸馏进一个小得多的模型,会丢掉长尾——那些大模型原本能处理的不常见情况。
分布很重要。 学生模型学到的是教师模型被问到过的东西。上线服务时,落在这个分布之外的 prompt 效果会差很多,所以蒸馏数据集必须反映真实流量。
服务条款。 用托管模型的输出训练一个竞争模型,通常是被禁止的。照这条路走之前值得先读一读。
实际形态
常规配方毫无新意,但管用:收集真实的生产环境输入,用大模型跑一遍,留下输出,拿这些配对去微调一个小模型,再在留出的样本上和教师模型对比评测。
两件事决定成败。用真实输入,因为合成的输入比现实干净,而这个落差会被学生模型继承过去。以及过滤教师模型的输出——能验证的就验证,通不过的就丢掉。否则教师模型的错误就变成了学生模型的训练数据。
具体到推理蒸馏,只保留那些最终到达可验证正确答案的过程,这一点至关重要。这正是合成数据实践与蒸馏重叠的地方。
要点回顾
- 蒸馏训练一个小的学生模型去模仿大的教师模型,效果胜过用原始标签训练。
- 教师模型的完整分布承载着问题结构——哪些错误是合理的——这是单个标签所没有的。
- 序列级蒸馏(用教师模型的输出训练)是实用做法;基于逐步思考过程的推理蒸馏推动了近期小模型的进步。
- 教师模型是天花板,广度会丢失,蒸馏数据的分布必须匹配真实流量。
- 靠验证来过滤教师模型的输出,否则你就是在拿它的错误做训练。
下一篇: 合成数据