你大概见过「这个小模型是从大模型蒸馏出来的」这种说法,但不太清楚中间到底发生了什么——是拿大模型的输出当答案重训一遍,还是把权重搬过去?这篇按机制顺序拆一遍:教师怎么产出、学生学什么、哪些环节决定成败,最后给一张自查清单,让你判断手上的需求该不该走蒸馏。
你大概见过「这个小模型是从大模型蒸馏出来的」这种说法,但不太清楚中间到底发生了什么——是拿大模型的输出当答案重训一遍,还是把权重搬过去?两件事都不是。蒸馏更像是一套「老师做示范、学生照着练」的训练流程,权重不共享,数据也不一定一样,真正被搬运的是教师的判断方式。
这篇按机制顺序拆一遍:教师怎么产出、学生学什么、哪些环节最容易翻车,最后给一张自查清单,让你判断手上的需求到底该不该走蒸馏。全篇不堆数字,需要具体参数时你到站内资料页按当时口径核对。
蒸馏到底在解决什么问题
大模型能力强,但推理贵、延迟高、部署门槛高。蒸馏的目标就是把这份能力压缩到更小的模型里,让小模型在特定场景下跑得动、跑得起。它不追求让学生全面追平教师,只求在目标任务上够用。
和直接拿小模型在原始数据上训练相比,蒸馏多出来的信息来自教师模型的输出分布,而不只是标准答案。硬标签只告诉你「这个是对的」,软分布还告诉你「哪些选项容易被混淆」,信息量完全不同。
教师模型输出的不是答案,是分布
- 软标签
- 教师对每个位置给出的一整条概率分布,正确答案之外的类别也带着高低不一的概率。
- 暗知识
- 藏在软标签里的类别相似关系,比如「猫」和「狗」被教师认为比「猫」和「汽车」更接近,硬标签给不了这种结构。
- 温度参数
- 把分布压平或拉尖的旋钮:温度高时暗知识露出来,温度低时接近独热标签。
很多人第一次看蒸馏代码会疑惑:教师给的明明是概率,为什么不当成标签用?因为训练时通常要配合温度一起调。温度太低,分布退化成独热向量,和直接用标准答案没区别;温度太高,分布又糊成一团,学生学不到有效区分。这个旋钮的合适区间要在验证集上试出来,没有万能值。
学生学什么:损失函数与训练信号
常见做法是把两部分损失加权相加:一是学生与教师软分布的差距,二是学生与真实标签的差距。前者负责学结构,后者保证不跑偏。只看软标签,容易在教师也不确定的样本上被带偏;只看硬标签,又丢掉了暗知识。
权重怎么分,要按教师质量来调。教师本身很准,就多信软标签;教师本身在目标场景上表现一般,就得把硬标签的权重提上来,避免学生忠实继承教师的偏差。
| 模仿对象 | 适合什么情况 | 主要风险 |
|---|---|---|
| 输出分布(软标签) | 教师质量高、类别关系重要 | 在教师不确定的样本上被带偏 |
| 中间层特征 | 师生结构接近、有对齐方案 | 结构差异大时很难对齐 |
| 注意力关系 | 需要保留推理路径信息 | 实现成本高,调参空间大 |
除了模仿输出,还有模仿中间层特征、注意力关系的做法。这类方式对结构差异大的师生组合更难对齐,实现成本也更高,适合有明确对齐方案的团队尝试,不建议作为第一版方案。
师生容量差和数据这两件事最卡人
学生太小、教师太大时,容量差距过大会出现学不进去的情况。这不是训练技巧能补的,得先缩小模型规模差,或者换一个规模更合适的教师。选型阶段就要把这条当作硬约束,别等问题出现才回头改。
训练数据不必和教师训练数据完全一致,但分布要贴近目标场景。用教师自己生成的样本可以省标注成本,代价是教师错误的样本也会被忠实继承。想省标注,就得接受这份偏差,或者人工筛一遍。
- 先定目标场景把学生要服务的任务写清楚,包括输入形态、延迟要求、部署环境,后面所有取舍都围绕它。
- 跑通最小链路用一小批数据走完「教师产出→学生训练→下游验证」这条流程,先确认链路能跑通,不追求效果。
- 验证看下游别只看学生和教师的接近程度,要看它在下游真实任务上的表现,否则可能只是学会了模仿教师的失误。
- 放大前再评估确认方向对了再增加数据和算力,具体卡时租费可以到算力相关页面按当时口径核对。
判断要不要走这条路:一份自查清单
- 先问有没有现成的开源小模型或量化方案能直接满足延迟和成本要求,能解决就不必自己训。
- 再问教师是否明显强于学生、数据是否够、标注预算是否紧张。三项里有两项不成立,收益通常抵不上工程投入。
- 如果要走,先用小规模跑通整条链路,再决定是否放大,别一上来就全量开训。
- 验证阶段一定要看下游任务指标,不要只看和教师的相似度。
- 具体方案和成本口径可以到站内评测与价格页面比对当时的数字。
蒸馏不是默认选项,而是一种在特定约束下才划算的手段。教师强、数据贴近、标注预算紧、目标场景明确,这几条同时成立时,它值得投入;否则先找现成方案试,往往更快。
下一步站内把各家模型资料、中转站可信度检测和价格追踪放在了一起,可以拿来对照选型和成本口径。→常见问题
蒸馏和微调是一回事吗?
不是。微调是在已有权重上继续训练,目标是把通用模型调向某个领域;蒸馏的重点是让一个学生模型去模仿教师模型的输出分布,师生通常架构不同、规模差很多,训练目标也不一样。两者可以叠加使用,但解决的问题不同。
蒸馏出来的小模型会不会一定比原模型差?
在绝大多数任务上会略有下降,幅度取决于容量差、数据分布和训练是否到位,没有统一结论。如果任务窄、教师在该任务上表现稳定,学生接近甚至在某些指标上持平的情况也存在,但这要靠你自己的验证集判断,不能靠通用说法。
自己动手做蒸馏,第一步该干什么?
先固定一个可复现的评测集,再拿教师在这个评测集上跑一遍拿到基线,然后挑一个学生模型结构并跑通一条最小的训练链路。基线没有之前不要动手训,否则后面的效果好坏无从判断,也不知道问题出在数据、结构还是训练参数上。