自学内容网 自学内容网

BERT模型

BERT介绍

BERT的输入输出

BERT全称BidirectionalEncoder Representations from Transformer(基于Transformer的双向编码器)。BERT模型利用大规模无标注的预料训练,获得包含文本内在语义信息的表示。

  • 输入:文本中各个词的原始向量。这个向量既可以是随机初始化,也可以是使用word2vec初步训练得到的。对于不同的任务,BERT有着不同的输入和输出
  • 输出:文本中各个词融合了全文语义后的向量表示

输入BERT的向量是融合三个部分的向量,分别是字嵌入向量(Token Embedding)文本嵌入向量(Segment Embedding)位置嵌入向量(Position Embedding),最后将这三个向量加和输入到BERT模型中。

字嵌入、文本嵌入以及位置嵌入

如下两个句子:

Sentence A: Paris is a beautiful city.
Sentence B: I love Paris.

添加[CLS]标记句子起始,[SEP]标记句子末尾,如下:

tokens = [ [CLS], Paris, is, a, beautiful, city, [SEP], I, love, Paris, [SEP]]

字嵌入

将tokens输入字嵌入层转为字嵌入向量,字嵌入向量会在训练过程中学习,得到如下:
在这里插入图片描述

文本嵌入

除了[SEP]标记,我们还要给模型某种标志来区分两个句子。因此,我们将tokens喂给文本嵌入层。得到如下的文本嵌入向量:
在这里插入图片描述

位置嵌入

位置嵌入提供句子中字的位置信息,将tokens输入字嵌入层训练,得到如下位置嵌入向量:
在这里插入图片描述

BERT的输入表示

如下图所示,首先我们将给定的输入序列分词为标记列表,然后喂给标记嵌入层,片段嵌入层和位置嵌入层,得到对应的嵌入表示。然后,累加所有的嵌入表示作为BERT的输入表示。
在这里插入图片描述

BERT的分词器

另外,BERT使用的分词器是WordPiece分词器。
当使用WordPiece分词器分词,首先我们检测单词在词表(vocabulary)中是否存在,若存在,则作为标记;否则,我们将该单词拆分为一些子词,然后我们检查这些子词是否存在于词表。

如果某个子词存在于词表,那么将它作为一个标记;否则继续拆分子词,然后检查更小的子词是否存在于词表中。

这样,我们不断地拆分子词,并用词表检查子词,直到碰到单个字符为止。这种做法可以有效地处理未登录词(out-of-vocabulary,OOV)。

BERT的词表有30K个标记,如果某个单词属于这30K个标记中一个,那我们将该单词视为一个标记;否则,我们拆分单词为子词,然后检查子词是否属于这30K个标记之一。
如:

"Let us start pretraining the model."

分词后得到

