近年来,大型语言模型的发展呈现出爆炸式的增长。BERT成为了最受欢迎和高效的模型之一,能够以高精度解决广泛的自然语言处理(NLP)任务。在BERT之后,还出现了一系列其他的模型,也展示了出色的结果。
一个容易观察到的明显趋势是,随着时间的推移,大型语言模型(LLM)倾向于变得更加复杂,通过指数增加它们训练所需的参数和数据。深度学习的研究表明,这样的技术通常会带来更好的结果。不幸的是,机器学习领域已经面临了几个关于LLM的问题,而可扩展性已经成为有效训练、存储和使用它们的主要障碍。
考虑到这个问题,一些特别的技术已经被设计出来用于压缩LLM。压缩算法的目标是减少训练时间、降低内存消耗或加速模型推理。在实践中使用最常见的三种压缩技术如下:
在本文中,我们将了解应用于BERT的蒸馏机制,它产生了一个新的模型叫做DistilBERT。顺便说一下,下面讨论的技术也可以应用于其他NLP模型。
蒸馏基础
蒸馏的目标是创建一个能够模仿一个较大模型的较小模型。在实践中,这意味着如果一个较大模型预测了某件事情,那么一个较小模型就应该做出类似的预测。
为了实现这一目标,需要预先训练一个更大的模型(在我们的例子中是BERT)。那么就需要选择更小的模型的架构。为了增加成功模仿的可能性,通常建议较小的模型具有与较大模型相似的架构,但参数数量较少。最后,较小的模型从较大的模型对特定数据集做出的预测中学习。为了实现这一目标,选择合适的损失函数至关重要,这将有助于较小的模型更好地学习。
在蒸馏符号中,较大模型被称为教师,而较小模型被称为学生。
通常,在预训练阶段应用蒸馏过程,但也可以在微调阶段应用。
DistilBERT
DistilBERT从BERT学习,并通过使用由三个部分组成的损失函数来更新它的权重:
接下来,我们将讨论这些损失组件,并理解它们各自的必要性。然而,在深入探讨之前,有必要理解一个重要概念,即softmax激活函数中温度(temperature)概念。温度概念被用于DistilBERT的损失函数中。
Softmax温度
我们经常观察到softmax变换作为神经网络的最后一层。Softmax将所有模型输出归一化,使它们加起来等于1,并且可以被解释为概率。
存在一个softmax公式,其中模型的所有输出都除以一个温度参数T:
Softmax 温度公式。pᵢ 和 zᵢ 分别是第 i 个对象的模型输出和归一化概率。T是温度参数。
温度T控制输出分布的平滑度:
为了让事情更清楚,让我们看一个例子。考虑一个有5个标签的分类任务,其中一个神经网络产生了5个值,表示输入对象属于相应类别的置信度。用不同的 T 值应用softmax会得到不同的输出分布。
基于温度T生成不同概率分布的神经网络示例
温度越高,概率分布越平滑。
基于不同温度T值的logits(1到5的自然数)的Softmax变换。随着温度升高,softmax值彼此变得更加一致。
损失函数
掩码语言建模损失
与教师模型(BERT)类似,在预训练期间,学生模型(DistilBERT)通过为掩码语言建模任务做出预测来学习语言。在为某个词元产生预测后,将预测的概率分布与教师模型的独热编码概率分布进行比较。
one-hot编码分布指定一种概率分布,其中最可能的标记的概率设置为1,所有其他标记的概率设置为0。
与大多数语言模型一样,计算预测分布和真实分布之间的交叉熵损失,并通过反向传播更新学生模型的权重。
掩码语言建模损失计算示例
蒸馏损失
实际上,只使用学生损失来训练学生模型是可能的。但是,在很多情况下,这可能不够。只使用学生损失的一个常见问题在于它的softmax变换中温度T被设为1。在实践中,T=1的结果分布往往是这样的形式,其中一个可能的标签有非常接近1的高概率,而其他所有标签的概率都很低,接近0。
这种情况与对于特定输入有两个或更多有效标签的情况不太一致:T=1的softmax层很可能会排除除了一个之外的所有有效标签,并使概率分布接近独热编码分布。这会导致学生模型可能学到的潜在有用信息丢失,从而降低其多样性。
这就是为什么论文的作者引入了蒸馏损失,其中softmax概率是用一个T> 1的温度计算的,使得概率能够平滑地对齐,从而考虑到学生的多个可能答案。
在蒸馏损失中,学生和教师应用相同的温度 T。删除了教师分布的One-hot编码。
蒸馏损失计算示例
可以使用KL散度损失来代替交叉熵损失。
相似度损失
研究人员还表示,在隐藏状态嵌入之间添加余弦相似性损失是有益的。
余弦损失公式
这样,学生不仅可以正确地再现屏蔽标记,还可以构建与教师相似的嵌入。它还为在模型的两个空间中保持嵌入之间的相同关系打开了大门。
相似度损失计算示例
三重损失
最后,计算所有三个损失函数的线性组合之和,这定义了DistilBERT中的损失函数。根据损失值,对学生模型进行反向传播以更新其权重。
DistillBERT损失函数
有趣的事实是,在三个损失组件中,掩码语言建模损失对模型性能的影响最小。蒸馏损失和相似性损失有更大的影响。
推理
DistilBERT的推理过程与训练阶段完全一样。唯一的微妙之处是,softmax温度T被设为 1。这样做是为了得到接近BERT计算出来的概率。
架构
总体而言,DistilBERT使用与BERT相同的架构,除了以下几点变化:
1、DistilBERT只有BERT层的一半。模型中的每一层都是通过取两个BERT层中的一个来初始化的。
2、去掉了词元类型嵌入。
3、去掉了用于分类任务的[CLS]词元的隐藏状态上的全连接层。
4、为了获得更强大的性能,作者使用了RoBERTa提出的最佳想法:
·使用动态掩码
·去掉了下一句预测目标
·在更大的批次上进行训练
·应用了梯度累积技术来优化梯度计算
DistilBERT中最后一层隐藏层的大小(768)与BERT相同。作者报告说,减少它并没有带来显著的计算效率方面的改进。根据他们的说法,减少总层数有更大的影响。
数据
DistilBERT在与BERT相同的数据语料上进行训练,其中包括BooksCorpus(800M词)和英文维基百科(2500M词)。
BERT与DistilBERT比较 BERT和DistilBERT在几个最流行的基准测试上进行了关键性能参数的比较。以下是需要记住的事实:
1、在推理过程中,DistilBERT比BERT快60%。
2、DistilBERT比BERT少了44M个参数,总体上比BERT小40%。
3、DistilBERT保留了97%的BERT性能。
BERT与DistilBERT比较(在 GLUE 数据集上)
结论
DistilBERT在BERT的发展中迈出了一大步,它可以显着压缩模型,同时在各种NLP任务上实现可比较的性能。除此之外,DistilBERT的重量仅为207MB,使得在容量有限的设备上的集成更加容易。知识蒸馏并不是唯一适用的技术:DistilBERT可以通过量化或剪枝算法进一步压缩。