文 | Sheryc_王苏
这个世界上有两种极具难度的工程:第一种是把很平常的东西做到最大,例如把语言模型扩大成能够写诗写文写代码的GPT-3;而另一种恰恰相反,是把很平常的东西做到最小。对于NLPer来说,这种“小工程”最迫在眉睫的施展对象非BERT莫属。
从18年那个109M参数的BERT,到52M参数的蒸馏后的DistilBERT,再到14.5M参数的蒸馏更多层的TinyBERT,最后到12M参数的层级共享的ALBERT,曾经那个在集群上加载参数都费劲的BERT现在甚至已经可以跑在手机平台上了。当我们为BERT的轻量化欢呼雀跃之时,有这样一群人站了出来——只是手机端可不够!他们的理想,是让BERT跑在物联网设备上,跑在低功耗芯片上,跑在我们能触及的每一个电子器件上!
这样一群来自哈佛/塔夫茨/HuggingFace/康奈尔的软件和硬件极客们,此刻已披上了法袍,化身为为BERT极限瘦身的炼金术士,向着这个看似不可能的目标添加着许多让人意想不到的配方…
论文题目:
EdgeBERT: Optimizing On-Chip Inference for Multi-Task NLP
论文链接:
https://arxiv.org/pdf/2011.14203.pdf
Arxiv访问慢的小伙伴也可以在【夕小瑶的卖萌屋】订阅号后台回复关键词【0105】下载论文PDF~
配方基底:ALBERT
出处:ALBERT: A Lite BERT for Self-supervised Learning of Language Representations(ICLR'20)
链接:https://arxiv.org/pdf/1909.11942.pdf
本文对于ALBERT的利用除了作为初始化参数外,还在对下游任务做fine-tune时利用已经fine-tune好的ALBERT作为teacher进行知识蒸馏,来进一步提升模型性能。
初级配方:算法优化
1. 基于熵的提前退出机制
出处:DeeBERT: Dynamic Early Exiting for Accelerating BERT Inference(ACL'20)
链接:https://arxiv.org/pdf/2004.12993.pdf
ALBERT虽好,但Transformer太深了,算起来太慢,让他变浅一点怎么样?
ACL'20的DeeBERT恰好就提出了一种动态的提前退出机制(Early Exit)。这一机制的设计是希望让简单的文本经过较少的运算,而复杂的文本经过更多的运算。
上图表现的是不同的熵阈值在MNLI、QQP、SST-2、QNLI四个数据集上的平均退出层数、理论运行时间节省和相应的准确度。添加提前退出机制后,在Acc损失1个百分点时,能够在这四个数据集上分别降低30%、45%、54%和36%的理论运行时间;在Acc损失5个百分点时,能将在这四个数据集上的理论运行时间的降低进一步降低至44%、62%、78%和53%。
2. 动态注意力范围
出处:Adaptive Attention Span in Transformers(ACL'19)
链接:https://arxiv.org/pdf/1905.07799.pdf
ALBERT虽好,但Attention范围太广了,算起来太慢,让他变窄一点怎么样?
ACL'19的Adaptive Attention提出的动态注意力范围正是试图通过这种方法减少注意力计算的。在Transformer的多头自注意力机制中,不同head对应的注意力范围并不一致,而让每一个head都对所有token进行注意力运算无疑增添了无用开销。为此,Adaptive Attention为每一个head添加一个不同的mask,使得每个token只能对周边的token计算注意力,从而降低矩阵运算的开销。
4. 零阶网络剪枝
出处:Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding(ICLR'16)
链接:https://arxiv.org/pdf/1510.00149.pdf
变短是变短了,但感觉这剪得还不够好啊,再换一种算法让它更短一点怎么样?
这种方法的做法非常简单:给模型里的参数设定一个绝对值阈值,绝对值高于它的保留,绝对值低于它的置零。由于方法实在太过简单,不用公式也能很容易理解的吧(=・ω・=)
一阶和零阶网络剪枝的效果对比如上图所示(MvP:一阶网络剪枝,MaP:零阶网络剪枝)。在参数稀疏程度更高时,一阶剪枝的效果更好,其他情况下是简单的零阶剪枝更有效。同时,研究还发现,当剪掉95%的嵌入层参数时,模型竟然在4个任务上都保持了至少95%的准确度。
5.动态浮点数量化
出处:AdaptivFloat: A Floating-point based Data Type for Resilient Deep Learning Inference(arXiv Preprint)
链接:https://arxiv.org/pdf/1909.13271.pdf
诶,怎么还有?网络的运算和存储过程从深度、宽度和长度进行了全方位的优化,模型还能再轻?
的确,到此为止,一般的炼丹师已经看着自己三维裁剪过的模型感到成就感满满了,但这距离让BERT跑遍所有设备的目标还差得远。以下的部分就要开始深入一般NLP工程师见不到的第四个维度——硬件维度了。在深入硬件优化之前,先来道偏软件的开胃菜,看看如何在浮点数量化上下手优化存储吧!
我们平时在考虑利用浮点数特性进行计算加速时,最先考虑的是使用FP16混合精度,虽然有效,但毕竟损失了信息,效果也多多少少会受影响。既想保留精度又想加速训练减小存储,那就只有深入底层,修改浮点数的表示方法了!
这正是AdaptivFloat的初衷:设计一种更加适合深度学习场景的浮点数数据类型。不过,要讲明白AdaptivFloat数据类型需要涉及到一些与机器学习无关的知识。
总结
压缩BERT是一项研究,但极限压缩BERT则是一项不易完成的工程:无论是对Transformer模型的全方位裁剪,还是对硬件存储介质读写性能与容错的取舍,亦或是对专属硬件加速器的设计,单独拿出一项已足够艰难,将它们合在一起就不仅可能互相冲突,甚至还可能产生逆向优化。这篇文章通过大量的实验,测试了已有的几种优化方法在边缘计算场景下的性能,比较了不同优化方法之间的差别,分析了所有优化方法进行组合后的影响及效果,并进一步提出了专属的硬件结构,实现了对目前已有的最轻量BERT变体的即插即用。对于需要长待机、低功耗、短延迟的场景,例如智能家居或是其他需要NLP技术加持的物联网设备,或许我们真的能在不远的将来看到实体的类似EdgeBERT加速器的解决方案出现。
虽然我们对于可能带来更大变革的模型结构依然处在探索当中,但从当下实用的角度而言,用基于Lottery Ticket Hypothesis[6]的BERT优化方法寻找一个更优的类BERT子结构依然是一个不错的课题,至少它能让更多人、更多时候、更多场景能够用上性能强大的预训练模型。本文中提到的这些优化方法是不是也给爱思考的你带来了什么启发呢?
参考文献
[1] Sanh et al. DistilBERT, a Distilled Version of Bert: Smaller, Faster, Cheaper and Lighter. In NeurIPS'19 EMC2 Workshop. https://arxiv.org/pdf/1910.01108.pdf [2] Jiao et al. TinyBERT: Distilling BERT for Natural Language Understanding. In Findings of EMNLP'20. https://arxiv.org/pdf/1909.10351.pdf [3] Zafrir et al. Q8BERT: Quantized 8Bit BERT. In NeurIPS'19 EMC2 Workshop. https://arxiv.org/pdf/1910.06188.pdf [4] Bengio et al. Estimating or Propagating Gradients Through Stochastic Neurons for Conditional Computation. arXiv Preprint. https://arxiv.org/pdf/1308.3432.pdf [5] IEEE 754 - Wikipedia. https://zh.wikipedia.org/wiki/IEEE_754 [6] Frankle et al. The Lottery Ticket Hypothesis: Finding Sparse, Trainable Neural Networks. In ICLR'19. https://arxiv.org/pdf/1803.03635.pdf
标签:BERT,树莓,剪枝,arxiv,13,https,pdf,org From: https://blog.51cto.com/xixiaoyao/7081551