FastBERT

自从BERT问世以来,大多数NLP任务的效果都有了一次质的飞跃。BERT Large在GLUE test上甚至提升了7个点之多。但BERT同时也开启了模型的“做大做深”之路,普通玩家根本训不起,高端玩家虽然训得起但也不一定用得起。

所以BERT之后的发展也比较清晰,一部分壕大佬们继续搞预训练提升效果,当你对BERT Large望而却步的时候,又出了GPT2,又双出了威震天Megatron-LM,又双叒出了T5,又双叒叕出了DeepSpeed。。。每次都是照着一个数量级去加,剩下的人只能默默观望,翻翻《显存不够,如何训练大型神经网络?》看哪个trick可以用上。

另一部分大佬着力于给BERT瘦身提升速度。比如剪枝,剪掉多余的连接、多余的注意力头、甚至LayerDrop[1]直接砍掉一半Transformer层;再比如量化,把FP32改成FP16或者INT8;还有蒸馏,用一个学生模型来学习大模型的知识,不仅要学logits,还要学attention score。。。

然而,大部分减肥方法都会带来精度的下降。剪枝会直接降低模型的拟合能力,量化虽然有提升但也有瓶颈,蒸馏的不确定性最大,很难预知你的BERT教出来怎样的学生。

但!是!

昨天刷到了一篇让我眼前一亮的文章《FastBERT: a Self-distilling BERT with Adaptive Inference Time》[2],是北大+腾讯+北师大的ACL2020。作者提出了一种新的inference速度提升方式,相比单纯的student蒸馏有更高的确定性,且可以自行权衡效果与速度,简单实用。

后台回复【0409】获取论文PDF噢~

FastBERT

模型结构

FastBERT的创新点很容易理解,就是在每层Transformer后都去预测样本标签,如果某样本预测结果的置信度很高,就不用继续计算了。论文把这个逻辑称为样本自适应机制(Sample-wise adaptive mechanism),就是自适应调整每个样本的计算量,容易的样本通过一两层就可以预测出来,较难的样本则需要走完全程。

那么问题来了,用什么去预测中间层的结果呢?作者的解决方案是给每层后面接一个分类器,毕竟分类器比Transformer需要的成本小多了:

注:FLOPs (floating point operations)是Tensorflow中提供的浮点数计算量统计

于是模型的整体结构就呼之欲出了:

作者将原BERT模型称为主干(Backbone),每个分类器称为分支(Branch)。

要注意的是,这里的分支Classifier都是最后一层的分类器蒸馏来的,作者将这称为自蒸馏(Self-distillation)。就是在预训练和精调阶段都只更新主干参数,精调完后freeze主干参数,用分支分类器(图中的student)蒸馏主干分类器(图中的teacher)的概率分布

之所以叫自蒸馏,是因为之前的蒸馏都是用两个模型去做,一个模型学习另一个模型的知识,而FastBERT是自己(分支)蒸馏自己(主干)的知识。值得注意的是,蒸馏时需要freeze主干部分,保证pretrain和finetune阶段学习的知识不被影响,仅用brach 来尽可能的拟合teacher的分布。

那为什么不直接用标注数据训分支分类器呢?因为直接训效果不好呗(摊手~下面是作者在消融实验给出的结果:

可以看到,非蒸馏的结果没有蒸馏要好。个人认为是合理的,因为这两种方式在精调阶段的目标不一样。非自蒸馏是在精调阶段训练所有分类器,目标函数有所改变,迫使前几层编码器抽取更多的任务feature。但BERT强大的能力与网络深度的相关性很大,所以过早地判断不一定准确,致使效果下降。

同时,使用自蒸馏还有一点重要的好处,就是不再依赖于标注数据。蒸馏的效果可以通过源源不断的无标签数据来提升。

模型训练与推理

了解模型结构之后,训练与推理也就很自然了。只比普通的BERT模型多了自蒸馏这个步骤:

  1. Pre-training:同BERT系模型是一样的,网上那么多开源的模型也可以随意拿来~

  2. Fine-tuning for Backbone:主干精调,也就是给BERT加上分类器,用任务数据训练,这里也用不到分支分类器,可以尽情地优化

  3. Self-distillation for branch:分支自蒸馏,用无标签任务数据就可以,将主干分类器预测的概率分布蒸馏给分支分类器。这里使用KL散度衡量分布距离,loss是所有分支分类器与主干分类器的KL散度之和

  4. Adaptive inference:自适应推理,及根据分支分类器的结果对样本进行层层过滤,简单的直接给结果,困难的继续预测。这里作者定义了新的不确定性指标,用预测结果的熵来衡量,熵越大则不确定性越大:

效果

对于每层分类结果,作者用“Speed”代表不确定性的阈值,和推理速度是正比关系。因为阈值越小 => 不确定性越小 => 过滤的样本越少 => 推理速度越慢。

模型最终在12个数据集(6个中文的和6个英文的)上的表现还是很好的:

可以看到,在Speed=0.2时速度可以提升1-10倍,且精度下降全部在0.11个点之内,甚至部分任务上还有细微提升。相比之下HuggingFace的DistillBERT的波动就比较剧烈了,6层模型速度只提升2倍,但精度下降最高会达到7个点。

总结

FastBERT是一个在工程上十分实用的模型,通过提前输出简单样本的预测结果,减少模型的计算负担,从而提高推理速度。虽然每层都多了一个分类器,但分类器的计算量也比Transformer小了两个数量级,对速度影响较小。后续的分支自蒸馏也设计的比较巧妙,可以利用无监督数据不断提升分支分类器的效果。

另外,Sample-wise adaptive mechanism和Self-distillation这两个idea也是在本文首次提出,相信会起到抛玉引玉的作用,衍生更多此类工作。论文本身也还有一些想象空间,比如分别优化每层分类器,因为在主干被freeze的情况下各个分支是独立的;或者自蒸馏unfreeze主干,再加上数据自蒸馏一把,说不定还会有性能提升。

值得一提的是,本文的一作刘伟杰(北大)正是K-BERT[3]的作者,那也是一篇我很喜欢的文章,把知识融入到BERT的方式比较优雅,真心期待作者有更多的idea~

最后再回来夸一下,FastBERT着实很实用,而且完全不会影响到手头调好的BERT,只需要蒸馏几个浅层分类器,再把判断机制加上就可以了。而且比起不太稳定的蒸馏来说放在线上也更有底,稳稳的幸福。

唯一的遗憾是源码要在文章发表时才会放出来,一起去催更吧~

https://github.com/autoliuweijie/FastBERT

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200521134644795.jpg)

