文章目录


下一句预测(NSP)是用于训练BERT模型的另一种有趣策略。NSP是一个二分类任务。在NSP任务中,我们向BERT输入两个句子,它必须预测第二个句子是否是第一个句子的后续(下一句)。让我们通过一个例子来理解NSP任务。

考虑以下两个句子:

句子A:She cooked dumpling.

句子B:It was delicious.

在前面的一对句子中,句子B是一个后续,即句子B紧随句子A。所以我们把这个句子对标记为isNext,表示句子B紧随句子A。

现在,考虑以下两个句子:

句子A:Turn the radio on.

句子B:She bought a new hat.

在前面的一对句子中,句子B不是一个后续,即它不紧随句子A。所以我们把这个句子对标记为notNext,表示句子B不紧随句子A。

在NSP任务中,我们模型的目的是预测句子对是否属于isNext或notNext类别。我们将句子对(句子A和B)喂给BERT,并训练它预测句子B是否紧随句子A。如果句子B紧随句子A,模型将返回isNext,否则,它将返回notNext作为输出。因此,NSP本质上是一个二分类任务。

但是NSP任务有什么用呢?通过执行NSP任务,我们的模型可以理解两个句子之间的关系。理解两个句子之间的关系在许多下游任务中都是有用的,比如问答和文本生成。

那么我们如何为NSP任务获取数据集呢?我们可以从任何单语语料库生成数据集。假设我们有一些文档。对于isNext类别,我们从同一文档中的两个连续句子中取出,并将它们标记为isNext,对于notNext类别,我们从一个文档中取出一个句子,从另一个随机文档中取出另一个句子,并将它们标记为notNext。注意,我们需要保持50%的数据点在isNext类别中,50%的数据点在notNext类别中。

现在我们已经了解了NSP任务是什么,让我们看看如何训练BERT模型执行NSP任务。假设我们的数据集如下表所示:

在这里插入图片描述

图2.15 – 示例数据集

让我们采取前面示例数据集中的第一个数据点。首先,我们将对句子对进行分词,如下所示:
tokens = [She, cooked, dumpling, It, was, delicious]

接下来,我们只在第一个句子的开头添加一个[CLS]标记,在每个句子的末尾添加一个[SEP]标记,如下所示:
tokens = [[CLS], She, cooked, dumpling, [SEP], It, was, delicious, [SEP]]

现在,我们将输入标记喂给标记(token)、片段(segment)和位置(position)嵌入层,并获得输入嵌入(input embeddings)。然后,我们将输入嵌入喂给BERT,并获得每个标记的表示。如下图所示,R_[CLS]表示标记[CLS]的表示,R_She表示标记She的表示,以此类推:

在这里插入图片描述

图2.16 – BERT

我们了解到NSP是一个二分类任务。但是现在我们只有句子对中每个标记的表示。我们如何根据这些表示来对句子对进行分类呢?

为了执行分类,我们只需取出[CLS]标记的表示,并将其喂给带有softmax函数的前馈网络,然后返回我们的句子对属于isNext类和notNext类的概率。下一个问题来了:为什么我们只需要取[CLS]标记的嵌入呢?为什么不取其他标记的嵌入呢?

[CLS]标记基本上持有所有标记的聚合表示。因此,它基本上持有我们句子的聚合表示。因此,我们可以忽略所有其他标记的表示,只需取出[CLS]标记的表示,并将其喂给带有softmax函数的前馈层,后者返回概率。这在下面的图中显示。请注意,这里的输入嵌入层(标记、片段和位置嵌入层)没有显示,以减少杂乱:

在这里插入图片描述

图2.17 – NSP任务

从前面的图中,我们可以理解前馈网络返回我们的输入句子对属于isNext类的高概率。

请注意,在最初的迭代中,我们的模型不会返回正确的概率,因为前馈网络和BERT的编码器层的权重不会是最优的。然而,通过一系列的迭代,以及反向传播,我们更新了前馈网络和BERT的编码器层的权重,并学习到最优权重。这样,我们就用NSP任务训练了BERT模型。我们学习了如何使用掩蔽语言建模和NSP任务对BERT进行预训练。在下一节中,我们将介绍预训练过程。


感谢您的阅读,欢迎关注!


Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