论文译文——BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding


笔者在网上搜寻了很多文章,关于BERT这篇文章几乎没有完整的论文译文。所以我决定整理一篇译文出来,供大家参阅,如有不妥,请联系我改正。谢谢大家

摘要

我们引入了一种称为BERT的新的语言表示模型,BERTBidirectional Encoder Representations from Transformers,即Transformer的双向编码器表示。 与最近的语言表示模型不同(Peters等,2018a; Radford等,2018),BERT旨在通过联合调节(jointly conditioning)所有层中的左右上下文来预训练深度双向表示。因此,只需一个额外的输出层就可以对预先训练的BERT表示进行微调,从而为各种任务创建最先进(state-of-the-art)的模型(例如问答和语言推理),而无需基本的特定任务架构的修改。

BERT在概念上简单且经验丰富。 它在11项自然语言处理任务中获得了最新的(state-of-the-art)成果,包括将GLUE基准(benchmark)推至80.5%(绝对提高7.7%),MultiNLI准确率达到86.7%(绝对改进5.6%)和SQuAD v1.1 问题回答测试F1(Test F1)到93.2(绝对提高1.5%),还有SQuAD v2.0 问题回答测试F1(Test F1)到83.1(绝对提高5.1%)

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) 和解码(paraphrasing ) (Dolan和Brockett,2005) ,旨在通过整体(整体的)分析来预测句子之间的关系, 以及词语级任务(token-level tasks),如命名实体识别 (Tjong Kim Sang和De Meulder,2003) 和SQuAD问题回答 (Rajpurkar等,2016) ,其中模型需要在令牌级别(token-level)生成细粒度输出(grained output)。

将预训练语言表示应用于下游任务(downstream tasks)有两种现有策略:基于特征(feature-based )和微调( fine-tuning)。 基于特征的方法,例如ELMo (Peters等,2018) ,使用特定任务的体系结构,其包括预先训练的表示作为附加特征。微调方法,例如Generative Pre-trained Transformer(OpenAI GPT) (Radford et al,2018) ,引入了最小的任务特定参数(minimal task-specific parameters),并通过简单地微调预训练参数来完成下游任务。 在以前的工作中,两种方法在预训练期间共享相同的目标函数,在这些方法中,他们使用单向语言模型来学习一般语言表示。

我们认为当前的技术严重限制了预训练表示的能力,特别是对于微调方法。 主要限制是标准语言模型是单向的(unidirectional),这限制了在预训练期间可以使用的体系结构的选择。例如,在OpenAI GPT中,作者使用从左到右架构,其中每个词语(token)只能处理Transformer的自我关注层中(self-attention layers)的前一个词语(previous tokens) (Vaswani等,2017) 。 这些限制对于句子级别的任务来说是次优的(sub-optimal),并且在将基于微调的方法应用于词语级任务(token-level)(如SQuAD问答)时可能是毁灭性(devastating )的(Rajpurkar等,2016),因为这些任务对于从两个方向融合上下文信息是至关重要的。

在本文中,我们通过提出BERT:Bidirectional Encoder Representations from Transformers 来改进基于微调的方法。 受到完形任务(Cloze task)的启发 (Taylor,1953) ,BERT通过提出新的预训练目标来解决前面提到的单向约束:“masked language model”(MLM)。The masked language model 从输入中随机地mask 掉一些 tokens ,目标是仅基于其上下文来预测被mask掉的单词的原始单词id 。与从左到右(left-to-right)的语言模型预训练不同,MLM目标 允许 representation 去融合左右上下文,这允许我们预训练深度双向Transformer 。 除了masked language model,我们还引入了“下句预测(next sentence prediction)”任务,该任务联合预先训练文本表示。

我们的论文的贡献如下:

  • 我们证明了双向预训练对语言表示的重要性。 不像 Radford等人(2018) 使用单向语言模型进行预训练,BERT使用 masked 语言模型(masked language model)来实现预训练的深度双向表示,这也与 Peters等人(2018) 形成对比,其使用由独立训练的从左到右和从右到左的LM的浅层连接。
  • 我们证明了预训练表示 减少了许多繁杂设计的任务特定体系结构的需求。 BERT是第一个基于微调表示模型,它在大量 句子级和词语级任务上实现了最先进(state-of-the-art)的性能,优于许多具有特定任务体系结构的系统。
  • BERT超越11项NLP任务的目前的最新技术。 我们还发现了BERT的广泛消融(extensive ablations),证明了我们模型的双向性质(bidirectional nature)是最重要的新贡献。 代码和预先训练的模型在:https://github.com/google-research/bert

2. 相关工作

预训练通用的语言表示有很长的历史,这部分我们简要回顾一下最广泛使用的算法。

2.1 Unsupervised Feature-based Approaches(基于特征的无监督的方法)

几十年来,学习广泛适用的词语表示一直是研究的一个活跃领域,包括非神经学 (Brown et al,1992; Ando and Zhang,2005; Blitzer et al,2006) 和 神经 (Collobert and Weston,2008; Mikolov等,2013; Pennington等,2014) 方法。预训练的单词嵌入被认为是现代NLP系统的一个组成部分,与从头学习的嵌入( embeddings learned from scratch)相比有着显着改进(Turian等,2010)。为了预训练 词嵌入向量,使用了从左到右的语言建模目标,还有 在左右上下文中区分正确单词和错误单词的目标。

这些方法已被推广到更粗糙的粒度(coarser granularities),例如句子嵌入(sentence embeddings)(Kiros等,2015; Logeswaran和Lee,2018)或段嵌入(paragraph embeddings)(Le和Mikolov,2014)。 为了训练句子表示,现有的工作 使用目标对候选的下一句进行排名(Jernite等人,2017; Logeswaran和 Lee,2018),给定前一个句子的表示从左到右生成下一个句子单词(Kiros等,2015),或去噪自动编码器导出的目标(Hill等,2016)
与传统的单词嵌入一样,这些学习的表示通常也用作下游模型中的特征。

