Abstract

我们要介绍的是一种新的语言表示模型,名为 BERT ,一种基于Transformer双向编码表征器。与近期的语言表现模型不同,BERT 的设计目标是从未经标注的文本中预训练深度双向表示(deep bidirectional representations),这意味着它在所有层级上同时考虑左右两侧的上下文信息。因此,只需对预训练的 BERT 模型增加一层输出层进行微调,就能构建出适用于各种任务的SOTA模型,如问题回答和语言推断,而无需对原有结构进行大量的任务相关的改动。

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 点)

Introduction

预训练的语言模型已经被证明在提升许多自然语言处理任务的性能方面具有显著效果。这包括一些句子级别的任务,如自然语言推理和改写,这些任务试图通过深入分析句子来预测它们之间的关系。还有一些是Token级别的任务,如命名实体识别和问题回答,这些任务要求模型能够在Token级别给出精确的输出结果。

目前,我们有两种策略可以将预训练的语言表示应用到下游任务中:一种是基于特征的方法,另一种是微调方法。基于特征的方法,比如ELMo,会使用一种特别设计的架构,这种架构将预训练的表示作为额外的特征。而微调方法,比如生成预训练Transformer(OpenAI GPT),只引入极少的针对特定任务的参数,并通过对所有预训练参数进行微调来训练下游任务。这两种策略在预训练阶段有着共同的目标,都是通过单向语言模型来学习和掌握通用的语言表达方式。

我们认为,现有的技术方法限制了预训练模型的潜力,特别是在进行模型微调的过程中。最主要的限制在于,传统的语言模型都是单向的,这就限制了我们在预训练阶段可以选择的架构类型。举个例子,在 OpenAI GPT 中,作者们采用了一种从左到右的架构,其中每个单词(Token)只能在 Transformer 的自注意力(self-attention)层中关注到其前面的单词。对于句子级别的任务,这样的限制并不是最理想的,而且在将微调的方法应用于例如问答这类需要处理单词级别的任务时,这样的限制可能会带来很大的问题,因为在这种情况下,能够融合来自前后两个方向的上下文信息是非常关键的。

在本论文中,我们提出了一种名为BERT的方法,这是一种基于Transformer的双向编码表示,以此改进了微调方法。BERT采用了一种受Cloze(完形填空)任务启发的预训练策略,称为"掩码语言模型"(MLM),以解决之前提到的单向性问题。在掩码语言模型中,我们会随机遮挡输入中的部分tokens,然后尝试仅根据其上下文来预测这些被遮挡的词的原始词汇id。与传统的自左向右的语言模型预训练不同,MLM能够同时考虑左右两个方向的上下文,这使得我们可以预训练一个深度的双向Transformer。除了掩码语言模型,我们还引入了一种"下一句预测"的任务,以便同时预训练文本对的表示。

我们的论文主要贡献如下:

  • 我们强调了双向预训练在语言表示中的重要性。与 ‘Radford et al. (2018)’ 采用的单向语言模型预训练不同,BERT 通过使用掩码语言模型来实现深度双向表示的预训练。这与 ‘Peters et al.(2018a)’ 他们通过简单组合独立训练的左向右和右向左的语言模型的方法形成了鲜明对比。

  • 我们发现,预训练的表示能够减少对大量精细设计的任务特定架构的依赖。BERT 是首个基于微调的表示模型,它在众多的句子级别和 token 级别的任务上都达到了SOTA性能,超过了许多专为特定任务设计的架构。

  • BERT 提升了十一个 NLP 任务的 SOTA 水平。此链接可以找到相关的代码和预训练模型。

预训练通用语言表达的研究历史悠久,本节我们将简单回顾一下这个领域中最常用的一些方法。

基于特征无监督的方法

学习广泛适用的词表征是几十年来的研究热点,涵盖了非神经网络模型和神经网络模型。预训练的词嵌入是现代自然语言处理系统的重要组成部分,它们相比从零开始训练的词嵌入,可以带来显著的性能提升。在预训练词嵌入向量的过程中,我们通常采用了从左到右的语言模型预测目标,以及在上下文中区分正确和错误词汇的目标。