bert速度提升fastbert相关推荐

  1. 亚马逊:我们提取了BERT的一个最优子架构,只有Bert-large的16%,CPU推理速度提升7倍...

    选自arXiv 作者:Adrian de Wynter.Daniel J. Perry 机器之心编译 机器之心编辑部 提取 BERT 子架构是一个非常值得探讨的问题,但现有的研究在子架构准确率和选择方 ...

  2. ICML 2021:矩阵乘法无需相乘,速度提升100倍,MIT开源最新近似算法

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 在不做乘 ...

  3. 矩阵乘法无需相乘,速度提升100倍,MIT开源最新近似算法 | ICML 2021

    萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 在不做乘加操作(multiply-adds)的情况下,能计算矩阵乘法吗? 矩阵乘法包含大量a+b×c类运算,因此常在运算中将乘法器和加法器进 ...

  4. 阿里公开自研AI集群细节:64个GPU,百万分类训练速度提升4倍

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 编辑:Sophia 计算机视觉联盟  报道  | 公众号 CVLianMeng 转载于 :量子位 AI博士笔记系列推 ...

  5. Python速度提升

    Python 是一种脚本语言,相比 C/C++ 这样的编译语言,在效率和性能方面存在一些不足.但是,有很多时候,Python 的效率并没有想象中的那么夸张.本文对一些 Python 代码加速运行的技巧 ...

  6. nmap 命令行执行错误_Unimap:一款基于Nmap实现的扫描速度提升工具

    Unimap Unimap是一款基于Nmap实现的扫描速度提升工具,我们只需要提供一个IP地址给Unimap,即使是大量数据,Unimap也能够以非常快的速度完成网络扫描.Unimap是"U ...

  7. mac webpack 版本_晓前端周刊 第48期:EMP面向未来微前端方案正式开源了!玩转 webpack,使你的打包速度提升 90%;...

    业界动态 苹果最大杀招:iPhone App 已能在电脑运行 近日网友反馈,苹果 App Store 中大量应用在兼容性一栏中显示:已支持运行 macOS 11(及以上版本)的 Mac 电脑.这意味着 ...

  8. 开源sk-dist,超参数调优仅需3.4秒,sk-learn训练速度提升100倍

    作者 | Evan Harris 译者 | Monanfei 编辑 | Jane  出品 | AI科技大本营(ID:rgznai100) [导语]这篇文章为大家介绍了一个开源项目--sk-dist.在 ...

  9. 单机训练速度提升高达640倍,快手开发GPU广告模型训练平台

    作者|廉相如(快手FeDA智能决策实验室 ) 如何有效处理大规模用户数据进行广告推荐?对于互联网企业的发展和进步至关重要.这也是为何快手成立西雅图实验室并实现新一代GPU广告模型训练平台的原因之一.快 ...

最新文章

  1. 值传递 和 地址传递 的区别(好多句话才可以说清)
  2. 使用Navicat创建数据库,外键出现错误ERROR 1005: Can't create table (errno: 121)
  3. eclipse 中文件引用报错不能编译,但引用文件确实存在
  4. PJSIP UA分析(1)--PJSUA主函数
  5. quartz 任务调试 建表 sql 语句、create table语句
  6. php100 linux,PHP100精华:很靠谱linux经常使用命令
  7. 架构设计(6)---Web架构师究竟都要学些什么?
  8. 试试Write Live Writer在博客园的使用
  9. docker视频教程下载
  10. RMAN-06004、RMAN-20011
  11. 卷毛机器人抢大龙_EDG卷毛宣布退役:感谢WE和EDG的培养
  12. 你必须知道的3D建模流程,最后一步是关键
  13. ExcelVBA:利用SUMIF和OFFSET+MATCH进行多条件求和
  14. 编译原理chatpter04 文法的形式和文法的类型
  15. Swift-技巧(五)设置圆角的代码
  16. 小程序中使用web-view链接H5网页
  17. 通过这一篇文章,可以把Java中的类加载器了解的七七八八了
  18. C语言的按位取反符号~(详解)
  19. android string 过滤,Android 字符串过滤器InputFilter详解
  20. PS学习笔记8-画笔工具

热门文章

  1. 系统遇到并发瓶颈时的优化方向
  2. 2022-2028年中国智慧物流行业深度调研及投资前景预测报告(全卷)
  3. 手把手教你搭建 Git 服务器
  4. 一步一步写自己的SqlHelper类库
  5. redis 双写一致性
  6. LeetCode简单题之字符的最短距离
  7. 快手推荐系统及 Redis 升级存储
  8. NVIDIA安倍架构
  9. Caffe框架GPU与MLU计算结果不一致请问如何调试?
  10. Tensor Core技术解析(上)