论文地址:BERT
代码地址:bert
零、摘要
我们提出了一种新的语言表示模型,称为 BERT ,其全称是来自 Transformers 的双向编码器表示 。与近期的语言表示模型(Peters 等人,2018a;Radford 等人,2018)不同,BERT 旨在通过在所有层中联合调节左右上下文 ,从无标注文本中预训练深度双向表示 。因此,预训练好的 BERT 模型只需添加一个额外的输出层进行微调,即可为广泛的任务(如问答和语言推理)创建最先进的模型,而无需对任务特定的架构进行大量修改。
BERT 在概念上简单 ,在实证上强大 。它在十一个自然语言处理任务上取得了新的最先进结果,包括将 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 分)。
一、介绍
语言模型预训练已被证明能有效改善许多自然语言处理任务(Dai and Le, 2015; Peters et al., 2018a; Radford et al., 2018; Howard and Ruder, 2018)。这包括句子级任务,如自然语言推理(Bowman et al., 2015; Williams et al., 2018)和释义(Dolan and Brockett, 2005),这些任务旨在通过整体分析句子来预测句子间的关系;以及词元级任务,如命名实体识别和问答,这些任务要求模型在词元级别产生细粒度的输出(Tjong Kim Sang and De Meulder, 2003; Rajpurkar et al., 2016)。
将预训练的语言表示应用于下游任务存在两种现有策略:基于特征的方法 和微调方法 。基于特征的方法,如ELMo(Peters et al., 2018a),使用包含预训练表示作为附加特征的任务特定架构 。微调方法,如生成式预训练Transformer(OpenAI GPT)(Radford et al., 2018),引入最少的任务特定参数,并通过简单地微调所有预训练参数 来在下游任务上进行训练。这两种方法在预训练期间共享相同的目标函数,即它们使用单向语言模型来学习通用语言表示。
我们认为,当前的技术限制了预训练表示的能力,特别是对于微调方法。主要的局限在于标准的语言模型是单向的 ,这限制了预训练期间可用的架构选择。例如,在OpenAI GPT中,作者使用了从左到右的架构 ,其中每个词元在Transformer的自注意力层中只能关注到先前的词元(Vaswani et al., 2017)。这种限制对于句子级任务来说是次优的,并且在将基于微调的方法应用于词元级任务(如问答)时可能非常有害,因为在这些任务中,结合双向的上下文信息至关重要。
在本文中,我们通过提出BERT (来自Transformers的双向编码器表示)来改进基于微调的方法。BERT通过使用一种受完形填空任务(Taylor, 1953)启发的"掩码语言模型 "预训练目标,来缓解前述的单向性限制。掩码语言模型随机掩盖输入中的一些词元,其目标是根据上下文预测被掩盖词的原始词汇id。与从左到右的语言模型预训练不同,MLM目标使得表示能够融合左右上下文 ,这使我们能够预训练一个深度双向的Transformer 。除了掩码语言模型,我们还使用一个"下一句预测"任务来联合预训练文本对表示。本文的贡献如下:
- 我们论证了双向预训练对于语言表示的重要性。与Radford等人(2018)使用单向语言模型进行预训练不同,BERT使用掩码语言模型来实现预训练的深度双向表示。这也与Peters等人(2018a)形成对比,后者使用了独立训练的从左到右和从右到左语言模型的浅层拼接。
- 我们表明,预训练表示减少了对许多精心设计的任务特定架构的需求。BERT是第一个基于微调的表示模型,在一大套句子级和词元级任务 上达到了最先进的性能,超越了许多任务特定的架构。
简要总结
本段是BERT论文引言的核心部分,清晰地阐述了研究的背景、现有方法的局限以及BERT的核心创新和贡献。
- 背景 :预训练语言模型能有效提升各种NLP任务(句子级和词元级)的性能。
- 现有策略 :
- 基于特征 :如ELMo,将预训练表示作为静态特征输入到为特定任务定制的模型中。
- 微调 :如GPT,在预训练模型上添加少量参数 ,然后在下游任务数据上更新所有模型参数。
- 共同局限 :它们都主要依赖于单向语言模型(从左到右)进行预训练。
- 问题与动机 :
- 单向性是一个主要限制,它阻碍了模型在预训练时充分理解上下文。例如,GPT中每个词只能看到它左边的词。
- 这对于需要全局上下文理解 的任务(尤其是问答等词元级任务)是非常不利的。
- 解决方案 :提出BERT 。
- 核心创新1 :采用掩码语言模型 作为预训练目标。通过随机掩盖输入中的一些词,并让模型预测它们,从而强制模型利用双向上下文 进行学习,实现了真正的深度双向编码器。
- 核心创新2 :引入下一句预测任务,让模型理解两个句子之间的关系,这对句子对任务(如推理)至关重要。
- 主要贡献 :
- 强调了双向预训练的极端重要性。
- 证明了BERT这种单一的、通用的 模型架构,通过预训练-微调,可以在众多任务上超越精心设计的任务特定模型,大大简化了NLP应用的开发流程。
核心思想 :这段文字的核心论点是,通过掩码语言模型 实现深度双向预训练 是突破之前预训练模型(如GPT)单向性瓶颈的关键。BERT的成功不在于复杂的下游任务架构,而在于其预训练阶段学习到的更强大、更通用的上下文表示能力。
二、相关工作
预训练通用语言表示有着悠久的历史,我们在本节简要回顾最广泛使用的方法。
预训练模型架构的差异。BERT 使用双向 Transformer。OpenAI GPT 使用从左到右的 Transformer。ELMo 使用独立训练的从左到右和从右到左的 LSTM 的连接来生成下游任务的特征。在这三个模型中,只有 BERT 的表示在所有层中都同时考虑了左右上下文。除了架构差异之外,BERT 和 OpenAI GPT 是微调方法,而 ELMo 是基于特征的方法。
2.1 基于无监督特征的方法
学习广泛适用的词语表示是几十年来的一个活跃研究领域,包括非神经(Brown et al., 1992; Ando and Zhang, 2005; Blitzer et al., 2006)和神经(Mikolov et al., 2013; Pennington et al., 2014)方法。预训练的词嵌入是现代NLP系统的一个组成部分,与从零开始学习的嵌入相比提供了显著改进(Turian et al., 2010)。为了预训练词嵌入向量,人们使用了从左到右的语言建模目标(Mnih and Hinton, 2009),以及区分左右上下文中正确与错误词的目标(Mikolov et al., 2013)。
这些方法已被推广到更粗的粒度,例如句子嵌入(Kiros et al., 2015; Logeswaran and Lee, 2018)或段落嵌入(Le and Mikolov, 2014)。为了训练句子表示,先前的工作使用了给候选下一句子排序的目标(Jernite et al., 2017; Logeswaran and Lee, 2018)、给定前一句子的表示从左到右生成下一句子词的目标(Kiros et al., 2015),或去噪自编码器衍生的目标(Hill et al., 2016)。
ELMo及其前身(Peters et al., 2017, 2018a)沿不同维度推广了传统的词嵌入研究。它们从一个从左到右和一个从右到左的语言模型中提取上下文敏感的特征。每个词符的上下文表示是左右和右左表示的拼接。当将上下文词嵌入与现有的任务特定架构集成时,ELMo推进了几个主要NLP基准(Peters et al., 2018a)的技术水平,包括问答(Rajpurkar et al., 2016)、情感分析(Socher et al., 2013)和命名实体识别(Tjong Kim Sang and De Meulder, 2003)。Melamud等人(2016)提出通过使用LSTM从左右上下文预测单个词的任务来学习上下文表示。与ELMo类似,他们的模型是基于特征的,并且不是深度双向的。Fedus等人(2018)表明完形填空任务可用于提高文本生成模型的鲁棒性。
2.2 无监督微调方法
与基于特征的方法一样,这个方向的早期工作只从无标注文本预训练词嵌入参数(Collobert and Weston, 2008)。
最近,产生上下文词符表示的句子或文档编码器已经从无标注文本进行了预训练,并针对有监督的下游任务进行了微调(Dai and Le, 2015; Howard and Ruder, 2018; Radford et al., 2018)。这些方法的优点是需要从零开始学习的参数很少。至少部分由于这个优点,OpenAI GPT(Radford et al., 2018)在GLUE基准(Wang et al., 2018a)的许多句子级任务上取得了之前的最先进结果。从左到右的语言建模和自编码器目标已被用于预训练此类模型(Howard and Ruder, 2018; Radford et al., 2018; Dai and Le, 2015)。
2.3 从有监督数据中进行迁移学习
也有工作展示了从具有大数据集的有监督任务(如自然语言推理(Conneau et al., 2017)和机器翻译(McCann et al., 2017))进行有效迁移。计算机视觉研究也证明了从大型预训练模型进行迁移学习的重要性,其中一个有效的方法是微调使用ImageNet预训练的模型(Deng et al., 2009; Yosinski et al., 2014)。
简要总结
本段是BERT论文的"相关工作"部分,系统地将已有的语言表示学习方法分为三类,为BERT的定位和创新提供了背景。
-
基于无监督特征的方法:
- 核心思想 :预训练静态的词、句或段落嵌入 ,将其作为固定特征输入到下游任务的特定模型中。
- 代表工作 :
- 词嵌入:Word2Vec, GloVe。
- 上下文嵌入 :ELMo (关键进步)。ELMo通过分别训练一个从左到右 和一个从右到左 的语言模型,然后将两个方向的表示拼接 起来,从而获得上下文相关的词表示。但BERT指出,这本质上是浅层双向的,因为两个模型是独立训练的。
-
无监督微调方法:
- 核心思想 :预训练整个模型架构(而不仅仅是词向量),然后通过微调所有参数来适应下游任务。这需要从零开始学习的参数很少。
- 代表工作 :OpenAI GPT (BERT最直接的比较对象)。GPT使用Transformer解码器进行从左到右 的语言模型预训练。其关键局限 是单向性,限制了模型对上下文的完整理解。
-
从有监督数据中进行迁移学习:
- 核心思想 :利用大型有标注数据集(如自然语言推理、机器翻译)上训练的模型进行迁移学习。
- 类比:类似于计算机视觉中先在ImageNet(大型有标注数据集)上预训练,再微调以适应新任务的做法。
BERT的定位:
- BERT属于第二类------无监督微调方法。它的直接竞争对手是GPT。
- BERT的核心创新在于解决了GPT的单向性 问题,以及ELMo的非深度双向 问题。它通过掩码语言模型(MLM) 实现了真正的深度双向预训练。
- 这段相关工作通过梳理脉络,清晰地表明BERT并非凭空出现,而是在已有范式(特别是微调范式)上的一个重大突破 ,其突破点就在于预训练目标的设计。
三、Bert
我们在本节介绍BERT及其具体实现。我们的框架包含两个步骤:预训练 和微调 。在预训练阶段,模型在不同预训练任务的无标注数据上进行训练。在微调阶段,BERT模型首先用预训练的参数初始化,然后使用下游任务的标注数据对所有参数进行微调。每个下游任务都有独立的微调模型,即使它们是用相同的预训练参数初始化的。图1中的问答示例将作为本节的运行示例。
BERT的一个显著特点是其跨不同任务的统一架构。预训练架构与最终的下游架构之间差异极小。
模型架构 BERT的模型架构是一个多层双向Transformer编码器,基于Vaswani等人(2017)描述并在tensor2tensor库中发布的原始实现。由于Transformer的使用已很普遍,且我们的实现与原始实现几乎相同,我们将省略对模型架构的详尽背景描述,请读者参阅Vaswani等人(2017)以及优秀的指南如"The Annotated Transformer"。
本工作中,我们将层数(即Transformer块数)记为 L L L,隐藏层大小记为 H H H,自注意力头数记为 A A A。我们主要报告两种模型尺寸的结果:
- BERT_BASE ( L = 12 L=12 L=12, H = 768 H=768 H=768, A = 12 A=12 A=12, 总参数量=110M)
- BERT_LARGE ( L = 24 L=24 L=24, H = 1024 H=1024 H=1024, A = 16 A=16 A=16, 总参数量=340M)
选择BERT_BASE是为了与OpenAI GPT的模型尺寸相同以便比较。然而,关键区别 在于,BERT Transformer使用双向自注意力 ,而GPT Transformer使用受限的自注意力,即每个词符只能关注其左侧的上下文。
输入/输出表示 为了使BERT能处理各种下游任务,我们的输入表示能够在一个词符序列中明确地表示单个句子或句子对(例如〈问题,答案〉)。在整个工作中,"句子"可以是任意的连续文本片段,而非真正的语言学句子。"序列"指的是BERT的输入词符序列,可以是一个单句或打包在一起的两个句子。
我们使用包含30,000个词符词汇表的WordPiece嵌入 (Wu et al., 2016)。每个序列的第一个词符总是一个特殊的分类词符([CLS]) 。与该词符对应的最终隐藏状态被用作分类任务的聚合序列表示 。句子对被打包成一个序列。我们通过两种方式区分句子:首先,用一个特殊词符([SEP] )分隔它们;其次,向每个词符添加一个习得的嵌入 ,指示它属于句子A还是句子B。如图1所示,我们将输入嵌入记为 E E E,特殊[CLS]词符的最终隐藏向量记为 C ∈ R H C \in \mathbb{R}^H C∈RH,第 i i i个输入词符的最终隐藏向量记为 T i ∈ R H T_i \in \mathbb{R}^H Ti∈RH。
对于一个给定的词符,其输入表示通过将对应的词符嵌入、段嵌入和位置嵌入相加 来构建。这种构建的可视化如图2所示。
图2:BERT 输入表示。输入嵌入是令牌嵌入、段落嵌入和位置嵌入的总和。
3.1 预训练BERT
与Peters等人(2018a)和Radford等人(2018)不同,我们不使用传统的从左到右或从右到左语言模型来预训练BERT。相反,我们使用两个无监督任务来预训练BERT,本节将对此进行描述。此步骤呈现在图1的左侧。
任务 #1: 掩码语言模型 直观上,有理由相信深度双向模型严格优于从左到右模型或左右模型的浅层拼接。然而,标准的条件语言模型只能被训练为从左到右或从右到左,因为双向条件作用会让每个词间接地"看到自己",模型就能在多层上下文中轻松预测目标词。
为了训练深度双向表示,我们随机掩盖一定比例的输入词符 ,然后预测那些被掩盖的词符。我们将此过程称为"掩码语言模型"(MLM),尽管在文献中它常被称为完形填空任务(Taylor, 1953)。在此情况下,对应于被掩盖词符的最终隐藏向量被送入一个在词汇表上的输出softmax层,如同标准LM一样。在我们所有的实验中,我们随机掩盖每个序列中15%的WordPiece词符。与去噪自编码器(Vincent et al., 2008)相比,我们只预测被掩盖的词,而不是重建整个输入。
尽管这使我们能够获得一个双向预训练模型,但一个缺点是我们在预训练和微调之间造成了不匹配 ,因为[MASK]词符在微调期间不会出现。为了缓解这个问题,我们并不总是 用实际的[MASK]词符替换"被掩盖"的词。训练数据生成器随机选择15%的词符位置进行预测。如果第 i i i个词符被选中,我们按以下方式替换它:(1)80%的时间使用[MASK]词符;(2)10%的时间使用一个随机词符;(3)10%的时间保持原词符不变。然后, T i T_i Ti将被用于通过交叉熵损失预测原始词符。我们在附录C.2中比较了此过程的变体。
任务 #2: 下一句预测 许多重要的下游任务,如问答(QA)和自然语言推理(NLI),都基于理解两个句子之间的关系,而语言建模无法直接捕捉这种关系。为了训练一个理解句子关系的模型,我们预训练一个二值化的下一句预测任务 ,该任务可以从任何单语语料库中轻松生成。具体来说,在为每个预训练样本选择句子A和B时,50%的情况下B是A的实际下一句(标记为IsNext),50%的情况下它是语料库中的一个随机句子(标记为NotNext)。如图1所示, C C C被用于下一句预测(NSP)。尽管简单,我们将在5.1节证明针对此任务的预训练对QA和NLI都非常有益。
NSP任务与Jernite等人(2017)和Logeswaran与Lee(2018)中使用的表示学习目标密切相关。然而,在先前的工作中,只有句子嵌入被迁移到下游任务,而BERT迁移所有参数以初始化最终任务模型参数。
预训练数据 预训练过程大致遵循语言模型预训练的现有文献。对于预训练语料库,我们使用BooksCorpus(8亿词)(Zhu et al., 2015)和英文维基百科(25亿词)。对于维基百科,我们只提取文本段落,忽略列表、表格和标题。使用文档级语料库而非打乱的句子级语料库(如Billion Word Benchmark (Chelba et al., 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。
简要总结
本段详细阐述了BERT模型的核心架构、预训练任务和微调方法。
-
整体框架 :采用预训练-微调两阶段范式。预训练使用无标注数据,微调使用下游任务标注数据。
-
模型架构:
- 核心是多层双向Transformer编码器。
- 定义了两种规格:BERT_BASE (1.1亿参数,用于与GPT公平对比)和BERT_LARGE(3.4亿参数,性能更强)。
- 关键区别 :与GPT(单向) 不同,BERT使用双向自注意力,能同时利用上下文信息。
-
输入表示:
- 使用WordPiece分词。
- 引入特殊词符:[CLS](用于分类任务的聚合表示)和**[SEP]**(分隔句子)。
- 输入嵌入由三部分组成:词符嵌入 + 段嵌入(区分句子A/B)+ 位置嵌入。
-
预训练任务(核心创新):
- 任务1: 掩码语言模型 :
- 目的 :实现深度双向语言表示。
- 方法:随机掩盖15%的输入词符,让模型预测原词。
- 缓解微调不匹配:掩盖时,80%替换为[MASK],10%替换为随机词,10%保留原词。
- 任务2: 下一句预测 :
- 目的:让模型理解句子间关系。
- 方法:给定句子A,50%概率B是下一句,50%概率是随机句,让模型判断。
- 任务1: 掩码语言模型 :
-
微调:
- 流程简单 :为下游任务设计输入输出(如将问题/段落对应为句子A/B),然后用任务数据端到端微调所有参数。
- 高效:利用自注意力机制天然处理单句或句对任务,无需复杂结构调整。
- 低成本:微调计算量远小于预训练。
核心思想 :BERT的成功源于三个关键设计:(1)双向Transformer架构 ;(2)掩码语言模型预训练目标 ,巧妙解决了双向建模的难题;(3)下一句预测任务,增强句子级理解。通过统一的架构和简单的微调,BERT为各种NLP任务提供了强大的基础模型。