这些技术已经被扩展应用到更大的语言单位上,如句子或者段落的嵌入表示。在训练句子表示的过程中,以往的研究主要采用了几种方法:一种是通过目标函数对候选的下一句进行排序;另一种是在给定前一句的表示后,从左到右生成下一句的单词;还有一种是利用去噪自动编码器派生的目标函数。

ELMo及其前身在另一维度上拓展了传统的词嵌入研究。它们从左向右和右向左的语言模型中提取出对上下文敏感的特征。每个Token的上下文表示是由其左向右和右向左的表示拼接而成。ELMo通过将上下文词嵌入与特定任务的架构相结合,成功地提升了一些主要NLP任务(包括问题回答,情感分析,和命名实体识别)的SOTA水平。‘Melamud et al. (2016)’ 提出了一种新的学习上下文表示的方法,他们设计了一个任务,通过长短期记忆网络(LSTMs)来预测左右上下文中的一个词。这种方法在某种程度上与ELMo类似,它们的模型都是基于特征的,而不是深度双向的。‘Fedus et al. (2018)’ 证明使用Cloze任务可以有效地提升文本生成模型的稳定性和鲁棒性。

基于微调的无监督方法

就像基于特征的方法一样,这个方向的初步工作只是从未标记的文本中预训练了词嵌入参数。

近期,一种新型的句子或文档编码器开始受到关注,它能生成具有上下文信息的 Token 表示,并且这种编码器可以通过无标签的文本进行预训练,然后在有监督的下游任务中进行微调。这种方法的优点在于,我们只需要学习少量的参数。正是因为这个优势,OpenAI 的 GPT 在 GLUE 基准的许多句子级任务中创下了前所未有的 SOTA 成果。而且,从左到右的语言建模和自动编码器等目标已经被用于这种模型的预训练。

从有监督数据中进行迁移学习

一些研究已经证明,从大规模数据集的监督任务,如自然语言推理和机器翻译,进行迁移学习是有效的。在计算机视觉领域,研究也展示了大型预训练模型在迁移学习中的重要性,一种有效的策略就是微调那些使用 ImageNet 数据集预训练过的模型。

BERT

本节将详细介绍BERT及其实现过程。我们的框架分为两个步骤:预训练和微调。在预训练阶段,模型会在各种预训练任务上对无标签数据进行训练。微调阶段,首先使用预训练的参数对BERT模型进行初始化,然后利用下游任务的标签数据对所有参数进行微调。尽管所有的下游任务都使用同样的预训练参数进行初始化,但每个任务都会有自己单独的经过微调的模型。图 1 中的问答示例将在本节中作为持续进行的示例进行讲解。

图1: BERT 的预训练和微调过程的总览。除了输出层外,预训练和微调阶段使用的网络架构是一样的。同样的预训练模型参数被用于初始化不同下游任务的模型。在微调阶段,所有的参数都会被进一步调整。[CLS] 是一个特殊的符号,我们在每个输入样例的开始位置添加它,而 [SEP] 则是一个用于分隔不同部分的特殊 Token。

