Bert: 针对语言理解双向深度transformer的预训练模型
摘要
本文介绍一种新的语言表达模型-BERT(Bidirectional Encoder Representations from Transformers).与近期语言表达模型 (Peters et al., 2018a; Radford et al., 2018)不同的是,Bert通过在所有层上调节双向上下文来预训练未标定数据的双向深度模型。结果,预训练的bert模型仅靠额外输出层的微调,且没有大量的针对任务做结构调整,就在多种任务上取得了最好的效果,比如问答系统、语言推理系统。
Bert理论简单但实战有效。它在11个NLP任务中取得了最好的效果,包括将 GLUE分数提高到80.5%(提高7.7%),MultiNLI AUC提高到86.7%(提高4.6%),问答系统SQuAD v1.1 测试F1提高到93.2(提高1.5个点)以及SQuAD v2.0 测试 F1 提高到83.1(提高5.1个点)。
1.简介
语言模型预训练已在多个NLP任务(Dai and Le, 2015; Peters et al.,2018a; Radford et al., 2018; Howard and Ruder,2018)中体现出有效的提升。这些任务不仅包含通过整体分析来推倒句子之间的相关性的句子级别的任务,比如NLI (Bowman et al., 2015;Williams et al., 2018) 和解释系统 (Dolan and Brockett, 2005), 也包含那些产出细粒度token的token级别的任务,比如,实体识别和问答系统。
有两个用于预训练语言表述模型下游任务的策略:基于特征的方法和微调方法。基于特征的方法比如ELMo (Peterset al., 2018a), 使用包含预训练表述作为额外特征的特定任务结构。微调方法,比如OpenAI (Radford et al., 2018), 引进最小特定任务参数,通过在下游任务中简单地微调所有预训练参数来训练模型。这这两种方法在预训练阶段都共享了相同的目标函数,其中,预训练阶段它们使用了单向的语言模型来学习生成语言表达。
我们认为当前的技术限制了预训练表达模型的能力,尤其是对微调方法。主要的限制是标准语言模型是单向的,并且这个限制了预训练阶段网络结构的选择。例如在OpenAI GPT中,作者使用了从左到右的网络结构,在Transformer的自注意力层,每一个token只能注意到它之前的token(Vaswani et al., 2017)。这样的限制对于句子级别的任务是次优的,对于基于微调的token级别任务来说却是不利的,比如在问答系统中这对于从双向组合上下文是至关重要的。
在本文中,我们提出BERT(Bidirectional Encoder Representations from Transformers)来提升基于微调的方法。BERT通过使用“遮挡语言模型”(MLM)预训练目标,在完形填空任务(Taylor, 1953)激发下,减少了之前提到的单行约束问题。该遮挡的语言模型随机遮挡一部分输入的token,其目的是仅基于上下文来预测被遮挡的原始词汇id。不同于从左到右的语言模型于新亮,MLM目标使得表达模型能融合左右上下文,这使得我们可以预训练一个深度的双向Transformer。除了“遮挡语言模型”外,我们还使用一个“下一句预测”任务,该任务预训练文本对表述。本论文的贡献包含以下方面:
我们证明双向预训练对于语言表达的重要性。不同于Radford et al. (2018),使用单向语言模型做预训练,BERT利用遮挡的语言模型使得预训练深度双向表示。这个也可以对比Peters等人的研究. (2018a),他们研究中使用一个从左到右和从右到左的独立训练的语言模型的“浅连接”。
我们展示了预训练表达模型能够减少许多精心设计任务的特定结构。BERT是第一个在众多任务(包括句子级别任务和token级别任务)中取的最好效果的基于微调的表达模型模型,由于许多特定任务的结构。
BERT 提升了11个NLP任务的最好效果。代码和预训练模型可通过以下链接:https://github.com/google-research/bert.
2.相关研究
预训练一般的语言表达有很长的历史,在这一章节我们简单的回顾以下几个最常用的方法。
2.1 基于特征的非监督方法
数十年来,学习单词(词语)的适应性表达(笔者理解应该是解决一词多义的问题)一直是一个活跃的研究领域,包括非神经网的方法(Brown et al., 1992; Ando and Zhang, 2005; Blitzer et al., 2006)和神经网络的方法(Mikolov et al., 2013; Pennington et al., 2014)。预训练词向量是现在自然语言处理系统中一个完整的部分,与从头开始学习的词向量相比有很大的提升(Turian et al., 2010)。为了预训练词向量,从左到右的语言模型目标函数被应用过(Mnihand 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), 在给定前一句子表达的情况下从左到右生成下一句子(Kir¬dkmsos et al., 2015), 或者是加噪自编码衍生出目标函数 (Hill et al., )。
ELMo及其前身通过不同维度推广了传统词向量研究。它们通过从左右到以及从右到左的语言模型提取了上下文相关的特征。每一个token的上下文相关的表达都关联这左右语境。当将已有的特定任务的结构集成上下文祥光的词向量,ELMo提升了几个主要的NLP基础任务的效果,包括问答系统(Rajpurkar et al., 2016),句子分析(Socher et al., 2013),以及命名实体识别(Tjong Kim Sang and De Meulder, 2003)。Melamud 等人2016年提出了通过将LSTM应用到双向文本预测单一词的任务来学习上下文语义。与ELMo雷同,它们的模型都是基于特征而给深度的双向模型。Fedus 等人于2018年展示了完形填空任务可以提升文本生成模型的鲁棒性。
2.2 非监督的微调方法
和基于特征的方法一样,该方法的首要工作也是在标注文本上预训练词向量参数(Col lobert and Weston, 2008)。
更近期(的研究中),产生上下文相关token语音的句编码器和文章编码器,在被未标定的文本中预训练或者在下游的有监督任务中微调(Daiand 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 在有监督数据上的transform学习
已经有研究表明,在大数据集上的有监督任务中transfer很有效,比如自然语言推 (Conneau et al., 2017)和机器翻译 (McCann et al., 2017)。计算机视觉的研究也表明在大型预训练模型的transfer学习的重要性,其中微调模型和在ImageNet数据集(Deng et al., 2009; Yosinski et al., 2014)上预训练是一个有效的方法。
3. BERT
我们会在该小节介绍BERT及其具体实现。我们的框架有两步:预训练和微调。在预训练部分,模型会在覆盖不同预训练任务的未标定数据集上训练。对于微调,BERT模型先用预训练参数初始化,然后在下游任务已标定数据上对所有参数微调。虽然每个下有任务有使用相同的预训练参数初始化,但是他们都有独立的微调模型。图1的问答系统作为本节运作样例。
BERT的一个与众不同特点是在不同的任务中它的接口是一致的。预训练结构和最终下游(任务)结构的差异很小。
模型结构 BERT的模型结构是多层双向的Transformer编码器,该编码器是基于Vaswani等人(2017)描述的原始实现且发布在tensor2tensor库。由于Transformer的使用很普遍并且我们的实现几乎和原版一样,我们将忽略详尽模型结构背景描述,并且请读者参考Vaswani 等人(2017)同样优秀的指导,比如“The Annotated Transformer”。
在本论文中,我们指定L为层数(比如, Transformer blocks),H为隐含数,A为自注意力头的个数。我们主要报告以下两种大小的模型结果:BERTBASE (L=12, H=768, A=12, Total Parameters=110M) 以及BERTLARGE (L=24, H=1024, A=16, Total Parameters=340M).
BERTBASE选用和OpenAI GPT 同样大小的模型用于比较。精确的说,BERT Transformer使用双向自注意力,而GPT Transformer使用被束缚的自注意力,每一个token只能注意到其左边的内容。
输入输出层表示 为了是BERT能应对各种各样的下游任务,我们的输入层表示能够用一个token序列来描述单个句子和成对句子(e.g., h Question, Answeri)。通过这个工作,一个“句子”可以是任意连续文本的一个片段,而不是一个真正的(完整)的符合语言学的句子。“句子”指的是BERT输入的token序列,可以是一个单个句子也可以是两个合并在一起句子。
我们使用拥有30000个token词汇的词向量(Wu et al., 2016)。每一个序列的开头总是一个特定的分类标记([CLS])。最终隐藏状态对应的token被用作分类任务的聚合序列表示。句子对被打包成在一个单个序列。我们使用两种方式来区分句子。第一,我们使用特定的token来区分它们。第二,我们给每一个token增加学习得到词向量来表示是属于句子A还是句子B. 如图1所示,我们制定输入向量记为E,指定[CLS] token的最终隐藏向量记为,第i个输入token的最终隐藏向量记为.
对于给定的token,它的输入表达通过将对应token、片段、位置向量加和来表示。可视化的结构如图2.
3.1 预训练BERT
不同于Peters 等人(2018a) and Radford等人(2018)的研究,我们不使用传统的从左到右或者从右到左的语言模型来预训练BERT。我们使用两个非监督任何来预训练BERT,本小节对此介绍。这一步体现在图1的左半部分。
任务1:遮挡的语言模型 直观的讲,有理由相信一个深度双向模型确实比从左到右模型或者将从左到右和从右到左浅链接模型更强大。不幸的是,标准的条件语言模型只被从左到右或者从右到左训练,由于双向条件能够是的每个词直接的“看到自己”,并且模型可以在多层上下文中详细的预测出目标单词。
为了训练深度双向表述模型,我们随机遮挡一定比例输入的token,然后预测这些被遮挡的token。我们将这个处理叫做“遮挡的语言模型”(MLM),尽管它经常被归类到在文献(Taylor, 1953)中完形填空。这种情况下,遮挡token的最终隐藏向量通过词汇表喂给输出层softmax,正如标准的语言模型(中的操作)。在我们所有的实验中,我们随机在每一个序列中遮挡15% 的词分割token。与加噪自编码 (Vincent et al., 2008)相比,我们只预测被遮挡的词,而非重构整个输入。
虽然这能使我们得到一个双向预训练模型,但是缺点是我们造成了预训练和微调之间的不匹配,因为遮挡的token不会再微调中出现。为了减轻这个缺点,我们不能使用实际遮挡调的token来替代被遮挡掉的词。训练数据生成器随机选取15%的token位置用于预测。如果选中第i个token,我们会用以下方式替代它:(1)80%的情况下遮挡调,(2)10%的情况下随机一个token,(3)剩下的10%维持原状。然后 将被通过交叉熵用于预测。在附录C.2中我们比较了该过程的不同之处。
任务2:下一句子预测(NSP) 许多重要的下游任务都是基于对两个句子之间关系的理解,这不能从语言模型中直接获取到,比如问答系统和自然语言推理。为了训练理解句子之间关系的模型,我们预训练一个二值化的下一句子预测任务,该任务可以由任意单一语言语料库生成。具体的,当选择句子A和B作为预训练样例,50%的情况下B是真正的A的下一句(标记为IsNext),50%的情况下从语料库中任意选一个句子作为下一句(标记为NotNext)。正如图1所示,C用于下一句子预测(NSP)。尽管这很简单,我们仍会在5.1小节展示针对这个任务(指NSP)的预训练对问答系统和自然语言推理非常有效。
NSP任务和Jernite 等人(2017)以及Logeswaran 、Lee (2018)的研究中的表述学习目标非常相近。然而,之前的工作只将句向量传递到下游任务,而BERT将初始化的所有参数来初始化最终任务模型参数。
预训练数据 预训练过程很大程度遵循现有研究的语言模型预训练。预训练语料,我们使用BooksCorpus (800M词汇) (Zhu et al., 2015) 和英文维基百科(2,500M词汇).对于维基百科我们只获取文本片段忽略列表等。对于提取出长的连续序列来说,使用文章级别的语料而不是无序句子级别的语料(比如Chelba 等人2013年的百万词基准)很重要。
3.2 微调BERT
微调是理所应当的操作,因为Transformer中的自注意力机制允许BERT通过替(选用)输入输出数据对许多下游任务进行建模,无论任务涉及单个文本还是文本对。对于涉及文本对应用,一个常用的模块是在应用双向交叉注意力之前独立编码文本对,比如Parikh 等人(2016); Seo 等人(2017)。BERT则使用自注意力机制来统一这两个阶段,因为使用自注意力编码串联文本对有效的包含了两个句子之间的双向交叉注意力。
对于每一个任务,我们(只需要)简单在任务中将输入和输出插入到BERT中,然后端到端的微调所有参数。在输入端,预训练的句子A和句子B就如同(1)复述中的句子对,(2)文本蕴含中的前提假设对,(3)问答系统中的问答对,(4)文本分类或序列标定中的退化的。在输出端,token表述被喂进token级别的任务的输出层,比如序列标定或者问答系统,[CLS]表述被喂进用于分类的输出层,比如文本蕴含或者情感分析。
与预训练相比,微调的代价小很多。论文中所有的结果都可以在一个TPU云上用差不多1个小时复现,在GPU上也就几个小时,从完全相同的预训练模型开始。第4节的相应小节中我们会描述特定任务的细节,更多细节可以参照附录A.5。
4. 实验
本小节,我们将展示BERT在11个NLP任务上的微调。
4.1 GLUE
通用语言理解评估(GLUE)基准(Wang et al., 2018a) 是各种自然语言理解任务的集合。关于GLUE数据集的详细描述参见附录B.1。
在GLUE上的微调,正如第3小节描述那样我们表述输入序列(单个句子或者句子对),然后使用输入的第一个token([CLS])对应的最终隐藏向量作为聚合表示。在微调阶段唯一引入的新参数就是分类层的权重,其中K是类别个数。我们使用C和W来计算一个标准的分类损失函数,比如。
我们使用批处理大小为32,对GLUE上所有任务的数据3次迭代进行微调。对于每个任务,我们都在验证数据集上选用最好的微调学习率( 5e-5, 4e-5, 3e-5, 以及2e-5)。另外我们发现BERTLARGE 在小数据集上有时候并不稳定,因为我们随机执行几次重启并在验证集上选用最好的模型。对于随机重启,我们使用相同的预处理检查点(模型),但是执行不同的微调数据重组以及分类层初始化。
结果如表1所示。在所有任务上BERTBASE 和BERTLARGE 都以很大优势超过了所有系统,相较于之前最好的结果,分别取得了4.5%和7%的平均准确率提升。我们注意到BERTBASE和 OpenAI GPT除了注意力遮挡之外,模型结构几乎一样。对于最大最广记录的GLUE任务,MNLI, BERT达到了4.6%绝对准确率提高。在BLUE排行榜上,BERTLARGE 取的了80.5分,而OpenAI GPT至截稿之日得分为72.8。
我们发现BERTLARGE在所有任务上都明显优于BERTBASE ,尤其是那些训练数据比较少的任务。模型大小的优势将在5.2小节更深入的讨论。
4.2 SQuAD v1.1
斯坦福问答(SQuAD v1.1)系统收集了10万人的问答对(Rajpurkar et al., 2016)。该任务是给定一个问题和包含答案维基百科的一个段落,从段落中找出答案。
如图1所示,在问答任务中,我们将输入的问题和段落表示为单个压缩序列,其实问题使用A向量,段落使用B向量。在微调阶段我们只引入一个开始向量和一个结束向量。第i个词是答案开端的概率计算如下:和S的内积除以所有词的内积(多分类的softmax)。类似的公式用于答案的结尾。从候选文本段(第i个词到第j个词)的得分定义为+,且取满足的所文本段得分最高的最为预测结果。训练的目标函数是开始和结尾位置正确的极大似然函数的对数之和。我们使用学习率为5e-5、批大小为32对3轮迭代做微调。
表2展示了顶级排行榜条目以及源于顶级发布系统的结果(Seo et al., 2017; Clark and Gardner, 2018; Peters et al., 2018a; Hu et al., 2018). SQuAD排行榜的顶级结果还没有最新的公共系统描述,允许在训练他们系统时使用任意公共数据。因此,在对SQuAD微调之前,我们使用适当的数据增强来首先微调TriviaQA (Joshi et al., 2017) 。
我们最好的新能系统胜过顶级排行榜系统,集成系统增加1.5F1,单个系统增加1.3F1. 实际上,在F1分数方面,我们单个BERT模型由于顶级集成系统。在没有TriviaQA的微调数据,我们我们只损失了0.1-0.4 F1,仍然远超于所有现有系统。
4.3 SQuAD v2.0
SQuAD 2.0任务扩展了 SQuAD 1.1的问题定义,通过允许在给定段落中不存在短答案,使得问题更加现实。
对于该任务我们使用简单的方法来扩展SQuAD v1.1 BERT模型。我们把没有答案的问题当做在[CLS]token处有起始位置答案的问题。答案起始位置的概率空间扩展到包含了[CLS]token的位置。对于预测,我们比较无答案分数=和最好(答案)非空分数=。当 +,我们预测是一个非空答案,其中阈值在验证集最大化F1选出。在这个模型中我们没有使用TriviaQA数据。我们使用学习率为5e-5以及批大小为48来微调2轮迭代。
表3中展示了与之前排行榜条目和最好的已发布研究工作(Sun et al., 2018;Wang et al., 2018b),这也包括了所用BERT的一些系统。我们注意到比之前最好的系统F1有5.1提升。
4.4 SWAG
对抗性生成情景数据集(SWAG)包含11.3万句子对完整例子,这些例子评估基于常识的推断(Zellers et al., 2018)。该任务是给定一个句子在四个选项中选择最有可能是下一句的选项。
在SWAG数据集上微调时,我们构建4组输入序列,每一个序列都包含给定句子(句子A)和可能的下一句(句子B)的关联。唯一引入的任务特定的参数是个向量,该向量与[CLS]token的表述C做内积表示每个选项的得分,这个得分会通过softmax做归一化。
我们使用学习率为2e-5、批大小为16对该模型3次迭代做微调,结果如表4所示。BERTLARGE分别以27.1%远超于作者初始ESIM+ELMo系统,8.3%优于OpenAI GPT。
5.消模实验(模型简化实验)
在本小节,我们将在BERT的方方面面进行消模实验,以更好的接他们关联价值。更多的消模研究可参见附录C。
5.1 预训练任务的作用
通过评估两个使用和BERTBASE完全相同的预训练数据、微调策略以及超参的预训练目标,来论证BERT深度双向的重要性。
No NSP: 一个用MLM训练的双向模型,没有NSP任务。
LTR & No NSP: 一个用标准从左到右(LTR)语言模型而非MLM训练的左向上下文模型。左向约束也作用于微调,若删除此约束就会引入与训练和微调不匹配问题,这会减低下游任务的效果。另外模型不使用NSP任务预训练。这直接和OpenAI GPT可对比,但是使用我们更大的训练数据集、我们的输入以及我们的微调策略。
我们首先评测NSP任务带来的影响。表5展示了删除NSP,显著的降低了在QNLI、MNLI和SQuAD 1.1上效果。紧接着,我们通过比较“No NSP”和“LTR & No NSP”来评估训练双向表达的影响。在所有任务中LTP模型都逊色与MLM模型,在MRPC和SQuAD上相差更大。
对于SQuAD数据集,LTR模型在token预测上显然会表现差,因为token级别的隐藏状态,上下文没有右侧信息。为了更好的尝试加强LTR系统,我们在顶层增加随机初始化的BiLSTM。这样做在SQuAD上有显著提高,但是仍然要比预训练双向模型的效果差很多。BiLSTM降低了在GLUE任务上的效果。
我们认识到这是可能的:单独训练LTR和RTL模型并且将每个token表示为两个模型的关联,正如ELMo所做的。然而,(a)这是单个双向模型的两倍开销;(b)对于问答系统这是非直观(可行的),以为RTL模型不能保证答案就是问题(对于应的答案);©它确实没有深度双向模型效果好,因为后者每一层能使用双向上下文。
5.2 模型大小的作用
本小节,我们将探索模型大小在微调任务准确率上的作用。我们使用许多不同层数、隐藏单元以及注意力头来训练BERT模型,然而其他方面如前边描述使用相同的超参和训练过程。
表6展示了GLUE任务的效果。这张表显示了在验证集上5个微调随机重启的平均正确率。我们可以看出较大模型会使得在4个数据集上的正确率明显提升,即使再只有3600个标定的训练样本的MRPC上,也与预训练任务有很大不同。或许令人惊讶的是,相较于现有文献已经相当大模型上我们能够取到如此重大提升。例如,Vaswani 等人2017年提出的最大的Tansformer结构:L=6, H=1024, A=16,用于encoder参数有100M。我们发现Al-Rfou等人2018年的文献中最大的Transformer结构:L=64, H=512, A=2以及235M参数。相比之下,BERTBASE 包含110M参数,BERTLARGE 包含340M参数。
长期以来(研究者)认为,模型大小的增加使得大规模任务能有持续提升,比如机器翻译和语言建模,表6的LMpp(数据)证明了这一点。然而,我们相信这是第一个研究工作证明:经过充分预训练的模型,扩展到极致大小的模型也可以使得小规模任务有很大的提升。Peters 等人(2018b)的研究呈现了将预训练bi-LM由2层变为4层对下游任务影响的混合结果。Melamud 等人(2016)的研究顺带提出隐藏维度从200到600(对效果)有一定提升,但是扩大到1000并没有来带进一步的提升。这些之前的工作都使用了基于特征的方法——我们假设当模型直接在下游任务微调并且只使用极小量的随机初始额外参数,该特定任务的模型可以从更大、耗费更多的预训练表述中获益,及时下游任务非常小。
5.3 基于特征的BERT方法
目前所有BERT结果都使用了微调方法,其中在预训练模型后加一个简单的分类层,以及所有参数在下有任务上一起微调。然而基于特征的方法具有一定优势,从预训练模型中提取固定特征。首先,并不是所有的任务都能通过Transformer编码器架构来简单表述,因此需要添加一个针对任务的模型。其次,在训练数据上进行一次高消耗的预计算表述,然后在这个表述基础上进行多次低消耗的实验,这是主要的计算优势。
在本小节,我们通过将BERT应用到CoNLL-2003命名实体识别任务(Tjong Kim Sang and De Meulder, 2003)来比较两种方法。在BERT的输入中,我们使用保持大小写按字分割的模型,并且包含数据提供的最大文档内容。我们遵循标准实践经验,将其视作一个标注任务,但是不在输出添加CRF层。我们使用第一个sub-token的表述作为NER标定集上token级别分类器的输入。
为消除(BERT中的)微调方法,我们采用基于特征的方法,从一层或多层中提取**信息,不对BERT任何参数做微调。这些文本向量用作分类层前的随机初始化两层786维BiLSTM的输入。
结果如表7所示。BERTLARGE使用最先进方法表现很有竞争力。效果最好的方法将预训练Transformer的顶部4个隐藏层的token描述关联起来,仅仅以0.3F1落后于微调整个模型(的方法)。这证明BERT对于基于微调和基于特征的方法都是有效的。
6.总结
近期源于语言模型迁移学习的实践进展已经证明了大量、非监督的预训练是许多语言理解系统的(不可或缺的)一部分。更进一步的,这些结果甚至能使低资源任务从深度单向的结构中受益。我们的主要贡献在于将这些发现推广到深度双向结构,是的相同的预训练模型能成功的处理一系列NLP任务。