BERT: Bidirectional Encoder Representations from Transformers.
摘要
论文引入了一种称为BERT的语言表征新模型,它支持transformer的双向编码器表征。与最近的语言表征模型不同(Peters et al.,2018a;Radford et al.,2018),BERT设计成通过在所有层中的左右上下文共同调节来对未标记文本的深度双向表征进行预训练。因此,预训练的BERT模型在用于其他广泛的NLP任务中仅仅只需要添加输出层即可,例如问答和语言推断,不需要进行根据特定任务对BERT进行实质性的体系结构修改。
BERT做到了理论简单,但是实验表明它是非常强大的。它在11种自然语言处理任务中取得了state-of-the-art的结果,甚至在有些任务中有非常高的提升。
1 简介
语言模型的预训练已经被证明是改善许多自然语言处理任务的有效方法。这包括sentence-level的任务,如自然语言推理(natural language inference),段落理解(paraphrasing),其目的是通过整体分析句子来预测句子之间的关系。还包括token-level的任务,比如命名实体识别(named entity recognition)和问答(question ansewering),这些模型被要求产生token级别的细粒度(fine-grained)输出。
目前,在下游任务(down-stream tasks)中应用预先训练过的语言表征有两种策略:
1) 基于特征(feature-based)。基于特定的方法使用将预训练好的语言表征当作一个额外的特征输入到基于特定任务的体系结构中,例如ELMo。
2) 微调(fine-tuning)。微调方法引入很少任务特定参数,通过简单微调所有预训练过参数来下游任务进行训练,例如OpenAI GPT。
这两种方法在预训练都使用相同的目标函数,使用单向语言模型来学习一般的语言表征。
作者认为,当前已有的技术限制了预训练表征的强大,尤其是对于微调的方法。主要的限制是标准语言模型是单向的,这就限制了在预训练过程中可选的体系结构。比如OpenAI GPT中使用了一个left-to-right的结构,Transformer中self-attention layers中,每个token都只能根据关注在它前面的token。这种限制导致sentence-level任务是次优的,并且对使用fine-tuning方法来实现token-level任务是非常有害的,例如question answering中,前后文的信息非常重要。
在论文中,作者对基于微调的方法进行了改进,提出了BERT。BERT通过使用“遮蔽语言模型”(masked language model, MLM)预训练目标来缓解先前提到的单向性约束。遮蔽语言模型随机遮蔽输入的一些token,目标是去预测原文中被遮蔽后的词汇ID。不同于left-to-right语言模型预训练,MLM目标能使语言表征融合左右文本信息,这允许对深的双向Transformer进行预训练。除了遮蔽语言模型,论文还训练了“下一个句子预测”任务,联合地对文本对的表征进行了学习。论文的贡献如下:
2 相关工作
2.1 基于特征的非监督方法
在方面的工作有:word embedding,sentence embedding,paragragh embedding
ELMo分别使用了left-to-right和right-to-left的语言模型来提取上下文敏感(context-sensitive)的特征。然后concatenation这两个特征来表示token的上下文表征(word embedding)。当将ELMo的上下文word embedding与现有的特定任务的网络结构结合后提高了几个state-of-the-art的主要NLP benchmarks。包括问答,情绪分析,实体命名识别。
2.2 基于微调的非监督方法
句子或文档编码器通过没有标记的文本上进行预训练得到上下文的词表征,然后在下游任务中进行监督微调。这中方法的优点是只有很少的参数需要需要从头开始学习。基于此,OpenAI GPT在许多sentence-level任务中取得了state-of-the-art的结果。
2.3 从监督数据中进行迁移学习
从大量数据中进行训练然后迁移到特定任务中进行监督学习,在自然语言处理任务中,如自然语言推理和机器翻译,以及计算机视觉任务中都表面了其有优越性。
3 BERT
BERT主要包含两个过程:pre-training 和 fine-tunning。在预训练期间,在不同的预预训练任务上使用未标记的数据对该模型进行的训练(同一个 model)。在微调期间,首先用预训练的参数初始化BERT模型,并且使用来自下游任务的标记数据对所有参数进行微调。每个下游任务都有单独的微调模型,即使它们是用相同的预训练参数初始化的。图1中的问答示例将作为本节的运行示例。
BERT的一个显著特点是其同一个网络结构可以跨越不同的任务,在预训练的网络结构和最终的下游任务结构之间只有很小的不同(最后多一个输出层)。
Model Architecture。BERT的模型结构是一个多层的双向Transformer编码器,Transformer几乎直接是基于Vaswani et al. (2017)的原始实现。论文使用 L 来代表网络的层数,即Transformer block的个数,H指代隐藏层维度,self-attention head的数量用A来表示。在论文所有的cases里都将feed-forward/filter的大小设置为4H,即3072对应于H=768,4096对应于H=1024。论文主要展示了两种模型大小的结果。一是BERTBASE (L=12,H=768,A=12,参数量:110M),二是BERTLARGER (L=24,H=1024,A=16,参数量:340M)。BERTBASE 与OpenAI GPT有相同的模型大小,因此两个具有可比性。需要注意的是,在这篇论文中,将双向Transformer称为Transformer编码器,将OpenAI GPT中的单向Transformer称为Transformer解码器,因为它只能关注前面(左侧)的上下文。
Input/Output Representations。为了使BERT可以处理各种下游任务,在一个token序列中,它的输入表征能够同时明确的表达一个单个句子和一对句子。在整个工作中,“句”可以是任意的连续文本,而不是实际的语言语句,“序列”指的是BERT的输入token序列,可以是单句或两个句子打包在一起。论文使用了具有30,000词汇大小的WordPiece embedding。句子头部使用了一个特殊标记[CLS],与这个标记对应的最后隐藏状态可以在分类任务中用来作为这个输入句子的表征。当句子对融合卫一个句子时,论文用两种方式来区分它们。一是使用一个特殊的token[SEP],二是其,在每个token中添加一个学习过的embedding来指示它是属于句子A还是句子B。如图1所示,输入的embedding表示卫E,最后的隐藏层向量中,[CLS]是指句子的表征C∈R^H,第i个向量是指第i个输入token的输出表征Ti∈R^H。
对于给定的token,它的输入表征是通过对相应的token、segment和position embedding的求和来构造的。在图2中可以看到这个结构的可视化。
3.1 预训练BERT
BERT是一个多任务模型,它的任务是由两个自监督任务组成,即MLM和NSP。
TASK 1: Masked LM (MLM)。直观地讲,深度双向模型比left-to-right模型或left-to-right模型和right-to-left模型的串联更强大。但是,标准的条件语言模型只能left-to-right或right-to-left进行单向训练,因为双向条件训练可以使每个词间接地“看到自己”,
为了训练深度双向表示,作者随机地遮掩一定百分比的输入token,然后预测这些被遮掩的token,这个过程称为“masked LM”(MLM),可以理解为完型填空。在这种情况下,与maked token对应的最终隐藏向量被输入到对应词汇表的输出Softmax中。作者在实验中遮掩了输入序列15%的token。与去噪自动编码器不同,BERT只预测maksed token,而不是重构整个输入。
虽然这可以获得一个双向的预训练模型,但缺点是在预训练模型和下游任务微调之间造成了不匹配,因为[MASK] token并不会出现在微调中,为了减轻这个问题,BERT并不总是用[MAKS]去遮掩需要被遮掩的token,训练数据随机选择15%的token位置来进行预测,如果第i个token被选择了,那么它有80%的概率被[MASK]替换,10%的概率被随机token替换和10%的概率不改变。使用交叉熵损失来得到预测原始token的Ti。
TASK 2:Next Sentence Prediction (NSP)。
许多重要的下游任务,如问答(QA)和自然语言推理(NLI),都是基于理解两句之间的关系,而不是通过语言建模直接捕捉到的。为了训练模型能理解句子之间的关系,论文作者对下一个句子预测预训练了一个二分类任务。对于每个训练样本都包含一个句子A和一个句子B,让模型去判断B是否是A的下一句,一般B有50%的概率是A的真实下一句,对其标记卫IsNext,有50%的概率是语料库中的随机句子,对其标记卫NotNext。在图1的模型结构中,C(一般可用于句子分类)可以用来判断B是否是A的下一句。这种操作虽然简单,但是效果极好,在下一个句子预测中能达到97%-98%的准确率,预训练的模型对QA和NLI的提升也很大。
对比:word2vec的一个精髓是引入了一个优雅的负采样任务来学习词向量(word-level representation),BERT使用句子级负采样任务学到句子表示。同时在句子表示上,BERT这里并没有像下游监督任务中的普遍做法一样,在encoding的基础上再搞个全局池化之类的,它首先在每个sequence(对于句子对任务来说是两个拼起来的句子,对于其他任务来说是一个句子)前面加了一个特殊的token[CLS]。然后让encoder对[CLS]进行深度encoding,深度encoding的最高隐层即为整个句子/句对的表示。这个做法乍一看有点费解,不过Transformer是可以无视空间和距离的把全局信息encoding进每个位置的,而[CLS]作为句子/句对的表示是直接跟分类器的输出层连接的,因此其作为梯度反传路径上的“关卡”,当然会想办法学习到分类相关的上层特征。
预训练数据
因为模型要学习词和上下文已经句子和上下文的关系,需要使用document-level的语料库,而不能使用sentence-level的语料库(如Billion Word Benchmark)
document-level的语料库:
BooksCorpus (800M words)
English Wikipedia (2,500M words)。只提取文本段落,忽略列表、表和标题。
3.2 微调BERT
对于需要处理文本对的应用,常见的做法是先分别对文本对进行编码,然后再应用双向交叉注意力机制。但是BERT改用自注意力机制来统一了这两个阶段,因为自注意力机制对拼接的文本对编码时包括了两个句子间的双向交叉注意力。
对于每个任务,只需将任务的输入和输出插入到BERT中,然后端到端的训练所有参数。句子A和句子B被统一指代输入的两个句子,可以是(1)段落的句子对,(2)推理中的假设-前提对,(3)问答对以及(4)针对文本分类或者序列标注的退化text-null(B为空)。在输出部分,token的表征可以输入到额外添加的输出层中进行token-level的任务,比如序列序列标注或者问答,[CLS]的表征可以表示为一个句子的表征,可以输入到输出层进行分类,例如推理或者情感分析任务。
相比于BERT的预训练,微调就相对便宜一下,BERT 预训练需要大量时间(使用 16 个 TPUv3 训练 3 天) BERT大号则需要更长
BERT 在 33 亿文本的语料上训练语言模型,谷歌用了 16 个自己的 TPU 集群(一共 64 块 TPU)来训练大号版本的 BERT,一共花了约4天的时间。(现在提出了优化将BERT训练时间缩短到76分钟,但是使用了1024块TPUv3 ==)目前谷歌公布了代码预训练模型,前面写了网址,我们可以直接拿来进行任务微调,作者在论文指出论文中的11项任务都是在一个单独的Cloud TPU上微调一个小时即可完成,或者在一个单独的GPU上微调几个小时(还是可行的)。
在不同任务上的模型效果
4 实验
4.1 GLUE数据集上的效果
作者在GLUE数据集进行微调,GLUE是General Language Understanding Evaluation的简称,包含了各种自然语言处理的任务,提供相关数据集。
GLUE基准包括以下数据集,其描述最初在Wang等人(2018)的文章中进行了总结:
多类型自然语言推理是一项大规模的众包蕴涵分类任务(Williams等,2018)。给定一对句子,目标是预测第二句与第一句相比是蕴涵、矛盾还是中立。
Quora问题对是一个二元分类任务,其目的是确定Quora上提出的两个问题是否在语义上是等价的(Chen等,2018)。
问题自然语言推理是斯坦福问题答疑数据集(Rajpurkar等,2016)的一个版本,已被转换为二元分类任务(Wang等,2018)。正例是(问题,句子)对包含正确答案,而负例是(问题,句子)来自同一段落,不包含答案。
斯坦福情感树库2是一个二元单句分类任务,由从电影评论中提取的句子和人类注释的情绪组成(Socher等,2013)。
语言可接受性语料库是一个二元单句分类任务,其目标是预测英语句子在语言上是否“可接受”(Warstadt等,2018)。
语义文本相似性基准是从新闻标题和其他来源中提取的句子对的集合(Cer等,2017)。它们用1到5的分数进行注释,表示两个句子在语义上的相似程度。
微软研究院解释语料库由从在线新闻源自动提取的句子对组成,其中人类注释是否该对中的句子是否在语义上相等(Dolan和Brockett,2005)。
识别文本蕴涵是类似于MNLI的二进制蕴涵任务,但训练数据少得多(Bentivogli等,2009)。(注:请注意,本文仅报告单任务微调结果。多任务微调方法可能会进一步推动结果。例如,我们确实观察到MNLI多任务培训对RTE的实质性改进。)
威诺格拉德自然语言推理是一个源自(Levesque等,2011)的小型自然语言推理数据集。GLUE网页指出,该数据集的构建存在问题,并且每个提交给GLUE训练过的系统的性能都比预测大多数类别的65.1基线准确度差。(注:https://gluebenchmark.com/faq) 因此,我们将这一组排除在OpenAIGPT的公平性之外。对于我们的GLUE提交,我们总是预测其大多数的类。
对于分类任务,额外的参数矩阵表示为W∈R^(K×H),K是类别的个数。使用 C和W来计算标准分类损失,例如log(softmax(CW^T)),C是[CLS]的隐藏向量 C∈R^H
设置batch size: 32,epoch: 3,学习率:5e-5, 4e-5, 3e-5, 2e-5。
大号BERT在小的数据集上不是很稳定。
表一给出了结果。大号BERT的效果更加,尤其在小数据集上。但是两种BERT都全面超过了之前sate-of-the-art的方法。
4.2 SQuADv1.1问答数据集效果
SQuADv1.1(Stanford Question Answering Dataset)包含100k的问答数据对。
微调时,句子A对应问题,句子B对应一段包含答案的文本,模型任务就是预测答案在B中的位置。所以微调只需要引入一个开始位置的向量S∈R^H和结束位置的向量E∈R^H。判断B中的token是否时起始位置,只需对应的Ti与S进行点乘,然后输入到softmax中
结束位置的计算和起始位置的计算是一样的。对于答案候选片段 i~j的最终得分记为
训练目标函数是正确起始位置和结束位置的对数似然的和
设置batch size:32, epoch: 3,学习率:5e-5
表二展示了结果,问答的效果没有前面GLUE数据集上的任务表现强。
4.3 SQuAD v2.0
SQuAD v2.0是SQuAD v1.1的扩展,它允许在所提供的段落中不存在简短的答案,从而使问题更加现实。起始和结束的答案跨度位置的概率空间被扩展为包括[CLS]标记的位置。没有答案的跨度分数为:-s_null=S·C + E·C
非空跨度的最佳得分记为:
将两者进行比较,如果包含答案则满足:
后面一项是与之,用来使F1最大化。
设置batchsize:48, epoch:2, 学习率5e-5
结果如表三
4.4 SWAG
SWAG: Situations With Adversarial Generations
对抗生成情境(SWAG)数据集包含113k个句子对的完成样例,用于评估基础常识推理。给定一个句子,任务是在四种选择中选择最合理的后续。
当对数据集进行微调时,作者构造了四个输入序列,每个序列包含给定句子A句)的串联和可能的延续(B句)。引入的唯一特定于任务的参数是一个向量,它与[CLS]表征C进行点积来表示每个选择的分数,该分数被一个Softmax层规范化。
设置epoch:3, batchsize:16,学习率2e-5.
结果如表四