BERT的一个独特特点是,无论是在哪种任务中,其架构都保持一致。预训练阶段的架构和最终应用于下游任务的架构之间的差别极其微小。

  • Model Architecture

    BERT 的模型架构是一种多层双向 Transformer 编码器,这种架构基于 ‘Vaswani 等人 (2017)’ 的原始实现,并已经在 ‘tensor2tensor’ 库中公开。由于 Transformer 的使用已经非常普遍,且我们的实现几乎与原始的完全一致,因此我们不会详细描述这个模型架构的背景。如需进一步了解,读者可以参考 ‘Vaswani 等人 (2017)’ 的文章,或者阅读像是 “The Annotated Transformer” 这样的优秀教程。

    在我们的研究中,我们以 L 来表示层数,以 H 来表示隐藏层的大小,以 A 来表示自注意力头的数量。主要的性能结果我们将以两种模型规模来展示:‘BERT_BASE’ (L=12, H=768, A=12, 总参数量=110M) 和 ‘BERT_LARGE’ (L=24, H=1024, A=16, 总参数量=340M)。

    我们选择 BERT_BASE 的原因是为了与 OpenAI GPT 的模型大小做出比较。然而,最关键的区别在于,BERT Transformer 采用了双向自注意力机制(即每个 Token 可以关注到其左右两侧的上下文),而 GPT Transformer 则采用了受限的自注意力机制(即每个 Token 只能关注到其左侧的上下文)。

  • Input/Output Representations

    为了让 BERT 能够处理各种下游任务,我们设计了一种输入表示方式,这种方式可以在一个 Token 序列中清晰地表示出单个句子,也可以表示出两个有关联的句子(例如,⟨ Question, Answer ⟩)。在我们的研究中,“句子”可以是一段连续的文本片段,而不仅限于实际的语言学意义上的句子。“序列”则是指输入给BERT的 Token序列,这可能是一个独立的句子,或者是两个句子组合在一起。

    我们采用了WordPiece嵌入方法,其词汇表规模为30000个Token。每个序列的第一个Token总是一个特殊的分类Token([CLS])。对应这个Token的最后一个隐藏状态被用作分类任务中的序列总体表示。我们会将一对句子组合成一个单独的序列。我们通过两种方式来区分这些句子。首先,我们使用一个特殊的Token([SEP])来分隔它们。其次,我们为每个Token添加一个训练得到的嵌入,用来标识它是属于句子A还是句子B。如图 1 所示,我们将输入的嵌入记做E,[CLS]标记的最后一个隐向量记做C,以及第 i 个输入token的最后一个隐向量记做 $ T_i $ 。

    对于一个特定的token,我们通过将对应的token、分段、和位置的嵌入相加,来构建它的输入表示。图2即为这种构建方式的可视化展示。

图2:BERT 的输入表示方法。输入嵌入是 token 嵌入、分段嵌入和位置嵌入的总和。

Pre-training BERT

我们的方法与 ‘Peters et al. (2018a)’ 和 ‘Radford et al. (2018)’ 的方法有所不同,他们采用的是传统的顺序(从左至右或从右至左)语言模型进行 BERT 的预训练。而我们则选择使用两种特定的无监督学习任务来预训练 BERT,这些任务将在本节中详细介绍。你可以在图 1 的左侧部分看到这个预训练步骤的示意图。

  • Task #1: Masked LM

    直观上看,深度双向模型必然比单向模型(从左到右或从右到左)或者是简单地将一个从左到右的模型和一个从右到左的模型拼接在一起的方法更强大。然而,遗憾的是,我们通常只能以从左到右或从右到左的方式来训练标准的条件语言模型,因为如果允许模型同时考虑两个方向的信息,每个单词就能间接地“看到”自己,这就使得模型可以轻易地在多层次的上下文中预测出目标单词。

    为了训练出深度的双向表示,我们采用了一种简单的方法:随机遮蔽输入中的一部分 tokens,然后预测这些被遮蔽的 tokens。我们把这个过程称为 “遮蔽语言模型”(Masked LM,简称 MLM),在学术界,这种任务有时也被称为 “填空任务”(Cloze task)。在这个过程中,对应被遮蔽 tokens 的最后一层隐藏向量会被输入到一个 softmax 函数中,这个函数会输出一个覆盖整个词汇表的概率分布,这与传统的语言模型是一样的。在我们的所有实验中,我们会随机遮蔽每个序列中 15% 的所有 WordPiece tokens(词片 tokens)。与 “降噪自编码器”(Denoising Auto-encoders)不同的是,我们只预测被遮蔽的词,而不是重构整个输入。

    尽管这种方法让我们可以得到一个预训练的双向模型,但它也带来了一个问题,那就是在预训练和微调阶段出现了不匹配,因为在微调阶段并没有使用 [MASK] token。为了解决这个问题,我们在“遮蔽”单词时,并不总是用 [MASK] token 来替换。在生成训练数据时,我们会随机选取 15% 的 token 位置进行预测。如果选中了第 i 个 token,那么我们会这样替换它:80% 的情况下用 [MASK] token 替换,10% 的情况下用随机的 token 替换,剩下 10% 的情况下保持原样。然后,我们会用交叉熵损失函数来预测 $T_i$ 的原始 token。

  • Task #2: Next Sentence Prediction (NSP)

    如问题回答(QA)和自然语言推理(NLI)等许多重要的下游任务,都是基于理解两个句子之间的关系,而这种关系并非能直接通过语言模型获取。为了训练出能理解句子关系的模型,我们采用了预训练方法,针对一个“下一句预测任务”,该任务可以简单地从任何单语语料库中生成。具体来说,当我们为每个预训练样本选择句子 A 和句子 B 时,有 50% 的概率 B 是真正紧跟在 A 后面的句子(我们标记为“IsNext”),另外 50% 的概率 B 是从语料库中随机抽取的句子(我们标记为“NotNext”)。如图 1 所示,C 被用于下一句预测(NSP)。尽管它很简单,但我们在第 5.1 节证明,这种预训练方式对于 QA 和 NLI 这两种任务都大有裨益。

    NSP 任务与 ‘Jernite et al. (2017)’ 和 ‘Logeswaran and Lee (2018)’ 的研究中使用的目标表示学习方法密切相关。但是,在以前的研究中,只有句子嵌入被应用到下游任务中,而 BERT 则将所有参数应用于初始化最终任务的模型参数。

  • Pre-training data

    我们的预训练过程大致遵循了现有的语言模型预训练方法。在预训练语料库的选择上,我们使用了 BooksCorpus(8亿词)和英文维基百科(25亿词)。对于维基百科,我们只提取了文本段落,忽略了列表、表格和标题。与使用如’Billion Word Benchmark’这样的打乱的句子级别语料库不同,选择文档级别的语料库以提取长的连贯序列是非常关键的。

