BERT:用于语言理解的深度双向 Transformer 预训练
Jacob Devlin, Ming-Wei Chang, Kenton Lee, Kristina Toutanova Google AI Language {jacobdevlin, mingweichang, kentonl, kristout}@google.com
摘要
我们介绍了一种新的语言表示模型,称为 BERT,即 Bidirectional Encoder Representations from Transformers(来自 Transformer 的双向编码器表示)。与最近的语言表示模型(Peters 等人,2018a;Radford 等人,2018)不同,BERT 旨在通过在所有层中联合调节左右上下文,从无标签文本中预训练深度双向表示。因此,预训练的 BERT 模型只需增加一个额外的输出层,即可针对广泛的任务(如问答和语言推理)创建最先进的模型,而无需对特定任务进行实质性的架构修改。
BERT 在概念上简单且在经验上强大。它在 11 项自然语言处理任务上获得了新的最先进结果,包括将 GLUE 分数提高到 80.5%(绝对提升 7.7 个百分点),将 MultiNLI 准确率提高到 86.7%(绝对提升 4.6 个百分点),将 SQuAD v1.1 问答测试 F1 分数提高到 93.2(绝对提升 1.5 个百分点),以及将 SQuAD v2.0 测试 F1 分数提高到 83.1(绝对提升 5.1 个百分点)。
1 引言
语言模型预训练已被证明对于改进许多自然语言处理任务是有效的(Dai 和 Le,2015;Peters 等人,2018a;Radford 等人,2018;Howard 和 Ruder,2018)。这些任务包括句子级任务,如自然语言推理(Bowman 等人,2015;Williams 等人,2018)和复述(Dolan 和 Brockett,2005),旨在通过整体分析句子来预测句子之间的关系;以及标记级任务,如命名实体识别和问答,其中模型需要在标记级别产生细粒度的输出(Tjong Kim Sang 和 De Meulder,2003;Rajpurkar 等人,2016)。
目前有两种将预训练语言表示应用于下游任务的策略:基于特征(feature-based)和微调(fine-tuning)。基于特征的方法,如 ELMo(Peters 等人,2018a),使用特定任务的架构,将预训练表示作为附加特征。微调方法,如生成式预训练 Transformer(OpenAI GPT)(Radford 等人,2018),引入了极少的特定任务参数,并通过简单地微调所有预训练参数来在下游任务上进行训练。这两种方法在预训练期间共享相同的目标函数,即使用单向语言模型来学习通用语言表示。
我们认为,现有的技术限制了预训练表示的能力,特别是对于微调方法。主要的局限性在于标准语言模型是单向的,这限制了预训练期间可以使用的架构选择。例如,在 OpenAI GPT 中,作者使用了从左到右的架构,其中每个标记只能在 Transformer 的自注意力层中关注之前的标记(Vaswani 等人,2017)。这种限制对于句子级任务来说是次优的,并且在将基于微调的方法应用于问答等标记级任务时可能会非常有害,因为在这些任务中,结合来自两个方向的上下文至关重要。
在本文中,我们通过提出 BERT:来自 Transformer 的双向编码器表示,改进了基于微调的方法。BERT 通过使用受完形填空任务(Taylor,1953)启发的“掩码语言模型”(MLM)预训练目标,缓解了前面提到的单向性约束。掩码语言模型随机掩盖输入中的一些标记,其目标是仅根据其上下文预测被掩盖的原始词汇 ID。与从左到右的语言模型预训练不同,MLM 目标使表示能够融合左右上下文,这使我们能够预训练深度双向 Transformer。除了掩码语言模型外,我们还使用“下一句预测”任务,联合预训练文本对表示。
我们的论文贡献如下:
- 我们证明了双向预训练对于语言表示的重要性。与使用单向语言模型进行预训练的 Radford 等人(2018)不同,BERT 使用掩码语言模型来实现预训练的深度双向表示。这也与使用独立训练的从左到右和从右到左 LM 的浅层拼接的 Peters 等人(2018a)形成了对比。
- 我们证明了预训练表示减少了对许多繁琐的特定任务架构的需求。BERT 是第一个实现一系列句子级和标记级任务最先进性能的基于微调的表示模型,优于许多特定任务架构。
- BERT 在 11 项 NLP 任务上推进了最先进水平。代码和预训练模型可在 https://github.com/google-research/bert 获取。
2 相关工作
预训练通用语言表示有着悠久的历史,我们在本节中简要回顾最广泛使用的方法。
2.1 无监督基于特征的方法
学习广泛适用的词表示几十年来一直是研究的热点,包括非神经方法(Brown 等人,1992;Ando 和 Zhang,2005;Blitzer 等人,2006)和神经方法(Mikolov 等人,2013;Pennington 等人,2014)。预训练词嵌入是现代 NLP 系统不可或缺的一部分,与从头开始学习的嵌入相比,提供了显著的改进(Turian 等人,2010)。为了预训练词嵌入向量,已经使用了从左到右的语言建模目标(Mnih 和 Hinton,2009),以及在左右上下文中区分正确和错误单词的目标(Mikolov 等人,2013)。
这些方法已被推广到更粗的粒度,如句子嵌入(Kiros 等人,2015;Logeswaran 和 Lee,2018)或段落嵌入(Le 和 Mikolov,2014)。为了训练句子表示,先前的工作使用了对候选下一句进行排序的目标(Jernite 等人,2017;Logeswaran 和 Lee,2018),给定前一句表示的下一句单词的从左到右生成(Kiros 等人,2015),或去噪自编码器派生的目标(Hill 等人,2016)。
ELMo 及其前身(Peters 等人,2017, 2018a)沿另一个维度推广了传统的词嵌入研究。它们从从左到右和从右到左的语言模型中提取上下文敏感特征。每个标记的上下文表示是左右表示的拼接。当将上下文词嵌入与现有的特定任务架构集成时,ELMo 在几个主要的 NLP 基准测试(Peters 等人,2018a)上推进了最先进水平,包括问答(Rajpurkar 等人,2016)、情感分析(Socher 等人,2013)和命名实体识别(Tjong Kim Sang 和 De Meulder,2003)。Melamud 等人(2016)提出通过使用 LSTM 从左右上下文预测单个单词的任务来学习上下文表示。与 ELMo 类似,他们的模型是基于特征的,而不是深度双向的。Fedus 等人(2018)表明,完形填空任务可用于提高文本生成模型的鲁棒性。
2.2 无监督微调方法
与基于特征的方法一样,该方向的早期工作仅从无标签文本中预训练词嵌入参数(Collobert 和 Weston,2008)。
最近,产生上下文标记表示的句子或文档编码器已从无标签文本中进行预训练,并针对监督下游任务进行了微调(Dai 和 Le,2015;Howard 和 Ruder,2018;Radford 等人,2018)。这些方法的优势在于几乎不需要从头开始学习参数。至少部分由于这一优势,OpenAI GPT(Radford 等人,2018)在 GLUE 基准测试(Wang 等人,2018a)的许多句子级任务上取得了先前的最先进结果。
图 1:BERT 的总体预训练和微调过程。除了输出层外,预训练和微调中使用了相同的架构。相同的预训练模型参数用于初始化不同下游任务的模型。在微调期间,所有参数都会进行微调。[CLS] 是添加到每个输入示例前面的特殊符号,[SEP] 是特殊的分隔符标记(例如,分隔问题/答案)。
3 BERT
我们在本节中介绍 BERT 及其详细实现。我们的框架有两个步骤:预训练和微调。在预训练期间,模型在不同的预训练任务上对无标签数据进行训练。对于微调,BERT 模型首先使用预训练参数进行初始化,并使用来自下游任务的标签数据对所有参数进行微调。每个下游任务都有单独的微调模型,即使它们是用相同的预训练参数初始化的。图 1 中的问答示例将作为本节的运行示例。
BERT 的一个显著特点是其跨不同任务的统一架构。预训练架构与最终下游架构之间的差异极小。
模型架构 BERT 的模型架构是一个多层双向 Transformer 编码器,基于 Vaswani 等人(2017)中描述并在 tensor2tensor 库中发布的原始实现。由于 Transformer 的使用已变得普遍,且我们的实现与原始实现几乎相同,我们将省略对模型架构的详尽背景描述,并参考 Vaswani 等人(2017)以及诸如“The Annotated Transformer”之类的优秀指南。
在这项工作中,我们将层数(即 Transformer 块)表示为 ,隐藏层大小表示为 ,自注意力头数表示为 。我们主要报告两种模型尺寸的结果:(, 总参数=110M)和 (, 总参数=340M)。
选择 是为了与 OpenAI GPT 具有相同的模型尺寸,以便进行比较。然而,关键的是,BERT Transformer 使用双向自注意力,而 GPT Transformer 使用受限自注意力,其中每个标记只能关注其左侧的上下文。
输入/输出表示 为了使 BERT 处理各种下游任务,我们的输入表示能够明确地表示单个句子和句子对(例如,问题,答案)在一个标记序列中。在本文中,“句子”可以是任意连续的文本跨度,而不是实际的语言学句子。“序列”是指输入到 BERT 的标记序列,它可以是单个句子或打包在一起的两个句子。
我们使用带有 30,000 个标记词汇表的 WordPiece 嵌入(Wu 等人,2016)。每个序列的第一个标记始终是特殊的分类标记([CLS])。对应于该标记的最终隐藏状态被用作分类任务的聚合序列表示。句子对被打包成一个单一序列。我们通过两种方式区分句子。首先,我们用一个特殊标记([SEP])将它们分开。其次,我们向每个标记添加一个学习到的嵌入,指示它属于句子 A 还是句子 B。如图 1 所示,我们将输入嵌入表示为 ,特殊 [CLS] 标记的最终隐藏向量表示为 ,第 个输入标记的最终隐藏向量表示为 。
对于给定的标记,其输入表示是通过对相应的标记、段落和位置嵌入求和来构建的。这种构建的可视化可以在图 2 中看到。
3.1 预训练 BERT
与 Peters 等人(2018a)和 Radford 等人(2018)不同,我们不使用传统的从左到右或从右到左的语言模型来预训练 BERT。相反,我们使用本节中描述的两个无监督任务来预训练 BERT。此步骤显示在图 1 的左侧。
任务 #1:掩码 LM 直观地,有理由相信深度双向模型严格强于从左到右模型或从左到右和从右到左模型的浅层拼接。不幸的是,标准的条件语言模型只能从左到右或从右到左训练,因为双向调节将允许每个单词间接地“看到自己”,并且模型可以在多层上下文中轻易地预测目标单词。
为了训练深度双向表示,我们只需随机掩盖输入标记的某个百分比,然后预测这些被掩盖的标记。我们将此过程称为“掩码 LM”(MLM),尽管它在文献中通常被称为完形填空任务(Taylor,1953)。在这种情况下,对应于掩码标记的最终隐藏向量被馈送到词汇表上的输出 Softmax 中,就像在标准 LM 中一样。在我们的所有实验中,我们随机掩盖每个序列中 15% 的 WordPiece 标记。与去噪自编码器(Vincent 等人,2008)不同,我们只预测被掩盖的单词,而不是重建整个输入。
虽然这使我们能够获得双向预训练模型,但一个缺点是我们在预训练和微调之间造成了不匹配,因为 [MASK] 标记在微调期间不会出现。为了缓解这种情况,我们并不总是用实际的 [MASK] 标记替换“被掩盖”的单词。训练数据生成器随机选择 15% 的标记位置进行预测。如果选择了第 个标记,我们将第 个标记替换为 (1) [MASK] 标记(80% 的时间),(2) 随机标记(10% 的时间),(3) 未更改的第 个标记(10% 的时间)。然后, 将用于通过交叉熵损失预测原始标记。我们在附录 C.2 中比较了此过程的变体。
任务 #2:下一句预测 (NSP) 许多重要的下游任务(如问答 (QA) 和自然语言推理 (NLI))基于理解两个句子之间的关系,而语言建模并不能直接捕捉到这一点。为了训练一个理解句子关系的模型,我们预训练了一个二值化的下一句预测任务,该任务可以轻易地从任何单语语料库中生成。具体来说,在为每个预训练示例选择句子 A 和 B 时,50% 的时间 B 是跟随 A 的实际下一句(标记为 IsNext),50% 的时间它是语料库中的随机句子(标记为 NotNext)。如图 1 所示, 用于下一句预测 (NSP)。尽管它很简单,但我们在第 5.1 节中证明,针对此任务进行预训练对 QA 和 NLI 都非常有益。

