【简单理解】BERT

【简单理解】BERT

原文链接:BERT: Pre-training of Deep Bidirectional Transformers forLanguage Understanding

1.简单介绍BERT

一个训练好的【双向Transformer编码器栈】。可以训练出具有上下文关系的【语境化词向量】,是一个【句子级的语言模型】

作为一种pre-train方法,可以直接获得一整个句子的唯一向量表示,方便了下游具体NLP任务的调用     (不用像ELMo模型在与下游具体NLP任务拼接时需要每层加上权重做全局池化)。

2.BERT亮点

总结概括BERT总共有三个创新点:

mask language model

1)通过mask输入序列考虑到了【双向的上下文信息】,并实现了真正的双向   

2)解决【自己看到自己】,达成双向语言模型训练

Next Sentence Prediction(句子级负采样):

  • 功能:预测输入BERT的【两段文本】AB是否【连续】。
  • 方式:通过【句子级负采样】捕捉句子级别的representation
    • 输入模型文本B,50%从全部文本中随机选取,50%选取第一个片段的后续的文本。 
    • 首先给定的一个句子(相当于word2vec中给定context),它下一个句子即为正例(相当于word2vec中的正确词),随机采样一个句子作为负例(相当于word2vec中随机采样的词)
    • 然后在该sentence-level上来做二分类(即判断句子是当前句子的下一句还是噪声)。

transformer:

Transformer架构将句子中每个词和所有其他词之间的关系建模,以生成注意力分数。

这些注意力分数随后被用作所有词表示的加权平均值的权重,它们被输入到完全连接的网络中以生成新的表示。

3.具体介绍

BERT 的特征抽取结构为双向的 Transformer,简单来说,就直接套用了 Attention is all you need 中的 Transformer Encoder Block 结构,虽然相比于GPT,仅仅是从单向的变为双向的,但这也意味着 BERT 无法适用于自回归语言模型的预训练方式,因此,BERT提出了两种预训练任务来对其模型进行预训练。
 

BERT的预训练

Task 1: MLM

由于BERT需要通过上下文信息,来预测中心词的信息,同时又不希望模型提前看见中心词的信息,因此提出了一种 Masked Language Model 的预训练方式,即随机从输入预料上 mask 掉一些单词,然后通过的上下文预测该单词,类似于一个完形填空任务。

为了训练深度双向表示,采用了一种随机遮蔽一定比例的输入标记,然后仅预测那些被遮蔽的标记。将这个过程称为“遮蔽语言模型”(MLM),通常被称为完形填词任务。在这种情况下,就像在标准语言模型中一样,与遮蔽标记相对应的最终隐藏向量被输入到与词汇表对应的输出 softmax 中(也就是要把被遮蔽的标记对应为词汇表中的一个词语)。

这种方法确实可以获得一个双向预训练模型,但这种方法有两个缺点。第一个缺点是,在预训练和微调之间造成了不匹配,因为 [MASK] 标记在微调期间从未出现过。为了缓和这种情况,并不总是用真的用 [MASK] 标记替换被选择的单词。而是,训练数据生成器随机选择 15% 的标记,例如,在my dog is hairy 这句话中,它选择 hairy。然后数据生成不会总是用 [MASK] 替换被选择的单词,而是执行以下操作:

  • 80% 的情况下:用 [MASK] 替换被选择的单词,例如,my dog is hairy → my dog is [MASK]
  • 10% 的情况下:用一个随机单词替换被选择的单词,例如,my dog is hairy → my dog is apple
  • 10% 的情况下:保持被选择的单词不变,例如,my dog is hairy → my dog is hairy。这样做的目的是使表示偏向于实际观察到的词

Task 2: NSP Next Sentence Prediction(句子级负采样)

仅仅一个MLM任务是不足以让 BERT 解决阅读理解等句子关系判断任务的,因此添加了额外的一个预训练任务,即 Next Sequence Prediction。

具体任务即为一个句子关系判断任务,即判断句子B是否是句子A的下文,如果是的话输出’IsNext‘,否则输出’NotNext‘。

训练数据的生成方式是从平行语料中随机抽取的连续两句话,其中50%保留抽取的两句话,它们符合IsNext关系,另外50%的第二句话是随机从预料中提取的,它们的关系是NotNext的。这个关系保存在图4中的[CLS]符号中。

许多重要的下游任务,如问题回答(QA)和自然语言推理(NLI),都是建立在理解两个文本句子之间的关系的基础上的,而并不是语言建模直接捕捉到的。为了训练一个理解句子关系的模型,预训练了一个下一句预测的二元分类任务,这个任务可以从任何单语语料库中简单地归纳出来。具体来说,在为每个训练前的例子选择句子 A 和 B 时,50% 的情况下 B 是真的在 A 后面的下一个句子,50% 的情况下是来自语料库的随机句子。语料的选取很关键,要选用document-level的而不是sentence-level的,这样可以具备抽象连续长序列特征的能力。

 

输入表征

BERT的输入表征由三种Embedding求和而成:

  • Token Embeddings:即传统的词向量层,每个输入样本的首字符需要设置为[CLS],可以用于之后的分类任务,若有两个不同的句子,需要用[SEP]分隔,且最后一个字符需要用[SEP]表示终止
  • Segment Embeddings:为[0,1][0,1]序列,用来在NSP任务中区别两个句子,便于做句子关系判断任务
  • Position Embeddings:与Transformer中的位置向量不同,BERT中的位置向量是直接训练出来的

具体如下:

  • 使用WordPiece嵌入(Wu et al., 2016)和30,000个token的词汇表。用##表示分词。
  • 使用学习的positional embeddings,支持的序列长度最多为512个token。
  • 每个序列的第一个token始终是特殊分类嵌入([CLS])。对应于该token的最终隐藏状态(即,Transformer的输出)被用作分类任务的聚合序列表示。对于非分类任务,将忽略此向量。
  • 句子对被打包成一个序列。以两种方式区分句子。首先,用特殊标记([SEP])将它们分开。其次,添加一个learned sentence A嵌入到第一个句子的每个token中,一个sentence B嵌入到第二个句子的每个token中。
  • 对于单个句子输入,只使用 sentence A嵌入。

Fine-tunninng

对于不同的下游任务,我们仅需要对BERT不同位置的输出进行处理即可,或者直接将BERT不同位置的输出直接输入到下游模型当中。具体的如下所示:

  • 对于情感分析等单句分类任务,可以直接输入单个句子(不需要[SEP]分隔双句),将[CLS]的输出直接输入到分类器进行分类
  • 对于句子对任务(句子关系判断任务),需要用[SEP]分隔两个句子输入到模型中,然后同样仅须将[CLS]的输出送到分类器进行分类
  • 对于问答任务,将问题与答案拼接输入到BERT模型中,然后将答案位置的输出向量进行二分类并在句子方向上进行softmax(只需预测开始和结束位置即可)
  • 对于命名实体识别任务,对每个位置的输出进行分类即可,如果将每个位置的输出作为特征输入到CRF将取得更好的效果。

特定任务的BERT

  • 单句子分类:CLS+句子。利用CLS进行分类
  • 多句子分类:CLS+句子A+SEP+句子B。利用CLS分类
  • SQuAD:CLS+问题+SEP+文章。利用所有文章单词的输出做计算start和end
  • NER:CLS+句子。利用句子单词做标记

缺点

  • BERT的预训练任务MLM使得能够借助上下文对序列进行编码,但同时也使得其预训练过程与中的数据与微调的数据不匹配,难以适应生成式任务
  • 另外,BERT没有考虑预测[MASK]之间的相关性,是对语言模型联合概率的有偏估计
  • 由于最大输入长度的限制,适合句子和段落级别的任务,不适用于文档级别的任务(如长文本分类);
  • 适合处理自然语义理解类任务(NLU),而不适合自然语言生成类任务(NLG)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值