bert微调

BERT推理提速方法整理

 

一、BERT模型压缩

1、剪枝(pruning)

去掉BERT中不必要的部分,内容包括权重大小剪枝、注意力剪枝、网络层以及其他部分的剪枝等。还有一些方法也通过在训练期间采用正则化的方式来提升剪枝能力(layer dropout)。

总体思想是将权重矩阵中不重要的参数设置为0,结合稀疏矩阵来进行存储和计算。通常为了保证performance,需要一小步一小步地进行迭代剪枝。

      

(1)注意力剪枝

有的多头attention无作用

NeurIP文章Are Sixteen Heads Really Better than One?https://arxiv.org/abs/1905.10650

acc维持不变的情况下可推理提速1.2

 

(2)神经元剪枝

神经元剪枝则直接将某个节点直接去掉。对应到权重矩阵中,相当于某一行和某一列置零。常见做法是,计算神经元对应的一行和一列参数的平方和的根,对神经元进行重要性排序,将大小排名最后的k%置零。

 

(3)突触剪枝

突触剪枝剪掉神经元之间的不重要的连接。常见的做法是在权重矩阵中按照数值大小对参数进行排序,将大小排名最后的k%置零即可,k%为压缩率。

 

2、知识蒸馏(knowledge distillation)

基本思想是将知识从大型的,经过预训练的教师模型转移到通常较小的学生模型中,常见的学生模型根据教师模型的输出以及分类标签进行训练。

      

(1)DistillBERT

https://arxiv.org/abs/1910.01108

在bert的基础上用知识蒸馏技术训练出来的小型化bert,可以将BERT模型的大小减少40%,同时保留97%的语言理解能力,速度提高60%。(较好)

 

(2)TinyBERT

TinyBERT: Distilling BERT for Natural Language Understanding | OpenReview

利用对Transformer结构的知识蒸馏和针对pre-training和fine-tuning两阶段的知识蒸馏,在GLUE基准测试中获得了与BERT相当的结果,同时在推断方面比BERT快7.5倍,快9.4倍

      

(3)MobileBERT

MobileBERT: Task-Agnostic Compression of BERT by Progressive Knowledge Transfer | OpenReview

是BERT-LARGE的精简版,比其快4倍。在GLUE的自然语言推理任务中,MobileBERT在Pixel 3手机上实现了0.6 GLUE评分性能下降和367 ms延迟。

      

(4)结合蒸馏和剪枝

https://arxiv.org/abs/1910.06360

推理提速2倍,在自然语言问题的简答准确性损失小于0.5 f1点。

      

(5)将蒸馏bert与bilstm结合

https://arxiv.org/abs/1903.12136

取得了与ELMo模型相似的结果,同时大约减少了100倍的参数并提高15倍的推理速度。

      

(6)一种蒸馏的通用方法

https://arxiv.org/abs/1911.03588

可以用于transformer框架之外模型的蒸馏方法,能提高10倍以上推理速度

      

3、Theseus 替换(忒修斯压缩)

https://arxiv.org/abs/2002.02925

EMNLP2020 | 模型压缩系列:BERT-of-Theseus(一种基于模块替换的模型压缩方法)_JasonLiu1919的博客-CSDN博客

针对模型微调阶段,先将原始的BERT分为数个模块并为其创建对应的压缩模块(即替代模块),再随机地用压缩模块替换掉原始的模块,并训练这些压缩模块使其能够效仿原始的模块。在训练过程中逐步增加替换的概率,从而实现整体模块(即整个模型)替换。

模型性能比DistillBERT好,推理速度未知

 

4、量化(Quantization )

通过减少用于表示每个权重值的精度来压缩模型。例如模型使用float32标准定义参数的精度进行训练,然后我们可以使用量化技术选择float16,甚至int8表示参数的精度用于压缩模型。

(1)动态量化

将32bit浮点型直接替换为8bit整型。可以提速2-3倍,但是准确率会降低2个点左右,而且GPU上不支持此运算

 

(2)伪量化QAT

在训练过程中进行量化操作。在训练过程中,weight 和 activation 都被“伪量化”为 INT8,但是计算实际仍以 FP32 完成。通过这种方法使模型在训练过程中能够“感知”到量化的影响,同时避免直接使用 INT8 训练导致的无法收敛的情况。

可以实现模型压缩,但对模型加速没有多大效果。

 

(3)聚类伪量化

用k-means等聚类算法,将大小相近的参数聚在一起,分为一类。每一类计算参数的平均值,作为它们量化后对应的值。

      

(4)QBERT模型                                                                                                        https://arxiv.org/abs/1910.06188