NSP 任务与 Jernite 等人(2017)和 Logeswaran 和 Lee(2018)中使用的表示学习目标密切相关。然而,在先前的工作中,只有句子嵌入被转移到下游任务,而 BERT 转移了所有参数来初始化端任务模型参数。
预训练数据 预训练过程在很大程度上遵循了现有的语言模型预训练文献。对于预训练语料库,我们使用 BooksCorpus(8 亿词)(Zhu 等人,2015)和英语维基百科(25 亿词)。对于维基百科,我们仅提取文本段落,忽略列表、表格和标题。使用文档级语料库而不是像 Billion Word Benchmark(Chelba 等人,2013)那样的打乱句子级语料库对于提取长连续序列至关重要。
3.2 微调 BERT
微调是直接的,因为 Transformer 中的自注意力机制允许 BERT 对许多下游任务进行建模——无论是涉及单个文本还是文本对——只需交换适当的输入和输出。对于涉及文本对的应用程序,一种常见的模式是在应用双向交叉注意力之前独立编码文本对,例如 Parikh 等人(2016);Seo 等人(2017)。BERT 而是使用自注意力机制来统一这两个阶段,因为用自注意力编码拼接的文本对有效地包含了两个句子之间的双向交叉注意力。
对于每个任务,我们只需将特定任务的输入和输出插入 BERT,并对所有参数进行端到端微调。在输入端,预训练中的句子 A 和句子 B 类似于 (1) 复述中的句子对,(2) 蕴含中的假设-前提对,(3) 问答中的问题-段落对,以及 (4) 文本分类或序列标注中的退化文本- 对。在输出端,标记表示被馈送到输出层以进行标记级任务(如序列标注或问答),[CLS] 表示被馈送到输出层以进行分类(如蕴含或情感分析)。
与预训练相比,微调相对便宜。论文中的所有结果都可以在单个 Cloud TPU 上最多 1 小时内,或在 GPU 上几小时内,从完全相同的预训练模型开始复制。我们在第 4 节的相应小节中描述了特定任务的细节。更多细节可以在附录 A.5 中找到。
4 实验
在本节中,我们展示 BERT 在 11 项 NLP 任务上的微调结果。
4.1 GLUE
通用语言理解评估 (GLUE) 基准测试(Wang 等人,2018a)是各种自然语言理解任务的集合。GLUE 数据集的详细描述包含在附录 B.1 中。
为了在 GLUE 上进行微调,我们按照第 3 节中的描述表示输入序列(对于单个句子或句子对),并使用对应于第一个输入标记 ([CLS]) 的最终隐藏向量 作为聚合表示。微调期间引入的唯一新参数是分类层权重 ,其中 是标签数量。我们使用 和 计算标准分类损失,即 。
| 系统 | MNLI-(m/mm) | QQP | QNLI | SST-2 | CoLA | STS-B | MRPC | RTE | 平均 |
|---|---|---|---|---|---|---|---|---|---|
| 训练示例数 | 392k | 363k | 108k | 67k | 8.5k | 5.7k | 3.5k | 2.5k | - |
| Pre-OpenAI SOTA | 80.6/80.1 | 66.1 | 82.3 | 93.2 | 35.0 | 81.0 | 86.0 | 61.7 | 74.0 |
| BiLSTM+ELMo+Attn | 76.4/76.1 | 64.8 | 79.8 | 90.4 | 36.0 | 73.3 | 84.9 | 56.8 | 71.0 |
| OpenAI GPT | 82.1/81.4 | 70.3 | 87.4 | 91.3 | 45.4 | 80.0 | 82.3 | 56.0 | 75.1 |
| 84.6/83.4 | 71.2 | 90.5 | 93.5 | 52.1 | 85.8 | 88.9 | 66.4 | 79.6 | |
| 86.7/85.9 | 72.1 | 92.7 | 94.9 | 60.5 | 86.5 | 89.3 | 70.1 | 82.1 |
表 1:GLUE 测试结果,由评估服务器评分 (https://gluebenchmark.com/leaderboard)。每个任务下方的数字表示训练示例的数量。“平均”列与官方 GLUE 分数略有不同,因为我们排除了有问题的 WNLI 集。BERT 和 OpenAI GPT 是单模型、单任务。QQP 和 MRPC 报告 F1 分数,STS-B 报告 Spearman 相关性,其他任务报告准确率分数。我们排除了使用 BERT 作为其组件之一的条目。
我们使用 32 的批大小,并在所有 GLUE 任务的数据上微调 3 个 epoch。对于每个任务,我们在开发集上选择了最佳微调学习率(在 5e-5、4e-5、3e-5 和 2e-5 之间)。此外,对于 ,我们发现微调在小数据集上有时不稳定,因此我们进行了几次随机重启,并在开发集上选择了最佳模型。通过随机重启,我们使用相同的预训练检查点,但执行不同的微调数据打乱和分类器层初始化。
结果如表 1 所示。 和 在所有任务上都以显著优势优于所有系统,在先前最先进水平的基础上分别获得了 4.5% 和 7.0% 的平均准确率提升。请注意,除了注意力掩码外, 和 OpenAI GPT 在模型架构方面几乎相同。对于最大且报道最广泛的 GLUE 任务 MNLI,BERT 获得了 4.6% 的绝对准确率提升。在官方 GLUE 排行榜上, 获得了 80.5 的分数,而 OpenAI GPT 在撰写本文时获得了 72.8。
我们发现 在所有任务上都显著优于 ,特别是在训练数据非常少的任务上。模型尺寸的影响在第 5.2 节中进行了更深入的探讨。
4.2 SQuAD v1.1
斯坦福问答数据集 (SQuAD v1.1) 是 10 万个众包问题/答案对的集合(Rajpurkar 等人,2016)。给定一个问题和一段来自维基百科的包含答案的段落,任务是预测段落中的答案文本跨度。
如图 1 所示,在问答任务中,我们将输入问题和段落表示为单个打包序列,问题使用 A 嵌入,段落使用 B 嵌入。我们在微调期间仅引入一个起始向量 和一个结束向量 。单词 成为答案跨度起始点的概率计算为 和 之间的点积,随后对段落中的所有单词进行 Softmax:。
类似的公式用于答案跨度的结束点。从位置 到位置 的候选跨度的得分定义为 ,并且使用 的最大得分跨度作为预测。训练目标是正确起始和结束位置的对数似然之和。我们以 5e-5 的学习率和 32 的批大小微调 3 个 epoch。
表 2 显示了排行榜前列的条目以及来自已发表顶级系统的结果(Seo 等人,2017;Clark 和 Gardner,2018;Peters 等人,2018a;Hu 等人,2018)。SQuAD 排行榜上的顶级结果没有最新的公开系统描述,并且在训练其系统时允许使用任何公开数据。因此,我们在我们的系统中使用了适度的数据增强,首先在 TriviaQA(Joshi 等人,2017)上进行微调,然后再在 SQuAD 上进行微调。
我们表现最好的系统在集成方面优于排行榜顶级系统 +1.5 F1,作为单一系统优于 +1.3 F1。事实上,我们的单一 BERT 模型在 F1 分数方面优于顶级集成系统。
5 消融研究
在本节中,我们对 BERT 的多个方面进行消融实验,以更好地理解它们的相对重要性。
5.1 预训练任务的影响
我们通过使用与 完全相同的预训练数据、微调方案和超参数评估两个预训练目标,证明了 BERT 深度双向性的重要性:
无 NSP:一个双向模型,使用“掩码 LM”(MLM) 训练,但没有“下一句预测”(NSP) 任务。
LTR & 无 NSP:一个仅左上下文模型,使用标准的从左到右 (LTR) LM 训练,而不是 MLM。左侧约束也应用于微调,因为移除它会引入导致下游性能下降的预训练/微调不匹配。此外,该模型是在没有 NSP 任务的情况下预训练的。这与 OpenAI GPT 直接可比,但使用了我们更大的训练数据集、我们的输入表示和我们的微调方案。
我们首先检查 NSP 任务带来的影响。在表 5 中,我们展示了移除 NSP 会显著损害 QNLI、MNLI 和 SQuAD 1.1 上的性能。接下来,我们通过比较“无 NSP”和“LTR & 无 NSP”来评估训练双向表示的影响。LTR 模型在所有任务上的表现都比 MLM 模型差,在 MRPC 和 SQuAD 上有大幅下降。
对于 SQuAD,直观地清楚 LTR 模型在标记预测方面表现不佳,因为标记级隐藏状态没有右侧上下文。为了对加强 LTR 系统进行诚实的尝试,我们在顶部添加了一个随机初始化的 BiLSTM。这确实显著改善了 SQuAD 上的结果,但结果仍然远差于预训练的双向模型。BiLSTM 损害了 GLUE 任务上的性能。
| 任务 | MNLI-m (Acc) | QNLI (Acc) | MRPC (Acc) | SST-2 (Acc) | SQuAD (F1) |
|---|---|---|---|---|---|
| 84.4 | 88.4 | 86.7 | 92.7 | 88.5 | |
| 无 NSP | 83.9 | 84.9 | 86.5 | 92.6 | 87.9 |
| LTR & 无 NSP | 82.1 | 84.3 | 77.5 | 92.1 | 77.8 |
| + BiLSTM | 82.1 | 84.1 | 75.7 | 91.6 | 84.9 |
表 5:使用 架构对预训练任务进行的消融。“无 NSP”是在没有下一句预测任务的情况下训练的。“LTR & 无 NSP”是作为没有下一句预测的从左到右 LM 训练的,类似于 OpenAI GPT。“+ BiLSTM”在微调期间在“LTR + 无 NSP”模型之上添加了一个随机初始化的 BiLSTM。
5.2 模型尺寸的影响
在本节中,我们探讨模型尺寸对微调任务准确率的影响。我们训练了多个具有不同层数、隐藏单元和注意力头的 BERT 模型,同时使用与之前描述相同的超参数和训练过程。
所选 GLUE 任务的结果如表 6 所示。在此表中,我们报告了 5 次微调随机重启的平均开发集准确率。我们可以看到,更大的模型在所有四个数据集上都导致了严格的准确率提升,即使对于只有 3,600 个标记训练示例且与预训练任务大不相同的 MRPC 也是如此。令人惊讶的是,我们能够在相对于现有文献已经相当大的模型之上实现如此显著的改进。例如,Vaswani 等人(2017)中探索的最大 Transformer 是(),编码器有 1 亿个参数,而我们在文献中发现的最大 Transformer 是(),有 2.35 亿个参数(Al-Rfou 等人,2018)。相比之下, 包含 1.1 亿个参数, 包含 3.4 亿个参数。
众所周知,增加模型尺寸将导致机器翻译和语言建模等大规模任务的持续改进,这由表 6 中显示的留出训练数据的 LM 困惑度证明。然而,我们相信这是第一项令人信服地证明扩展到极端模型尺寸也会导致在极小规模任务上产生巨大改进的工作,前提是模型已经过充分的预训练。
6 结论
最近由于语言模型迁移学习带来的经验改进表明,丰富的无监督预训练是许多语言理解系统不可或缺的一部分。特别是,这些结果使即使是低资源任务也能从深度单向架构中受益。我们的主要贡献是将这些发现进一步推广到深度双向架构,允许相同的预训练模型成功地处理广泛的 NLP 任务。