Loading...

参考链接

🔗:BERT 论文逐段精读【论文精读】

BERT: Pre-training of Deep Bidirectional Transformers for Language

题目理解:深的双向的transformer用来做预训练的针对语言理解的模型

pre-train:在一个数据集上训练好模型,但模型是用于在别的任务上,这种训练叫预训练

abtract

本文提出一种新的语言表示模型BERT,即基于transformer的双向编码器表示。与最近的语言表示模型不同(GPT), BERT旨在通过联合约束所有层的左右上下文来预训练未标记文本的深度双向表示。因此,预训练的BERT模型可以通过一个额外的输出层进行微调,以创建适用于广泛任务的最先进模型,如问答和语言推理,而无需对特定任务的架构进行实质性修改


1.Motivation

语言模型预训练已被证明可以有效的提高许多自然语言处理任务的性能。这包括句子层次的任务,例如自然语言推断与同义改写,它的目的是通过对句子进行整体分析来预测句子之间的关系。还有Token级别的任务,如命名实体识别和问答,其中需要模型在Token级别产生细粒度的输出。目前有两组种方式来应用为下游任务预训练的语言表示模型:feature-based与fine-tuning。feature-based方法,例如ELMo使用为了任务特别设计的结构,包括预先训练的表达作为附加特征。fine-tuning方法,例如Generative Pre-trained Transformer (OpenAI GPT),介绍了一种引入最小的任务特定参数,并通过简单地微调所有预先训练的参数对下游任务进行训练。这两种方法在训练前的目标函数相同,即使用单向语言模型来学习一般的语言表征。

作者认为现有的技术限制了预训练模型的能力,特别是fine-tuning方法。主要的限制是标准语言模型是单向的,这限制了在预训练期间可以使用的体系结构的选择。例如,在OpenAI GPT中,作者使用了从左到右的体系结构,其中每个token只能处理Transformer的自注意层中的前一个token。对于sentence-level的任务来说,这种限制是不好的,当将基于fine-tuning的方法应用到诸如问答之类的token-level任务时,效果不是那么好,因为在这些任务中,从左右两个方向考虑上下文信息是非常重要的。

在这篇文章中,作者通过提出BERT:Bidirectional Encoder Representations from Transformers提高了基于基于fine-tuning方法的模型表现。BERT通过使用一种“masked language model”(MLM)预训练目标来缓解前面提到的单向约束。MLM随机屏蔽输入中的一些token,其目标是仅基于上下文预测屏蔽词的原始词汇表id。与从左到右语言模型预训练不同,MLM能够考虑到融合左右上下文,这使得我们能够预训练深度双向的Transformer。


2.Method

这一节介绍BERT以及它的详细实现,框架中有两个步骤:pre-training和fine-tuning

2.1 BERT

在pre-training阶段,模型在不同的训练前任务上对未标记的数据进行训练。在fine-tuning阶段,BERT模型首先使用预训练参数进行初始化,然后所有的这些参数使用下游任务中标注好的数据进行微调。每个下游任务都有单独的微调模型,即使它们是用相同的预训练参数初始化的。图1是一个问答示例

BERT的一个显著特性是它跨不同任务的统一体系结构,预训练的体系结构和最终的下游任务体系结构之间的差异很小。


2.2 Model Architecture

BERT模型的结构是一个基于原始实现方式的多层双向Transformer编码器,在这篇工作中,作者将层(例如Transformer blocks)数标记为L,隐含层为H,self-attention heads的数量记作A。这里主要报告两种模型尺寸的结果BERTBASEBERT_{BASE}(L=12,H=768,A=12,整体参数量=110M)以及BERTLARGEBERT_{LARGE}(L=24,H=1024,A=16,整体参数量=340M)。

BERTLARGEBERT_{LARGE}是被选取来和相同模型大小的OpenAI GPT作比较用的。但是,重要的是,BERT Transformer使用双向self-attention,而GPT Transformer使用受约束的self-attention,其中每个token只能关注其左侧的上下文


2.3 Input/Output Representations

为了使BERT能够处理各种下游任务,需要使得输入表示能够在一个token sequence中明确地表示单个句子和一对句子(例如Question, Answer)。在这个工作中,一个“句子”可以是一个任意跨度的连续文本,而不是一个实际的语言句子。“序列”指的是BERT的输入token序列,它可能是一个句子或两个句子打包在一起。

