模型distill瘦身后效果不行?换个思路试一下

背景

随着当代算力的加强,各种大模型如雨后春笋一发不可收拾,各家大厂都在拼算力,拼模型的大小,比如如下模型:

最近几年来的大模型和参数

数据越大,模型复杂度越来越高,效果一般越来越好,各种SOTA和霸榜铺天盖地. 使用一时爽快,但后续上线带来了一定的痛苦,这不?笔者的线上AI的BERT服务也在’管辖‘范围内,服务要求低的耗时,原始的推理模型的耗时要得降下来。

咚咚咚!提到模型的瘦身,脑袋里立马浮现出类似知识蒸馏distill、剪枝、量化操作。剪枝是通过裁减模型的不重要部分去加速推理,而量化是通过将浮点计算转成低比特定点计算的技术去加速模型推理,量化和剪枝都不是本文说的。蒸馏部分才是本文的主题,首先看一下知识蒸馏的基于原理,知识蒸馏的之基本原理来自于Hinton 2015的文章,核心思路大致如下:

知识蒸馏的基本原理

<!-- ![知识蒸馏的基本原理](i17aA.D.e35/https://jkboy.com/wp-content/uploads/2023/01/20230103042122-63b33cc2a513b.png) -->

主要包括两个角色,一个teacher老师模型,性能较好但结构比较复杂,一个是student学生模型,模型结构比较简单。对于student网络,除了常规的基于hard labels的(交叉熵)学习外,还存在一部分来自于teacher网络的指导,该指导输入来自于teacher教师网络输出软标签分布(logits或者softmax分布)送到student学生网络进行学习. 通过这样的知识蒸馏学习方式,使得student学生网络学的超过只进行交叉熵的student网络,从而近似达到类似于teacher网络的效果。

印象中的模型瘦身都会有效果上的损失,那么distill蒸馏的BERT模型效果如何呢?首先还是开始一波调研工作,第一个上场的是DistillBERT(DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter ), 好家伙上来直接对BERT进行瘦身,直接就是我们想要的,效果怎么样,看一下论文的效果:

DistilBERT的实验效果

由此可见,速度是有不少的提升,但是效果还是保持和teacher网络的相对稳定的下降。

再来看一下另外一个赫赫有名的TinyBert,打败了类似DistillBERT,BERT-PKD、MobileBERT等名将,来看看他的表现吧:

TinyBert的实验效果

TinyBERT的蒸馏操作还是比较复杂的,在输入层、隐藏层、预测层上进行不同的方式蒸馏,选择不同的loss计算,然后累加所有层的Loss,通过这样的操作,效果表现的还不错,性能相对于Teacher来说,整体保持,略微有点下降。

业务实验

现目前从如上paper看,将BERT模型的瘦身还是速度有提升,效果接近teacher模型,下面我们开始在实际的线上AI的BERT服务进行实验,这里选择的是变式题服务,变式题服务是基于纯BERT模型.

第一轮变式题蒸馏实验

首先,进行直接简单的蒸馏操作效果如下:

方法

模型

总请求条数

总耗时ms

平均耗时ms

F1

变式题BERT

BERT-Base

7658

92000

12.01

71.20%

变式题-distill

BERT-Base-L9

7658

71000

9.27

67.94%

变式题-distill

BERT-Base-L6

7658

55488

7.25

65.96%

变式题-distill

BERT-Base-L3

7658

42523

5.55

61.30%

从瘦身的效果看,瘦身到6层,速度有近一倍的提升,但是效果下降得十分厉害,有5-7个点的下降,身体瘦了,力气小了,好气人呀.....

问题重审

暂且把老师-学生蒸馏(TS-BERT)的模式放一下,换个思路想一下这个事情,在上学的时候考试成绩不好,学生没有学到知识,可能不是student的问题呀,也可能是老师教的不咋的,不是学生的菜,如果把普通老师换成高级老师或者教授(这里假设教授的教学能力比老师强哈,呵呵)来上课,学生是不是也可以学得很好呢?

老师-学生 vs 老师-教授-学生的机制对比

如右图所示,我们提出了一种基于“老师-教授-学生”的蒸馏模型,这时主要的重任在于如何针对老师的能力进行提升,如果把这个老师的变为教授,让教授去直接教授学生,使得学生学习的能力比之前老师的效果还好。顺着这个提升老师的能力的思路继续走,如何去把teacher的做大做强变为教授呢?这里至少有两种直接的方式,一种是从模型层面出发,类似集成学习的方式把模型做大做强,另一种思路是从数据层面上出发,通过数据增强的方式,让模型见到更多的数据,从而提高模型的泛化能力.

第二轮变式题蒸馏实验A

下面开始试验,第一种思路,基于BoostingBERT的做法,类似于Boosting的思路,以BERT作为base learner,每一轮迭代过程中针对之前的错误样本进行样本权重boost,最终联合多个base learner作为教授Model.通过新得到的教授模型对之前的学生模型进行教授,实验效果怎么样呢?看如下结果:

方法

模型

总请求条数

总耗时ms

平均耗时ms

TS-F1

PS-Boosting-F1

vs Teacher

变式题BERT

BERT-Base

7658

92000

12.01

71.20%

72.01%

0.81%

变式题-distill

BERT-Base-L9

7658

71000

9.27

67.94%

71.01%

-0.19%

变式题-distill

BERT-Base-L6

7658

55488

7.25

65.96%

67.95%

-3.25%

变式题-distill

BERT-Base-L3

7658

42523

5.55

61.30%

63.29%

-7.91%

从实验效果看,整体而言,实验效果获得了提升。通过教授模型(PS-Boosting)教得的学生模型不仅瘦了身,而且9层Base(71.01%)效果还不错,和之前的老师模型(TS-71.20%)的效果还差不多.

第二轮变式题蒸馏实验B

下面进行思路2做数据增强,数据增强的思路主要是借助与数据之间的关联关系,类似数据之间的交换性和传递性。

交换性:
正交换:如果ab相似,那么ba相似;

负交换:如果ab不相似,ba也不相似;

传递性

正传递:如果ab相似,bc相似,那么ac相似;

负传递:如果ab相似,bc不相似,那么ac不相似;

核心思路是这样,这其实里面还有坑,主要是传递过程中的性能损失,有时间再花一点时间介绍。总而言之简而言之就是通过数据增强的方式获得了一些新的数据,提高了模型的泛化性,达到效果的提升。基于此思路,实验效果怎么样呢?看如下结果:

方法

模型

总请求条数

总耗时ms

平均耗时ms

TS-F1

PS-Boosting-F1

PS-DA-F1

vs Teacher

变式题BERT

BERT-Base

7658

92000

12.01

71.20%

72.01%

75.08%

3.88%

变式题-distill

BERT-Base-L9

7658

71000

9.27

67.94%

71.01%

73.83%

2.63%

变式题-distill

BERT-Base-L6

7658

55488

7.25

65.96%

67.95%

71.06%

-0.14%

变式题-distill

BERT-Base-L3

7658

42523

5.55

61.30%

63.29%

67.87%

-3.33%

从实验效果看,通过数据增强得到的教授模型(PS-DA)本身获得了比较明显的提升. 教学的学生模型不仅瘦了身,而且效果还不错,12层的Base已经比之前有一个很大的提高,而且6层Base(71.06%)和之前的老师的效果还差不多.

行至此,本文也即将步入尾声,送出一个小的彩蛋。同样的,我们也可以从学生的角度考虑,这里我们的student模型初始化主要来自于我们预训练的模型12层参数的其中部分.一个自然而然的问题是,是否我们可以将针对特定层数的student模型进行单独的预训练,而不是初始来自于之前12层teacher模型? 相当于让优秀的学生提前进行‘预习’,教授上课时才会学得更好。基于此,我们使用特定层数的模型在教育领域的数据上进行大规模的无监督训练,训练得到模型作为“教授-老师-学生”蒸馏模式的学生模型初始化。最后在这种模式下,附上实验效果:

方法

模型

总请求条数

总耗时ms

平均耗时ms

TS-F1

PS-Boosting-F1

PS-DA-F1

PS-DA*-F1

vs Teacher

变式题BERT

BERT-Base

7658

92000

12.01

71.20%

72.01%

75.08%

75.08%

3.88%

变式题-distill

BERT-Base-L9

7658

71000

9.27

67.94%

71.01%

73.83%

74.42%

3.22%

变式题-distill

BERT-Base-L6

7658

55488

7.25

65.96%

67.95%

71.06%

74.47%

3.27%

变式题-distill

BERT-Base-L3

7658

42523

5.55

61.30%

63.29%

67.87%

71.94%

0.74%

实验的结果还是比较符合预期,通过特定层数进行的预训练(PS-DA*)效果提升还是十分的明显,有0.6-4个点幅度的提升。此时,瘦身后的3层学生模型(71.94%)已经超过了原始的“老师-学生”蒸馏模式的老师模型,从而也验证了我们提出这种新的蒸馏模式的有效性,优秀的教授教出来的瘦身后的学生的学习效果是可以比老师的学习好呀.

参考文献

Hinton, G., Vinyals, O., & Dean, J. (2015). Distilling the knowledge in a neural network. arXiv preprint arXiv:1503.02531, 2(7).

Sanh, V., Debut, L., Chaumond, J., & Wolf, T. (2019). DistilBERT, a distilled version of BERT: Smaller, faster, cheaper and lighter. arXiv 2019. arXiv preprint arXiv:1910.01108.

Jiao, X., Yin, Y., Shang, L., Jiang, X., Chen, X., Li, L., ... & Liu, Q. (2019). Tinybert: Distilling bert for natural language understanding. arXiv preprint arXiv:1909.10351.

Huang, T., She, Q., & Zhang, J. (2020). Boostingbert: Integrating multi-class boosting into BERT for NLP tasks. arXiv preprint arXiv:2009.05959.

版权声明:
作者:towan
链接:https://jkboy.com/archives/12861.html
来源:随风的博客
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
海报
模型distill瘦身后效果不行?换个思路试一下
随着当代算力的加强,各种大模型如雨后春笋一发不可收拾,各家大厂都在拼算力,拼模型的大小,比如如下模型:
<<上一篇
下一篇>>