让BERT飞一会

[TOC]


1. 模型蒸馏

1. DistilBERT(2019.10.2)

知识蒸馏的基础原理:

定义两个网络,teacher网络和student网络,teacher网络是预训练得到的大模型,student模型是想要学习和迁移得到的小模型。根据Hinton的文章,一般的蒸馏模式是:把teacher网络的输出作为soft-label,student网络学习的目标是hard-label,交叉构造三种loss来联合训练,目的是时student网络具备与teacher网络同样的推理目标。

模型简述:

student的网络解决与teacher的网络结构相同,都是Bert。主要改动有:

  1. 对student网络的构造,就是从teacher网络每两层去掉一层。因为,作者调研发现,隐层维度的变化比层数的变化对性能的影响较小,所以只改变网络层数。
  2. 因为student网络的层数减少两倍,所以去掉token type embedding和pooler。
  3. 使用teacher网络每两层的一层的参数来初始化student网络。
  4. 使用更大的batch,使用dynamic masking,去掉NSP任务。这几点是从RoBERTa中取的经。

三个loss:

  1. , teacher模型得到的目标概率分布是,student模型得到的目标概率分布是,然后计算两个分布的KL散度:。KL散度是衡量两个分布的相关度,使用这个loss,在训练的时候,就可以把teacher网络中丰富的先验知识带进训练过程。
    这里使用softmax-temperature,使用来控制输出概率的平滑度,在inference时,设置为1。
  2. ,就是bert中的masked语言模型的loss。
  3. ,计算teacher网络的hidden state和teacher网络的hidden state的余弦相似度。

然后将三个loss加权想和:

实验:

inference时间对比,大概提升了60%:


Ablation test结果,可以看出Lce、Lcos、参数初始化为结果影响较大:


2. TinyBert (2019.11.23)

主要贡献

  1. 提出的蒸馏方法,增加了对Transformer中attention层考量。
  2. 提出two-stage的蒸馏模式,在pre-training和fine-tuning阶段进行相同的蒸馏,验证效果更好。
  3. 实验证明结果很好。

模型简述:

问题定义:
teacher模型(m)和student模型(n)的层通过一个函数映射。student学teacher的过程就是通过最小化下面的目标函数:

各种loss的定义:

  1. Transformer-layer Distillation
  2. Embedding-layer Distillation
  3. Hidden-Layer Distillation
  4. Prediction-Layer Distillation

根据上面的定义,就可以最终得到student网络的完整的loss:

实验:

TinyBERT在经验上是有效的,其性能能够超过基线BERT的96%,容量小7.5倍,推理速度快9.4倍。同时,TinyBERT要比基线DistillBERT也明显更优,只有其28%的参数,31%的推理时间:


在 GLUE 基准上实现了与 BERT 相当(下降 3 个百分点)的效果:


paper
code

2. 模型结构上的优化

1.《Deformer:Decomposing Pre-trained Transformers for Faster Question Answering》

BERT模型做QA问题,比如问答或者阅读理解,需要将query和document拼接作为模型输入,然后使用self-attention对输入文本进行多层的交互编码,之后使用线性分类器在document中寻找可能的答案序列。而通常document都非常的长,所以就会有大量的计算。
这篇文章提出,将BERT模型做成两段式的结构,提前进行一些运算。
有研究表明,在多层Transformer模型中,低层(low layers)的编码主要关注一些局部的预言表层特征(比如词性,语法等),到了高层(upper layer)才逐渐关注与下游任务相关的全局语义信息。所以,在low layers, ”文档编码能够不依赖于问题“的假设是正确的。所以,这篇文章的思路具体来说:在底层先对问题和文档各自编码,在高层拼接问题和文档的隐层表征再进行交叉编码。如下图:

另外,作者实验发现这种结构在SQuAD上精度损失比较大,所以作者添加了两个蒸馏损失项。目的是最小化Defomer的高层表征和分类层logits与原始BERT模型的差异

实验:
在三个QA任务上,BERT和XLNet采用DeFormer分解后,取得了2.7-3.5倍的加速,节省内存65.8-72.0%,效果损失只有0.6-1.8%。但还是很慢,达不到实时的效果。


2.《AlBert》

主要三个改变,

  1. 使embedding层的维度()设置为远小于隐层的维度(),然后通过矩阵分解,将的矩阵分解为,,其中, 为字典大小,就是先将embedding的矩阵,映射到小维度的矩阵,然后再映射到大维度的隐层矩阵。这样就可以使embedding层参数大大减小。
  2. 共享emcoder中的所有参数。
  3. 将NSP任务改为SOP任务。
  • 《》

你可能感兴趣的:(让BERT飞一会)