论文阅读_模型蒸馏_TinyBERT
英文题目:TINYBERT: DISTILLING BERT FOR NATURAL LAN-GUAGE UNDERSTANDING
中文题目:TinyBERT: 提炼 BERT 的自然语言理解能力
论文地址:https://arxiv.org/pdf/1909.10351.pdf
领域:NLP,知识蒸馏
发表时间:2020
作者:Xiaoqi Jiao, 华中科技大学
出处:ICLR
被引量:67
代码和数据:
- https://github.com/huawei-noah/Pretrained-Language-Model/tree/master/TinyBERT
- https://github.com/Lisennlp/TinyBert
- https://github.com/qiangsiwei/bert_distill(数据是中文的)
阅读时间:22.09.16
读后感
对 BERT 模型进行蒸馏,老师模型和学生模型都使用Transformer架构,但是层数和每层的输出维度可以不同,从而实现对模型的精减。
介绍
预训练的大模型难以应用到资源受限的系统中,文中提出针对 Transformer 模型的蒸馏方法,将 BERT 模型作为老师模型,将知识蒸馏到学生模型 TinyBERT 中。同时在预训练和精调的场景中进行蒸馏,它可以达到其老师模型 96% 的准确率,比老师模型小 7.5 倍,快 9.4 倍。
实现的具体方法是根据 BERT 层设计了多种损失函数。与现有模型的差异如表 -1 所示:

文章贡献
- 优化了基于 Transformer 框架的蒸馏方法
- 支持预训练和精调两个场景的蒸馏
- 实验证明 TinyBERT 的效果
方法
蒸馏
蒸馏方法的如公式 -5 所示:

将 fs 定义为学生模型,将 ft 定义为老师模型,把实例代入模型,计算预测结果,L() 为损失函数,评价师生的差异,目标是尽量让老师与学生结果一致。
Transformer 蒸馏
蒸馏方法允许老师和学生是完全不同的模型,TinyBERT 设计过程中将老师和学生模型都设计使用 Transformer 结构。
符号定义
设学生模型有 M 个 Transformer 层,老师模型有 N 个 Transformer 层,在二者之间建立一个映射函数 n=g(m),学生的第 m 层从老师的第 g(m) 层学习。将嵌入层定义为第 0 层,预测层定义为 M+1 层。根据经验选择 g() 映射函数。其整体损失函数定义如下:

公式 -6 与公式 -5 类似,它针对学习的 m 个层优化,λm 为超参数,指定每层的重要程度。
Transformer 层蒸馏
Transformer 层蒸馏包含对注意力的蒸馏和对隐藏状态的蒸馏,如图 -2 所示:

注意力层的蒸馏致力于学习 BERT 捕捉的丰富语言学知识,学生模型首先拟合老师模型的多头注意力,损失函数如下:

其中 h 是头数,A 为注意力矩阵,MSE 为均方误差损失。这里直接使用 Attention,而未使用归一化的 softmax,是由于实验证明直接使用效果更好。
除了 Attention,还对 transformer 层的输出进行了拟合:

这里的 HS 和 HT 分别是学生和老师模型的隐藏层,学生模型隐藏层的维度往往小于老师层的维度,使用 W 参数在两个维度间进行转换。
嵌入层蒸馏
嵌入层的蒸馏与上述隐藏层处理方法类似,也可使用不同维度,通过 W 进行映射,本文中使用了相同维度。

预测层蒸馏
另外,还对最后一层的预测层进行了蒸馏,具体使用了软的交叉熵作为损失函数,这是为了从老师模型中除了最终结果类别,还能学到每一个类别的匹配度。

其中 zS 和 zT 分别对学生和老师预测的向量进行指数运算,t 是温度系数,本文实验中 t=1 时表现最好。
综上,对不同层使用不同的损失函数:

TinyBERT 学习
一般训练 BERT 模型包含两个场景:预训练和精调。对预训练模型的蒸馏将丰富的语言学知识转换到小模型中,提升小模型的泛化性能。流程如图 -1 所示:

另外,还支持进一步针对具体任务的蒸馏。
通用蒸馏
使用普通的 BERT 作为老师模型,并利用大规模数据集来蒸馏,生成的 TinyBERT 可用于进一步训练下游任务。此处训练出的 TinyBERT 是一个中间模型,效果比 BERT 差。
针对任务蒸馏
由于大模型的众多参数不一定都能通过精调优化,精调质量不一定很高,所以蒸馏模型有可能达到与普通的调优模型类似的效果。此处,用附加的针对任务的数据调优模型。将针对任务调优的 BERT 模型作为老师,使用数据增强方法来扩展训练数据,以提升学生模型的泛化能力。
数据增强
使用预训练的 BERT 和 GloVE 词嵌入实现词级别替换来增强数据。
用 BERT 来找到单个词替换,用 Glove 词嵌入来检索最相似的词组替换,通过概率 p 来决定是否替换当前词。算法 -1 展示了数据加强的方法。预训练的蒸馏模型为针对任务的模型提供初始模型参数。

实验
主实验结果如表 -1 所示:

可以看到,TinyBERT 在参数少且速度快的情况下,相对于其它小模型效果更好,基本于 MobileBERT 持平。