文章目录

  • 1. 概述
  • 2. 模型架构


1. 概述

  通过预训练语言表征完成NLP任务主要分为两大类:feature-base、fine-tuning。前者如ELMo,它将学习的表征作为feature提供给下面的任务,下游任务提供模型;后者如Open GPI、ULMFiT,它们在fine tune预训练中学习到参数,不需要下游提供task-specific的模型。这两类在预训练时都使用了同样的目标函数,同时也都使用了单向的语言模型。

  这些方法没有充分利用上下文信息。虽然ELMo利用了正向与反向的语言模型,但仍然是两个模型的叠加。

  Bert是fine-tuning这一类的方法。bert采用了一个新的预训练目标函数:the masked language model(MLM)随机mask掉输入中的一些tokens,并在预训练中对其进行预测,这样学习到的表征就可以融合两个方向的context。此外,bert增加了句子级别的任务:next sentence prediction。文章作者认为很多NLP任务如QA、NLI都需要对两个句子之间的关系的理解,但是语言模型并不能很好德直接理解。为理解句子关系,论文同时预训练了下一个句子预测的任务,做法为随机替换一些句子,然后利用上句进行lsNext/NotNext预测。

2. 模型架构

  Bert的常用模块包括两大类,一是BASE: L=12, H=768, A=12, Total Parameters=110M;二是LARGE: L=24, H=1024, A=16, Total Parameters=340M。

这里L是layers层数(即Transformer blocks个数),H是hidden vector size, A是self-attention的“头数”。输入方面,针对不同的任务,模型能够明确的表达一个句子,或者句子对(比如[问题,答案])。对于每一个token, 它的表征由其对应的token embedding, 段表征(segment embedding)和位置表征(position embedding)相加产生。如下图:

nlp 根据文章生成摘要 nlp篇章分析_bert

具体细节如下:

  • 论文使用了WordPiece embeddings;
  • 使用了positional embeddings, 长达512位,即句子的最大长度;
  • 每句话的第一个token总是[CLS]。对应它的最终的hidden state(即Transformer的输出)用来表征整个句子,可以用于下游的分类任务;
  • 模型能够处理句子对。为区别两个句子,用一个特殊token [SEP]隔开它们,另外针对不同的句子,把学习到的Segment embeddings 加到每个token的embedding上(如图)
  • 对于单个句子仅使用一个Segment embedding。
      为达到真正的bidirectional的LM的效果,作者提出Masked LM,但是缺点是如果常常把一些词mask起来,未来的fine tuning过程中模型有可能没见过这些词。作者在实现中随机选择了句子中15%的WordPiece tokens作为要mask的词。作者在做mask的时候,80%的时间真的用[MASK]取代被选中的词。

  很多NLP的任务比如QA和NLI都需要理解两个句子之间的关系,而语言模型并不能直接反应这种关系。为了是预训练出来的模型很好的适应这些任务,作者提出了这样的一个next sentence prediction的预训练任务。实验表明,增加这样的一个任务在针对下游的QA和NLI任务时效果非常好。

  微调过程:对于句子级的分类任务,BERT的微调方法非常直观。论文用刚才介绍过的特殊符号[CLS]来对应整个句子的表征。我们只需要把它作为输入通过一层网络,最后做softmax就可以了。