如果你已经训练过像 BERT 或 RoBERTa 这样的大型 NLP 模型,你就会晓得这个过程是极其漫长的。因为其宏大的规模,训练此类模型可能会继续数天。当须要在小型设施上运行它们时,就会发现正在以微小的内存和工夫老本为日益增长的性能付出代价。
有一些办法能够加重这些苦楚并且对模型的性能影响很小,这种技术称为蒸馏。在本文中,咱们将探讨 DistilBERT [1] 办法背地的机制,该办法可用于提取任何相似 BERT 的模型。
首先,咱们将探讨个别的蒸馏以及咱们为什么抉择 DistilBERT 的办法,而后如何初始化这个过程,以及在蒸馏过程中应用的非凡损失,最初是一些须要留神的细节。
简略介绍DistilBERT
什么是常识蒸馏?
蒸馏的概念是相当直观的:它是训练一个小的学生模型,模拟一个更大的老师模型并尽可能靠近的过程。如果咱们只将他用在集群上进行机器学习模型的微调时,那么常识蒸馏的作用并不大。然而当咱们想要将一个模型移植到更小的硬件上时,比方一台无限的笔记本电脑或手机,常识蒸馏的益处是不言而喻的,因为蒸馏的模型在保障性能的状况下,参数更少、运行得更快、占用的空间更少。
BERT蒸馏的必要性
基于bert的模型在NLP中十分风行,因为它们最后是在[2]中引入的。随着性能的进步,呈现了很多很多的参数。精确地说,BERT的参数超过了1.1亿,这里还没有探讨BERT-large。对常识蒸馏的须要是显著的,因为 BERT 十分通用且性能良好,还有就是起初的模型基本上以雷同的形式构建,相似于 RoBERTa [3],所以可能正确的提取和应用BERT外面蕴含的内容能够让咱们达到两全其美的目标。
DistilBERT 办法
第一篇对于 BERT 提炼的论文是给咱们灵感的论文,即 [1]。然而其余办法也会陆续介绍,例如 [4] 或 [5],所以咱们很天然地想晓得为什么将本人限度在 DistilBERT 上。答案有三点:第一,它非常简单,是对蒸馏的一个很好的介绍;其次,它带来了良好的后果;第三,它还容许提炼其余基于 BERT 的模型。
DistilBERT 的蒸馏有两个步骤,咱们将在上面具体介绍。
复制主模型(老师)的架构
BERT 次要基于一系列互相重叠的注意力层。因而这意味着 BERT 学习的“暗藏常识”蕴含在这些层中。咱们不会关怀这些层是如何工作的,然而对于那些想要理解更多细节的人,除了原始论文 [1],我能够举荐这篇做得十分杰出的 TDS 文章 [6]。在这里咱们能够将注意力层视为一个黑匣子,这对咱们来说并不重要。
各个BERT模型之间的最大区别是层数 N 不同,模型的大小天然与 N 成正比。由此可知,训练模型所破费的工夫和前向流传的工夫也取决于 N,当然还有用于存储模型的内存。因而提取 BERT 的合乎逻辑的论断是缩小 N。
DistilBERT 的办法是将层数减半并从老师的层初始化学生的层。这个办法听起来就是简略而高效的:
DistilBERT 在一个齐全复制层和一个疏忽层之间交替,依据 [4]的办法,它尝试优先复制顶层或底层。
这里还要感激huggingface的transformers 模块,再加上和对BERT其外部工作原理的一些理解,这个复制的步骤能够很容易地实现。咱们将在另一篇文章中展现如何具体做到,因为咱们在本文中只钻研实践和机制。
当然,如果应用基于 BERT 的模型进行特定工作,比如说工夫序列分类,那么还须要为学生模型复制老师模型的头部,但一般来说BERT 的头部大小与其注意力层的大小相比就显得十分的小了,能够忽略不计。
咱们当初有一个能够用来学习的学生模型。然而蒸馏过程并不是一个经典的拟合过程:咱们不是像平常一样教学生模型学习一种模式,咱们的指标是模拟老师。因而咱们将不得不调整训练过程,尤其是咱们的损失函数。
蒸馏的损失
本文顶部的图像阐明了蒸馏过程。咱们的训练程序将基于实现以下两个指标的特定损失:将与老师模型训练时雷同的损失函数最小化、模拟老师模型的输入。所以常识蒸馏的最大问题就是,模拟老师模型须要将两个损失函数混合。上面咱们将从简略的指标开始,尽量减少与老师模型雷同的损失。
老师模型雷同的损失
对于这部分没有什么可说的:相似 BERT 的模型都以雷同的形式工作,外围将嵌入输入到解决特定问题的头部。老师微调的工作带有本人的损失函数。为了计算这个损失,因为学生模型是与老师具备雷同问题特定头部的注意力层组成,所以咱们只须要输出学生的嵌入和标签。
学生-老师穿插熵损失
这是第一个可能放大学生和老师模型概率分布之间差距的损失。当类 BERT 模型对输出进行前向流传时,无论是用于掩码语言建模、标记分类、序列分类等……它都会输入 logits,而后通过 softmax 层将其转换为概率分布。
对于输出 x,老师模型输入:
学生模型输入:
请记住softmax 及其附带的符号,咱们前面还会持续探讨。如果咱们心愿 T 和 S 靠近,能够以 T 为指标对 S 利用穿插熵损失。这就是咱们所说的学生-老师穿插熵损失:
学生-老师余弦损失
帮忙学生模拟老师的第二个损失是余弦损失。余弦损失很乏味因为它不尝试使向量 x 等于指标 y,而是尝试将 x 与 y 对齐,并且不思考它们各自的范数或空间原点。咱们应用这种损失能够使老师和学生模型中的暗藏向量对齐。公式示意如下:
实际上,余弦损失有两种版本,一种用于对齐向量,另一种是将一个向量拉向另一个相同的方向。在本文中,咱们只对第一种办法感兴趣。
蒸馏应用残缺损失
全副蒸馏的损失是上述三种损失的整合:
额定细节
蒸馏过程
在解释了损失之后,蒸馏程序的其余部分非常简单。该模型的训练与其余模型十分类似,惟一的问题是必须并行运行两个BERT 的模型(学生、老师)。然而侥幸的是老师模型不须要梯度,因为反向流传仅在学生身上实现。然而作为蒸馏过程,依然须要实现损失的计算,咱们将在当前的文章中介绍它。
Temperature
在学生-老师穿插熵损失时咱们提到的这个符号:
DistilBERT 应用 [7] 中的Temperature概念,这有助于软化 softmax。Temperature是一个 ≥ 1变量,它会随着 softmax 的回升而升高“置信度”。失常的 softmax 形容如下:
当初,让咱们将其重写为:
公式中的 1实际上对应于。一个一般的 softmax 是一个Temperature设置为 1 的 softmax,一个蕴含Temperature的 softmax 的公式是:
随着 回升, 上的商变为零,因而整个商变为 1/n,softmax 概率分布变为均匀分布。这能够在上图中察看到。
在 DistilBERT 中,学生和老师模型的 softmax 在训练时都以雷同的 为条件,并在推理时将Temperature设置为 1。
总结
以上就是 DistilBERT 对类 BERT 模型的蒸馏过程,惟一要做的就是抉择一个模型并提炼它!咱们在前面的文章中将具体介绍蒸馏的过程和代码实现。
援用
[1] Victor SANH, Lysandre DEBUT, Julien CHAUMOND, Thomas WOLF, DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter (2019), Hugging Face
[2] Jacob Devlin, Ming-Wei Chang, Kenton Lee, Kristina Toutanova, BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding (2018), Google AI Language
[3] Yinhan Liu, Myle Ott, Naman Goyal, Jingfei Du, Mandar Joshi, Danqi Chen, Omer Levy, Mike Lewis, Luke Zettlemoyer, Veselin Stoyanov, RoBERTa: A Robustly Optimized BERT Pretraining Approach (2019), arXiv
[4] Xiaoqi Jiao, Yichun Yin, Lifeng Shang, Xin Jiang, Xiao Chen, Linlin Li, Fang Wang, Qun Liu, TinyBERT: Distilling BERT for Natural Language Understanding (2019), arXiv
[5] Zhiqing Sun, Hongkun Yu, Xiaodan Song, Renjie Liu, Yiming Yang, Denny Zhou, MobileBERT: a Compact Task-Agnostic BERT for Resource-Limited Devices (2020), arXiv
[6] Raimi Karim, Illustrated: Self-Attention (2019), Towards Data Science
[7] Geoffrey Hinton, Oriol Vinyals, Jeff Dean, Distilling the Knowledge in a Neural Network (2015), arXiv
作者:Remi Ouazan Reboul