论文标题:DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter
提出机构:HuggingFace
部分内容引用于https://www.cnblogs.com/jiangxinyang/p/11715678.html
优化内容
DistillBert是在bert的基础上用知识蒸馏技术训练出来的小型化bert。整体上来说这篇论文还是非常简单的,只是引入了知识蒸馏技术来训练一个小的bert。具体做法如下:
1)给定原始的bert-base作为teacher网络。
2)在bert-base的基础上将网络层数减半(也就是从原来的12层减少到6层)。
3)利用teacher的软标签和teacher的隐层参数来训练student网络。
训练时的损失函数定义为三种损失函数的线性和,三种损失函数分别为:
1)。这是teacher网络softmax层输出的概率分布和student网络softmax层输出的概率分布的交叉熵(注:MLM任务的输出)。
2)。这是student网络softmax层输出的概率分布和真实的one-hot标签的交叉熵。也就是student模型做预训练的mlm损失。
3)。这是student网络隐层输出和teacher网络隐层输出的余弦相似度值,在上面我们说student的网络层数只有6层,teacher网络的层数有12层,因此个人认为这里在计算该损失的时候是用student的第1层对应teacher的第2层,student的第2层对应teacher的第4层,以此类推。
同时,作者对student的初始化也做了工作(后面的实验证明初始化工作也对精度有很大提升),作者用teacher的参数来初始化student的网络参数,做法和上面类似,用teacher的第2层初始化student的第1层,teacher的第4层初始化student的第2层。另外作者在这里移除了句子向量和pooler层,同时也移除了预训练过程中的NSP任务。
Distillation细节
模型和BERT架构完全一样,预训练过程也一致。batch_size设置的很大,使用梯度累计使batch达到4K,同时使用动态mask并移除nsp。
语料使用和BERT相同:English Wikipedia and Toronto Book Corpus。
在8张16G显存的V100 GPU上训练了90个小时。作为对比,RoBERTa在1024张32G显存的V100 GPU上训练了24个小时。
消融实验
如下表所示,mlm损失对精度影响不大,但其他两个蒸馏的loss和student模型的初始化工作对精度有很大影响。