首页 / 第四部分 · 压缩与工程落地 / 第 17 篇

第 17 篇 · 第四部分 · 压缩与工程落地

知识蒸馏:让小模型学到大模型的判断力

学生模型要学的不是标准答案,而是老师的"犹豫"——那些错项上的小概率里藏着知识。

一、问题:大模型好用,却很难在端侧运行

假设你有一个 7B 的模型,以 fp16 精度保存大约要 14GB。将它部署在服务器上回答效果较好,可你若要把它装入一部手机、一个摄像头盒子、一台没有独立显卡的工控机——显存或内存根本容纳不下。就算强行装入,一轮推理也要几百毫秒,散热风扇满负荷运转,电量消耗也很快。

那就换个小模型。一个 100M 参数的学生网络,体积只有 200MB 上下,运行速度虽快,但准确率也明显下降了几个点。真正想要的目标其实很难兼得:大模型的能力,小模型的体积。这两件事本就互相冲突,参数量缩小 70 倍,又如何能要求精度不下降呢?

知识蒸馏(knowledge distillation)就是针对这一矛盾提出的。它的思路不是对大模型进行剪枝削减,而是让大模型充当老师,把自己"如何判断问题"的方式传授给小模型。

二、Hinton 的洞察:软标签比硬标签信息更多

平时训练分类模型,标签是一张 one-hot 向量。一张手写数字图,标注是 3,那向量就是 [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]——只有"3"那一格是 1,其余全是 0。

这种标签有个明显的局限:它把答案当成非黑即白。可现实中"这张图是 3"并不总是确定无疑。它可能是没写清楚的 3,也可能是写歪了的 8。one-hot 不管这些,一律写成"100% 是 3,其它 0%"。

老师模型在大规模数据上训练过,它的输出不是 one-hot,而是一排概率。同样是那个歪歪扭扭的 3,老师可能给出:3 占 0.72,8 占 0.21,5 占 0.05。这排数字其实传达了一个信息——这张图最像 3,但它与 8 也很相似,同时还跟 5 有几分相似。Hinton 在 2015 年那篇《Distilling the Knowledge in a Neural Network》里,管这种输出叫"软标签"(soft target),对应的 one-hot 叫"硬标签"(hard target)。他的观点很明确:软标签携带的信息量比硬标签大得多。

学生真正需要学习的,正是这一组带有不确定性的概率。

三、蒸馏的损失函数:温度 T 与软目标

直接使用老师的原始 logits 去训练学生,会碰到一个问题:老师对正确答案往往过于自信,分布尖锐如针,错误项那一点小概率被压到几乎不可见。为了把这些微小的概率差异放大出来,引入一个参数——温度 T。

做法是把 logits 先除以 T 再送进 softmax:

pi = exp(zi / T) / Σj exp(zj / T)

T=1 时就是平常的 softmax。T 调大,比如 2、4、8,分布就被"平滑",原本 0.72 对 0.21 的差距会收窄成 0.4 对 0.3 这样,那些原本几乎不可见的类别概率才显现出来。这个 T 是蒸馏特有的旋钮,训练完就不用了,学生照常按 T=1 输出。

学生有两个目标:别把老师平滑后的分布学偏(用 KL 散度衡量两个分布的差异程度),也别丢弃真实标签(照常用硬标签计算交叉熵)。两个损失加权求和,通常写成:

# teacher / student 的 logits: z_t, z_s;真实标签 one-hot: y
loss = (1 - alpha) * CE(softmax(z_s), y) \
     + alpha * T * T * KL( softmax(z_s / T), softmax(z_t / T) )

那个 T * T 不是多余的。软目标那一项里也除了 T,梯度量级会被缩小约 1/T²,乘回来是为了让两项损失在训练时量级相当。

四、软标签为什么有用(暗知识:类间相似度)

回到那个 3 的例子。硬标签只告诉你"这是 3",学生学到的边界是"3 跟其它九个数字都平等地不像"。软标签则表明,3 离 8 近、离 5 次之、离 1 很远。Hinton 把这部分叫"暗知识"(dark knowledge)——它不在正确答案那一格里,而全部体现在错误答案的概率分布里。

这有点像估分。老师批卷只写"这题错了",你什么也学不到;老师要是说"你按 3 的思路做,但很容易滑向 8 这一类",你下次就知道这两个岔路口挨得很近。软标签所起的作用正是后者。

好处体现在泛化上。学生不是死记十个类别的绝对边界,而是记住它们之间的远近关系,遇到模棱两可的样本会更稳定。实验中,靠软标签训练出的小模型,在测试集上的准确率常常比用硬标签直接训练高出 1~3 个点,这在压缩场景里是相当可观的收益。

五、三种形态:logits 蒸馏、特征蒸馏、关系蒸馏

蒸馏不只在输出层做,老师的中间过程也能拿来教人,按"教什么"分大致有三类。

  • logits 蒸馏:只对齐输出层那排概率,也就是上面讲的经典做法。最便捷,老师内部结构如何都无妨,只要你能拿到输出。
  • 特征蒸馏:让学生中间某层的特征图,去逼近老师对应的中间层。Romero 等人在 2015 年的 FitNets 里提出这个思路,称之为"提示"(hint)。网络的中间层更像是"理解了一半",促使学生模仿,相当于把解题步骤也传授给它。
  • 关系蒸馏:不比较单个样本,比较样本之间、层与层之间的关系结构。比如老师认为样本 A 和 B 的相似度是 0.8,学生也得认为它俩是 0.8。这种教法更抽象,但迁移性往往更好。

