Press "Enter" to skip to content

软硬兼施极限轻量BERT!能比ALBERT再轻13倍?!

文 | 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

 

EdgeBERT是 在ALBERT的基础上 进行优化的。

 

ICLR’20上谷歌提出的ALBERT是目前最佳的BERT压缩方案。相比于过去利用 知识蒸馏 从原始BERT模型得到压缩模型(例如DistilBERT [1]、TinyBERT [2])和利用 浮点数量化 得到压缩模型(例如Q8BERT [3]),ALBERT选择直接抛弃BERT的预训练参数,只继承BERT的设计思想。正所谓不破不立,继承BERT灵魂的ALBERT仅用 12M参数 就取得了和其他BERT变体相当的性能。

 

ALBERT对BERT的设计采取了以下三点改进:

 

嵌入层分解:BERT中,WordPiece的嵌入维度和网络中隐藏层维度一致。作者提出,嵌入层编码的是上下文无关信息,而隐藏层则在此基础上增加了上下文信息,所以理应具有更高的维数;同时,若嵌入层和隐藏层维度一致,则在增大隐藏层维数时会同时大幅增加嵌入层参数量。ALBERT因此将嵌入层进行矩阵分解,引入一个额外的嵌入层。设WordPiece词汇表规模为,嵌入层维度为,隐藏层维度为,则嵌入层参数量可由降低为。

 

参数共享:BERT中,每个Transformer层参数均不同。作者提出将Transformer层的所有参数进行层间共享,从而将参数量压缩为仅有一层Transformer的量级。

 

上下句预测任务→句序预测任务:BERT中,除语言模型的MLM任务外还进行了上下句预测任务,判断句2是否为句1的下一句,然而该任务被RoBERTa和XLNET等模型证实效果一般。作者提出将其替换为句序预测任务,判断句2和句1之间的句子顺序来学习文本一致性。

 

ALBERT的设计相当成功,成为了压缩BERT的经典范例,而为了做到最极限压缩BERT,以ALBERT作为起点确实是个不错的主意。ALBERT已经如此强大,EdgeBERT又能压到什幺程度?作者一上来就用一张在QQP上的内存占用/运算量/性能比较图吊足了读者的胃口。(注意:纵坐标的内存占用量是 对数刻度 !)

本文对于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) 。这一机制的设计是希望让 简单的文本经过较少的运算 ,而 复杂的文本经过更多的运算 。

实现上,DeeBERT向层的BERT模型添加了个“ 出口层 ” 分类器(Early Exit Off-Ramps) 。出口层分类器被放置在第和层Transformer之间,作为判断第层Transformer的信息是否足以进行推断的标志。进行推断时,从最底层的分类器开始逐层计算出口层分类器的熵,当某一层的出口层分类器 熵小于某个阈值 时,则将该出口层分类器结果作为模型结果,省去后续层的计算。

上图表现的是不同的熵阈值在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计算注意力,从而降低矩阵运算的开销。

具体地,mask函数基于两个token之间的距离为注意力机制的权重计算添加了soft masking。注意力机制中的权重变为:

 

其中为控制soft程度的超参数,为序列截止到token的长度(原文采用了Transformer Decoder结构学习语言模型,故每个token只能于自己之前的token计算注意力。在EdgeBERT中没有提及公式,不过根据模型图的结构来看,分母应修改为对整个序列求和)。mask函数中的为mask的边界,此边界值会跟随注意力的head相关参数和当前输入序列变化:对于注意力机制中的每一个head,有,其中、可训练,为sigmoid函数。

 

EdgeBERT甚至对Adaptive Attention又进一步做了简化:连算都不用算了,直接 给每一个head赋一个可学习的 ,连输入序列都不考虑了,多出来的参数 只有12个 (因为有12个head)。那幺,这样做的结果如何呢?作者将所有序列都pad/trunc到128长度,经过实验,得到了一个惊人的结果:

表中展示的是经过优化后各个head的值,和模型在MNLI/QQP/SST-2/QNLI四个任务上的准确度。在一大半head 几乎完全被mask掉 ()之后,模型居然只在这几个任务上 掉了0.5甚至0.05的准确度 !而这一方法也为模型带来了最高的计算量降低。

 

3. 一阶网络剪枝

 

出处:

 

Movement Pruning: Adaptive Sparsity by Fine-Tuning

(NeurIPS’20)

链接:

 

https://arxiv.org/pdf/2005.07683.pdf

 

ALBERT虽好,但参数存起来占用的内存 太长了 ,开销太大,让他 变短一点 怎幺样?

 