ELMo(Peters等,2017)将传统的词嵌入研究概括(generalizes)为不同的维度。他们提出从语言模型中提取上下文敏感特征(context sensitive features)。 当将上下文词嵌入( contextual word embeddings)与现有的任务特定体系结构集成(integrating)时,ELMo推进(advances )了几个主要NLP基准(benchmarks)测试的最新技术(Peters等,2018),包括关于SQUAD的问题回答(Rajpurkar等,2016),情绪分析(sentiment analysis)(Socher et al,2013),以及命名实体识别( named entity recognition)(Tjong Kim Sang和De Meulder,2003)。

ELMo及其前身(Peters 等人,2017,2018a)沿不同维度概括了传统词嵌入研究。他们从 从左到右和从右到左的语言模型中提取 context-sensitive 特征。每个token的上下文表示 是从左至右和从右至左表示的串联。当将上下文词嵌入与现有的特定任务的体系结构集成时,ELMo超越了几种主要的NLP基准(Peters等人,2018a)的最新水平,其中包括问答(Rajpurkar等人,2016),情感分析(Socher等人,2013年),和命名实体识别(Tjong Kim Sang和De Meulder,2003年)Melamud等人(2016)提出了通过学习使用LSTM从左右上下文预测单个单词的任务来学习上下文表示。与ELMo相似,它们的模型是基于特征的,并且不是深度双向的。 Fedus等人(2018)显示了cloze任务(完形任务)可用于提高文本生成模型的鲁棒性。

2.2 Unsupervised Fine-tuning Approaches(无监督的微调方法)

与基于特征的方法一样,第一种方法仅在未标记文本的预训练词嵌入参数上才可以使用(Collobert和Weston,2008)
最近,产生上下文词表示的句子或者文档编码器,已经从未标记的文本中进行了预训练,并针对有监督的下游任务进行了微调(Dai and Le, 2015; Howard and Ruder, 2018; Radford 等人, 2018)。这些方法的优点是需要从scratch 学习很少的参数。 至少有部分原因是由于这一优势,OpenAI GPT(Radford等,2018)从GLUE基准(benchmark)(Wang et al。,2018)获得了许多句子级任务的最新(state-of-the-art)结果。左右语言建模和自动编码器目标已用于预训练此类模型 (Howard and Ruder, 2018; Radford et al., 2018; Dai and Le, 2015).

2.3 Transfer Learning from Supervised Data(从监督数据进行迁移学习)

也有工作表明从具有大型数据集的监督任务中的有效转移,例如:自然语言推理(Conneau 等人, 2017)和机器翻译(McCann 等人, 2017)。计算机视觉研究也证明了(demonstrated)从大型预训练模型迁移学习的重要性,其中一个有效的方法是微调在ImageNet上预训练的模型(Deng 等人,2009; Yosinski 等人,2014)

3. BERT

我们在本节介绍BERT及其详细实现。 我们的框架中有两步:预训练和微调。在预训练部分,模型在不同的预训练任务上使用未标记数据进行训练。对于微调部分,BERT模型首先用预训练参数进行初始化,所有参数使用来自下游任务的带标记数据进行微调。每个下游任务有独立的微调模型,尽管他们是使用相同的参数初始化。图1 的问答例子可以作为本节的一个示例。
图1 BERT的预训练和微调的整体框架
图1 BERT的预训练和微调的整体框架。除了输出层,在预训练和微调中都使用相同的体系结构。 相同的预训练模型参数用于初始化不同下游任务的模型。 在微调期间,所有参数都将进行微调。 [CLS]是在每个输入示例前添加的特殊符号,[SEP]是特殊的分隔符标记(例如,分隔问题/答案)。

BERT的一个独特功能是其跨不同任务的统一体系结构。 预训练的体系结构和最终的下游体系结构之间的差异很小。

**模型架构:**BERT的模型架构是一个多层双向Transformer编码器,基于Vaswani等人(2017)描述的原始实现,并在tensor2tensor库 ( 1 ) ^{(1)} 中发布。 因为Transforner的使用已经很普遍,我们的实现基本与原始实现相同,因此我们将省略对模型架构的详尽背景描述,并向读者推荐阅读Vaswani等(2017)以及出色的指南,例如“带注释的Transformer” ( 2 ) ^{(2)}

在这项工作中,我们将层数(即Transformer块)表示为L,将隐藏大小表示为H,并将自注意头的数量表示为A ( 3 ) ^{(3)} 。我们主要报告在两种模型大小上的结果:
B E R T B A S E ( L = 12 , H = 768 , A = 12 , t o t a l P a r a m e t e r s = 110 M ) BER{T_{BASE}}(L = 12,H = 768,A = 12,total {\rm{ Parameters = 110M}})
B E R T L A R G E ( L = 24 , H = 1024 , A = 16 , t o t a l P a r a m e t e r s = 340 M ) BER{T_{LARGE}}(L = 24,H = 1024,A = 16,total{\rm{Parameters = 340M}})

出于比较的目的, B E R T B A S E BER{T_{BASE}} O p e n A I OpenAI G P T GPT 具有相同的模型大小。但是,重要的是,BERT Transformer使用双向自注意力机制,GPT Transformer使用受限自注意力机制,其中每个token只关注其左侧的上下文 ( 4 ) ^{(4)}

输入输出表示:
  为了使BERT可以处理各种下游任务,我们的输入表示能够明确地在一个token序列中表示单个句子和一对句子(例如< Question,Answer >)。 在整个工作中,“句子”可以是任意连续文本,而不是实际的语言句子。 “序列”是指BERT的输入token序列,它可以是一个句子或两个句子拼装在一起。

  我们使用 WordPiece embeddings(Wu et al., 2016) 和3万个token的词汇表。每个序列的第一个token总是一个特殊的分类(Classification)token([CLS])。与此token对应的最终隐藏状态被用作分类任务的集成序列表示。句子对被打包成一个单独的序列。我们用两种方法区分这些句子。首先,我们用一个特殊的标记(SEP)将它们分开。其次,我们在每个token上添加一个学习到的embedding,表示它属于句子A 还是句子B 。如图1所示,我们将输入embedding表示为 E E ,特殊[CLS] token 的最终隐藏向量表示为 C R H C \in {R^H} ,第 i个 输入token 的最终隐藏向量表示为 T i R H {T_i} \in {R^H}

  对于给定的token,其输入表示形式是通过将相应的token、segment和position 嵌入求和来构造的。 这种构造的可视化表示如图2所示。

