美文网首页
让BERT飞一会

让BERT飞一会

作者: ColdCoder | 来源:发表于2020-06-11 10:31 被阅读0次

    [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. L_{ce}, teacher模型得到的目标概率分布是t_i,student模型得到的目标概率分布是s_i,然后计算两个分布的KL散度:L_{ce} = \sum_i{t_i * \log{s_i}}。KL散度是衡量两个分布的相关度,使用这个loss,在训练的时候,就可以把teacher网络中丰富的先验知识带进训练过程。
      这里使用softmax-temperature,使用T来控制输出概率的平滑度,在inference时,设置为1。
    2. L_{mlm},就是bert中的masked语言模型的loss。
    3. L_{cos},计算teacher网络的hidden state和teacher网络的hidden state的余弦相似度。

    然后将三个loss加权想和:

    Loss= 5.0*L_{ce}+2.0* L_{mlm}+1.0* L_{cos}

    实验:

    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)的层通过一个n=g(m)函数映射。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层的维度(E)设置为远小于隐层的维度(H),然后通过矩阵分解,将H*V的矩阵分解为V*E,E*H,其中H<<H, V为字典大小,就是先将embedding的矩阵,映射到小维度的矩阵,然后再映射到大维度的隐层矩阵。这样就可以使embedding层参数大大减小。
    2. 共享emcoder中的所有参数。
    3. 将NSP任务改为SOP任务。
    • 《》

    相关文章

      网友评论

          本文标题:让BERT飞一会

          本文链接:https://www.haomeiwen.com/subject/wlgvtktx.html