Fine-tuning BERT

BERT的微调过程相当直观,这得益于Transformer中的自注意力机制,它使得BERT能够处理许多下游任务,无论这些任务是涉及单个文本还是文本对,只需要更改相应的输入和输出即可。对于涉及文本对的应用,常见的做法是先独立地对每段文本进行编码,然后再应用双向交叉注意力,这种做法可以参见 ‘Parikh et al. (2016)’ 和 ‘Seo et al. (2017)’ 的研究。然而,BERT采用了自注意力机制,将这两个阶段融为一体。也就是说,通过自注意力机制对连接后的文本对进行编码,实际上已经包含了两个句子之间的双向交叉注意力。

对于每项任务,我们只需将特定任务的输入和输出接入到 BERT 中,并进行全面的参数微调。在输入端,预训练时用到的句子 A 和句子 B 在不同任务中有不同的对应关系,例如:(1)在改述任务中,它们对应于一对待改述的句子;(2)在蕴含(entailment)任务中,它们对应于假设和前提两部分;(3)在问答任务中,它们对应于问题和答案段落;(4)在文本分类或序列标记任务中,它们对应于一段文本和一个空标记。在输出端,token 的表示形式会被用于 token 级别的任务,如序列标记或问答,而 [CLS] 的表示形式会被用于分类任务,如蕴含或情感分析。

相较于预训练,微调的计算资源和时间消耗更少。无论是在单个 Cloud TPU 上,还是使用 GPU,只需最多一小时或几小时,就可以重现本文中所有的结果,前提是使用完全相同的预训练模型。关于任务特定的详细内容,我们已在第4节的对应小节中进行了描述。

Experiments

在本节中,我们将为大家展示 BERT 在 11 个自然语言处理任务上的微调成果。

GLUE

General Language Understanding Evaluation(GLUE)基准测试是汇集了多种自然语言理解任务的一项测试。

为了对 GLUE 进行微调,我们将输入序列(无论是单个句子还是句子对)处理为第3节所描述的形式,并使用与第一个输入 token ([CLS]) 相对应的最终隐藏向量 $ C \in \mathbb{R}^{H} $ 作为整体的表达形式。微调过程中新引入的唯一参数是分类层的权重 $ W \in \mathbb{R}^{K * H}$,其中 K 是标签的数量。我们用 C 和 W 来计算常规的分类损失,如 $ log(softmax(CW^{T}))$。

表1:GLUE 测试结果。