图2
图2 BERT 输入表示。输入embeddings是token embedding、segment embedding和position embedding的和。

3.1 Pre-training BERT

不像Peters et al. (2018a)Radford et al. (2018),我们不使用从左向右或者是从右向左的语言模型来预训练BERT。取而代之,我们使用本节中描述的两个无监督任务来预训练BERT。此步骤如图一左侧所示。

任务1:Masked LM:
  从直觉上讲,有理由相信,深层双向模型 比从左向右模型或从左向右模型和从右向左模型的浅连接 严格上说更强大。可惜,标准的条件语言模型只能从按照left-to-right或者right-to-left的方式训练,双向条件可以允许每个词间接的“see itself”,那么这个模型就可以简单地在多层上下文中预测目标单词。
  Intuitively, it is reasonable to believe that a deep bidirectional model is strictly more powerful than either a left-to-right model or the shallow concatenation of a left-toright
and a right-to-left model. Unfortunately, standard conditional language models can only be trained left-to-right or right-to-left, since bidirectional conditioning would allow each word to indirectly “see itself”, and the model could trivially predict the target word in a multi-layered context.(原句,不是很理解。。)

  为了训练一个深度双向表示,我们简单随机地mask掉一些百分比的输入tokens,然后预测那些被mask掉的tokens。这一步称为“ masked LM ”(MLM),尽管在文献中(Taylor, 1953).它通常被称为完型填空任务(Cloze task)。在这个例子中,mask掉的tokens所对应的最终的隐藏层向量被喂给一个输出softmax,像在标准的LM中一样。在实验中,我们为每个序列随机mask掉了15%的WordPiece tokens。和 denoising auto-encoders[去噪自动编码器](Vincent et al., 2008)相比,BERT的做法是只预测被mask掉的词,而不是重建完整的输入。

  尽管这允许w我们获得双向预训练模型,其带来的负面影响是在预训练和微调模型之间创造了不匹配,因为[MASK]符号不会出现在微调阶段。为了减轻这个不匹配,我们不总是用[MASK]符号来替代被masked掉的tokens。训练数据生成器随机选择15%的token positions用来预测。如果第i个token被选中,我们将使用以下规则来替换这个token:(1)有80%用[MASK]替换选中的word,(2)10%用一个随机的word代替选中的word,(3)剩下10%的比例保持选中的word不变。然后, T i T_i 会被用来 用交叉熵损失预测原始token。我们在附录C.2中比较了此过程的变体。

任务2:下一句预测(NSP)
  许多重要的下游任务,例如问答(QA)和自然语言推理(NLI),都是基于对两个句子之间关系的理解,而这并不是语言建模直接捕获的。为了训练一个能理解句子间关系的模型,我们为一个二分类的下一个句子预测任务进行了预训练,这些句子对可以从任何单语语料库中获取到。特别是,当为每个预训练示例选择一个句子对A和B,50%的时间B是A后面的下一个句子(标记为IsNext), 50%的时间B是语料库中的一个随机句子(标记为NotNext)。图1中,C用来预测下一个句子(NSP) ( 5 ) ^{(5)} 。尽管简单,但我们在5.1节中证明了完成此任务的预训练对QA和NLI都非常有益 ( 6 ) ^{(6)}

  NSP任务和 Jernite et al. (2017)Logeswaran and Lee (2018)中的表示学习的目标密切相关。然而,先前的工作中,只将句子embeddings转移到了下游任务中,而BERT转移了所有参数来初始化终端任务模型的参数。

预训练数据
  预训练过程很大程度上参考了已有的语言模型预训练文献。对于预训练语料,我们使用了BooksCorpus(800M words)English Wikipedia(2500M words)。我们只提取Wikipedia的文本段落,忽略列表,表格和标题。为了提取长连续序列,关键是使用文档级语料库,而不是像十亿词基准 Billion Word Benchmark(Chelba et al., 2013)这样的无序的句子级语料库。

3.2 Fine-tuning BERT

  微调很简单,因为Transformer中的self-attention机制允许BERT通过交换合适的输入输出建模许多下游任务——无论涉及单个文本还是文本对。对于涉及到文本对的应用,常见的模式是在应用双向交叉的注意力之前,分别编码文本对中的文本,例如Parikh et al. (2016); Seo et al. (2017)。然而BERT是使用self-attention机制来统一这两个阶段,因为使用self-attention编码一个串联的文本对,有效地包括了两个句子之间的双向交叉注意力。

  对于每个任务,我们只需将特定任务的输入和输出插入到BERT,并端对端微调所有参数。 在输入处,来自预训练的句子A和句子B可以类似于(1)释义句子对(2)假设条件句子对(3)问答句子对 (4)文本分类或序列标注中的text-∅对。 在输出中,token表示被喂到输出层以执行token级别的任务,例如序列标记或问答,而[CLS]表示被喂到一个分类器输出层,例如需求或情感分析。

  微调的代价要比预训练小的多。论文中的很多结果都从一个完全相同的预训练模型 ( 7 ) ^{(7)} 开始,在TPU上只要花费1小时的时间就可以复现,GPU上也只要几个小时。我们将在第4节的相应小节中描述特定于任务的细节。更多细节可以查看附录 A.5


