在看了好多大牛们的博客之后,关于BERT有了一个大概的理解,将一些知识点整理到这里。

BERT概述

BERT的全称是Bidirectional Encoder Representation from Transformers,利用了Transformer的Encoder部分,重点是预处理/训练pre-training,创新点是将双向 Transformer 用于语言模型

模型介绍

BERT采用了Transformer Encoder的模型来作为语言模型,Transformer模型来自于论文[4], 完全抛弃了RNN/CNN等结构,而完全采用Attention机制来进行input-output之间关系的计算,如下图中左半边部分所示,其中模型包括两个sublayer:

  1. Multi-Head Attention 来做模型对输入的Self-Attention
  2. Feed Forward 部分来对attention计算后的输入进行变换

预训练

这里为了能够有利于token-level tasks例如序列标注,同时有利于sentence-level tasks例如问答,采用了两个预训练任务,目标就是做语言模型,使用两个新的无监督预测任务对BERT进行预训练

第一种是Masked LM:
为了训练双向特征,这里采用了Masked Language Model的预训练方法,随机mask句子中的部分token,然后训练模型来预测被去掉的token。

具体操作是:
随机mask语料中15%的token,然后将masked token 位置输出的final hidden vectors送入softmax,来预测masked token。
这里如果都用标记[MASK]代替token会影响模型,所以在随机mask的时候采用以下策略:

1)80%的单词用[MASK]token来代替
my dog is hairy → my dog is [MASK]

2)10%单词用任意的词来进行代替
my dog is hairy → my dog is apple

3)10%单词不变
my dog is hairy → my dog is hairy

这样做的目的:Transformer encoder不知道它将被要求预测哪些单词或哪些单词已被随机单词替换,因此它被迫保持每个输入token的分布式上下文表示

为什么要以一定的概率保持不变呢? 如果100%的时间都用[MASK]来取代被选中的词,那么在fine-tuning的时候模型会有一些没见过的词。
那么为啥要以一定的概率使用随机词呢?这是因为Transformer要保持对每个输入token分布式的表征,否则Transformer很可能会记住这个[MASK]就是"hairy"。
至于使用随机词带来的负面影响,所有其他的token(即非"hairy"的token)共享15%*10% = 1.5%的概率,其影响是可以忽略不计的。

第二种是Next Sentence Prediction
在 BERT 的训练过程中,模型接收成对的句子作为输入,并且预测其中第二个句子是否在原始文档中也是后续句子。
在训练期间,50% 的输入对在原始文档中是前后关系,另外 50% 中是从语料库中随机组成的,并且是与第一句断开的。

Input = [CLS] the man went to [MASK] store [SEP]
             penguin [MASK] are flight ## less birds [SEP]
Label = NotNext
             he bought a gallon [MASK] milk [SEP]
Label = IsNext
Input = [CLS] the man [MASK] to the store [SEP]

训练模型,使模型具备理解长序列上下文的联系的能力

BERT的输入部分

针对不同的任务,模型能够明确的表达一个句子,或者句子对(比如[问题,答案])。如下图所示,输入包括三个embedding的求和,分别是:

  1. Token embedding 表示当前词的embedding,每个句子有个句子整体的embedding项对应给每个单词
  2. Segment Embedding 表示当前词所在句子的index embedding
  3. Position Embedding 表示当前词所在位置的index embedding,这是因为NLP中单词顺序是很重要的特征,需要在这里对位置信息进行编码
  4. bert获得embedding过程_bert获得embedding过程


  5. bert的输入部分是个线性序列,两个句子通过分隔符分割,最前面和最后增加两个标识符号。把单词对应的三个embedding叠加,就形成了Bert的输入。

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

bert获得embedding过程_语言模型_02

微调Fine-tuning

Fine-tuning方式是指在已经训练好的语言模型的基础上,加入少量的task-specific parameters, 例如对于分类问题在语言模型基础上加一层softmax网络,然后在新的语料上重新训练来进行fine-tune。