BERT语言模型

1 Transformer原理

文章:《Attention Is All You Need》

模型架构图如下:

transformer的结构由encoder编码和decoder解码组成。

1.1 Encoder

Encoder组件部分由一堆Layer(可以理解为编码器)构成(论文中是将6个Layer叠在一起)。Decoder解码组件部分也是由相同数量(与编码器对应)的解码器(decoder)组成的。每个Layer由两个sub-layer组成,分别是multi-head self-attention mechanism和fully connected feed-forward network,sub-layer的结构相同,但是没有共享参数。

使用self-attrntion,考虑到以下三个需求:

  • the total computational complexity per layer 每层计算复杂度
  • the amount of computation that can be parallelized, as measured by the minimum number of sequential operations required.
  • the path length between long-range dependencies in the network

1.2 Decoder

Decoder组件部分与Encoder很想,但是它多了一个attention的sub-layer(解码注意力层),用来关注输入句子的相关部分(和seq2seq模型的注意力作用相似)。

Transformer的一个核心特性,在这里输入序列中每个位置的单词都有自己独特的路径流入编码器。在自注意力层中,这些路径之间存在依赖关系。而前馈(feed-forward)层没有这些依赖关系。因此在前馈(feed-forward)层时可以并行执行各种路径。如下图所示:

输入句子: The animal didn't cross the street because it was too tired

随着模型处理输入序列的每个单词,自注意力会关注整个输入序列的所有单词,帮助模型对本单词更好地进行编码。

如果你熟悉RNN(循环神经网络),回忆一下它是如何维持隐藏层的。RNN会将它已经处理过的前面的所有单词/向量的表示与它正在处理的当前单词/向量结合起来。而自注意力机制会将所有相关单词的理解融入到我们正在处理的单词中。

当我们在编码器#5(栈中最上层编码器)中编码“it”这个单词的时,注意力机制的部分会去关注“The Animal”,将它的表示的一部分编入“it”的编码中。

1.3 Positional Encoding

除了主要的Encoder和Decoder,还有数据预处理的部分。Transformer抛弃了RNN,而RNN最大的优点就是在时间序列上对数据的抽象,所以文章中作者提出两种Positional Encoding的方法,将encoding后的数据与embedding数据求和,加入了相对位置信息。计算方法:

  • 用不同频率的sine和cosine函数直接计算
  • 学习出一份positional embedding

作者试验了上面两种方法,两者的结果很相近,最后选了第一种方法,是因为它可以允许模型外推到比训练期间遇到的序列长度更长的序列长度(We chose the sinusoidal version because it may allow the model to extrapolate to sequence lengths longer than the ones encountered during training)。

推荐文章:

Attention Is All You Need

【NLP】Transformer详解

BERT大火却不懂Transformer?读这一篇就够了

2 BERT 原理

文章《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

BERT是一种基于微调的多层双向Transformer编码器,其中的Transformer与原始的Transformer是相同的。

BERT 利用了 Transformer 的 encoder 部分。
Transformer 是一种注意力机制,可以学习文本中单词(或子单词)之间的上下文关系。
Transformer 的原型包括两个独立的机制,一个 encoder 负责接收文本作为输入,一个 decoder 负责预测任务的结果。
BERT 的目标是生成语言模型,所以只需要 encoder 机制。

Transformer 的 encoder 是一次性读取整个文本序列,而不是从左到右或从右到左地按顺序读取,因此它被认为是双向的,尽管说它是非定向的更准确。。

下图是 Transformer 的 encoder 部分,输入是一个 token 序列,先对其进行 embedding 称为向量,然后输入给神经网络,输出是大小为 H 的向量序列,每个向量对应着具有相同索引的 token。

在训练语言模型时,存在定义预测目标的挑战。 许多模型预测序列中的下一个单词(例如“The child came home from ___”),这是一种固有地限制语境学习的方向性方法。 为了克服这一挑战,BERT模型使用两个新的无监督预测任务对BERT进行预训练,分别是Masked LM和Next Sentence Prediction。

2.1 Masked LM

为了训练深度双向Transformer表示,采用了一种简单的方法:随机掩盖部分输入词,然后对那些被掩盖的词进行预测,此方法被称为“Masked LM”(MLM)。预训练的目标是构建语言模型,BERT模型采用的是bidirectional Transformer。那么为什么采用“bidirectional”的方式呢?因为在预训练语言模型来处理下游任务时,我们需要的不仅仅是某个词左侧的语言信息,还需要右侧的语言信息。

