因为Bert本身参数量大,所以上线的过程中会碰到需求大空间和速度慢等问题。当前对Bert瘦身有三个思路,分别是Distillation(蒸馏)、Quantization(量化)和Pruning(剪枝)。
Quantization(量化):
通过降低模型参数的精度来达到压缩模型的目的。
- 该方法也常用于输入法压缩模型。例如,将32-bit Float类型的模型参数,用最接近的8 bit的整形数值表示。又如,通过聚类的方式,将部分数值用该类别固定数值替代。
在训练过程中进行量化:
- 量化weights
- 计算量化网络的loss
- 计算非量化weights的梯度loss
- 更新非量化weights
- 不断反复,得到最后量化后weights的模型
Pruning(剪枝):
通过移除部分模型内容来达到压缩模型目的。
- 删除部分weight connections:
一个好的模型,可以尽可能让期望的结果概率接近1,而不期望的结果接近0。所以我们可能会有很多接近0的权值,我们可以删除这些接近0的权值,从而达到压缩模型目的。
- 删除部分neurons:
可以通过评估某些神经元的重要性,删除一些不重要的神经元,从而达到压缩模型目的。
- 删除部分weight matrices:
有的工作会删除整个Attentional heads,并且尽可能保证最小损失。
Distillation(蒸馏):
- 蒸馏方法也叫teacher-student learning, 是一种压缩大模型的方法,核心思想就是训练小模型。它首先训练一个大的,复杂的,慢的完整模型(Teacher),然后再训练一个小的,简单的,快的模型(Student),并且通过最小化Kullback-Leibler Divergence(KL)值让学生模型(分布)尽可能接近老师模型(分布)。
- 相对熵有一个性质:两个分布差异越大,KL散度越大。实际应用需要两个分布尽可能的相等,于是就需要KL散度尽可能的小。
- 让KL尽可能小,就可以让学生模型尽可能接近教师模型。
- 首先训练了一个大的,复杂的,慢的完整教师模型,然后我们用该模型结果指导训练学生模型。上图代码,14行对学生模型进行训练,然后将相同输入,输入教师模型和学生模型,得到结果,然后通过KL计算之间误差,我们目标是通过不断训练student模型,减小这个误差。
- 学生模型,使用相同隐藏层大小,但是将层数减去一半。
- 采用了一些RoBERTa中的训练技巧:大批量,动态掩码,删除NSP
- 根据知识蒸馏方法提出了DistilBert,在保留 bert 97%的性能的前提下,模型大小下降40%,inference运算速度快了60%
参考:[深度学习:前沿技术-DistilBERT ]
网友评论