Press "Enter" to skip to content

大型语言模型:DistilBERT —— 更小、更快、更便宜和更轻巧

解密BERT压缩:最大效率的学生-教师框架

大型语言模型:DistilBERT —— 更小、更快、更便宜和更轻巧 四海 第1张

介绍

近年来,大型语言模型的发展一飞冲天。BERT成为最受欢迎和高效的模型之一,可以解决各种自然语言处理任务并取得高精度。在BERT之后,另一组模型也取得了出色的结果。

一个明显的趋势是,随着时间的推移,大型语言模型越来越复杂,通过指数级增加参数和训练数据。深度学习的研究表明,这些技术通常会取得更好的结果。不幸的是,机器学习世界已经遇到了几个与大型语言模型和可扩展性有关的问题,这已经成为有效训练、存储和使用它们的主要障碍。

考虑到这个问题,人们发展了一些特殊的技术来压缩大型语言模型。压缩算法的目标要么是减少训练时间,要么是降低内存消耗,要么是加速模型推断。实践中使用最多的三种常见压缩技术如下:

  • 知识蒸馏:训练一个较小的模型,试图表现出一个较大模型的行为。
  • 量化:减少用于存储表示模型权重的数字的内存。
  • 修剪:丢弃模型权重中最不重要的部分。

在本文中,我们将了解应用于BERT中的蒸馏机制,从而导致了一个称为DistillBERT的新模型。顺便提一下,下面讨论的技术也可以应用于其他自然语言处理模型。

蒸馏基础知识

蒸馏的目标是创建一个较小的模型,可以模仿一个较大的模型。实际上,这意味着如果一个大型模型预测某些内容,那么期望一个较小的模型也能做出类似的预测。

为了实现这一点,需要先对一个较大的模型进行预训练(在我们的例子中,是BERT)。然后选择一个较小模型的架构。为了增加成功模仿的可能性,通常建议较小的模型采用与较大模型类似的架构,但参数数量较少。最后,较小的模型根据较大模型在某个数据集上的预测进行学习。为了实现这个目标,选择一个适当的损失函数对较小模型的学习至关重要。

在蒸馏中,较大的模型被称为教师,较小的模型则称为学生

通常,蒸馏过程应用于预训练中,但也可应用于微调。

DistilBERT

DistilBERT从BERT中学习并通过使用损失函数更新其权重,该损失函数由三个组成部分组成:

  • 掩码语言建模(MLM)损失
  • 蒸馏损失
  • 相似性损失

接下来,我们将讨论这些损失组件并了解每个组件的必要性。然而,在深入讨论之前,有必要了解一个被称为温度的重要概念,它在softmax激活函数中使用。温度概念用于DistilBERT损失函数。

Softmax温度

我们经常观察到softmax变换作为神经网络的最后一层。Softmax将所有模型输出归一化,使它们总和为1,并可解释为概率。

存在一个softmax公式,其中模型的所有输出都除以一个名为温度的参数T:

Softmax温度公式。pᵢ和zᵢ分别是模型输出和第i个对象的归一化概率。T是温度参数。

温度T控制输出分布的平滑度:

  • 如果T > 1,则分布变得更加平滑。
  • 如果T = 1,则分布与正常的softmax应用相同。
  • 如果T < 1,则分布变得更加粗糙。

为了更清楚地说明,我们来看一个例子。假设一个分类任务有5个标签,神经网络产生了5个数值,表示输入对象属于相应类别的置信度。使用不同的T值应用softmax会产生不同的输出分布。

一个神经网络根据温度T产生不同概率分布的示例

温度越大,概率分布越平滑。

根据不同温度T的logits(从1到5的自然数)的softmax转换。随着温度的升高,softmax值越趋于一致。

损失函数

掩码语言建模损失

类似于教师模型(BERT),在预训练期间,学生模型(DistilBERT)通过对掩码语言建模任务进行预测来学习语言。在为某个特定标记生成预测后,将预测的概率分布与教师模型的one-hot编码概率分布进行比较。

one-hot编码分布指的是概率分布,其中最可能的标记的概率设为1,其他所有标记的概率设为0。

与大多数语言模型一样,通过计算预测分布与真实分布之间的交叉熵损失,并通过反向传播更新学生模型的权重。

掩码语言建模损失计算示例

蒸馏损失

实际上,可以只使用学生损失来训练学生模型。然而,在许多情况下,这可能不足够。仅使用学生损失的常见问题在于其softmax转换,其中温度T设置为1。在实践中,T = 1时得到的分布形式为,一个可能的标签具有非常高的概率接近于1,而其他标签的概率变得较低,接近于0。

这种情况与某个特定输入可能有效的两个或多个分类标签不符合:T = 1的softmax层很可能会排除除一个之外的所有有效标签,并使概率分布接近于one-hot编码分布。这导致潜在有用的信息丢失,学生模型可能无法学习到它,使得模型的多样性减少。

这就是为什么本文的作者引入了蒸馏损失,其中使用温度T > 1计算softmax概率,从而平滑地调整概率,从而考虑学生的多个可能答案。

蒸馏损失中,相同的温度T被同时应用于学生和教师。去掉了教师分布的one-hot编码。

蒸馏损失计算示例

可以使用KL散度损失代替交叉熵损失。

相似性损失

研究人员还指出,在隐藏状态嵌入之间添加余弦相似性损失是有益的。

余弦损失公式

这样,学生模型不仅有可能正确复制被屏蔽的标记,还能构造类似于教师模型的嵌入。同时,这也为在模型的两个空间中保持相同的嵌入关系打开了大门。

相似性损失计算示例

三元损失

最后,计算所有三个损失函数的线性组合之和,这定义了DistilBERT中的损失函数。基于损失值,将在学生模型上执行反向传播以更新其权重。

DistillBERT损失函数

有趣的是,在这三个损失组件中,屏蔽语言建模的损失对模型的性能影响最小。蒸馏损失和相似性损失具有更高的影响。

推理

DistilBERT中的推理过程与训练阶段完全一样。唯一的细微之处是将softmax温度T设置为1。这样做是为了获得与BERT计算的概率接近的结果。

架构

总体上,DistilBERT使用与BERT相同的架构,除了以下变化:

  • DistilBERT只有BERT层数的一半。模型中的每一层都是通过取两个BERT层中的一个进行初始化。
  • 删除了标记类型嵌入。
  • 删除了应用于分类任务的[CLS]标记隐藏状态的稠密层。
  • 为了更稳健的性能,作者采用了RoBERTa中提出的最佳思路:使用动态屏蔽、移除下一句预测目标、在更大的批次上训练、应用梯度累积技术来优化梯度计算

DistilBERT中的最后一个隐藏层大小(768)与BERT相同。作者报告称,将其减小并不会在计算效率方面产生显着的改进。根据他们的说法,减少总层数对性能的影响更大。

数据

DistilBERT和BERT在相同的数据语料库上进行训练,其中包含BooksCorpus(8亿个单词)和英文维基百科(25亿个单词)。

BERT与DistilBERT的比较

对BERT和DistilBERT在几个最流行的基准测试中的关键性能参数进行了比较。以下是需要记住的重要事实:

  • 在推理过程中,DistilBERT比BERT快60%。
  • DistilBERT的参数比BERT少4400万,并且总体上比BERT小40%。
  • DistilBERT保留了BERT性能的97%。
BERT vs DistilBERT比较(在GLUE数据集上)

结论

DistilBERT通过允许在显著压缩模型的同时,在各种NLP任务上实现可比较的性能,使BERT的演进取得了巨大的进步。除此之外,DistilBERT的体积仅为207 MB,使其更易于在内存受限的设备上集成。知识蒸馏不是唯一可以应用的技术:DistilBERT可以进一步通过量化或修剪算法进行压缩。

资源

除非另有说明,所有图片都是作者拍摄

Leave a Reply

Your email address will not be published. Required fields are marked *