在训练的过程中,随机地掩盖每个序列中15%的token,并不是像word2vec中的cbow那样去对每一个词都进行预测。MLM从输入中随机地掩盖一些词,其目标是基于其上下文来预测被掩盖单词的原始词汇。与从左到右的语言模型预训练不同,MLM目标允许表示融合左右两侧的上下文,这使得可以预训练深度双向Transformer。Transformer编码器不知道它将被要求预测哪些单词,或者哪些已经被随机单词替换,因此它必须对每个输入词保持分布式的上下文表示。此外,由于随机替换在所有词中只发生1.5%,所以并不会影响模型对于语言的理解。这样在预测输出词需要以下三步计算:

  • 在编码器输出之上添加分类层。
  • 将输出向量乘以嵌入矩阵,将它们转换为词汇维度。
  • 用softmax计算词汇表中每个单词的概率。

2.2 Next Sentence Prediction

很多句子级别的任务如自动问答(QA)和自然语言推理(NLI)都需要理解两个句子之间的关系,譬如上述Masked LM任务中,经过第一步的处理,15%的词汇被遮盖。那么在这一任务中我们需要随机将数据划分为等大小的两部分,一部分数据中的两个语句对是上下文连续的,另一部分数据中的两个语句对是上下文不连续的。然后让Transformer模型来识别这些语句对中,哪些语句对是连续的,哪些语句是不连续。

注意:作者特意说了语料的选取很关键,要选用document-level的而不是sentence-level的,这样可以具备抽象连续长序列特征的能力。

为了帮助模型区分开训练中的两个句子,输入在进入模型之前要按以下方式进行处理:

  1. 在第一个句子的开头插入 [CLS] 标记,在每个句子的末尾插入 [SEP] 标记。
  2. 将表示句子 A 或句子 B 的一个句子 embedding 添加到每个 token 上。
  3. 给每个 token 添加一个位置 embedding,来表示它在序列中的位置。

  • token Embeddings表示词向量,第一个单词是CLS标志,可以用于之后的分类任务,对于非分类任务,可以忽略词向量;

  • Segment Embeddings用来区别两种句子,因为预训练不只做语言模型还要做以两个句子为输入的分类任务;

  • Position Embeddings是通过模型学习得到的

为了预测第二个句子是否是第一个句子的后续句子,用下面几个步骤来预测:

  1. 整个输入序列输入给 Transformer 模型
  2. 用一个简单的分类层将 [CLS] 标记的输出变换为 2×1 形状的向量
  3. 用 softmax 计算 IsNextSequence 的概率

在训练 BERT 模型时,Masked LM 和 Next Sentence Prediction 是一起训练的,目标就是要最小化两种策略的组合损失函数。

2.3 Fine-tuning (How to use BERT)

BERT可用于各种语言任务,而只需在核心模型中添加一个层:

  • Classification tasks such as sentiment analysis are done similarly to Next Sentence classification, by adding a classification layer on top of the Transformer output for the [CLS] token.(在分类任务中,例如情感分析等,只需要在 Transformer 的输出之上加一个分类层)
  • In Question Answering tasks (e.g. SQuAD v1.1), the software receives a question regarding a text sequence and is required to mark the answer in the sequence. Using BERT, a Q&A model can be trained by learning two extra vectors that mark the beginning and the end of the answer.(在问答任务(例如SQUAD v1.1)中,问答系统需要接收有关文本序列的 question,并且需要在序列中标记 answer。 可以使用 BERT 学习两个标记 answer 开始和结尾的向量来训练Q&A模型)
  • In Named Entity Recognition (NER), the software receives a text sequence and is required to mark the various types of entities (Person, Organization, Date, etc) that appear in the text. Using BERT, a NER model can be trained by feeding the output vector of each token into a classification layer that predicts the NER label.(在命名实体识别(NER)中,系统需要接收文本序列,标记文本中的各种类型的实体(人员,组织,日期等)。 可以用 BERT 将每个 token 的输出向量送到预测 NER 标签的分类层)

在 fine-tuning 中,大多数超参数可以保持与 BERT 相同,在论文中还给出了需要调整的超参数的具体指导

推荐文章:

《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》

BERT算法原理解析

BERT – State of the Art Language Model for NLP             5 分钟入门 Google 最强NLP模型:BERT

3 利用预训练的BERT模型将句子转换为句向量,进行文本分类

code 尚未学习

发布了41 篇原创文章 · 获赞 14 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/fan3652/article/details/96432336