(1)https://github.com/tensorflow/tensor2tensor
(2)http://nlp.seas.harvard.edu/2018/04/03/attention.html
(3)在所有情况下,我们将前馈/滤波器的大小设置为 4H,即H = 768为3072,H = 1024为4096。
(4)我们注意到,在文献中,双向Transformer通常被称为“Transformer encoder”,而仅左上下文的版本被称为“Transformer decoder”,因为它可以用于文本生成。
(5) 最后的模型在 N S P NSP 数据集上获得 97 % 97\% ~ 98 % 98\% 的正确率。
(6) 如果不进行微调,向量 C C 并不是有意义的句子表示形式,因为它是使用 N S P NSP 训练的。
(7) 例如,BERT SQuAD模型在一个独立的TPU训练半个小时,可以实现91%的Dev F1 score。


实验

  在这个章节中,我们在11个NLP任务中列出BERT微调的结果。

4.1 GLUE

  通用语言理解评估(The General Language Understanding Evaluation)(GLUE)基准(Wang et al., 2018a)是各种自然语言理解任务的集合。 GLUE数据集的详细说明包含在附录B.1中。

  在GLUE上fine-tune,我们按照第3节中的描述 表示输入序列(针对单个句子或句子对),并使用与第一个输入token([CLS])相对应的最终隐藏向量 C R H C \in {R^H} 作为聚合表示[aggregate representation]。在微调中介绍的唯一一个新的参数是分类器层的权重系数矩阵 W R K × H W \in {R^{K \times H}} K K 是类别的个数。 我们使用 C C W W 计算标准的分类损失,比如 log ( s o f t max ( C W T ) ) \log (soft\max (C{W^T}))

  在所有的GLUE任务上,我们在数据上使用了 b a t c h s i z e = 32 , e p o c h s = 3 batch-size=32,epochs=3 。对于每个任务,都通过开发集的验证来选择了最佳的微调学习率(在 5 e 5 , 4 e 5 , 3 e 5 5e- 5,4e - 5,3e -5 2 e 5 2e-5 之间)。另外,对于 B E R T L A R G E BER{T_{LARGE}} 模型,作者发现微调有时在小数据集上不稳定,所以随机重启了几次,并选择了开发集上表现最佳的模型。随机重启时,我们使用相同的预训练Checkpoint,但执行不同的fine-tuning 乱序数据和分类器层初始化 ( 9 ) ^{(9)}

  结果如表1所示。 B E R T B A S E BER{T_{BASE}} B E R T L A R G E BER{T_{LARGE}} 在所有任务上的性能均大幅度优于所有系统,与现有技术相比,平均精度分别提高了4.5%和7.0%。请注意, B E R T B A S E BER{T_{BASE}} 版本的模型架构和 O p e n A I G P T OpenAI GPT 除了attention masking以外,几乎相同。对于最大且报告最广的GLUE任务MNLI,BERT获得了4.6%的绝对精度提高。 在官方GLUE排行榜 ( 10 ) ^{(10)} 上, B E R T L A R G E BER{T_{LARGE}} 的得分为80.5,而 O p e n A I G P T OpenAI GPT 的得分为72.8。

  在所有任务中, B E R T L A R G E BER{T_{LARGE}} 版本明显比 B E R T B A S E BER{T_{BASE}} 版本要表现的更好,尤其是在很小的训练数据中。关于模型大小的影响,在5.2节有更深入的探讨。


