17

BERT模型蒸馏有哪些方法?

 3 years ago
source link: https://zhuanlan.zhihu.com/p/269748491
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

作者 | 蔡杰

学校 | 北京大学硕士生

研究方向 | 问答系统

我们都知道预训练模型的标准范式:

  • pretrain - 利用大量的未标记数据通过一些自监督的学习方式学习丰富的语义和句法知识。例如:Bert的MLM,NSP等等。
  • finetune - 将预训练过程中所学到的知识应用到子任务中,以达到优异的效果。

预训练模型在各个领域虽然带来了巨大的提升,但是也有一些致命的问题:

  • 预训练模型高计算复杂度-不可能在实时系统中运行。
  • 大存储需求——预训练模型一般都很大,少则几百M,大则几G,无法在有限资源的设备上部署。

所以模型压缩和加速技术的研究迫在眉睫!

Logit Distillation

知识蒸馏最早是Hinton在15年提出的一个黑科技技术,核心思想是通过迁移知识,从而通过训练好的大模型得到更加适合推理的小模型。

AZnaAn2.jpg!mobile

论文标题:Distilling the Knowledge in a Neural Network

论文来源:NIPS 2014

论文链接: http:// arxiv.org/abs/1503.0253 1

神经网络通常使用“softmax”输出层生成每个类别的概率:

U7JVb2u.jpg!mobile

输出层通过将 E7FbquM.png!mobile 与其他logit进行比较,以 7jA3qmI.png!mobile 表示为每个类计算出的logit。T是温度系数,通常设置为1。

softmax是一种"soft max",在使用cross-entropy计算loss的时候,相对的差别规模较小的logit值被压缩甚至丢失。

EbaieeR.jpg!mobile

论文中用了对softmax的公式进行了推导,如果T远高于对数的量级,且对数为零均值,则上图公式(4)和公式(2)和几乎相同。在T非常小的情况下,梯度会接近于qi-pi,所以当多个类别的pi接近于0时,最终输出的相似性信息是没有体现在梯度中的,所以网络会忽略掉这些信息;

所以,单纯的用logits来蒸馏的方法是存在一些bias的,那能否有更准确以及更快速的蒸馏方法呢?

Beyond Logit Distillation

2qmAFfU.jpg!mobile

论文标题:TinyBERT: Distilling BERT for Natural Language Understanding

论文来源:ICLR 2020

论文链接: http:// arxiv.org/abs/1909.1035 1

代码链接: https:// github.com/huawei-noah/ Pretrained-Language-Model

TINYBERT提出了新的迁移蒸馏方法,蒸馏的loss可以从4个方面来构造:

  • Embedding Layer
  • Transformer Layer(Hidden States 和 Attention Matricies)
  • Prediction Layer
ZNRjU3Z.jpg!mobile

整个模型的loss是学生模型的每一层loss的求和:

6bqeaiq.jpg!mobile

构造的Loss都是清一色的MSE函数:

Embedding-layer Distillation

Znyeq2B.png!mobile

Hidden-layer Distillation

MFVBjiR.png!mobile

Self-Attention Distillation

fUFZbii.jpg!mobile

Target Classifier Distillation

jA3A3mq.png!mobile

最终每一层的loss如下:

Yru2Eff.png!mobile

通过论文中的实证研究表明了TinyBERT的有效性,在 GLUE 上达到了与 BERT 相当(下降 3 个百分点)的效果,同时模型大小只有 BERT 的 13.3%(BERT 是 TinyBERT 的 7.5 倍),Inference的速度是 BERT 的 9.4 倍。此外,TinyBERT 还显著优于当前的 SOTA 基准方法(BERT-PKD),但参数仅为为后者的 28%,推理时间仅为后者的 31%。

Curriculum Distillation

rIr67ri.jpg!mobile

论文标题:FitNets : Hints for Thin Deep Nets

论文来源:ICLR 2015

论文链接: https:// arxiv.org/abs/1412.6550

代码链接: https:// github.com/adri-romsor/ FitNets

蒸馏时采用的中间层匹配本质上是一种正则化形式,Transformer的分层蒸馏可能会导致过度正则化。

本文将Hinton的蒸馏output的logits的idea进行了扩展,不仅使用输出的logits,同时也用模型的中间层信息来作为hints来提高student模型的性能。通过这样的方法可以训练出一个deeper和thinner的student模型。

E7z2ief.jpg!mobile7BRfeav.jpg!mobileRjaQbmQ.png!mobile

Zzu2ymy.png!mobile 代表teacher网络中的第一层到hint层的函数映射,Whint表示其中的参数;

eIra6f7.png!mobile 代表student网络中的第一层到hidden层的函数映射,Wguided表示其中的参数;

