大模型,进入剪枝蒸馏时代!
今天聊一个有意思的话题:如何把大模型“压缩”到更小,同时还能保持不错的性能?具体来说,这篇文章的目标是通过剪枝(pruning)和蒸馏(distillation),把Llama 3.1 8B和Mistral NeMo 12B分别压缩到4B和8B参数。结果相当惊艳,值得花时间拆解。

先看剪枝的套路:先给每个层、每个神经元、每个注意力头和嵌入维度算一个“重要性分数”,然后排个名,把不重要的部分砍掉。那么,这个重要性怎么衡量?文章用了三个指标:LM验证损失、块重要性(Block Importance,简称BI)和下游任务准确率。BI其实就是一个衡量输入输出余弦距离的策略,之前也有论文提过,不难理解。前两个指标好懂,第三个就是看剪掉后对实际任务的准确率影响多大。
有个细节值得注意:开源模型往往不知道训练数据长什么样,所以作者在剪枝和蒸馏之前,先对教师模型做了一步微调,称为
teacher correction
至于蒸馏过程,只在教师和学生模型的logits上使用前向KL散度损失,没有搞复杂的多阶段蒸馏,够直接。那么,加不加teacher correction有什么区别?实验表明,加上之后,无论是收敛速度还是最终性能,都有明显提升。
另一个有趣的对比是宽度剪枝 vs 深度剪枝。两种变体参数数量相同,但宽度剪枝(砍神经元/头)的初始损失更低,并且始终优于深度剪枝(砍层)。这是个非常实用的经验:与其砍层数,不如把每层做瘦身。
如果拿剪枝后的小模型和随机初始化的小模型比,剪枝起点的损失明显更低——因为剪枝保留了原有模型的部分知识。另外,基于蒸馏的训练方法也显著优于传统训练方式,而且需要的训练tokens更少。下图中红线和绿线可以清楚看到这一点。
还有一个重要发现:teacher correction 不会影响到剪枝时的重要性排序,但它结合蒸馏却能有效弥补剪枝带来的性能差距。换句话说,teacher correction 的价值不在于重新排重要性,而在于让后续蒸馏有一个更好的起点。
关于层的重要性分布:开头和结尾的层是最重要的。有趣的是,如果一定要剪掉层,删除不连续的层(而不是连续地砍掉中间几层)反而能得到更好的LM验证损失。但这个结论在下游任务准确率上不一定稳定成立——也就是说,纯语言模型损失和实际任务效果之间存在一定脱节。
最后总结一下:剪枝+蒸馏的组合拳,在参数量大幅压缩的情况下,依然能交出相当漂亮的成绩单。核心要点就这些了。
-
- 关于宇宙的好的网名有哪些
- 角色扮演 | 1
- 网名