表1 GLUE测试结果,由评估服务器(https://gluebenchmark.com/leaderboard)评分。
每个任务下面的数字表示训练样本的数量。 “Average” 列与官方GLUE得分略有不同,因为我们排除了有问题的WNLI集 ( 8 ) ^{(8)} 。BERT和OpenAI GPT是单模型,单任务。 报告QQP和MRPC的F1得分,报告STS-B的Spearman相关性,报告其他任务的准确性得分。 我们排除使用BERT作为其组件之一的 条目。

4.2 SQuAD v1.1

  斯坦福问答数据集 (The Stanford Question Answering Dataset) (SQuAD v1.1)是100k个众包问答对的集合(Rajpurkar et al.,2016)。给定来自维基百科的一个问题和一篇短文,以及对应的答案,任务是预测出短文中的答案文本块。

  如图1所示,在问答任务中,作者将输入问题和短文打包表示成一个序列,其中,使用A embedding表示问题,B embedding表示文章。在微调的时候,我们只引入一个start向量 S R H S \in {R^H} ,和一个end向量 E R H E \in {R^H} 。answer span的起始词word i的概率是 T i T_i S S 的点乘的 s o f t m a x softmax ,在全文的所有词上,计算公式为: P i = e S T i j e S T j {P_i} = \frac{{{e^{S \cdot {T_i}}}}}{{\sum\nolimits_j {{e^{S \cdot {T_j}}}} }} 。答案末尾词的概率表示同理。从位置 i i 到位置 j j 的候选span的分数定义如下: S T i + E T j S \cdot {T_i} + E \cdot {T_j} ,并将满足 j i j \ge i 的最大得分的span最为预测结果。训练目标是正确的开始和结束位置的对数似然估计的和。我们微调了3个epochs,学习率设置为 5 e 5 5e-5 ,batch-size设置为32。

  表2显示了排行榜中排名靠前的条目以及排名靠前的系统的结果(Seo et al., 2017; Clark and Gardner, 2018; Peters et al., 2018a; Hu et al., 2018).。SQuAD排行榜的最高结果没有最新的公共系统描述 ( 11 ) ^{(11)} ,并且允许使用任何公开数据训练各自的网络。 因此,作者在系统中使用适度的数据增强,首先对TriviaQA进行微调(Joshi et al., 2017),然后再对SQuAD进行微调。
在这里插入图片描述
表2 SQuAD 1.1的结果。 BERT集成是使用不同的预训练检查点和微调种子的7x系统。

  我们的最佳性能系统在整体表现上领先 + 1.5 +1.5 F 1 F1 ,而在整体系统方面则优于 + 1.3 +1.3 F 1 F1 。 实际上,就F1得分而言,我们的单个BERT模型优于顶级集成系统。 如果没有TriviaQA的微调数据,我们只会损失 0.1 0.4 0.1\sim 0.4 F 1 F1 ,仍然远远胜过所有现有系统 ( 12 ) ^{(12)}

4.3 SQuAD v2.0

  SQuAD 2.0任务通过允许在提供的段落中不存在简短答案,扩展了SQuAD 1.1问题定义,从而使问题更加实际。

  我们使用一种简单的方法来扩展SQuAD v1.1 BERT模型以完成此任务。 我们将没有答案的问题视为answer span以[CLS]token开头和结尾。 起始和终止answer span位置的概率空间已扩展为包括[CLS]token的位置。 为了进行预测,我们将no-answer span的分数: s n u l l = S C + E C {s_{null}} = S \cdot C + E \cdot C 和最佳non-null span的分数: s ^ i , j = max j i S T i + E T j {\hat s_{i,j}} = {\max _{j \ge i}}S \cdot {T_i} + E \cdot {T_j} 进行比较。当 s ^ i , j > s n u l l + τ {\hat s_{i,j}} > {s_{null}} + \tau 时,其中阈值 τ \tau 在开发集上选择,以最大化F1,预测为一个non-null answer。此模型不使用TriviaQA数据。我们微调了2个epochs,学习率设置为 5 e 5 5e-5 ,batch-size设置为48。

  表3中显示了与先前排行榜条目和排名靠前的工作(Sun et al., 2018; Wang et al., 2018b)相比的结果,其中不包括使用BERT作为其组件之一的系统。 与之前的最佳系统相比,我们观察到 + 5.1 +5.1 F 1 F1 的改进。
在这里插入图片描述
表3 SQuAD 2.0结果。 我们排除使用BERT作为其组件之一的条目

4.4 SWAG

  对抗生成情境(The Situations With Adversarial Generations)(SWAG)数据集包含113k个句子对完整示例,用于评估扎实的常识推理(Zellers et al., 2018)。 给定一个句子,任务是在四个选择中选择最合理的延续。

  在SWAG数据集上进行微调时,我们构造了四个输入序列,每个输入序列都包含给定句子(句子A)和可能的延续(句子B)的串联。 引入的唯一特定于任务的参数是一个向量,其与[CLS]token的表示 C C 的点积表示每个选择的得分,并使用softmax层对其进行归一化。

  我们对模型进行了3个epoch的微调,学习率为 2 e 5 2e-5 ,批处理大小为16。结果如表4所示。 B E R T L A R G E BERT_{LARGE} 优于作者的基线 E S I M + E L M o ESIM + ELMo 系统 + 27.1 +27.1% O p e n A I G P T OpenAI GPT 优于 8.3 8.3 %
在这里插入图片描述
表4:SWAG开发和测试准确率。 如SWAG paper中所述,人类绩效是用100个样本测量的。


(8) See (10) in https://gluebenchmark.com/faq
(9) GLUE数据集分布不包括“测试”标签,并且我们仅为每个 B E R T L A R G E BER{T_{LARGE}} B E R T B A S E BER{T_{BASE}} 中提交了一个GLUE评估服务器。
(10) https://gluebenchmark.com/leaderboard
(11) QANet在Yu et al. (2018)中进行了描述,但是该系统在发布后已经有了实质性的改进。
(12) 我们使用的TriviaQA数据由TriviaQA-Wiki的段落组成,这些段落由文档中的前400个token组成,这些token至少包含所提供的可能答案之一。


5. 消融研究

  本节通过在BERT的各方面做消融实验,来理解相对重要的部分。其他的消融研究见附录C。

5.1 预训练任务的影响

  通过使用与 B E R T B A S E BERT_{BASE} 完全相同的预训练数据,微调方案和超参数评估两个预训练目标,我们证明了BERT双向深度的重要性:

**NO NSP:**使用“masked LM”(MLM)进行训练但没有“下一个句子预测”(NSP)任务的双向模型。

**LTR & NO NSP:**使用标准的从左到右(Left-to-Right)(LTR)LM(而不是MLM)训练的仅左上下文模型。 左约束也应用微调,因为去掉它会引入预训练/微调不匹配,从而降低下游性能。 此外,该模型无需NSP任务即可进行预训练。 这可以直接与OpenAI GPT相提并论,但要使用我们的更大的训练数据集,输入表示形式以及我们的微调方案。

  我们首先测试NSP任务带来的影响。 在表5中所示,去掉NSP会严重损害QNLI,MNLI和SQuAD 1.1的性能。 接下来,我们通过比较“无NSP”与“ LTR和无NSP”来评估训练双向表示的影响。 在所有任务上,LTR模型的性能都比MLM模型差,而MRPC和SQuAD的性能下降很大。在这里插入图片描述
表5 使用 B E R T B A S E BERT_{BASE} 架构进行预训练任务的消融研究。NO NSP是 没有下一个句子预测任务的训练; LTR&No NSP被训练为从左到右的LM,而无需预测下一个句子,例如OpenAI GPT。 在微调期间,“ + BiLSTM”会在“ LTR + No NSP”模型的顶部添加随机初始化的BiLSTM。

  对于SQuAD,直观上很清楚,因为token级别的隐藏状态没有右侧上下文,所以LTR模型在token预测时的性能会很差。 为了真诚地尝试加强LTR系统,我们在顶部添加了一个随机初始化的BiLSTM。 这确实可以显着改善SQuAD上的结果,但结果仍然比预训练的双向模型的结果差很多。 BiLSTM损害了GLUE任务的性能。

  我们认识到,像ELMo一样,也有可能训练单独的LTR和RTL模型并将每个令token表示为两个模型的串联。 但是:(a)这要花费单个双向模型的两倍代价; (b)对于QA这样的任务,这是不直观的,因为RTL模型将无法确定问题的答案; (c)这绝对不像深度双向模型那么强大,因为它可以在每一层使用左右上下文。

5.2 模型大小的影响

  本节介绍模型大小对任务表现的影响。作者训练了一些不同层数、隐藏单元数、注意力头的BERT模型,但使用相同的超参数和训练过程。

  表6列出了选定的GLUE任务的结果。在此表中,我们报告了5次随机微调重启的平均Dev Set准确率。 我们可以看到,即使对于只有3,600个带标签的训练示例的MRPC,它与预训练任务也大不相同,较大的模型会导致所有的这四个数据集的准确性都得到严格提高。 我们能够在相对于现有文献而言已经相当大的模型的基础上实现如此显着的改进,这也许也令人惊讶。例如,Vaswani et al. (2017)研究的最大的Transformer是 L = 6 H = 1024 A = 16 (L = 6,H = 1024,A = 16) ,具有100M的编码器参数;我们在文献中发现的最大的Transformer 是 L = 64 H = 512 A = 2 (L = 64,H = 512,A = 2) 和235M 参数(Al-Rfou et al., 2018)。 相比之下, B E R T B A S E BERT_{BASE} 包含110M的参数,而 B E R T L A R G E BERT_{LARGE} 包含340M参数。
在这里插入图片描述
表6 BERT模型大小的消融。 #L =层数; #H =隐藏大小; #A =注意头的数量。 “ LM(ppl)”是held-out的训练数据的masked的LM困惑度。

  众所周知,增加模型的大小将导致对大型任务(如机器翻译和语言建模)的持续改进,这一点在表6中所示的held-out的训练数据的LM困惑度中得到了证明。但是,我们相信这是第一个有说服力的证明:只要模型已经过充分的预训练,缩放到极限模型大小也将导致非常小的规模任务的重大改进。Peters et al. (2018b)对于将预训练的Bi-LM大小从两层增加到四层对下游任务的影响提出了不同的结果,Melamud et al. (2016) 顺便提到了将隐藏维度大小从200增加到600有所帮助,但进一步增加到1000并没有带来进一步的改进。这两个先前的工作都使用基于特征的方法。我们假设,当直接在下游任务上对模型进行微调,并且仅使用额外的少量的随机初始化的参数时,特定于任务的模型可以从更大,更具表达力的预训练的表示形式中受益,即使下游任务数据非常小也是如此。

5.3 BERT的基于特征的方法

  到目前为止提出的所有BERT结果都使用了微调方法,其中在预训练模型中添加了一个简单的分类层,并且在下游任务上共同对所有参数进行了微调。 但是,从预训练模型中提取固定特征的基于特征的方法具有某些优势。 相比于上面一直在说的fine-tuning的方式,feature-based的方式也有着其关键的优势。首先,不是所有的任务都可以轻易的表示成Trasformer encoder 架构,所以会有添加一个基于特定任务的模型架构的需求。其次,预先计算一次训练数据的昂贵表示,然后在此表示之上使用更便宜的模型运行许多实验,这对计算有很大的好处。

  在本节中,我们通过将BERT应用于CoNLL-2003 命名实体识别(NER)任务(Tjong Kim Sang and De Meulder, 2003)来比较fine-tuning和feature-based这两种方法。在BERT的输入中,使用了一个保留大小写的单词WordPiece模型,并包含了数据提供的最大文档上下文。按照标准惯例,我们将其表示为标记任务,但在输出中不使用CRF层。我们使用第一个sub-token的表征,作为的NER标签集上token-level分类器的输入。

  为了和fine-tuning方法做消融实验,我们以从没有微调任何参数的一层或多层提取activations的方式应用feature-based方法。这些上下文的嵌入用做一个随机初始化的两层768维BiLSTM的输入,然后送入分类器层。

  结果显示在表7中。 B E R T L A R G E BERT_{LARGE} 用最新技术具有竞争力。 效果最好的方法将来自预训练的Transformer的顶部四个隐藏层的token表示连接起来,这仅比微调整个模型低0.3 F1。 这表明BERT对于微调和基于特征的方法均有效。
在这里插入图片描述
表7 CoNLL-2003命名实体识别结果。 使用开发集选择超参数。 使用这些超参数,报告的Dev和Test得分是在5次随机重启后的平均值。

6. 结论

  近来通过迁移学习改善模型学习的例子表明了丰富的,无监督的预训练是许多语言理解系统的重要组成部分。特别是,这些结果使得即使是低资源的任务也可以从深层单向架构中获益。BERT的主要贡献是进一步将这些发现推广到深层双向架构,使得相同的预训练模型可以成功应对一组广泛的NLP任务。

附录

  附录分为三个部分:

  • BERT的其他详细实现细节见附录A;
  • 我们实验的其他细节见附录B;
  • 其他的消融研究见附录C,包括
    – 训练步数的影响
    – 不同Masking过程的消融研究

A BERT的其他细节

A.1 Illustration of the Pre-training Tasks

  我们举了以下预训练任务的例子。

  Masked LM and the Masking Procedure 假设无标签的句子是 “my dog is hairy”,作者在3.1节 Task1中提到,会随机选择句子中15%的tokens位置进行mask,假设这里随机选到了第四个token位置要被mask掉,也就是对hairy进行mask,那么mask的过程可以描述如下:

  • 80% 的时间:用[MASK]替换目标单词,例如:my dog is hairy --> my dog is [MASK] 。
  • 10% 的时间:用随机的单词替换目标单词,例如:my dog is hairy --> my dog is apple 。
  • 10% 的时间:不改变目标单词,例如:my dog is hairy --> my dog is hairy 。 (这样做的目的是使表征偏向于实际观察到的单词。)

  解释: 上面的过程,需要结合训练过程的epochs来理解,每个epoch表示学完了一遍所有的样本,所以每个样本在多个epochs过程中是会重复输入到模型中的,知道了这个概念,上面的80%,10%,10%就好理解了,也就是说在某个样本每次喂给模型的时候,用[MASK]替换目标单词的概率是80%;用随机的单词替换目标单词的概率是10%;不改变目标单词的概率是10%。但是,有的介绍BERT的文章中,讲解MLM过程的时候,将这里的80%,10%,10%解释成替换原句子被随机选中的15%的tokens中的80%用[MASK]替换目标单词,10%用随机的单词替换目标单词,10%不改变目标单词。这个理解是不对的。

  采取上面的mask策略的好处是:Transformer encoder就不知道会让其预测哪个单词,或者说不知道哪个单词会被随机单词给替换掉,那么它就不得不 保持 每个输入token的一个上下文的表征分布(a distributional contextual representation)。也就是说如果模型学习到了要预测的单词是什么,那么就会丢失对上下文信息的学习,而如果模型训练过程中无法学习到哪个单词会被预测,那么就必须通过学习上下文的信息来判断出需要预测的单词,这样的模型才具有对句子的特征表示能力。 另外,由于随机替换相对句子中所有tokens的发生概率只有1.5%(即15%的10%),所以并不会影响到模型的语言理解能力。对此,本论文的C.2节做了对此过程影响的评估。

  相比标准的语言模型训练,masked LM在每个batch中仅对tokens的15%的部分进行预测,所以模型收敛需要更多的预训练步骤。C.1节演示了MLM比left-to-right模型(会对每个token进行预测)收敛的稍慢,但是学习效果的改善远远超过了增加的训练成本。

  Next Sentence Prediction ”下个句子预测“的任务的例子如下所示:

Input = [CLS] the man went to [MASK] store [SEP]
            he bought a gallon [MASK] milk [SEP]
            
Label = IsNext

Input = [CLS] the man [MASK] to the store [SEP]
            penguin [MASK] are flight ##less birds [SEP]

Label = NotNext

A.2 Pre-training Procedure

  NSP任务的样本获取策略:从语料库文本中选取2个span,这里的span可以理解为一个完整sentence。然后,2个span分别对应句子A和句子B。其中,50%的情况下,句子B是句子A的下一句,而50%的情况下,B不是A的下一句。并且,句子A和B组合起来的长度要<=512个tokens。 LM masking在WordPiece标记化之后应用,统一masking率为15%,并且对部分单词没有特别考虑。

  我们训练的时候采用batch-size=256个句子序列(也就是说每个batch由256*512=128000个tokens),总共训练了1,000,000步,将近40个epochs,超过33亿个单词。梯度优化算法采用Adam,学习率= 1 e 4 1e-4 β 1 = 0.9 β_1=0.9 β 2 = 0.999 β_2=0.999 0.01 0.01 L 2 L2 权重衰减,学习率在首个10000步进行warmup【注释4】 ,然后进行线性衰减。我们在所有层使用了0.1概率的dropout。在激活函数上,选择了 g e l u gelu ,而不是标准的 r e l u relu ,这个选择跟随了 O p e n A I G P T OpenAI GPT 。训练损失是masked掉的语言模型的似然均值与下一句预测的似然均值之和。

   B E R T B A S E BERT_{BASE} 模型在4块云TPU上训练(共16块TPU芯片)。 B E R T L A R G E BERT_{LARGE} 在16块云TPU上训练(共64块TPU芯片)。每个预训练持续4天的时间完成。

  由于注意力的计算复杂度是序列长度的平方,所以更长的序列所增加的成本是昂贵的。为了加速实验中的预训练过程,我们对90%的步骤使用128长度的序列预训练,然后用512长度的序列训练剩余的10%的步骤,以便学习到位置嵌入(positional embeddings)。

A.3 Fine-tuning Procedure

  在fine-tuning的时候,模型的大多数超参数和预训练的时候是一样的,除了batch-size,learning rate和epochs。dropout的概率始终保持在0.1。优化超参数的值是特定于任务来做的,但是以下范围内的值在跨任务上也工作的很好:

  • Batch size: 16, 32
  • Learning rate (Adam): 5e-5, 3e-5, 2e-5
  • Number of epochs: 2, 3, 4

  作者也观察了100k+的训练样本,超参数选择的敏感度远低于小数据集。Fine-tuning仍然非常快,所以简单粗暴的在上面的参数上运行一个穷举搜索来选择出可以让模型在开发集上表现最好的那些参数的方式也是可以接受的。

A.4 Comparison of BERT, ELMo ,and OpenAI GPT

  在这里,我们研究了最近流行的表示学习模型(包括ELMo,OpenAI GPT和BERT)的差异。 图3直观地显示了几种模型架构之间的比较。请注意,除了架构差异之外,BERT和OpenAI GPT是微调方法,而ELMo是基于特征的方法。

在这里插入图片描述
图3 预训练模型架构的差异。 BERT使用双向Transformer。 OpenAI GPT使用从左到右的Transformer。 ELMo使用经过独立训练的从左到右和从右到左的LSTM的串联来生成用于下游任务的特征。 在这三个之中,只有BERT表示在所有层的左上下文和右上下文中共同为条件。 除了架构差异之外,BERT和OpenAI GPT是微调方法,而ELMo是基于特征的方法。

  现有的与BERT最可比的预训练方法是OpenAI GPT,它在大型文本语料库上训练从左到右的Transformer LM。 实际上,BERT中的许多设计决策都是有意做出的,以使其尽可能接近GPT,以便可以对两种方法进行最小化比较。这项工作的核心论点是,双向性和在第3.1节中介绍的两个预训练任务是大多数经验改进的原因,但是我们确实注意到,如何训练BERT和GPT之间还有其他一些区别:

  • GPT在 B o o k s C o r p u s BooksCorpus (8亿字)上训练; BERT在 B o o k s C o r p u s BooksCorpus (8亿字)和 W i k i p e d i a Wikipedia (25亿字)上训练。
  • GPT仅在微调时才引入的句子分隔符([SEP])和分类符([CLS]); BERT在预训练期间学习[SEP],[CLS]和句子A / B嵌入。
  • 对GPT进行了1M 步的训练,batch-size为32,000个单词; BERT接受了1M 步的训练,batch-size为128,000个单词。
  • GPT在所有微调实验中使用了相同的 5 e 5 5e-5 的学习率; BERT选择特定于任务的微调学习率,该学习率在开发集上表现最佳。

  作者为了证明BERT模型是因为2个预训练任务和双向的Transformer才比其他模型表现更好,所以在5.1节中阐述了他们做的消融实验过程和结果。

A.5 Illustrations of Fine-tuning on Different Tasks

  在不同任务上的微调BERT见图4图示。我们的特定任务模型是通过将BERT与一个额外的输出层合并而形成的,因此需要从头开始学习一小部分的参数。(a)和(b)是序列级别的任务;(c )和(d)是token级别的任务。图中的 E E 表示输入的词嵌入, T i T_i 表示第 i i 个token的上下文表征,[CLS]是分类输出的特定符号,[SEP]是分隔非连续token序列的特定符号。

在这里插入图片描述
在这里插入图片描述
图4:在不同任务上对BERT进行微调的图示

B 详细实验设置

B.1 GLUE 基准实验的详细描述

  表1中的GLUE结果是从https://gluebenchmark.com/leaderboardhttps://blog.openai.com/language-unsupervised获得的。 GLUE基准测试包括以下数据集,其描述最初在Wang et al. (2018a)中进行了概述。

MNLI Multi-Genre Natural Language Inference
多体自然语言推理是一项大规模的,众包的蕴含分类任务(Williams et al., 2018)。 给定一对句子,目标是预测第二个句子对于第一个句子是蕴含、矛盾还是中性的关系。

QQP Quora Question Pairs
目标是判断两个问题是否等价。(Chen et al., 2018)

QNLI Question Natural Language Inference
将标准问答数据集转换成一个二分类任务。包含正确回答的句子对为正样本,反之为负样本。

SST-2 The Stanford Sentiment Treebank
对电影评论做情感二分类。

CoLA The Corpus of Linguistic Acceptability
预测一个句子是否符合语言学定义。

STS-B The Semantic Textual Similarity Benchmark
用1-5的分数表示2个句子的语义相似度。

MRPC Microsoft Research Paraphrase Corpus
判断2个句子是否语义上等价。

RTE Recognizing Textual Entailment
和MNLI类似,但是数据集小的多。

WNLI Winograd NLI
一个小型自然语言推理数据集。该数据集有一些问题,所以排除在评测之外。

C 其他消融研究

C.1 训练步数的影响

图5展示了在MNLI开发集上使用预训练了k步的模型进行微调后得到的准确度。
在这里插入图片描述
图5 :训练步数的消融。 这显示了微调后的MNLI精度,从已经过k步预训练的模型参数开始。 x轴是k的值。

通过此图,就可以回答下面的问题了:

  1. 问题:BERT真的需要这么巨大的预训练量级吗(128,000 words/batch * 1000,000 steps)?
    答案:是的。相对于500k的steps, B E R T B A S E BERT_{BASE} 训练1M步 准确度能提高1.0%
  2. 问题:MLM预训练收敛速度比LTR慢吗?因为每个batch中只有15%的单词被预测,而不是所有单词都参与。
    答案:确实稍稍有些慢。但是准确度因此而立刻超过了LTR模型,所以是值得的。

C.2 不同Masking过程的消融

  在章节3.1中,我们提到,在使用Masked语言模型(MLM)目标进行预训练时,BERT使用混合策略来mask目标token。 以下是一项消融研究,以评估不同masking策略的效果。

  注意mask策略的目的是减轻预训练和微调之间的不匹配,因为[MASK]符号在微调的时候几乎不会出现。我们报告了在MNLI 和 NER上的开发集结果。我们报告了微调和基于特征的方法,因为我们期望基于特征的方法的不匹配会被放大,因为模型在训练的时候,特征提取层没有机会调整特征表示(因为被冻结了)。表8展示了基于Fine-tune和基于Feature-based的方式下,不同的MASK策略对结果的影响:
在这里插入图片描述
表8 不同mask策略的消融研究

  在表中,MASK表示我们用MLM的[MASK]符号替换了目标token; SAME表示我们不改变目标token; RND表示我们将目标token随机替换为另一个token。

  表格左侧的数字表示在MLM预训练期间使用的特定策略的概率(BERT使用80%,10%,10%)。 本文的右侧部分代表开发集的结果。 对于基于特征的方法,我们将BERT的最后4层输出拼接起来作为特征,这在5.3节中被证明是最好的方法。

  另外,fine-tuning方式在不同的mask策略下都具有惊人的鲁棒性。然而,如作者所料,完全使用MASK的策略在feature-based方式下应用到NER领域是有问题的。有趣的是,全部使用随机的策略也比我们的策略差的多。

这里感谢:https://www.cnblogs.com/anai/p/11645953.html提供的注解。

注解

  • 深度双向:深度双向和浅度双向的区别在于,后者仅仅是将分开训练好的left-to-right和right-to-left的表征简单的串联,而前者是一起训练得到的。
  • feature-based: 又称feature-extraction 特征提取。就是用预训练好的网络在新样本上提取出相关的特征,然后将这些特征输入一个新的分类器,从头开始训练的过程。也就是说在训练的过程中,网络的特征提取层是被冻结的,只有后面的密集链接分类器部分是可以参与训练的。
  • fine-tuning: 微调。和feature-based的区别是,训练好新的分类器后,还要解冻特征提取层的顶部的几层,然后和分类器再次进行联合训练。之所以称为微调,就是因为在预训练好的参数上进行训练更新的参数,比预训练好的参数的变化相对小,这个相对是指相对于不采用预训练模型参数来初始化下游任务的模型参数的情况。也有一种情况,如果你有大量的数据样本可以训练,那么就可以解冻所有的特征提取层,全部的参数都参与训练,但由于是基于预训练的模型参数,所以仍然比随机初始化的方式训练全部的参数要快的多。对于作者团队使用BERT模型在下游任务的微调时,就采用了解冻所有层,微调所有参数的方法。
  • warmup:学习率热身。规定前多少个热身步骤内,对学习率采取逐步递增的过程。热身步骤之后,会对学习率采用衰减策略。这样训练初期可以避免震荡,后期可以让loss降得更小。
发布了21 篇原创文章 · 获赞 3 · 访问量 630

猜你喜欢

转载自blog.csdn.net/qq_38293297/article/details/103968595