r代表hidden层的一个额外的映射关系,Wr是其中的参数,这是为了使得hidden层与hint层的神经元大小一致。

Fig. 1 (a) 作者选择FitNet的一个隐藏层,作为学习层,去学习teacher model的某一层(引导层)。我们希望学习层能够预测引导层的输出。

Fig. 1 (b) 作者从一个训练过的teacher网络和一个随机初始化的FitNet开始,在FitNet学习层的顶部加入一个由Wr参数化的回归因子,将FitNet参数WGuided训练到学习层,使 Eq.(3) 最小化 (Fig. 1 (b))。

最后,从预训练的参数中,我们对整个FitNet的Ws的参数进行训练,使 Eq.(2) 最小化 (Fig. 1 (c))。

从实验结果上看,student比teacher参数少,效果却比teacher还要好,可能是因为网络更深的原因,某种程度上说明了深层网络的有效性,深层网络的表示性能要更优一些。实验也说明了Hint损失的重要性,Hint损失在某种程度上弥补了交叉熵和KD loss损失的信息,而这种丢失的信息在某种程度上可以被更深层的网络来弥补。

Dynamic Early Exit

通过分辨简单样本和复杂样本,有针对性的去优化网络性能,加快inference的速度,具体可参考之前写的FastBert。

r2Yfmaf.jpg!mobile

论文标题:FastBERT: a Self-distilling BERT with Adaptive Inference Time

论文来源:ACL 2020

论文链接: https:// arxiv.org/abs/2004.0217 8

代码链接: https:// github.com/autoliuweiji e/FastBERT

为了在保证模型性能的前提下提高其效率,本文提出了一种新的具有自适应推断时间的速度可调快速bert。推理速度可根据不同需求灵活调整,同时避免了样本的冗余计算。此外,该模型采用了一种独特的自蒸馏机制进行微调,有更强的计算效能与最小的性能损失。

eaUFFjb.jpg!mobile

原BERT模型为主干(Backbone),每个分类器称为分支(Branch),其中分支Classifier都是由最后一层的分类器蒸馏而来,在预训练和微调阶段都只调整主干参数,finetune之后主干参数freeze,把最后一层classifier蒸馏到每一层student classifier中。

之所以叫自蒸馏,因为student和teacher都是由一个模型得到的,以往的KD都是两个模型,student模型经过参数初始化,让teacher模型去优化student模型。

一共包含以下几个阶段:

  • Pre-training:和BERT预训练的流程一致,主要是要得到一个预训练模型。
  • Fine-tuning for Backbone:Backbone的微调,也就是训练一个Bert的分类器,预训练模型后添加一层classifier,classifier的参数用于后期的指导训练。
  • Self-distillation for branch:分支(branch)的自蒸馏,每一层都有一个student的classfier,由微调过的Bert的最后一层classifier蒸馏而来,每个branch都有一个classifier。
  • Adaptive inference:自适应inference,可以根据样本的难易程度决定样本要走几层分支分类器,简单的样本可以在底层直接给结果,困难的继续往高层走。

同类的文章还有:

Uvaye2V.jpg!mobile

论文标题:DeeBERT: Dynamic Early Exiting for Accelerating BERT Inference

论文来源:ACL 2020

论文链接: https:// arxiv.org/abs/2004.1299 3

代码链接: https:// github.com/castorini/De eBERT

yya2mmU.jpg!mobile

论文标题:DynaBERT: Dynamic BERT with Adaptive Width and Depth

论文来源:NeurIPS 2020

论文链接: https:// arxiv.org/abs/2004.0403 7

代码链接: https:// github.com/huawei-noah/ Pretrained-Language-Model/tree/master/DynaBERT

#投 稿 通 道#

如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢? 答案就是:你不认识的人。

总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。

PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是 最新论文解读 ,也可以是 学习心得技术干货 。我们的目的只有一个,让知识真正流动起来。

来稿标准:

• 稿件确系个人 原创作品 ,来稿需注明作者个人信息(姓名+学校/工作单位+学历/职位+研究方向)

• 如果文章并非首发,请在投稿时提醒并附上所有已发布链接

• PaperWeekly 默认每篇文章都是首发,均会添加“原创”标志

投稿方式:

• 方法一:在PaperWeekly知乎专栏页面点击“投稿”,即可递交文章

• 方法二:发送邮件至:[email protected] ,所有文章配图,请单独在附件中发送

• 请留下即时联系方式(微信或手机),以便我们在编辑发布时和作者沟通

关于PaperWeekly

PaperWeekly 是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事 AI 领域,欢迎在公众号后台点击 「交流群」 ,小助手将把你带入 PaperWeekly 的交流群里。

加入社区: http://paperweek.ly

微信公众号:PaperWeekly

新浪微博:@PaperWeekly


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK