[TOC]
1. 模型蒸馏
1. DistilBERT(2019.10.2)
知识蒸馏的基础原理:
定义两个网络,teacher网络和student网络,teacher网络是预训练得到的大模型,student模型是想要学习和迁移得到的小模型。根据Hinton的文章,一般的蒸馏模式是:把teacher网络的输出作为soft-label,student网络学习的目标是hard-label,交叉构造三种loss来联合训练,目的是时student网络具备与teacher网络同样的推理目标。
模型简述:
student的网络解决与teacher的网络结构相同,都是Bert。主要改动有:
- 对student网络的构造,就是从teacher网络每两层去掉一层。因为,作者调研发现,隐层维度的变化比层数的变化对性能的影响较小,所以只改变网络层数。
- 因为student网络的层数减少两倍,所以去掉token type embedding和pooler。
- 使用teacher网络每两层的一层的参数来初始化student网络。
- 使用更大的batch,使用dynamic masking,去掉NSP任务。这几点是从RoBERTa中取的经。
三个loss:
-
, teacher模型得到的目标概率分布是
,student模型得到的目标概率分布是
,然后计算两个分布的KL散度:
。KL散度是衡量两个分布的相关度,使用这个loss,在训练的时候,就可以把teacher网络中丰富的先验知识带进训练过程。
这里使用softmax-temperature,使用来控制输出概率的平滑度,在inference时,设置为1。
-
,就是bert中的masked语言模型的loss。
-
,计算teacher网络的hidden state和teacher网络的hidden state的余弦相似度。
然后将三个loss加权想和:
实验:
inference时间对比,大概提升了60%:
Ablation test结果,可以看出Lce、Lcos、参数初始化为结果影响较大:
2. TinyBert (2019.11.23)
主要贡献
- 提出的蒸馏方法,增加了对Transformer中attention层考量。
- 提出two-stage的蒸馏模式,在pre-training和fine-tuning阶段进行相同的蒸馏,验证效果更好。
- 实验证明结果很好。
模型简述:
问题定义:
teacher模型(m)和student模型(n)的层通过一个函数映射。student学teacher的过程就是通过最小化下面的目标函数:
各种loss的定义:
- Transformer-layer Distillation
- Embedding-layer Distillation
- Hidden-Layer Distillation
- Prediction-Layer Distillation
根据上面的定义,就可以最终得到student网络的完整的loss:
实验:
TinyBERT在经验上是有效的,其性能能够超过基线BERT的96%,容量小7.5倍,推理速度快9.4倍。同时,TinyBERT要比基线DistillBERT也明显更优,只有其28%的参数,31%的推理时间:
在 GLUE 基准上实现了与 BERT 相当(下降 3 个百分点)的效果:
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》
主要三个改变,
- 使embedding层的维度(
)设置为远小于隐层的维度(
),然后通过矩阵分解,将
的矩阵分解为
,
,其中
,
为字典大小,就是先将embedding的矩阵,映射到小维度的矩阵,然后再映射到大维度的隐层矩阵。这样就可以使embedding层参数大大减小。
- 共享emcoder中的所有参数。
- 将NSP任务改为SOP任务。
- 《》
网友评论