介绍了一种新的语言表示模型BERT,它代表Transformers的双向编码器表示。与最近的语言表达模型不同,BERT是预先训练深层双向表示,通过联合调节所有层中左右的上下文。因此,可以通过一个额外的输出层对预训练的BERT表示进行微调,以创建适用于各种任务的最新模型,如回答问题和语言推理,而无需对特定于任务的体系结构进行实质性修改。
BERT概念简单,经验丰富。它在11项自然语言处理任务上获得了最新的最新成果,包括将GLUE基准推到80.4%(绝对改善7.6%),MultiNLI准确度推到86.7%(绝对改善5.6%),以及SQuAD v1.1问题回答测试F1为93.2(绝对改善1.5),比专家表现出色2.0。
语言模型预训练对许多自然语言处理任务的改进具有一定的作用。这些任务包括句子级的任务,如自然语言推理,旨在通过整体分析来预测句子之间的关系,以及标记级的任务,如命名实体识别和SQuAD问答,需要模型在标记级生成细粒度的输出。
现有两种将预先训练的语言表示应用于下游任务的策略:基于特征的和微调。基于特征的方法,如ELMo,使用特定于任务的架构,其中包括预先训练的表示作为附加功能。微调方法,例如生成式预训练Transformer (OpenAI GPT),引入了最小的任务特定参数,并通过简单微调预训练参数对下游任务进行了培训。在之前的工作中,这两种方法在培训前都具有相同的目标功能,它们使用单向语言模型来学习通用语言表示。
我们认为,当前的技术严重限制了预先训练的表示的能力,特别是对于微调方法。主要的限制是标准语言模型是单向的,这限制了可以在预训练期间使用的体系结构的选择。例如,在OpenAI GPT中,作者使用了从左到右的体系结构,在该体系结构中,每个token只能关注Transformer的自我关注层中以前的tokens。这种限制对于句子级任务来说是次优的,当对tokens级任务,如SQuAD问答应用基于微调的方法时,这种限制可能是毁灭性的,在这种情况下,从两个方向结合上下文至关重要。
本文通过提出基于Transformers的双向编码器表示BERT,改进了基于微调的方法。BERT通过提出一个新的预先训练目标来解决前面提到的单向约束:受完形填空Cloze任务启发的“遮蔽语言模型”(MLM)。遮蔽语言模型随机遮蔽输入中的一些标记,目的是仅考虑其上下文预测遮蔽词的原始词汇ID。与从左到右的语言模型预培训不同,MLM目标允许表示融合左右的上下文,这允许我们预训练一个深层双向Transformer。除了遮蔽语言模型之外,我们还引入了一个“下一句预测”任务,该任务联合预训练文本对表示。
本文的贡献如下:
有很长的预先训练通用语言表示的历史,在本节我们简要回顾最流行的方法。
几十年来,学习广泛适用的词汇表征一直是一个活跃的研究领域,包括非神经网络方法和神经网络方法。预先训练的单词嵌入被认为是现代NLP系统的一个组成部分,与从头学习的嵌入相比,它提供了显著的改进。
这些方法已被概括为更粗的粒度,例如句子嵌入或段落嵌入。与传统的单词嵌入一样,这些学习的表示法也通常用作下游模型中的特征。
ELMo(Peters et al,2017)将传统的嵌入研究概括为不同的维度。他们建议从语言模型中提取上下文相关的特性。在将上下文单词嵌入与现有特定任务架构相结合时,ELMo推进了几个主要NLP基准(Peters et al,2018)的最新水平,包括SQuAD问答、情绪分析和命名实体识别。
从语言模型(LMs)中迁移学习的一个最新趋势是,在为受监督的下游任务微调相同的模型之前,在LM目标上预先培训一些模型架构。这些方法的优点是几乎不需要从零开始学习参数。至少在一定程度上,由于这一优势,OpenAI GPT在GLUE基准测试的许多句子级任务上取得了最先进的结果。
无监督预培训的优点是几乎可以获得无限量的数据,但也有一些工作表明,从具有大型数据集的有监督任务(如自然语言推理和机器翻译)中可以有效地传输数据。除了NLP之外,计算机视觉研究还证明了从大型预培训模型转移学习的重要性,其中一个有效的方法是对在ImageNet上预培训的模型进行微调。
我们将在本节中介绍BERT及其详细实现。我们首先介绍了BERT的模型体系结构和输入表示。然后,我们将在第3.3节中介绍预训练任务,即本文的核心创新。预训练过程和微调过程分别在第3.4节和第3.5节中详细说明。最后,在第3.6节中讨论了BERT和OpenAI GPT之间的区别。
BERT的模型体系结构是基于Vaswani et al 所描述的多层双向Transformer编码器的原始实现,并在 tensor2tensor library 发布。由于Transformer的使用最近变得普遍,而且我们的实现实际上与原来的完全相同,因此我们将省略对模型体系结构的详尽背景描述,并将读者引向Vaswani et al 作为优秀的指南,如“The Annotated Transformer”。
在这项工作中,我们将层数(即Transformer blocks)表示为 L L L,隐藏大小表示为 H H H,而self-attention heads的数量表示为 A A A。在所有情况下,我们将前馈/滤波器的大小设置为 4 H 4H 4H,即H=768时为3072,H=1024时为4096。我们主要报告两种模型大小的结果:
为了对比,选择 B E R T B A S E BERT_{BASE} BERTBASE具有与OpenAI GPT相同的模型大小。然而,至关重要的是,BERT Transformer使用双向的self-attention,而GPT Transformer使用受限的自我关注,其中每个token只能关注其左侧的上下文。我们注意到,在文献中,双向Transformer通常被称为“Transformer encoder”,而left-context-only版本则被称为“Transformer decoder”,因为它可以用于文本生成。BERT、OpenAIGPT和ELMo之间的比较如图1所示。
图1:预训练模型体系结构的差异。BERT使用双向Transformer。OpenAI GPT使用从左到右的Transformer。ELMo使用独立训练的从左到右和从右到左LSTM的串联来为下游任务生成特性。在这三种表示中,只有BERT表示在所有层中都同时受到左右上下文的约束。
图2. BERT输入表示法。输入嵌入input embeddings是标记嵌入token embeddings、分段嵌入segmentation embeddings和位置嵌入position embeddings的总和。
我们的输入表示能够在一个标记序列中明确地表示单个文本句或一对文本句(例如[问题,答案])。对于一个给定的token,它的输入表示是通过summing相应的token、segment和position embeddings来构造的。图2中给出了我们的输入表示的可视化表示。
特别地:
与Peters et al.(2018)和Radford et al(2018)不同,我们不使用传统的从左到右或从右到左的语言模型来预训练BERT。相反,我们使用本节描述的两个新的无监督预测任务预先训练BERT。
直观地说,我们可以合理地认为,深层双向模型比从左到右模型或从左到右和从右到左模型的浅连接更强大。不幸的是,标准条件语言模型只能从左到右或从右到左进行培训,因为双向条件将允许每个单词在多层上下文中间接“看到自己”。
为了训练一个深层的双向表示,我们采用一种简单的方法来随机屏蔽输入tokens的某些百分比,然后只预测那些被屏蔽的tokens。我们将此过程称为“masked LM”(MLM),尽管在文献中常被称为Cloze task 完形填空(Taylor,1953)。在这种情况下,对应于屏蔽tokens的最终隐藏向量通过词汇表被输入到输出SoftMax中,就像在标准LM中一样。在我们所有的实验中,我们随机屏蔽每个序列中所有WordPiece的15%。与去噪自动编码器不同(Vincent等人,2008),我们只预测屏蔽词,而不是重建整个输入。
虽然这确实允许我们获得一个双向的预先训练模型,但是这种方法有两个缺点。第一个问题是,我们正在创建一个预训练和微调之间的不可匹配,因为在微调过程中从未看到[mask]标记。为了缓解这种情况,我们并不总是用实际的[mask]标记替换“masked”单词。相反,训练数据生成器随机选择15%的tokens,例如,在“my dog is hairy”这句话中,它选择hairy。然后执行以下步骤:
Transformer编码器不知道它将被要求预测哪些单词,或者哪些单词已被随机单词取代,因此它必须保持每个输入token的分布式上下文表示。此外,由于随机替换只发生在所有令牌的1.5%(即15%的10%)上,这似乎不会损害模型的语言理解能力。使用MLM的第二个缺点是每批中只预测了15%的tokens,这意味着模型聚合可能需要更多的预培训步骤。在第5.3节中,我们证明了MLM确实比从左到右的模型(预测每一个指标)收敛得稍慢,但MLM模型的经验改进远远超过了增加的训练成本。
许多重要的下游任务,如问答(QA)和自然语言推理(NLI),都是基于理解两个文本句之间的关系,而语言建模并不能直接捕捉到这两个文本句之间的关系。为了训练一个理解句子关系的模型,我们预先训练了一个二值化的下一个句子预测任务,该任务可以从任何单语语料库中琐碎地生成。具体来说,在为每个训练前示例选择句子a和b时,50%的时间b是紧随a的实际下一个句子,50%的时间是来自语料库的随机句子。例如:
Input = [CLS] the man went to [MASK] store [SEP] he bought a gallon [MASK] milk [SEP]
Label = IsNext
Input = [CLS] the man [MASK] to the store [SEP] penguin [MASK] are flight ##less birds [SEP]
Label = NotNext
我们完全随机选择NotNext句子,最终的预训练模型在这个任务中达到97%-98%的精度。尽管它很简单,但我们在第5.1节中证明了针对该任务的预训练对QA和NLI都非常有益。