NLP谷歌BERT模型深度解析《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》

目录

1. 背景

2. 什么是 Bert ?

3. 论文内容《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》:

3.1 第一个步骤——任务1: Masked LM

3.2 第二个步骤——任务2:下一句预测

4. BERT模型对NLP的影响

5. 其他模型

5.1 ELMo

5.2 ULMFiT

5.3  GPT

5.4  BERT

参考文献


  BERT 项目地址:

  https://github.com/google-research/bert#fine-tuning-with-bert

  BERT 项目论文:

  https://arxiv.org/abs/1810.04805

1. 背景

        早在2015年的时候,微软研究院的何凯明和他的同事们发表了残差网络的论文,第一次通过残差的方式将卷积神经网络推进到了100层以上,并在图像识别的任务上刷新了当时的最高纪录。自那以后起,随着网络不断地加深,效果也在不断提升。然而大量的数据训练出来的大型网络虽然效果更好,但随着网络的加深以及数据集的不断扩大,完全重新训练一个模型所需要的成本也在不断地增加。

        因此在计算机视觉处理中,人们越来越多地采用预训练好的大型网络来提取特征,然后再进行后续任务。目前这种处理方式已经是图像处理中很常见的做法了。

       相比之下,自然语言处理目前通常会使用预训练的词向量来进行后续任务。但词向量是通过浅层网络进行无监督训练,虽然在词的级别上有着不错的特性,但却缺少对连续文本的内在联系和语言结构的表达能力。因此大家也希望能像图像领域那样,通过大量数据来预训练一个大型的神经网络,然后用它来对文本提取特征去做后续的任务,以期望能得到更好的效果。这一方向的研究一直在持续,直到AllenAI提出的ELMo,由于其在后续任务上的优异表现获得了不小的关注。

2. 什么是 Bert 及原理?

  BERT 是一种对语言表征进行预训练的方法,换句话说,是经过大型文本语料库(如维基百科)训练后获得的通用「语言理解」模型,该模型可用于我们最在乎的 NLP 下游任务(如问答)。BERT 之所以表现得比过往的方法要好,是因为它是首个用于进行 NLP 预训练的无监督、深度双向系统。