如 表1 所示,BERT_BASE 和 BERT_LARGE 在所有任务中均表现优秀,相较于先前的最先进技术,平均准确度分别提高了4.5% 和 7.0%。值得注意的是,除了注意力掩蔽(masking)的差异,BERT_BASE 和 OpenAI GPT 在模型架构上几乎完全相同。在最大且被广泛报告的 GLUE 任务 MNLI 中,BERT 实现了4.6%的绝对准确度提升。在官方 GLUE 排行榜10中,BERT_LARGE 的得分为80.5,而在本文写作时,OpenAI GPT 的得分为72.8。

BERT_LARGE 在所有任务中都显著优于 BERT_BASE,尤其在训练数据非常少的任务中表现更为出色。我们将在第5.2节更深入地探讨模型大小对性能的影响。

SQuAD v1.1

斯坦福问答数据集(SQuAD v1.1)包含了10万对由众包产生的问题和答案。给定一个问题和一个包含答案的维基百科段落,任务就是要在段落中预测出答案文本的位置。

如图 1 所示,在问答任务中,我们将输入的问题和段落打包成一个序列,其中问题使用 A 嵌入,段落使用 B 嵌入。在模型的微调阶段,我们引入了两个特殊的向量,一个叫做"起始向量" S,另一个叫做"结束向量" E。这两个向量的作用是帮助我们计算出单词i作为答案开始部分的概率。通过计算 $T_i$ 和 $S$ 的点积,然后在段落中所有单词上进行 softmax 运算转化成概率。最后我们得到的概率就表示这个单词作为答案开始部分的可能性。

公式表示为 $ P_i = \frac{e^{S · T_i}}{\sum_{j}{e^{S · T_j}}}$ 。

对于答案的结束部分,我们也使用一种类似的计算方法。这个方法会给从位置 i 到位置 j 的一段文字打分, 定义为 $S · T_i + E · T_j$,其中 $j ≥ i$ 的最高得分范围被用作预测的答案。训练目标是正确的开始和结束位置的对数似然之和。我们进行了 3 轮的微调,学习率为 5e-5,批量大小为 32。

表2 展示了领先的排行榜成绩以及顶级已发布系统的表现。SQuAD 排行榜上的最佳成绩并未提供最新的公开系统描述,并且在训练他们的系统时,可以使用任何公开的数据。因此,我们在自己的系统中通过先在 TriviaQA 上进行模型微调(fine-tuning),再在 SQuAD 上进行微调,以实现适当的数据增强策略。

表2:SQuAD 1.1 的结果。BERT ensemble是有7套系统组成,使用了不同的预训练阶段的checkpoints和微调的seeds

我们表现最好的系统在集成模式下,F1 分数比排行榜顶部的系统高出1.5个点,作为单一系统,也高出1.3个F1分数。事实上,我们的单一 BERT 模型在 F1 分数上甚至超过了顶级的集成系统。即使没有 TriviaQA 的微调数据,我们的 F1 分数也只会下降0.1-0.4个点,但仍然以很大的优势领先于所有现有的系统。

SQuAD v2.0

SQuAD 2.0 任务在 SQuAD 1.1 问题定义的基础上进行了扩展,允许在给定的段落中可能不存在短答案,这使得问题更具现实性。

为了完成这项任务,我们采用了一种简单的策略,将SQuAD v1.1的BERT模型进行了扩展。对于那些没有答案的问题,我们将其答案的开始和结束都定位在 [CLS] Token 上。也就是说,答案的开始和结束的可能位置被扩展,包括了 [CLS] Token 的位置。在进行预测时,我们会比较无答案范围的得分 ($s_{null} = S·C + E·C$) 和最佳非空答案范围的得分 ($s_{\hat{i},j} = max_{j \geq i} S·T_i + E·T_j$)。只有当 $s_{null} > s_{\hat{i},j} + \tau$时,我们才会预测出一个非空的答案。这个阈值 $τ$ 是我们在开发数据集上通过最大化 F1 分数来选择的。对于这个模型,我们没有使用 TriviaQA 的数据进行训练。我们进行了两个周期的微调,使用的学习率为5e-5,批量大小为48。

表3:SQuAD 2.0 的结果。我们排除了所有包含 BERT 作为一部分的项目。