这里的网络剪枝方式使用到了NeurIPS’20的一篇针对模型Fine-tune过程的剪枝算法。该论文的作者提出,传统的 零阶网络剪枝 (即给模型里的参数绝对值设定一个阈值,高于它的保留,低于它的置零)的方法 并不适用于迁移学习场景 ,因为该场景下模型参数主要受原始模型影响,却需要在目标任务上进行fine-tune和测试,所以直接根据模型参数本身剪枝可能会损失源任务或目标任务的知识。与此相反,作者提出一种 基于Fine-tune过程中的一阶导数 进行剪枝的Movement Pruning:尽可能保留fine-tune过程中更加 偏离0 的参数。

 

具体地:对于模型参数,为其赋予同样size的重要性分数,则剪枝mask。

 

前向传播过程中,神经网络利用加mask的参数计算输出的各分量:。

 

反向传播过程中,利用Straight-Through Estimator[4]的思想,将省略近似得到损失函数对重要性分数的梯度:

 

对模型参数,有:

 

将上述两个式子代换后,省略的mask矩阵后可得:

 

根据梯度下降,当时,重要性增大,此时与异号。这表示,只有当在反向传播时 为正的参数变得更大 或 为负的参数变得更小 时才会得到更大的重要性分数,避免被剪枝。

 

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数据类型需要涉及到一些与机器学习无关的知识。

根据IEEE 754二进制浮点数标准,一个浮点数的二进制表示由三个域组成: 符号位 (Sign,)、 指数偏移值 (Exponent bias,)和 分数值 (Fraction,或Mantissa,)。由此,一个数可以表示为。

 

这时聪明的你可能发现有什幺不对劲:按照表示无符号整形的方法取指数偏移值 只能取出正数 啊!2的 负次幂 怎幺办!这正是为什幺称其为“指数偏移值”:它并不代表实际上2的指数,而是在其基础上需要 加一个常数 作为2的指数:。

 

我们常用的浮点数保证了的选取能够使得在 数轴两侧分布几乎均等 (例如在32位浮点数FP32中,指数范围为至),但这样的数作为机器学习模型的参数显然有些不太合适:为了增加小数的精度,我们甚至要允许这样显然不会出现的数也能表示,这真的不是在 浪费内存 ?

 

AdaptivFloat的最关键动机正在于此: 根据模型参数动态修改 。所谓动态体现在 每个Tensor 都能得到 量身定做 的。方法也很简单,找到Tensor里 最大的一个数 ,让它能被指数范围恰好覆盖到就好。不过说来简单,为了实现这一方法需要配套地对现有浮点数表示方法进行许多其他修改,感兴趣的话可以去看看AdaptivFloat原文,此外IEEE 754标准[5]同样也可以作为参考哦~

上图的结果中,Bit Width是浮点数的总位数,后五行在模型中使用了AdaptivFloat并将指数偏移值限制为3个bit。不比不知道,谁能想到修改个量化方式居然直接 用8bit在四个数据集上都干翻了FP32 ?!不仅 节省了3/4的内存 ,还 取得了更好的性能 ,或许这就是吹毛求疵挑战极限的极客们的浪漫?

 

高级配方:存储介质选择

 

光软件优化可不够!如果软件优化就够了的话,还买什幺SSD,换什幺GPU(不)

 

EdgeBERT的目的,是尽可能降低 边缘计算场景 中使用BERT的 推理延迟 和 耗能 。为了最大限度地降低推理延迟,需要为网络中不同的组成部分根据其增删改查的需求选取 符合最大效能的存储介质 。

 

BERT类模型的一大特点,在于它们都是预训练模型:这类模型并非开箱即用,而是需要在目标任务上fine-tune后才能使用。这使得这类模型天生地存在着两类存储需求:

 

嵌入层:保存了Embedding向量。EdgeBERT在进行下游任务fine-tune时一般 不对嵌入层进行修改 。这类参数相当于 只读参数 ,只对快速读取有较高要求,同时希望能够在掉电时依然保持原有数据来降低数据读写开销,因此适用耗能低、读取速度快的 eNVM (Embedded Non-Volatile Memory,嵌入式非挥发性记忆体)。本文选取的是基于MLC的 ReRAM ,一种低功耗、高速度的RAM。

 

其他参数:这些参数需要在fine-tune时进行改变。此处使用的是SRAM(与计算机内存的DRAM不同,SRAM更贵但功耗更低、带宽更高,常被用于制造cache或寄存器)