在BERT微调阶段进行量化感知训练,以便在最小精度损失的情况下将BERT压缩4倍。此外,所生成的量化模型如果对支持8bit Integer的硬件进行优化,可以加快推理速度

 

5、权重共享(Weight Sharing)

如ALBERT,12层共用一套参数而使得参数量降低到原来的1/12。这个方案对于模型压缩作用很大,但对于推理加速则收效甚微,因为共享权值并没有带来计算量的减少。

 

6、权重因式分解(Weight Factorization)

基本思想是将原始的大矩阵分解为两个或多个低秩矩阵的乘积。就模型压缩技术而言主要用于全连接层和卷积层。

 

7、网络层合并与计算图优化

资料较少。

 

二、早退机制(Dynamic Early Exiting)

核心是根据样本的难度来匹配相应的计算量。

bert对每个样本都同等的执行了12层运算,忽略了样本之间的难度差异。对于一些比较简单的样本,或许前几层的Layer表示就足以支撑模型进行正确的预测,后续的计算都可以认为是冗余的,从而可以省去以提升推理的速度。

综述文章:基于动态提前退出的预训练模型推理加速简介_分类器

相关paper合集:https://github.com/txsun1997/awesome-early-exiting

 

1、基于句子的退出机制

(1)DeeBERT

DeeBERT: Dynamic Early Exiting for Accelerating BERT Inference - ACL Anthology

设置阈值,若其熵小于某个特定的阈值,说明模型对于当前的预测足够自信,则可以退出,否则则需要继续执行下一层。

在GLUE的分类数据集上进行了实验,发现相比于DistilBERT这类静态模型压缩的方法,能够取得更好的推理加速的效果。

 

(2)FastBERT

FastBERT: a Self-distilling BERT with Adaptive Inference Time - ACL Anthology

https://github.com/TobiasLee/Awesome-Efficient-PLM (里面还有几个作者的其他模型)

速度可调、推理时间自适应。

如果给定不同的加速阈值来权衡速度与性能之间的关系,那么它可以比BERT提高1到12的速度。

 

(3)CALM

https://arxiv.org/abs/2207.07061

教大模型自己跳过“无用”层,推理速度×3性能不变,谷歌MIT这个新方法火了

谷歌研究人员提出的新框架。如果CALM意识到某些层“可有可无”,那么它在计算时就会跳过这些层,即让模型根据不同的输入,动态决定要用多少层网络来计算。

推理速度快3

 

(4)PABEE

https://arxiv.org/abs/2006.04152

尝试结合中间不同层的退出决策的一致性进行更加鲁邦的退出决策,其核心是当连续某几层的中间分类器都给出一致的预测结果后,认为这一个样本的预测结果以及足够自信,因而可以提前退出。

推理快1.5倍。

 

2、基于Token 的退出机制

基于上下文窗口中所有 Token 的预测不确定度的最大值,若是其超过了某个设定的阈值,则后续的计算过程中,这一token 的表示将不再被重复计算,而是直接传递到下一层。

(1)Accelerating BERT Inference for Sequence Labeling via Early-Exit

https://github.com/LeeSureman/Sequence-Labeling-Early-Exit

推理快1-4倍。

 

(2)TR-bert

https://aclanthology.org/2021.naacl-main.463.pdf

提速1-3倍。

 

三、其他方法

1TurboTransformers

https://github.com/Tencent/TurboTransformers

https://www.jianshu.com/p/957e9e7a5358

腾讯开源的BERT推理模型,支持C++和python方式调用,在pytorch基础上增加几行代码可以获得端到端BERT加速,可提速1-4倍。

 

2、招商证券nlp组bert推理提速方案

招商证券BERT压缩实践:如何大幅提高模型推断速度?_AI_招商证券信息技术中心NLP开发组_InfoQ精选文章

招商证券BERT压缩实践(二):如何构建3层8bit模型?_AI_招商证券信息技术中心NLP开发组_InfoQ精选文章

将压缩模型按任务分为两类:对于(长、短文本)分类任务,使用了 3 层 Theseus 模型+QAT 方法进行压缩,对于其他(文本相似度、因果推断等)任务,使用了 3 层蒸馏+QAT 方法进行压缩。

经过了两步压缩后模型精度下降了 2-3 个点,推理速度提升约4倍。

 

 

参考资料

1、模型压缩方法总结博文(有性能和推理速度的对比表格)

All The Ways You Can Compress BERT | Mitchell A. Gordon

 

2、压缩方法综述

https://arxiv.org/pdf/2002.11985.pdf

 

*KD是知识蒸馏

 

3、从算法应用层、框架层、硬件层考虑加速

一文看懂“深度学习模型压缩和加速” - 脉脉

 

 

你可能感兴趣的:(bert,python,人工智能)