我们在 表3 中展示了与先前的排行榜成绩和已发表的顶级研究相比的结果,但并未包括那些使用 BERT 作为组成部分的系统。我们发现,与之前最好的系统相比,F1 分数提高了 5.1。

SWAG

Situations With Adversarial Generations (SWAG) 数据集包含了 113k 个句子配对填充示例,这些示例被用于评估基于实际常识的推理能力。给定一个句子,任务是在四个选项中选择最有可能的接续。

在对 SWAG 数据集进行微调时,我们构造了四个输入序列,每个序列包含给定的句子(A)和一个可能的延续(B)的连接。唯一引入的任务特定参数是一个向量,其与 [CLS] token 表示 C 的点积代表每个选项的得分,该得分通过 softmax 层进行归一化。我们对模型进行了3轮微调,学习率为2e-5,批量大小为16。结果在 表4 中展示。BERT_LARGE 的表现超过了 ESIM+ELMo (作者的基线) 27.1%,超过了 OpenAI GPT 8.3%。

表4:SWAG 的开发集和测试集的准确率。人类的表现是通过在 SWAG 论文中报告的 100 个样本来衡量的。

Ablation Studies

在这一部分,我们通过消融实验,探讨了 BERT 的多个关键要素,以便更好地理解它们各自的重要性。

Effect of Pre-training Tasks

我们通过评估两个使用与 BERT_BASE 完全相同的预训练数据、微调方案和超参数的预训练目标,展示了 BERT 的深度双向性的重要性:

No NSP: 一种双向模型,该模型使用 “masked LM”(MLM)进行训练,但不包括 “next sentence prediction”(NSP)任务。

LTR & No NSP: 一个只考虑左侧上下文的模型,它采用的是标准的从左到右(Left-to-Right,LTR)语言模型训练方式,而不是被遮蔽的语言模型(Masked Language Model,MLM)。在微调阶段,我们也坚持了这种“只看左边”的规则,因为如果不这样做,预训练和微调阶段的处理方式就会不一致,这可能导致模型在实际任务中的表现下降。另外,这个模型在预训练阶段并没有执行“下一句预测”(Next Sentence Prediction,NSP)任务。这个模型可以直接和 OpenAI 的 GPT 进行比较,不过我们使用了更大的训练数据集,我们自己的输入数据表示方法,以及我们自己的微调策略。

我们首先研究了 NSP 任务带来的影响。在 表5 中,我们展示了去掉 NSP 在 QNLI、MNLI 和 SQuAD 1.1 上显著降低了性能。接下来,我们通过比较“No NSP”和“LTR & No NSP”来评估训练双向表示的影响。LTR 模型在所有任务上的表现都比 MLM 模型差,其中在 MRPC 和 SQuAD 上的下降尤为显著。

对于 SQuAD 任务,我们可以直观地理解,一个从左到右(LTR)的模型在预测单个字符(token)时表现会很差,因为这些字符级别的隐含状态缺乏右侧的上下文信息。为了尽可能地提升这个从左到右的系统,我们在其上增加了一个随机初始化的双向长短期记忆网络(BiLSTM)。这确实在 SQuAD 任务上取得了显著的改善,但是与预训练的双向模型相比,其结果仍然相差甚远。而且,BiLSTM 在 GLUE 任务上的表现反而下降了。

我们意识到,也可以像 ELMo 那样,分别训练从左到右(LTR)和从右到左(RTL)的模型,然后将每个字符(token)的表示形式作为这两个模型的结合。但是,这种方式存在以下问题:(a) 它的成本是单个双向模型的两倍;(b) 对于像问答(QA)这样的任务,这种方式并不直观,因为从右到左的模型无法根据问题来决定答案;© 它的能力不如深度双向模型,因为深度双向模型可以在每一层都同时使用左右两侧的上下文信息。

Effect of Model Size

在这一部分,我们研究了模型规模对微调任务精度的影响。我们训练了多个BERT模型,这些模型在层数、隐藏单元和注意力头的数量上有所不同,但在超参数和训练流程上,它们与前文描述的保持一致。

