【ACL2020】DeeBERT:衡量性能与效率的 BERT 推理方法
来自:AI自然语言处理与知识图谱(很好的公众号,推荐!)
DeeBERT
作者信息
Elesdspline
目前从事NLP与知识图谱相关工作。
导语
近年来预训练在 NLP 领域的各个任务上都表现出来很好的效果,但是在推理速度方面却不如人意,所以有很多的研究针对如何加快推理而提出了各种各样的尝试。
本文针对加快 BERT 预训练模型的推理速度提出的相关方法,提出了一种简单而有效的方法 DeeBERT 来加速 BERT 推理,该允许在不经过整个模型的情况下提前退出,获取推理结果。实验表明,DeeBERT 能够在模型质量最小的情况下节省 40% 的推理时间。
一、动机
现如今,大型或者超大型的预训练模型例如 BERT、XlNet、GPT、RoBERTa 等在 NLP 领域的各个任务上都表现出来很好的效果,无论是各种竞赛还是论文等,但是在推理速度方面却不如人意,所以有很多的研究针对如何加快推理而提出了各种各样的尝试,比如模型蒸馏等技术。
本文的动机来源于 CV 领域对 CNN 的一个观察结果[2]:在深度卷积神经网络中,较高的层通常产生更详细、更细粒度的知识表示结果。其实有一篇文章对 BERT 各个层学到的知识也有类似的结论, 较低的层学习到是一些基础语义知识,例如句法、词性信息等,较高的层次学到的信息更细粒度,更高级的特征表示。
因此,本文假设中间的层次也能够完成相应任务,不一定非要模型的最后一层信息。大概来说,不同的任务所需要的特征信息不一样,较低层次的信息可能便已经满足某个任务。
本文针对上述动机与假设,提出 DeeBERT : Dynamic early exiting for BERT,动态提前退出策略。
二、DeeBERT
DeeBERT 具体的做法是在 BERT 的每一个 transformer 层之间加入一个分类器,称之为 off-ramp,如下图所示,灰色框代表 transformer,黄色圆圈代表 off-ramp,蓝色箭头代表在不同层退出。
2.1 DeeBERT 如何微调?
假设 BERT 有 n 层 transformer,对应的有 n 个 off-ramps,每一个 off-ramp 在下游任务 fine-tune 的时候损失函数定义如下:D 是训练数据集、 是模型参数、H 是交叉熵损失函数、 是第 i 个 off-ramp 的输出。
fine-tune 的过程遵循以下两方面:
更新嵌入层、所有 transformer 层和最后一个 off-ramp 的参数,这和 BERT 原文中一致,其中最后一个 off-ramp 就是 原始 BERT 的分类层。
冻结 1 中 fine-tune 过的所有参数,然后更新除了最后一个 off-ramp 的其他 off-ramp。冻结 transformer 层参数的原因是为了保证最后 off-ramp 的输出质量最佳。
2.2 DeeBERT 如何推理?
上文我们提到, DeeBERT 在推理的时候设置了一个阈值,来判断当前的 off-ramp 对预测结果是否有信心,这个阈值在这里表示为 S , 这个决定了是在当前层就返回结果还是要继续进入下一层的 transformer,具体的算法过程如下图:在这里可以先说明下,从直觉和实验结果来看,S 越大,模型的推理速度越快,但推理的精确度越低;S 越小,模型推理的精确度越高,但推理速度越慢。在实验中,根据这个原则选择 S。
三、Experiment Result
3.1 实验设置
实验设置中,基线模型选用了 BERT 和 RoBERTa,并在六个分类数据集上面进行相关的实验:SST-2、MRPC、QNLI、RTE、QQP 和 MNLI。除此之外,还有对同样加快推理速度的模型进行了对比。
3.2 实验结果
下面是实验结果表:下面的表格中列出来与基线模型、加速模型以及不同阈值的 DeeBERT 的实验对比结果。从实验的结果表中能够不同的阈值下,精确度的波动范围以及推理时间的减少比例。 其实是为了权衡性能与推理时间。
DeeBERT 可以根据用户的需求灵活的选择何时推理,而不像 DistilBERT 将模型压缩。
DeeBERT 已经对 transformer 进行了微调,推理的时候不需要对模型进行进一步的训练,这可能相比于微调要花费更多的时间。
总结
本提出了一种简单而有效的方法 DeeBERT 来加速 BERT 推理,该允许在不经过整个模型的情况下提前退出,获取推理结果。从实验结果来看,更快的推理速度所损耗的精确度可能更高,两者之间如何权衡还是要进一步考虑。
参考资料
[1] DeeBERT: Dynamic Early Exiting for Accelerating BERT Inference
[2] Visualizing and understanding convolutional networks
说个正事哈
由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们和给我们多点点【在看】。星标具体步骤为:
(1)点击页面最上方“深度学习自然语言处理”,进入公众号主页。
(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。
感谢支持,比心。
投稿或交流学习,备注:昵称-学校(公司)-方向,进入DL&NLP交流群。
方向有很多:机器学习、深度学习,python,情感分析、意见挖掘、句法分析、机器翻译、人机对话、知识图谱、语音识别等。
记得备注呦
推荐两个专辑给大家:
专辑 | 李宏毅人类语言处理2020笔记
整理不易,还望给个在看!