BERT:一个语言表征模型,利用transformer的encoder来进行预训练。BERT模型的全称是Bidirectional Encoder Representations from Transformers,它是一种新型的语言模型。之所以说是一种新型的语言模型,是因为它通过联合调节所有层中的双向Transformer来训练预训练深度双向表示。作者通过在33亿文本的语料上训练语言模型,再分别在不同的下游任务上微调,这样的模型在不同的任务均得到了目前为止最好的结果,并且有一些结果相比此前的最佳成绩得到了幅度不小的提升。

         预训练表征可能无上下文语境,也可能有上下文语境,有上下文语境的系统可以进一步划分成单向的或者双向的。以 word2vec ( https://www.tensorflow.org/tutorials/representation/word2vec  ) 和 GloVe ( https://nlp.stanford.edu/projects/glove/  )为例,无上下文语境的模型为词汇表中的每个单词生成单个「词嵌入」表征,因此「 bank 」在「 bank deposit 」和「 river bank 」中可能存在同样的表征。反之,有上下文语境的模型会根据整句话生成词的表征。

   BERT 建立在近期一些上下文预训练语境表征工作的基础上,包括半监督序列学习( https://arxiv.org/abs/1511.01432  )、预训练生成模型( https://blog.openai.com/language-unsupervised/  )、ELMo ( https://allennlp.org/elmo  )以及 ULMFit ( http://nlp.fast.ai/classification/2018/05/15/introducting-ulmfit.html  ),但以上模型要么是单向的,要么是浅层双向的,这意味着每个单词只能与其左边(或右边)的单词进行语境化结合。以「  I made a bank deposit 」为例,由于是单向表示,「 bank 」只能基于左边「  I made a 」而不是与关联性更强的「 deposit 」生成语境。过去有一些工作试图打造出一个能够结合上下文语境的生成模型,然而这些工作目前看来都较「 浅层  」。BERT 真正做到了结合上下文语境来生成「  bank 」,兼顾到「  I made a 」和「  deposit 」,从深度神经网络的最底层开始,拥有深度双向属性。

        想深入了解BERT模型,首先应该理解语言模型。预训练的语言模型对于众多自然语言处理问题起到了重要作用,比如SQuAD问答任务、命名实体识别以及情感识别。目前将预训练的语言模型应用到NLP任务主要有两种策略,一种是基于特征的语言模型,如ELMo模型;另一种是基于微调的语言模型,如OpenAI GPT这两类语言模型各有其优缺点而BERT的出现,似乎融合了它们所有的优点,因此才可以在诸多后续特定任务上取得最优的效果。

3. 论文内容《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》

         这个题目有五个关键词,分别是 Pre-training、Deep、Bidirectional、Transformers、和 Language Understanding。其中 pre-training 的意思是,作者认为,确实存在通用的语言模型,先用文章预训练通用模型,然后再根据具体应用,用 supervised 训练数据,精加工(fine tuning)模型,使之适用于具体应用。为了区别于针对语言生成的 Language Model,作者给通用的语言模型,取了一个名字,叫语言表征模型 Language Representation Model。
          语言表征模型 Language Representation Model:能实现语言表征目标的模型,作者提议,用 Deep Bidirectional Transformers 模型。

3.1 BERT模型输入

        输入表示可以在一个词序列中表示单个文本句或一对文本(例如,[问题,答案])。对于给定的词,其输入表示是可以通过三部分Embedding求和组成。Embedding的可视化表示如下图所示:

NLP谷歌BERT模型深度解析《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》_第1张图片

  • token Embeddings表示的是词向量,第一个单词是CLS标志,可以用于之后的分类任务,对于非分类任务,可以忽略词向量;
  • Segment Embeddings用来区别两种句子,因为预训练不只做语言模型还要做以两个句子为输入的分类任务;
  • Position Embeddings是通过模型学习得到的。

3.2 BERT模型预训练任务

        预训练 pre-training,训练结束后的 Transformer 模型,包括它的参数,是作者期待的通用的语言表征模型。BERT模型使用两个新的无监督预测任务对BERT进行预训练,分别是Masked LM和Next Sentence Prediction

3.2.1 Masked LM

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

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

         把一篇文章中,15% 的词汇遮盖,让模型根据上下文全向地预测被遮盖的词。假如有 1 万篇文章,每篇文章平均有 100 个词汇,随机遮盖 15% 的词汇,模型的任务是正确地预测这 15 万个被遮盖的词汇。通过全向预测被遮盖住的词汇,来初步训练 Transformer 模型的参数。

BERT有哪些“反直觉”的设置?

        (1) 用比语言模型更简单的任务来做预训练。直觉上,要做更深的模型,需要设置一个比语言模型更难的任务,而BERT则选择了两个看起来更简单的任务:完形填空和句对预测。

        (2) 完形填空任务在直观上很难作为其它任务的预训练任务。在完形填空任务中,需要mask掉一些词,这样预训练出来的模型是有缺陷的,因为在其它任务中不能mask掉这些词。而BERT通过随机的方式来解决了这个缺陷:80%加Mask,10%用其它词随机替换,10%保留原词。这样模型就具备了迁移能力。

        数据生成器将执行以下操作,而不是始终用[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. 这样做的目的是将表示偏向于实际观察到的单词。

3.2.2 Next Sentence Prediction

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

        然后,用第二个步骤继续训练模型的参数。譬如从上述 1 万篇文章中,挑选 20 万对语句,总共 40 万条语句。挑选语句对的时候,其中 2*10 万对语句,是连续的两条上下文语句,另外 2*10 万对语句,不是连续的语句。然后让 Transformer 模型来识别这 20 万对语句,哪些是连续的,哪些不连续。

BERT 的方法很简单:一开始先屏蔽掉输入词汇的 15%,然后通过深度双向的 Transformer 编码器运行整个序列,最后预测屏蔽的单词。举个例子:

Input: the man went to the [MASK1] . he bought a [MASK2] of milk.

Labels: [MASK1] = store; [MASK2] = gallon

为了让模型学习到句子之间的关系,我们特意将模型放在可以从任意单语语料库里生成的简单任务中进行训练:给出两个句子 A 和 B,句子 B 究竟是句子 A 的下一个衔接句,亦或者只是语料库中随机生成的句子?

Sentence A: the man went to the store .

Sentence B: he bought a gallon of milk .

Label: IsNextSentence

Sentence A: the man went to the store .

Sentence B: penguins are flightless .

Label: NotNextSentence

除了模型结构,模型大小和数据量也很重要

        以上的描述涵盖了BERT在模型结构和训练目标上的主要创新点,而BERT的成功还有一个很大的原因来自于模型的体量以及训练的数据量

         BERT训练数据采用了英文的开源语料BooksCropus 以及英文维基百科数据,一共有33亿个词。同时BERT模型的标准版本有1亿的参数量,与GPT持平,而BERT的大号版本有3亿多参数量,这应该是目前自然语言处理中最大的预训练模型了。

        当然,这么大的模型和这么多的数据,训练的代价也是不菲的。谷歌用了16个自己的TPU集群(一共64块TPU)来训练大号版本的BERT,一共花了4天的时间。对于是否可以复现预训练,作者在Reddit上有一个大致的回复,指出OpenAI当时训练GPT用了将近1个月的时间,而如果用同等的硬件条件来训练BERT估计需要1年的时间。不过他们会将已经训练好的模型和代码开源,方便大家训练好的模型上进行后续任务。

3.3 模型比较

        ELMo、GPT、BERT都是近几年提出的模型,在各自提出的时候都取得了不错的成绩。并且相互之间也是相辅相成的关系。

3个模型比较如下:

NLP谷歌BERT模型深度解析《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》_第2张图片

再往前看,在NLP中有着举足轻重地位的模型和思想还有Word2vec、LSTM等。

        Word2vec作为里程碑式的进步,对NLP的发展产生了巨大的影响,但Word2vec本身是一种浅层结构,而且其训练的词向量所“学习”到的语义信息受制于窗口大小,因此后续有学者提出利用可以获取长距离依赖的LSTM语言模型预训练词向量,而此种语言模型也有自身的缺陷,因为此种模型是根据句子的上文信息来预测下文的,或者根据下文来预测上文,直观上来说,我们理解语言都要考虑到左右两侧的上下文信息,但传统的LSTM模型只学习到了单向的信息。

NLP谷歌BERT模型深度解析《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》_第3张图片

4. BERT模型对NLP的影响

        BERT,再次验证了预训练在NLP当中是很有用的,其次继续验证了Transformer的拟合能力真的很强

        总体上,BERT模型的成功还在于是一种表示学习,即通过一个深层模型来学习到一个更好的文本特征。这种非RNN式的模型是非图灵完备的,无法单独完成NLP中推理、决策等计算问题。当然,一个好的表示会使得后续的任务更简单。

        BERT能否像ResNet那样流行还取决于其使用的便利性,包括模型实现、训练、可迁移性等,可能有好的模型出现,但类似的预训练模型会成为NLP任务的标配,就像Word2vec,Glove那样。

        最后,BERT也打开了一个思路:可以继续在无标注数据上挖潜,而不仅仅限于语言模型。

5. 其他模型

5.1 ELMo

      ELMo中是通过双向的两层RNN结构对两个方向进行建模,但两个方向的loss计算相互独立

5.2 ULMFiT

        在ELMo获得成功以后不久FastAI就推出了ULMFiT,其大体思路是在微调时对每一层设置不同的学习率。此后OpenAI又提出了GPT。追一科技在文本蕴含、观点型阅读理解等任务中,就采用了GPT模型作为预训练方案。预训练的语言模型是在百度15亿词文本的语料上进行的,模型参数选择了12层,12head的Transformer结构。然后采用此模型直接在子任务上微调来进行后续任务。

5.3  GPT

       GPT利用Transformer的结构来进行单向语言模型的训练。所谓的语言模型其实是自然语言处理中的一种基础任务,其目标是给定一个序列文本,预测下一个位置上会出现的词。

        从上面提及的这些论文的结果以及学界和工业界的反馈来看,这种使用大量的语料进行预训练,然后再在预训练好的模型上进行后续任务训练,虽然训练方式各有不同,但在后续任务都有不同程度的提高。

5.4  BERT

        BERT就是在OpenAI的GPT的基础上对预训练的目标进行了修改,并用更大的模型以及更多的数据去进行预训练,从而得到了目前为止最好的效果。

BERT对GPT的第一个改进就是引入了双向的语言模型任务:

         此前其实也有一些研究在语言模型这个任务上使用了双向的方法,例如在ELMo中是通过双向的两层RNN结构对两个方向进行建模,但两个方向的loss计算相互独立。

         BERT的作者指出这种两个方向相互独立或只有单层的双向编码可能没有发挥最好的效果,我们可能不仅需要双向编码,还应该要加深网络的层数。

        BERT的作者提出了采用MaskLM的方式来训练语言模型:通俗地说就是在输入一句话的时候,随机地选一些要预测的词,然后用一个特殊的符号来代替它们。尽管模型最终还是会看到所有位置上的输入信息,但由于需要预测的词已经被特殊符号代替,所以模型无法事先知道这些位置上是什么词,这样就可以让模型根据所给的标签去学习这些地方该填的词了。

        然而这里还有一个问题,就是我们在预训练过程中所使用的这个特殊符号,在后续的任务中是不会出现的。因此,为了和后续任务保持一致,作者按一定的比例在需要预测的词位置上输入原词或者输入某个随机的词。当然,由于一次输入的文本序列中只有部分的词被用来进行训练,因此BERT在效率上会低于普通的语言模型,作者也指出BERT的收敛需要更多的训练步数。

BERT另外一个创新

        是在双向语言模型的基础上额外增加了一个句子级别的连续性预测任务。这个任务的目标也很简单,就是预测输入BERT的两段文本是否为连续的文本,作者指出引入这个任务可以更好地让模型学到连续的文本片段之间的关系。在训练的时候,输入模型的第二个片段会以50%的概率从全部文本中随机选取,剩下50%的概率选取第一个片段的后续的文本。

6. 总结

         语言模型的每一次进步都推动着NLP的发展,从Word2vec到ELMo,从OpenAI GPT到BERT。通过这些发展我们也可以洞悉到,未来表征学习(Deep learning is representation learning)将会越来越多的应用到NLP相关任务中,它们可以充分的利用目前海量的数据,然后结合各种任务场景,去训练出更为先进的模型,从而促进AI项目的落地。

参考文献

1. [NLP自然语言处理]谷歌BERT模型深度解析 https://blog.csdn.net/qq_39521554/article/details/83062188

2. 华尔街见闻:NLP历史突破 https://wallstreetcn.com/articles/3419427

3. OPENAI-Improving Language Understanding with Unsupervised Learning:https://blog.openai.com/language-unsupervised/

4. https://gluebenchmark.com/leaderboard:https://gluebenchmark.com/leaderboard

5. 知乎讨论:如何评价 BERT 模型?https://www.zhihu.com/question/298203515

6.  ELMo算法原理解析:https://www.cnblogs.com/huangyc/p/9860430.html

7. OpenAI GPT算法原理解析:https://www.cnblogs.com/huangyc/p/9860181.html

你可能感兴趣的:(自然语言处理,深度学习)