如 表6 所示,我们给出了在选定的GLUE任务上的结果。在这个表格中,我们给出了在进行5次随机微调后,开发集(Dev Set)准确度的平均值。我们可以看到,模型规模更大的BERT模型能在所有四个数据集上都带来准确度的显著提升,即使是在只有3600个标注训练样本,与预训练任务大相径庭的MRPC数据集上也是如此。同时,令人惊讶的是,我们在已经相对于现有研究来说规模较大的模型基础上,还能取得如此显著的提升。例如,'Vaswani et al. (2017)'探索的最大的Transformer模型是(L=6, H=1024, A=16),编码器的参数有100M,而我们在文献库中找到的最大的Transformer模型是(L=64, H=512, A=2),参数有235M。相比之下,BERT_BASE模型包含了110M参数,BERT_LARGE模型包含了340M参数。

表6:对BERT模型大小进行消融实验。#L = 层数的数量;#H = 隐藏层大小;#A = 注意力头的数量。“LM (ppl)”是保留训练数据的被遮蔽的语言模型困惑度。

大家都知道,如果我们增加模型的规模,将会在大规模任务,如机器翻译和语言建模,上取得持续的改进。这一点可以通过查看 表6 中展示的预留训练数据的语言模型复杂度得到证实。然而,我们认为,这是第一项有力地证明,只要模型得到了充分的预训练,即使在非常小规模的任务上,极大地增加模型规模也能带来显著改进的研究。在 ‘Peters et al. (2018b)’ 的研究中,他们针对预训练的双向语言模型大小从两层增加到四层的影响,展示了混合的结果。而 ‘Melamud et al. (2016)’ 则提到,将隐藏维度从 200 增加到 600 有所帮助,但是进一步增加到 1000 并未带来更多的改进。这两项研究都采用了基于特征的方法。我们的假设是,当模型直接在下游任务上进行微调,并且只使用极少量的随机初始化的附加参数时,即使下游任务数据非常少,任务特定的模型也能从更大,更具表达力的预训练表示中受益。

Feature-based Approach with BERT

我们迄今为止展示的所有BERT结果都是采用了微调策略,也就是在预训练模型的基础上增加了一个简单的分类层,并在具体任务上对所有参数进行了统一的微调。然而,基于特征的方法,也就是从预训练模型中提取出固定的特征,也有其独特的优点。首先,不是所有的任务都能被Transformer编码器架构轻松地表达出来,因此有时需要添加特定于任务的模型架构。其次,一种有效的计算策略是先预计算一次训练数据的复杂表示,然后在这个表示的基础上使用更经济的模型进行多次实验。

在这一部分,我们将 BERT 模型应用于 CoNLL-2003 命名实体识别 (NER) 任务,以此来对比两种不同的方法。在为 BERT 模型提供输入的过程中,我们采用了一种能够保留字母大小写的 WordPiece 模型,并且还包括了数据所能提供的最大的文档环境信息。遵循常规的做法,我们将这个任务设定为一个标记任务,但是在模型的输出部分,我们并未使用条件随机场(CRF)层。在对 NER 标签集进行 token 级别的分类时,我们选择了第一个子 token 的表示作为输入。

为了探究微调方法的影响,我们采用了一种基于特征的方法:从 BERT 的一个或多个层中提取激活值,而不对 BERT 的任何参数进行微调。这些上下文嵌入被作为输入送入一个随机初始化的两层 768 维的 BiLSTM,然后再进入分类层。

表7:

结果见 表7。BERT_LARGE 的表现与最先进的方法相媲美。表现最好的方法是将预训练的 Transformer 模型中最顶层的四个隐藏层的 token 表示进行拼接,这仅比微调整个模型的 F1 分数低 0.3。这证明了 BERT 对于微调和基于特征的方法都是有效的。

Conclusion

近期的研究发现,通过使用语言模型进行迁移学习,且在预训练阶段引入大量无监督数据,可以显著提升语言理解系统的性能。特别地,这种方法甚至使得资源匮乏的任务也能从深度单向模型(Deep Unidirectional Models)中获益。我们的主要贡献在于,我们将这些研究成果推广到了深度双向模型(Deep Bidirectional Models),使得同一个预训练模型能够成功应对各种各样的自然语言处理(NLP)任务。

Source

BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding