NLP学习笔记(十二)BERT模型

1,333 阅读5分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

BERT模型

这节课我们学习BERT(Bidirectional Encoder Representations from Transformers)。BERT是用来预训练Transformer模型的,本节课只解释BERT的主要思想,细节请参考论文。 在这里插入图片描述

BERT在18年提出,19年发表。BERT的目的是预训练Transformer的Encoder网络,从而大幅度提高准确率。BERT的基本想法有两个:一个想法是随机遮挡一个或多个单词,让Encoder网络根据上下文来预测被遮挡的单词。第二个想法是把两个句子放在一起,让Encoder网络判断两句话是不是原文里相邻的两句话。BERT用这两个任务来预训练Transformer中的Encoder网络。

Task 1: Predict Masked Words(任务一:预测遮住的单词)

首先,我们回顾一下Transformer的Encoder部分。输入是一句话,有很多单词。这些单词经过Embedding层后映射为一个词向量。 在这里插入图片描述

然后是Encoder网络。它是由多个Block垒起来的。 在这里插入图片描述

输入有6个单词,Embedding层将其映射为6个词向量x1,,x6x_1, \cdots, x_6,经过Encoder网络后输出6个向量u1,,u6u_1, \cdots, u_6

BERT的第一个任务是预测被遮挡的单词。随机遮住一个或多个单词,让神经网络来预测这个被遮住的单词。 在这里插入图片描述

具体做法如下:我们把遮住的单词替换为[MASK],[MASK]符号会被Embedding层编码为词向量xMx_M,把[MASK]位置的输出记作向量uMu_M

在这里插入图片描述

注意:上节课我们讲过,Transformer网络的映射不是一对一而是多对一(即每个位置的输出都会受所有输入的影响)。 uMu_M向量不仅依赖于xMx_M向量,而且依赖于所有xx向量。uMu_M在[MASK]位置上,但是uMu_M知道整句话的信息。uMu_M包含上下文信息,所以可用uMu_M来预测被遮挡的单词。

在这里插入图片描述

uMu_M向量作为特征输入一个Softmax分类器。分类器的输出是一个概率分布pp。字典里每个单词都有一个概率值。通过概率值就可以判断被遮挡单词是什么。 在这里插入图片描述

把被遮住的单词的One-Hot向量记作ee,分类器输出的概率记作pp。我们希望pp尽量接近ee,把eepp的CrossEntropy作为损失函数loss。之后通过反向传播和梯度下降就可以更新模型参数。

可以用任何书籍或者维基百科作为训练数据。可以自动生成标签。这样一来训练数据要多少有多少。足以训练一个足够大的模型。

Task 2: Predict the Next Sentence(任务二:预测下一个句子)

任务举例如下:假如有两句话,第一句话是“calculus is a branch of math”,第二句话是“it was developed by newton and leibniz”。现在需要模型来判断,这两句话是否是相邻的两句话。这里极有可能是的,因为微积分和牛顿、莱布尼茨关系密切,模型应该有能力学出这种相关性。

在这里插入图片描述

假如第一句话不变,第二句变为:“panda is native to south central china”,那么就不是相邻的两句话了。 在这里插入图片描述 在这里插入图片描述

我们可以这样准备训练数据,把两句话拼接起来。之间用[SEP]符号分开,最前面放一个[CLS]符号占一个位置。生成训练数据时,有50%概率是原文本中真实相邻的两句话。另外50%的第二句话是从训练数据中随机抽取的句子。 在这里插入图片描述

一条训练数据包含两句话。两句话都被分割为很多个符号。最前面一个[CLS]符号占一个位置,这个位置上的输出记作向量cc。注意:这里虽然cc在[CLS]的位置上,但并不只依赖于[CLS]符号,而是包含两句话的全部信息,所以靠cc就可以判断出两句话是否相邻。 在这里插入图片描述

cc输入一个分类器,分类器的输出是一个0到1之间的数值。1代表True,0代表False。可以用CrossEntropy作为loss衡量预测值和真实值的区别。有了loss之后就可以计算梯度进行反向传播。

这种分类任务可以使Encoder找到单词间正确的相关性。

Combining the two methods

我们把两个任务结合起来预训练Transformer。把两句话拼接起来,然后随机遮挡15%的单词。

在这里插入图片描述

在这里插入图片描述

假如有两个单词被遮挡,那么就有个任务,就需要定义3个损失函数。第一个任务是二分类,所以第一个损失函数就是Binary CrossEntropy。第二、三个任务是多分类,所以损失函数是CrossEntropy。目标函数是三个损失函数的加和。

在这里插入图片描述

BERT的好处是不用人工标注数据集。节约人力和时间成本。 在这里插入图片描述

BERT的想法简单,但计算代价超大。论文里有两个模型。一个base模型,有1.1亿个参数。大模型有2.35亿个参数。训练小模型用了16块TPU,花了4天时间。要是买亚马逊EC2的服务来训练模型,差不多要花1万美元。这只是跑一遍的时间,还不算调参数。训练大模型更夸张,是小模型的4倍。 在这里插入图片描述

不过好在这些模型都是公开的,我们可以直接下载使用。