作者使用含有30000个token词汇表的WordPiece embeddings。每一个序列的第一个token是一个特定的分类token([CLS])。与此标记对应的最终隐藏状态被用作分类任务的聚合序列表示(aggregate sequence representation)。句子对被打包成一个单独的序列,作者用两种方法来区分句子。第一,使用一种特定的token([SEP])来区分它们,第二,对每一个token加入一个可学习的的embedding表示它是属于句子A还是句子B。如图1所示,这里将输入embedding记作E,特定的[CLS]token的最后hidden vector记作CRHC \in R^H,第i个输入token的最终hidden vector记作TiRHT_i \in R^H

对于一个给定的token,其输入表示是通过对相应的token、segment embedding(表示这个token属于句子A还是句子B)和位置embedding进行求和来构造的,如图2所示:


2.4 Pre-training BERT

作者不使用传统的从左到右或者从右到左的语言模型而是使用两个非监督任务对BERT进行预训练。

2.4.1 Task #1: Masked LM

直观上来说深层双向模型应该比从左到右的模型或简单地拼接从左到右和从右到左的模型更强大。但是不幸的是,标准条件语言模型只能从左到右或从右到左训练,因为双向条件反射会让每个词间接地“看到自己”,这种模型可以简单地预测多层上下文中的目标词。

为了去训练一个deep bidirectional representation,作者简单地随机mask一部分输入token,然后来预测这些被mask掉的token,这里将这个过程称为“masked LM” (MLM),这与完形填空看起来比较像。通过这种方式允许我们获得一个双向的预训练模型,而缺点是在训练前和微调之间产生了不匹配,因为[mask] token在fine-tuning期间不会出现,为了缓和这一点,作者并不总是用一个实际存在的词来替换被mask的词。训练数据生成器随机选择token position中的15%来进行预测。如果第i个token被选择到,那就通过以下两种方式对其进行替换:

  • 1.有80%的几率使用[mask]token进行替换
  • 2.有10%的几率使用一个随机的token对其进行替换
  • 3.有10%的几率使用一个固定的token对其进行替换

然后利用Ti对具有交叉熵损失的原始token进行预测


2.4.2 Task #2: Next Sentence Prediction (NSP)

很多重要的下游任务例如Question Answering (QA)与Natural Language Inference (NLI)是通过理解两个句子之间的关系进行工作的,这是语言建模不能直接捕捉到的。为了能够训练一个可以理解句子之间关系的模型,作者预训练一个二值化next sentence prediction任务,该任务可以从任何单一语料库轻松生成。特别是为一个训练例子选择句子A与B的时候,有50%的概率B是跟在A后面的下一个句子(标记为IsNext),然后有50%的概率B是从语料库中随机选取的一个句子(标记为NotNext),就像图1中所示的C被用来做next sentence prediction (NSP)。尽管模型很简单,但是这种预训练模型在QA和NLI任务中的表现都很好。然而,在之前的工作中,只有sentence embeddings被转移到下游任务,而BERT将所有模型参数转移到下游任务中。


2.5 Fine-tuning BERT

Fine-tuning很简单,因为Transformer中的自注意机制允许BERT可以通过交换适当的输入和输出为许多下游任务无论是单文本还是文本对进行建模。对于涉及文本对的应用场景,一个常见的方法是应用双向交叉注意之前独立编码文本对。BERT使用self-attention机制统一了这两个步骤,BERT使用self-attention编码一个串联的文本对,其过程中就包含了2个句子之间的双向交叉注意力。

对于每一个任务,我们可以简单地将特定任务的输入与输出放到BERT中,然后对所有的参数进行微调。对于输入,微调的句子A和句子B与下面的几种比较相似:

  • 1.释义句子对
  • 2.假设条件句子对
  • 3.问答句子对
  • 4.文本分类或序列标注中的text-∅对

对于输出端,token表征喂给一个针对token级别的任务的输出层,序列标注和问答是类似的,[CLS]表征喂给一个分类器输出层,比如情感分析。

微调的代价要比预训练小的多。论文中的很多结果都从一个完全相同的预训练模型开始,在TPU上只要花费1小时的时间就可以复现,GPU上也只要几个小时。