特征蒸馏有个限制:老师和学生的中间层维度通常不一致(老师 1024 维,学生 256 维),需要额外加入一层线性映射把维度对齐。这一层仅作临时使用,蒸馏结束后即弃用。

六、大模型当老师的几种做法

到了 LLM 时代,蒸馏的做法变了。老师的参数量动辄几百亿,学生的参数只有几亿,中间差着一两个数量级,依赖对齐中间层的做法已不现实,主流退回到"学输出"。

黑盒 API 蒸馏:你无法获取老师的权重,只能调用它的接口。做法是准备大量问题,让老师逐条回答,将问答对保存下来,再用这批数据微调小模型。这条路径最现实,代价是按 token 计费,几十万条数据的费用不低。

自蒸馏:老师和学生其实是同一个模型,或者同一家族。比如先用大模型生成数据训练一个小模型,再让小模型充当老师,去教更小的模型。也有模型自己教自己的版本——用自己多次采样的平均输出当软标签,反过来提升单次推理的准确率。

用老师的思维链当教材:不光让学生学"答案是什么",还学"老师是怎么一步步推出来的"。让老师写出完整的推理过程,再让学生模仿这个过程,小模型在数学、代码这类需要多步推理的任务上提升尤其明显。这已经不只是学习概率分布,而是在学习解题的方法路径。

七、训练数据从哪来

蒸馏的瓶颈往往不在算法,在数据。几个常见的来源:

  • 无标注的领域数据:一批没有标签的真实文本或图片,让老师打上软标签,学生据此学习。这是最标准的做法,配合半监督学习效果好。
  • 老师生成的合成数据:直接让老师生成题目、答案,甚至对话。Self-Instruct、Alpaca 那批开源数据集就是这么来的,几万条指令数据就能支撑不小的规模。
  • 有标注数据加软标签:原本就有硬标签的可以继续使用,再让老师补一份软标签,两者共同用于训练。

这里有一个取舍要讲清楚:数据的质量和覆盖面,比数量重要。几万条覆盖各类边界场景的数据,通常比几十万条重复冗余的同质数据更有用。学生没见过的情况,它永远学不会。

八、蒸馏、微调、量化,三件事不是一回事

这三个词经常被混用,实际上各有所指。

手段动的是什么模型结构典型收益
微调调整参数,让它适应某个任务不变专项任务表现提升
蒸馏换一个更小的模型来学习能力变了,变小体积、延迟显著下降
量化把权重从 fp16 降到 int8/int4不变显存、内存更节省

微调是让同一个模型表现更强,结构不变。量化是把现有的权重用更少的比特表示,结构也不变,只是以精度换取空间。蒸馏则是确实换成了一个小模型,它是这三者里唯一会改变架构的。三者可以叠加:先蒸馏出一个小模型,再对它微调,量化之后部署上线。

九、现实中的效果与局限

蒸馏不是万灵药,有几个反直觉的地方值得先说明。

学生追不上老师。 参数差距太大的时候,强行教学也收效甚微。老师的能力建立在它容量的基础上,学生基础容量太小,模仿得再认真,能达到的上限也很有限。学术界有个说法叫"容量差"(capacity gap)——老师太强,学生反而学不会,中等强的老师有时比最强的老师更好用。

模式坍塌。 如果只让学生模仿老师置信度最高的那个答案,学生可能退化成一个只会重复的模型:老师绝大多数时候输出 A,它就只会输出 A,把老师偶尔表现出的不确定全丢掉了。回头看那个温度 T 就是为此而设计的,T 调好,学生才能捕捉到老师没有完全表达的那部分信息。

存在一个"合适的区间"。 温度设得太低,几乎无法传递有效信息;设得太高,分布被过度平滑,同样无法传递有效信息。实践中 T 大多落在 2 到 8 之间,是一个需要依靠验证集调试确定的超参。

本质上,蒸馏的思路并不复杂:让一个预算有限的学生,尽可能完整地继承一位慷慨老师的判断力,包括老师不确定时候的那种分寸感。这一思路落地之后,下一步就是解决"这个学生用什么格式保存、怎么部署到目标设备上"的问题——那正是后面两篇要接续讨论的内容。

参考资料

  1. Geoffrey Hinton, Oriol Vinyals, Jeff Dean, Distilling the Knowledge in a Neural Network, 2015. arXiv:1503.02531(软标签与温度蒸馏的原始出处)
  2. Cristian Buciluǎ, Rich Caruana, Alexandru Niculescu-Mizil, Model Compression, KDD 2006. ACM DL 10.1145/1150402.1150464(更早的模型压缩思路)
  3. Adriana Romero 等, FitNets: Hints for Thin Deep Nets, 2014. arXiv:1412.6550(特征蒸馏 / hint 的提出)
  4. Victor Sanh 等, DistilBERT, a distilled version of BERT, 2019. arXiv:1910.01108(把蒸馏用到 Transformer 上的代表作)
  5. Jianping Gou 等, Knowledge Distillation: A Survey, 2020. arXiv:2006.05525(系统性综述)