tokens = [let, us, start, pre, ##train, ##ing, the, model]

接着会添加[CLS]和[SEP]

tokens = [ [CLS], let, us, start, pre, ##train, ##ing, the model, [SEP] ]

BERT模型的任务

对于不同的任务,BERT有着不同的输入和输出

  • 单文本分类:例如文章情绪分析。BERT模型在输入的文本前添加一个[CLS]符号,并将该符号对应的输出向量作为最终整篇文章的语义表示。与其他文本字相比,这个[CLS]向量能更公平的融合各个字词的语义信息。
  • 语句对文本分类: 例如问答系统、LLM等。这时输入向量不仅添加了[CLS],还添加了[SEP]用于分割语句。
  • 序列加标注:此类任务每个字对应的输出向量是对该字的标注,可以理解为分类。例如命名实体的识别。

BERT的预训练策略

  • Masked LM(掩码建模):给定一句话,随即抹去其中几个词,要求根据上下文判断缺失字词。形象理解为“完形填空”。原文作者在一句话中随机选择15%的词汇用于预测。对于被抹去的词汇,80%用[MASK]替换,10%用其他字替换,10%保持不变。这样做的原因是,模型在实际预测使并不知道对应位置的词汇是否为正确答案,这迫使模型更加依赖上下文信息去预测。
  • Next Sentence Prediction(下一句预测): 给定两句话,判断第二句是否紧挨着第一句。类似四六级中的段落重排序。

掩码建模

BERT是一个自编码语言模型,即预测时同时从两个方向阅读序列。在一个屏蔽语言建模任务中,对于给定的输入序列,我们随机屏蔽15%的单词,然后训练模型去预测这些屏蔽的单词。为了做到这一点,我们的模型以两个方向读入序列然后尝试预测屏蔽的单词。

举个例子。我们考虑上面见到的句子:Paris is a beautiful city’, and 'I love Paris。首先,我们将句子分词,得到一些标记:

tokens = [ [CLS], Paris, is, a beautiful, city, [SEP], I, love, Paris, [SEP] ]

接下来,我们在上面的标记列表中随机地屏蔽15%的标记(单词)。假设我们屏蔽单词city,然后用[MASK]标记替换这个单词,结果为:

tokens = [ [CLS], Paris, is, a beautiful, [MASK], [SEP], I, love, Paris, [SEP] ]

现在训练我们的BERT模型去预测被屏蔽的标记。

这里有一个小问题。 以这种方式屏蔽标记会在预训练和微调之间产生差异。即,我们训练BERT通过预测[MASK]标记。训练完之后,我们可以为下游任务微调预训练的BERT模型,比如情感分析任务。但在微调期间,我们的输入不会有任何的[MASK]标记。因此,它会导致 BERT 的预训练方式与微调方式不匹配。

为了解决这个问题,我们应用80-10-10%规则。我们知道我们会随机地屏蔽句子中15%的标记。现在,对于这些15%的标记,我们做下面的事情:

  • 80%的概率,我们用[MASK]标记替换该标记。因此,80%的情况下,输入会变成如下:
tokens = [ [CLS], Paris, is, a beautiful, [MASK], [SEP], I, love, Paris, [SEP] ]
  • 10%的概率,我们用一个随机标记(单词)替换该标记。所以,10%的情况下,输入变为:
tokens = [ [CLS], Paris, is, a beautiful, love, [SEP], I, love, Paris, [SEP] ]
  • 剩下10%的概率,我们不做任何替换。因此,此时输入不变:
tokens = [ [CLS], Paris, is, a beautiful, city, [SEP], I, love, Paris, [SEP] ]

在分词和屏蔽之后,我们分别将这些输入标记喂给字嵌入、片段嵌入和位置嵌入层,然后得到输入嵌入。

然后,我们将输入嵌入喂给BERT。如下所示,BERT接收输入然后返回每个标记的嵌入表示作为输出。
在本例中,我们使用BERT-base,即有12个编码器层,12个注意力头和768个隐藏单元。
在这里插入图片描述
为了预测屏蔽的标记,我们将BERT返回的屏蔽的单词表示
喂给一个带有softmax激活函数的前馈神经网络。然后该网络输出词表中每个单词属于该屏蔽的单词的概率。如下图所示。
在这里插入图片描述
从上图可以看到,单词city属于屏蔽单词的概率最高。因此,我们的模型会预测屏蔽单词为city。

注意在初始的迭代中,我们的模型不会输出正确的概率,因为前馈网络和BERT编码器层的参数还没有被优化。然而,通过一系列的迭代之后,我们更新了前馈网络和BERT编码器层的参数,然后学到了优化的参数。

下一句预测

下一句预测(next sentence prediction,NSP)是另一个用于训练BERT模型的任务。NSP是二分类任务,在此任务中,我们输入两个句子两个BERT,然后BERT需要判断第二个句子是否为第一个句子的下一句。
数据集如图所示:
在这里插入图片描述
训练输入:

tokens = [[CLS], She, cooked, pasta, [SEP], It, was, delicious, [SEP]]

然后我们把这个输入标记喂给字嵌入、片段嵌入和位置嵌入层,得到输入嵌入。

接着把输入嵌入喂给BERT获得每个标记的嵌入表示。
为了进行分类,我们简单地将[CLS]标记的嵌入表示喂给一个带有softmax函数的全连接网络,该网络会返回我们输入的句子对属于isNext和notNext的概率。

因为[CLS]标记保存了所有标记的聚合表示。也就得到了整个输入的信息。所以我们可以直接拿该标记对应的嵌入表示来进行预测。如下图所示:
在这里插入图片描述

自注意力机制

BERT的核心是Transformer,而Transformer的核心是Attention,注意力机制。
在这里插入图片描述
自注意机制将每个字作为Query,加权融合所有字的语义信息,得到各字的增强语义向量

Multi-head Self-Attention(多头自注意力机制)

在这里插入图片描述
将每个字的多个增强语义向量进行线性组合,最终获得一个与原始字向量长度相等的增强语义向量。Multi-head的出现是因为不仅词具有多义性,有些句子在不同场景下所表达的意思也不一样。Multi-head Self-Attention可以看作是对文本中每个字分别增强其语义向量表示的黑盒。

Transformer

大名鼎鼎的Transformer是Multi-head Self-Attention的升级版。由于BERT没有Decoder模块,下文只涉及Transformer Encoder结构。
在这里插入图片描述
Transformer在Multi-head基础上又添加了

  • 残差连接:将multi-head模块的输入和输出直接相加。
  • 标准化:对神经网络节点做0,1标准化
  • 线性转换:再做两次线性变化,变换后的向量和原向量长度相同

BERT模型

组装好TransformerEncoder之后,将Transformer Encoder堆叠起来,就是BERT模型。
在这里插入图片描述


原文地址:https://blog.csdn.net/qq_44250808/article/details/142550194

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!