嵌入层用了ReRAM究竟能带来多大的影响?上图结果表明,仅仅是改变了嵌入层的硬件介质就能带来 约的推理延迟降低 ,以及低至 约的能耗降低 !这对于边缘计算场景下简直是 质变 了!(为何ReRAM只有读,但DRAM那边却要算DRAM读+SRAM读/写呢?因为此处的ReRAM是特殊设计的只读结构,并且可以直接读入处理器进行运算。与此相反,DRAM,即电脑里一般使用的内存,需要经过基于SRAM的处理器cache,所以读写开销需要加上这部分读写开销。)

 

合并结果

 

好了,所有的基础配方一个一个单独使用的结果已经出来了!那幺,把它们 全都加在一起 能产生什幺样的结果呢?

这张图展示了完全体EdgeBERT在四个数据集上的性能、运算量和内存占用。其中所有红点的实验配置参照上表(即TABLE IV)。

 

在性能(准确度)相比ALBERT 下降1个百分点 时,EdgeBERT能取得 的内存降低 和 的推理速度 ;下降5个百分点时甚至能取得 的推理速度 。

 

Embedding经过裁剪后 仅保留了40% ,使得存储进eNVM的嵌入层参数 仅1.73MB 。

 

QQP的Transformer参数被 mask掉80% ,MNLI、SST-2、QNLI的Transformer参数被 mask掉60% 后,性能可以仅 下降1个百分点 。

 

究极配方:硬件加速器

 

这是什幺东西?来,给你展示一下谷歌给树莓派定制的TPU加速器Coral:

EdgeBERT专属的硬件加速器想来应该也是差不多的样子。

 

这一部分完全不是王苏的菜…给各位上一张EdgeBERT加速器的硬件结构图:

感兴趣的各位可以去参照原文进行学习_(:з」∠)_

 

这个加速器有什幺用呢?它是基于EdgeBERT的运算特点 量身定做 的加速器,能够把fine-tune好的EdgeBERT 完整地装进去进行运算 。至于运算效果,它们修改了模型图中VMAC序列(即进行矩阵运算的单元序列)长度,与NVIDIA的移动端TX2 mGPU进行了推理时间和耗能的对比:

本文中提出的硬件加速器能够为EdgeBERT带来 相比于baseline硬件加速器的能耗降低 ,相比于英伟达TX2移动端GPU甚至能够 带来的能耗降低 !耗电大户BERT家族终于也有能被说“省电”的一天了!

 

总结

 

压缩BERT是一项研究,但极限压缩BERT则是一项不易完成的 工程 :无论是对Transformer模型的 全方位裁剪 ,还是对 硬件存储介质 读写性能与容错的取舍,亦或是对 专属硬件加速器 的设计,单独拿出一项已足够艰难,将它们合在一起就不仅可能互相冲突,甚至还可能产生 逆向优化 。这篇文章通过大量的实验,测试了已有的几种优化方法在边缘计算场景下的性能,比较了不同优化方法之间的差别,分析了所有优化方法进行组合后的影响及效果,并进一步提出了专属的硬件结构,实现了对目前已有的最轻量BERT变体的 即插即用 。对于需要 长待机、低功耗、短延迟 的场景,例如智能家居或是其他需要NLP技术加持的物联网设备,或许我们真的能在不远的将来看到实体的类似EdgeBERT加速器的解决方案出现。

 

虽然我们对于可能带来更大变革的模型结构依然处在探索当中,但从当下实用的角度而言,用基于Lottery Ticket Hypothesis[6]的BERT优化方法寻找一个更优的 类BERT子结构 依然是一个不错的课题,至少它能让更多人、更多时候、更多场景能够用上性能强大的预训练模型。本文中提到的这些优化方法是不是也给爱思考的你带来了什幺启发呢?

 

萌屋作者:Sheryc_王苏

 

北航高等理工学院CS专业的市优秀毕业生,蒙特利尔大学/MILA准Ph.D.,资深ACG宅,目前作为实习生在腾讯天衍实验室进行NLP研究。虽主攻NLP,却对一切向更完善的智能迈进的系统和方向充满好奇。如果有一天N宝能真正理解我的文字,这个世界应该会被卖萌占领吧。(还没发过东西的)知乎ID:Sheryc

 

作品推荐:

 

 

这几个模型不讲“模德”,我劝它们耗子尾汁

 

NLP未来,路在何方?12位巨佬联名指路!

 

 

后台回复关键词【 入群 】

 

加入卖萌屋NLP/IR/Rec与求职讨论群

 

后台回复关键词【 顶会 】

 

获取ACL、CIKM等各大顶会论文集!

 

 

[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

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注