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

2023-11-09

BERT

个人翻译,并不权威。

paper

https://arxiv.org/pdf/1810.04805.pdf

BERT:Pre-training of Deep Bidirectional Transformers for Language Understanding 深度双向Transformers预训练解决语言理解

Abstract 摘要

我们引入被叫做BERT的新的语言表示模型,
BERT代表Bidirectional Encoder Representations from Transformers.
与最近的语言表示模型不同,(Peters等人,2018,Radford等人,2018),
BERT被设计通过所有层的左右上下文来预训练深层双向表示。
作为结果,可以通过一个额外的输出层对预训练的BERT表示进行微调,以创建适用于
各种任务的最先进模型,比如问答和语言推断,无需对特定与任务的架构进行实质
性修改。

BERT 概念上简单,经验上强大。BERT在11项自然语言处理任务上获得了最新的研究成果,
包括将GLUE基准值推到80.4%7.6%的绝对提升),MultiNLI 准确率达到86.7%5.6%
绝对提升),SQuAD v1.1 问题回答测试 F1 推到 93.21.5绝对提升),超出人类表现
两个点。

1 Introduction 介绍

语言模型预训练对于许多自然语言处理任务的提升是有效的。这些任务包括句子级别任务,
比如自然语言推理和释义,通过整体分析来预测句子之间的关系,以及包括词级别的任务,
比如命名实体识别和SQuAD 问题回答,模型需要产生词级别的细粒度的输出。
现在有两种将预训练的语言表示应用于下游任务的策略:基于特征和基于微调。
基于特征的方法,比如ELMo,使用特定于任务的架构,其中包括预训练的表示作为附加特征。
基于微调的方法,比如the Generative Pre-trained Transformer (OpenAI GPT),引入了
最小的具体任务参数,并通过简单的微调预训练参数对下游任务进行训练。
在之前的工作中,两种方法在训练之前都具有相同的目标函数,它们使用单向语言模型
来学习通用语言表示。

我们认为,当前的技术严重的限制了预训练的表示的能力,特别是对于微调方法。
主要的限制是标准语言模型是单向的,这限制了在预训练期间选择能够被使用的架构。
例如,在OpenAI中,作者使用了从左到右的体系结构,在该体系结构中,每个词只能关注
Transformer的self-attention 层以前的词。这样的限制对于句子级的任务来说是次优的,
但是将基于微调的方法应用于词级别的任务例如SQuAD问题回答,是可能是毁灭性的,在这种
情况下,从两个方向结合上下文至关重要。

在本文中,我们改进了基于微调的方法,提出了BERT:Bidirectional Encoder Representations from Transformers.
BERT提出了一个新的预训练目标:受完形填空任务启发的 ”masked language model"(MLM),
解决了前面提到的单向约束。The masked language model随机的屏蔽输入中的一些词,目的
是仅根据其上下文预测屏蔽词的原始词汇id。与从左到右的语言模型预训练不同,MLM目标
允许表示融合左和右上下文,这允许我们预训练一个deep bidirectional Transformer。
除了the masked language model,我们还引入了一个“下一句预测”任务,该任务联合预训练
文本对儿表示。

本文的贡献如下:

我们证明了双向预训练对于语言表示的重要性。与采用单向语言模型进行预训练的 Radford 2018 不同,
BERT使用masked language models 进行预训练的深层双向表示。这也与Peters等人形成了
对比,2018,使用了独立训练的从左到右,和从右到左的LMs浅连接。

我们表明,经过预训练的表示消除了许多经过严格设计的特定于任务的架构的需要。
BERT是第一个基于微调的表示模型,它在一系列句子级和词级别的任务上实现了最先进的性能,
优于许多具有特定任务架构的系统。

BERT提高了11项NLP任务的最先进水平。我们还报道了BERT的广泛消融分析,表明我们模型
的双向性是最重要的新贡献。代码和预训练的模型将在下面获得.

goo.gl/language/bert

2 相关的工作

预训练通用语言表示有很长的历史,在本节中我们简要回顾最流行的方法。

2.1 Feature-based Approaches 基于特征的方法

几十年来,学习广泛使用的词汇表示一直是一个活跃的研究领域,包括非神经和神经方法。
预训练的词嵌入被认为是现代NLP系统的一个组成部分,与从头学习的嵌入相比,它提供了
显著的改进。

这些方法已被推广到更粗的粒度,如句子嵌入或者段落嵌入。与传统的单词嵌入一样,这些
学习的表示法通常也用做下游模型中的特征。

ELMo 将传统的嵌入研究概括为不同的维度。他们建议从语言模型中提取上下文相关的特征。
在将上下文嵌入与现有的特定于任务的架构相结合是,ELMo为几个主要的NLP基准提供了
最先进的技术,包括SQuAD 问题回答, 情感分析,和命名实体识别。

2.2 Fine-tuning Approaches 基于微调的方法

从语言模型(LMs)迁移学习的一个最新趋势是,在为下游的监督任务微调相同的模型之前,
预先在LM目标上训练一些模型架构。这些方法的优点是几乎不需要从零开始学习参数。
至少在一定程度上,由于这一优势,OpenAI GPT 在GLUE基准测试的许多句子级任务上取得了
先前最先进的结果。

2.3 Transfer Learning from Supervised Data

虽然无监督训练的优势在于可获得的数据集量几乎是无限的,但也有一些工作表明,从具有
大型数据集的受监督任务中进行有效迁移,例如自然语言推理和机器翻译。
在NLP之外,计算机视觉研究还证明了从大型预训练模型中迁移学习的重要性,其中一个有效
的方法是对在ImageNet上预训练的模型进行微调。

3 BERT

我们在本节中介绍BERT以及其详细实现。我们首先介绍BERT的模型架构和输入表示。
然后我们将在3.3节中介绍预训练任务,即本文的核心创新。预训练过程和微调过程
分别在第3.4节和第3.5节中详细说明。最后,在第3.6节中讨论了BERT和OpenAI GPT之间
的区别。

3.1 Model Architecture 模型架构

BERT的模型架构是基于Vaswani等人描述的原始实现的多层双向Transformer编码器,
并在tensor2tensor库中发布。由于Transformers的使用最近变的普遍,而且我们的
实现实际上与原来的完全相同,因此我们将省略对模型架构的详尽背景描述,并将读者
引向Vaswani等人,以及优秀的指南如“The Annnotated Transformer”.

在这项工作中,我们将层的数量(Transformer blocks)表示为L,隐藏的大小表示为H,
而self-attention heads 为A。在所有的情况下,我们将feed-forward/filter大小设置为
4H,即H=768时,为3072, H=1024时,为4096.
我们主要报道两种型号的结果:

BERTBASE: L=12, H=768, A=12, Total Parameter=110M
BERTLARGE: L=24, H=1024, A=16, Total Parameters=340M

为了比较的目的,BERTBASE具有与OpenAI GPT相同的模型大小。然而,至关重要
的是,BERT Transformer使用双向的self-attention,而GPT Transformer 使用受约束的
self-attention,即每个词只能关注其左侧的上下文。我们注意到,在文献中,bidirectional
Transformer通常被称为“Transformer encoder”,而左上下文版本被称为“Transformer decoder”
因为它可以用于文本生成。图1直观地显示了BERT,OpenAI 和ELMo之间的比较。

在这里插入图片描述

图1, 预训练模型架构之间的不同。BERT 使用双向Transformer。OpenAI GPT 使用 左到右
的Transformer。 ELMo 使用独立训练的从左到右和从右到左的LSTM的串联来为下游任务
生成特征。在这三种方法中,只有BERT表示在所有层中都同时受左右上下文的约束。

3.2 Input Representation 输入表示

我们的输入表示能够在一个标记序列中明确的表示单个文本句或一对文本句(例如[问题,答案])
对于给定的词,其输入的表示是通过切合相应的词,段落和位置嵌入来构造的。
图2中给出了输入表示的可视化表示。

具体如下:

我们使用WordPiece Embeddings,和30000词的词汇表。我们用 ## 表示词分段。我们
使用学习的位置嵌入,支持的序列长度高达512个词。每个序列的第一个标志总是the
special classification embeddings [CLS]。与词对应的最终隐藏状态(即Transformer
的输出)用作分类任务的聚合序列表示。对于非分类任务,忽略此向量。

句子对被打包成一个序列。我们用两种方式区别句子。首先我们用一个特殊的词([SEP])
将它们分开。第二, 我们在第一句的每个词中添加一个学习过的句子A,在第二句的每一个
词中添加一个句子B。

对于单句输入,我们只使用句子A嵌入。

在这里插入图片描述
图2: BERT 输入表示。输入嵌入是词嵌入,段落嵌入和位置嵌入的总和。

3.3 Pre-training Tasks 预训练任务

与Peters等人2018和Radford等人2018我们不使用传统的从左到右或从右到左的语言模型
来预训练BERT。相反,我们使用两个新的无监督预测任务对BERT进行预训练,如本节所述。

3.3.1 Task #1:Masked LM 蒙面语言模型

直观地说,我们可以合理地认为,deep bidirectional model 比从左到右模型或从左到右和
从右到左模型的浅连接更强大。不幸的是,标准条件语言模型只能从左到右或从右到左进行
训练,因为双向条件将允许每个单词在多层上下文中间接“看到自己”。

为了训练一种深层双向表示,我们采用了一个种简单的方法,即随机屏蔽输入词的某些百分比,
然后只预测哪些屏蔽的词。我们将此过程称为“masked LM“ (MLM),尽管在文献中它通畅被称为
完形填空。在这种情况下,对应于蒙面词的最终隐藏向量通过词汇表输入到输出SoftMax中,
就像在标准LM中一样。在所有的实验中,我们随机的蒙住每个序列中所有WordPiece tokens的
15%。与去燥自编码器不同,我们只预测屏蔽词,而不是重建整个输入。

虽然这确实允许我们获得一个双向的预训练模型,但这种方法有两个缺点。第一个问题是,
我们在预训练和微调之间创建了一个不匹配,因为在微调过程中从来没有见过[MASK]词。
为了减轻这一点,我们并不总是用实际的[MASK]词替换 被蒙面的词。相反,训练数据
生成随机选择15%的词,例如在句子 my dog is hairy 选择了 hairy。接着执行下面的过程:

数据生成器不会总是用[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.这样做的目的
是是表达偏向于实际观察到的单词。

Transformer encoder不知道它将被要求预测哪些词,或者哪些词已被随机替换,因此它必须
保持每个输入词的上下文表示分布。此外,由于随机替换只发生在所有词的1.5%(即15%的10%)
上,这似乎不会损害模型的语言理解能力。

使用MLM的第二个缺点是,每个批中只预测了15%的词,这意味着模型收敛可能需要更多的预训练步骤。
在第5.3节中,我们证明了MLM确实比从左到右的模型(预测每一个词)稍微慢一些,但MLM模型
的实验提升远远超过了训练成本的增加。

3.3.2 Task #2:Next Sentence Prediction 下一句预测

许多重要的下游任务,如问答(QA)和自然语言推理(NLI),都基于理解两个文本句之间的关系,
而语言建模并不能直接捕获到这两个文本句之间的关系。为了训练一个理解句子关系的模型,
我们预训练了一个二元的下一个句子预测任务,该任务可以由任何单语语料库生成。
具体来说,在为每个训练前的例子选择句子A和B时,50%的时间B是A后面的实际下一个句子,
50%的时间B是来自语料库的随机句子。例如:

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

我们完全随机选择NotNext 句子,最终预测模型在这个任务中达到97%-98%的准确率。
尽管存在相似性,但我们在第5.1节中证明的针对该任务的预训练对QA和NLI都非常有益。

3.4 Pre-training Procedure 预训练过程

预训练的过程很大程度上遵循了现有的语言模型预训练文献。对于预训练语料库,我们使用
联合BooksCorpus(800M 字)和英语wikipedia(2500M 字)。 对于维基百科我们只提取了文本段落,
忽略列表,表格和标题。使用文档级别的语料库,而不是使用经过洗牌的句子级别语料库
例如(the Billion Word Benchmark )来提取长的连续序列时至关重要的。

为了生成每个训练输入序列,我们从语料库抽取两个文本跨度,我们称之为 “句子”,尽管
他们通常比单个句子长的多,(但也可以短一些)。第一句接受A嵌入,第二句接受B嵌入。
50%的时间B是A后面的实际下一句话,50%的时间是随机句,这是为“下一句预测”任务而做的。
对其进行采样,使组合长度小于等于512个词。LM屏蔽是在WordPiece分词后应用的,统一
的屏蔽率为15%,并且不特殊考虑部分单词片段。我们对256个序列的批量大小(256个序列*512个词=128000个词/批)
进行了1000000个步骤的训练,这在33亿字的语料库上大约是40轮。我们使用学习率为1e-4,
β1 = 0.9, β2 = 0.999,L2权重衰减为0.01,学习率预热超过10000步。学习率线性衰减。
我们对所有层使用0.1的dropout率。我们遵循OpenAI GPT 使用了gelu激活函数而不是标准的relu。
训练损失是蒙面语言模型似然均值与下一句预测似然均值之和。在4个云TPU上进行BERTBASE
的Pod 配置训练(共16个TPU片)。对16个云TPU(共64个TPU片)进行了BERTLARGE训练。
每个预训练需要四天才能完成。

3.5 Fine-tuning Procedure 微调过程

对于序列级别分类任务,BERT微调很简单。为了获得输入序列的固定维度集合表示,我们
对输入中的第一个词取最终的隐藏状态(即Transformer的输出)通过构造特殊的[CLS]字嵌入。
我们把这个向量表示为 C ∈ RH. 微调过程中添加的唯一新参数是分类层W ∈ RK x H,
其中K是分类标记的数量。用标准的Softmax P = softmax(CWT)计算标记概率P ∈ RK.
对BERT和W的所有参数进行联合微调,最大化正确标记的对数概率。对于 span-level 和词级别
的预测任务,必须以特定于任务的方式稍微修改上述过程。详情请见第4节的相应小节。

对于微调,大多数模型超参数与预训练相同,除了批的大小,学习率和训练轮数。
dropout概率始终保持在0.1。最佳超参数是特定于任务的,但我们发现可能值的后续范围在所有的任务重都能很好的工作。

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

我们还观察到,大数据集(例如,100K+标记的训练示例)对超参数选择的敏感性远低于小数据集。
微调通常非常快,因此只需要对上述参数进行详尽的搜索并选择在开发集上表现最佳的模型是合理的。

3.6 Comparison of BERT and OpenAI GPT BERT 与 OpenAI GPT 比较

与BERT最相似的现有预训练方法时OpenAI GPT,它在一个大的文本语料库训练了一个从左到右的
Transformger LM。事实上,许多BERT中的设计决策都是有意选择尽可能接近GPT,以便将这两种
方法进行比较。这项工作的核心论点是,第3.3节中提出的两项新的预训练任务占了大部分实验改进,
但我们确实注意到,BERT和GPT的训练方式还有其他几个不同之处。

GPT在BooksCorpus(800M words)上训练。 BERT在BooksCorpus(800M words)和 wikipedia(2500 M words)
上训练。

GPT 使用句子分隔符([SEP])和分类器词([CLS])只是在微调时引入。BERT 在预训练期间
学习[SEP],[CLS] 和句子A/B嵌入。

GPT 进行了 1M 步训练,批大小为32000字,BERT进行了1M步训练,批大小是128000字。

GPT 对所有微调实验使用相同的5e-5学习率, BERT选择了一个特定与任务的微调学习率,该学习率
在开发集上表现最佳。

为了隔离这些差异的影响,我们在第5.1节中进行了消融实验,证明大部分提升实际上来自于
新的预训练任务。

4 Experiments 实验

在本节中,我们将介绍11个NLP任务的BERT 微调结果。
在这里插入图片描述
图3: 我们的特定于任务的模型是通过BERT与一个额外的输出层相结合而形成的,因此需要
从零开始学习最少数量的参数。在任务中,(a)和(b)是序列级任务,而©和(d) 是词级任务。
图中,E代表嵌入,Ti代表词i的上下文表示,[CLS]是分类输出的特殊符号。
[SEP]是分离非连续词序列的特殊符号。

4.1 GLUE Datasets GLUE 数据集

The General Language Understanding Evaluation (GLUE)基准是多种自然语言任务的集合。
大多数GLUE数据集已经存在多年,但GLUE的目的是(1)分发这些数据集带着规范的Train Dev 和 Test
以及(2)建立一个评估服务器来缓解评估不一致和测试集过拟合的问题。
GLUE不分发测试集的标记,用户必须将其预测上载到GLUE服务器进行评估,并限制提交的次数。

GLUE 基准包括以下数据集,这些数据集最初在Wang等人中进行了总结(2018):

MNLI Multi-Genre Natural Language Inference 是一项大规模的,众包的蕴涵分类任务。
给定一对句子,目的是预测第二句与第一句是蕴涵,矛盾或中立的。

QQP Quora Question Pairs 是一个二元分类任务,其目标是确定Quora上提出的两个问题
在语义上是否等价。

QNLI Question Natural Language Inference 是 the Stanford Question Answering Dataset的一个版本,
该数据集已经被转换为二元分类任务。正面的例子是(问题, 句子)对儿,他们确实包含正确的答案,反面的例子是
(问题,句子)来自同一段落,不包含答案。

SST-2 The Stanford Sentiment Treebank 是一个二元单句分类任务,由从电影评论
中提取的句子和对其情感的人类注释组成。

CoLA The Corpus of Linguistic Acceptability 是一个二元单句分类任务,其目的
是预测一个英语句子在语言学上是否“可接受”.

SST-B The Semantic Textual Similarity Benchmark 是从新闻标题和其他来源中提取
的句子对儿集合。他们用1到5的分数做了注解,表示两个句子在语义上相似的程度。

MRPC Microsoft Research Paraphrase Corpus 由自动从在线新闻源中提取的句子对组成,
其中包含对句子是否语义等效的人工注释。

RTE Recognizing Textual Entailment 是一个类似于MNLI的二元蕴涵任务,但训练数据要少的多

WNLI Winograd NLI 是一个小型自然语言推断数据集,源自(Levesque等人 2011年)
GLUE网页指出,这个数据集的构建存在问题,提交给GLUE的每个经过训练的系统的性能都比
预测大多数类的65.1的基线精度要差。出于对OpenAI GPT的公平,我们排除了这个数据集。
对于我们的GLUE提交,我们总是预测大多数类。

4.1.1 GLUE Results GLUE 结果

为了在GLUE上进行微调,我们按照第三节的描述表示输入序列或序列对儿,并使用与第一个
输入词([CLS])对应的最终隐藏向量 C ∈ RH 作为聚合表示。这在图3(a)
和(b)中进行了直观演示。 微调过程中引入的唯一参数是分类层 W ∈ RK x H, 其中 K是标记数。
我们用C和W计算一个标准的分类损失 即 log(softmax(CWT)).

对于所有的GLUE任务,我们使用批大小为32和3轮在数据上。对每项任务,我们都运行了
学习率为5e-5,4e-5,3e-5和2e-5的微调,并选择了在开发集上表现最好的一项。此外,
对于BERTLARGE 我们发现微调有时在小数据集上是不稳定的(例如某些运行将
产生退化结果). 因此我们运行了几次随机重启,并选择了在开发集上表现最好的模型。
随机重启时,我们使用相同的预先训练的检查点,但执行不同的微调数据重组和分类器层初始化。
我们注意到GLUE数据集分发不包括测试标记,我们只做了单个GLUE评估服务器提交为每个
BERTBASE 和BERTLARGE.

结果见表1.
BERTBASE 和BERTLARGE在所有任务上都以相当大的幅度超越了现有的所有系统,
与最先进的系统相比,分别获得了4.4%和6.7%的平均准确率提升。注意,BERTBASE和OpenAI GPT
除了注意力屏蔽在主要的模型架构方面几乎是相同的。对于最大和最广泛报道的GLUE任务,MNLI,
BERT获得了4.7%准确率的绝对提升相比于最先进的模型。在GLUE官方排行榜上,BERTLARGE
获得了80.4分,与排名第一的OpenAI GPT相比,OpenAI GPT 在写此文时获得72.8分。

有趣的是, BERTLARGE在所有任务中都明显优于BERTBASE, 即使是
那些训练数据很少的数据集。在5.2节中更深入地探讨了BERT模型大小的影响。

在这里插入图片描述

表1:GLUE 测试结果, 由GLUE评估服务器评分。每个任务下面的数字表示训练示例的数量。
因为我们排除了有问题的WNLI数据集,所以“Average”列与官方的GLUE分数略有不同。
OpenAI GPT = (L=12, H=768, A=12); BERTBASE = (L=12, H=768, A=12); BERTLARGE = (L=24, H=1024, A=16).
BERT 和 OpenAI GPT 都是单模型,单任务。所有的结果都可以获取从
https://gluebenchmark.com/leaderboard and https://blog.openai.com/language-unsupervised/

4.2 SQuAD v1.1

The Standford Question Answering Dataset (SQuAD) 是10万个众包问答对的集合。给出
一个问题和一段维基百科中包含答案的段落,任务是预测段落中的答案文本跨度。例如:

• Input Question:
     Where do water droplets collide with ice
     crystals to form precipitation?

• Input Paragraph:
     ...  Precipitation forms as smaller droplets
     coalesce via collision with other rain drops
     or ice crystals within a cloud.  ...

• Output Answer:
     within a cloud

这种类型的跨度预测任务是GLUE的序列分类任务有很大的不同,但我们能够使BERT以一种
直接的方式在SQuAD上运行。 和GLUE一样,我们将输入问题和段落表示为单个打包的序列,
问题使用A嵌入,段落使用B嵌入。 在微调过程中,唯一的新参数是start verctor S ∈ RH
和end vector E ∈ RH. 使ith输入词的BERT输出的最终隐藏变量被表示成
Ti ∈ RH.可视化见图3(c)。然后,单词i作为答案范围开始的概率计算
为Ti和S 之间的点积。接着是在段落中所有单词上计算softmax:

Pi = e S ⋅ T i ∑ j e S ⋅ T j \frac{e^{S·T_i}}{\sum_je^{S·T_j}} jeSTjeSTi

答案范围的结尾使用相同的公式,并使用最大得分范围作为预测。训练目标是正确的开始
和结束位置的对数似然。

我们训练了3轮,学习率为5e-5,批量大小为32.在推理时,由于结果预测不以开始为条件,
因此我们添加了一个约束,即结果必须在开始之后,但不适用其他启发式方法。分词后的标记
跨度与原始为分词的输入对齐以进行评估。
结果见表2. SQuAD 使用非常严格的测试程序,提交者必须手动联系SQuAD的组织者,在隐藏的
测试集上运行他们的系统,因此我们只提交最好的系统进行测试。表中的结果是我们第一次
也是唯一一次向SQuAD提交测试的报告。我们注意到,来自SQuAD排行榜的最新结果没有最新的
公共系统描述,并且在训练他们的系统时,可以使用任何公共数据。因此,我们在提交的系统
中通过联合训练SQuAD和TriviaQA,使用非常适度的数据集增强。

我们表现最好的系统在集成方面超过了排行榜第一名+1.5 F1, 在单一系统方面超过了排行榜
第一名+1.3 F1. 事实上,我们的单BERT模型在F1分数上优于顶级的集成系统。如果我们只
对SQuAD(没有 TriviaQA)进行微调,我们将损失0.1到0.4F1,并且仍然在很大程度上超越现有的所有系统。

在这里插入图片描述
表2: SQuAD 结果。 BERT集成了7个系统,使用不同的训练前检查点和微调种子。

4.3 Named Entity Recognition 命名实体识别

为了评估词标记任务的性能,我们微调BERT在CoNLL 2003 Named Entity Recognition (NER)dataset。
此数据集由20万个训练单词组成,这些单词以注释为Person,Organization,Location, Miscellaneous,
或者 Other (非命名实体)。

为了微调,我们将每个词i的最终隐藏表示Ti ∈ RH输入到NER标记集的分类层中。
预测不受周围预测的限制(即,非自回归和无CRF)。为了使其与Wordpiece分词技术兼容,我们将每个
CoNLL分词输入字输入到我们的WordPiece分词器,并使用与第一个子词对应的隐藏状态作为分类器的输入。
例如:

Jim    Hen   ##son was a puppet ##eer  
I-PER  I-PER X     O   O O      X  

其中没有对X进行预测。由于WordPiece分词技术边界使输入的已知部分,因此这是为了训练和测试而进行的。
图3(d)中给出了可视化表示。NER使用的是 cased WordPiece model, 而 uncased model用于其它任务。

结果见表3.BERTLARGE的表现优于现有的SOTA,Cross-View Training with multi-task learning,
在CoNLL-2003 NER测试上提高了0.2

在这里插入图片描述
表3: CoNLL-2003 Named Entity Recognition 结果。使用开发集选择超参数,并使用这些超参数
对报告的开发和测试分数进行5次随机重新启动的平均值。

4.4 SWAG

The Situations With Adversarial Generations (SWAG) dataset包含了11.3万个句子对儿完成示例,
用于评估基本常识推理。给出一个视屏字幕数据集的句子,任务是在四个选项中决定最合理的延续。
例如:
A girl is going across a set of monkey bars. She
(i) jumps up across the monkey bars.
(ii) struggles onto the bars to grab her head.
(iii) gets to the end and stands on a wooden plank.
(iv) jumps up and does a back flip.

是BERT适配SWAG数据集类似于对GLUE的适配。对于每个示例,我们构建4个输入序列,每个输入
序列包含给定句子(句子A)和可能的延续(句子B)的连接。我们引入的唯一任务特定参数是
向量V ∈ RH,其具有最终聚集表示的点积Ci ∈ RH 表示每个
选择的得分。概率分布是四种选择的最大值:

Pi = e V ⋅ C i ∑ j = 1 4 e V ⋅ C j \frac{e^{V·C_i}}{\sum^4_{j=1}e^{V·C_j}} j=14eVCjeVCi

我们微调模型3轮,学习率 2e-5, 批大小16. 结果见表4. BERTLARGE比作者
的基线 ESIM + ELMo 系统高出27.1%。

在这里插入图片描述
表4:SWAG 开发和测试准确率。测试结果由SWAG作者根据隐藏标签进行评分。如SWAG 论文报道的,
用100个样本测量人类表现。

5 Ablation Studies 消融研究

尽管我们已经证明了极强的实验结果,但迄今为止提出的结果并没有将具体贡献与BERT框架
的各个方面分离开来。在本节中,我们对BERT的许多方面进行了消融实验,以便更好的了解
它们的相对重要性。

5.1 Effect of Pre-training Tasks 预训练任务的影响

我们的核心主张之一是,与以前的工作相比,BERT的深层双向性是BERT最重要的一个改进,
它是通过蒙面LM预训练实现的。为了证明这一点,我们评估了两种新的模型,它们使用与
BERTBASE完全相同的预训练数据,微调方案,和Transformer超参数:

  1. No NSP:使用 “蒙面LM” (MLM)单不使用“下一句预测” (NSP)任务的模型。

  2. LTR & No NSP:使用从左到右的LM,而不是MLM进行训练的模型。在这种情况下,
    我们预测每一个输入词,不应用任何遮盖。在微调是也应用了“仅左”约束,因为我们发现使用
    “仅左”上下文进行预训练和使用“双向”上下文进行微调总是更差。此外,该模型是在没有NSP
    任务的情况下进行预训练的。这与OpenAI GPT 有直接的可比性,但是使用我们更大的训练集,
    我们的输入表示,和我们的微调方案。

结果见表5. 我们先研究一下NSP任务带来的影响。我们可以看出移除NSP会显著影响QNLI,
MNLI和SQuAD的表现。这些结果表明,我们的预训练方法对于获得之前提出的强有力的实验
结果至关重要。

接下来,我们通过比较“No NSP” 和 “LTR & No NSP” 来评估训练双向表示的影响。
LTR模型在所有任务上的性能都比MLM模型差,MRPC和SQuAD的下降幅度非常大。
对于SQuAD,很明显LTR模型在范围和词预测方面的性能非常差,因为词级隐藏状态没有上下文。
对于MRPC来说,不清楚性能差是因为数据量小还是任务的性质,但是我们发现,在一次完全
的超参数扫描中,这种性能差是一致的,并且有许多随机重启。

为了增强LTR系统的可靠性,我们尝试在其上添加一个随机初始化的BiLSTM进行微调。这
确实大大提高了SQuAD的成绩, 但结果仍然比预训练的双向模型差很多。这也影响所有GLUE
任务的性能。

我们认识到,还可以训练单独的LTR和RTL模型,并像ELMo那样将每个词表示为两个模型的串联。
但是:(a)这是双向模型的两倍;(b)这对于处理像QA这样的任务来说是不直观的,因为RTL
模型不能对问题的答案进行条件化处理;©这样来说不如双向深度模型强大,因为双向模型
可以选择使用左侧或右侧上下文。

在这里插入图片描述
表5:使用BERTBASE架构对预训练任务进行消融。“No NSP”就是被训练时没有
下一句预测任务。“LTF & No NSP” 是训练从左到右的LM,没有下一句预测任务,像OpenAI GPT
"+ BiLSTM"在微调期间在“LTR + No NSP”模型顶部添加一个随机初始化的BiLSTM。

5.2 Effect of Model Size 模型大小的影响

在本节中,我们将探讨模型大小对微调任务准确率的影响。我们使用不同数量的层,
隐藏单元和注意力头训练了许多BERT模型,另外,我们使用之前描述的相同超参数和训练过程。

所选GLUE任务的结果如表6所示。在这个表中,我们报道了5个随机开始的微调的平均开发集准确率。
我们可以看到,更大的模型会在所有四个数据集上带来严格的准确率提升,即使对于只有
3600个标记训练示例的MRPC来说也是如此,并且与预训练的任务大不相同。我们能够在模型
上取得如此显著的改进,这也许也令人惊讶,相对于现有的文献来说,模型已经相当大了。
例如, Vaswani 等人研究的最大的Transformer是(L=6,H=1024,A=16) encoder 参数量为100M,
文献中发现最大的Transformer是(L=64,H=512,A=2) 参数量为235M,(AL-Rfou等人2018)

相比之下,BERTBASE包含110M参数,BERTLARGE包含340M参数。
多年来人们都知道,增加模型规模将导致机器翻译,和语言建模等大规模任务的持续改进,
表6所示的已发布训练数据的LM perplexity就是证明了这一点。然而,我们认为这是第一个
证明扩展到极端模型尺寸也会导致非常小规模任务的大改进的工作,前提是模型已经经过
充分的预训练。

在这里插入图片描述
表6:BERT 模型尺寸上的消融分析。#L = the number of layers; #H = hidden size; #A = number
of attention heads. “LM(ppl)” 发布训练数据的masked LM perplexity.

5.3 Effect of Number of Training Steps 训练步数的影响

图4显示了经过k步预训练的检查点微调后的MNLI 开发集准确率。这使我们能够回答以下的问题:

  1. 问题 :BERT 真的需要大量的预训练(128000字/批 * 1000000步)来实现高准确率的微调吗?
    答: 是的,与500k步相比,BERTBASE在1M步训练中获得了近1.0%的额外准确率。

  2. 问题 : MLM预训练是否比LTR预训练收敛的慢,因为每批预测的单词中只有15%而不是每个单词。
    答: MLM模型的收敛速度确实比LTR模型稍慢。然而,就绝对准确度而言,MLM模型几乎立刻开始
    优于LTR模型。

在这里插入图片描述
图4:训练步数上的消融分析。 这个显示了微调后的MNLI准确率,从经过k步预训练的模型参数开始。
x轴是k的值。

5.4 Feature-based Approach with BERT BERT处理基于特征的方法

到目前为止,所有BERT结果都使用了微调的方法,在预训练模型中添加一个简单的分类层,并且
在下游任务中对所有参数进行联合微调。然而,基于特征的方法, 从预训练的模型中提取固定
特征,具有一定优势。首先并非所有的NLP任务都可以很容易的用一个Transformer encoder架构,
因此需要添加一个特定于任务的模型架构。第二, 能够预先计算一次昂贵的训练数据表示,
然后在这种表示的基础上用较便宜的模型运行许多实验,有很大的计算优势。

在本节中,我们通过在CoNLL-2003 NER 任务上生成类似ELMo的预训练上下文表示来评估BERT在
基于特征方法中的表现。为此,我们使用4.3节中相同的输入表示,但使用一个或多个层的激活,
而不微调BERT的任何参数。这些上下文嵌入用作分类层之前随机初始化的两层768维BiLSTM的输入。

结果如表7所示,最好的方法是连接来自预训练Transformer顶部四个隐藏层的词表示,这只比微调
整个模型落后0.3F1。这表明,BERT对于微调和基于特征的方法都是有效的。

在这里插入图片描述
表7:BERT 在CoNLL-2003 NER上基于特征方法的消融分析。来自具体层的激活被合并并送入一个
两层的BiLSTM,而不向BERT进行反向传播。

6 Conclusion 结论

最近,由于语言模型的迁移学习所带来的实验改进表明,丰富,无监督的预训练是许多自然语言
理解系统不可或缺的一部分。特别是,这些结果使得即使是低资源任务也能从非常深的单向
架构中受益。我们的主要贡献是将这些发现进一步推广到深层双向架构中,使相同的预训练模型
能够成功地处理广泛地NLP任务。

虽然实验结果很强,在某些情况下超过了人类的表现,未来的重要工作是研究BERT可能捕捉或捕捉不到的
语言现象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BERT:Pre-training of Deep Bidirectional Transformers for Language Understanding 的相关文章

随机推荐

  • C语言之实现矩阵(3行3列)的转置(即行列互换)

    例如 输入下面的矩阵 100 200 300 400 500 600 700 800 900 程序输出 100 400 700 200 500 800 300 600 900 代码如下所示 include
  • 数据结构视频教程 -《[猎豹网校]数据结构与算法_C语言》

    整个视频打包下载地址 史上最全的数据结构视频教程系列分享之 猎豹网校 数据结构与算法 C语言 转载请保留出处和链接 更多优秀资源请访问 我是码农 数据结构是信息与计算科学专业中一门重要的专业基础课程 当用计算机来解决实际问题时 就要涉及到数
  • vmware esxi 6.7 下载以及如何在虚拟机里实现显卡直通?

    为了让vmware支持显卡 找了好久esxi下载 版本太多了 都不知道要下哪个 找到别人贡献的百度链接 分析给大家 使用esxi也不行 esxi需要安装在裸机上 才能支持独显 不能直接安装在windows上 后来查资料使用 qemu kvm
  • 【Windows基线检查】

    文章目录 前言 一 目的 二 要求 总结 前言 企业在发布服务器到公网前都应该对服务器进行安全测试 包括漏洞扫描 基线检查 业务流程测试等等 本期介绍Windows基线检查的部分内容和一些操作系统策略设置方法 一 目的 旨在为即将发布到公网
  • 获取时间的方法

    Java获取当前年份 月份和日期是通过Calendar类的实例对象来获取的 首先创建一个Calendar类的实例对象 Calendar类属于java util包 Calendar calendar Calendar getInstance
  • linux内核开发基础(linux内核源码、树莓派源码编译、SD卡挂载)

    首先下载树莓派linux内核源码 下载网址 https github com raspberrypi linux 在树莓派使用指令 uname r查看当前树莓派的版本号 然后选择对应的linux内核版本号进行下载 将linux内核源码从共享
  • linux下写穿/直写(Write-Through)与写回(Write-Back)

    CPU使用高速缓存 DCache 时 它对内存的的写操作有两种模式 写穿 write throuht 写回 write back 写穿 write throuht 模式 该模式下 CPU对主存写数据时 不经过DCdcache直接写到内存 此
  • JavaScript中将字符串的首字母大写

    其实方法有很多 这里我们使用其中一种 利用字符串的内置api来更改 1 定义全小写一个字符串 2 利用字符串的方法将首字母取出转化为大写并与剩余字符串进行拼接 3 弹窗显示结果 个人习惯 当然也可以控制台输出等等 代码为下 let str
  • 简简单单吃个磁盘(硬盘?)

    前言 Version S Description Date By V1 C First Version 2020 10 24 AYZP C Create A Add M Modify D Delete 整理资料的时候 发现个磁盘的相关知识不
  • 怎样建立css,怎样建立新的css规则

    建立新css规则的方法 首先打开dreamweaver软件 然后在菜单中单击 文件 选择 新建 接着创建 XHTML1 0 transitional 最后打开 新建CSS规则 对话框 并指定要创建的CSS规则的选择器类型即可 本教程操作环境
  • android设置状态栏颜色(沉浸式状态栏)

    设置状态栏颜色的方法是andorid4 4以后支持的 最少要api19以上才可以使用哟 方法如下 第一种 public static void setStatusBarTranslucent ViewGroup vg Activity ac
  • mac os 安装 redis

    mac os 安装 redis 在redis官网下载 https redis io download 1 下载 在mac os系统 双指点击 finder 图标 选 Go to Folder 输入 usr local 另外开一个finder
  • 基于鲸鱼算法改进支持向量机SVM的多分类研究,woa-svm

    目录 背影 支持向量机SVM的详细原理 SVM的定义 SVM理论 鲸鱼算法的原理及步骤 SVM应用实例 鲸鱼算法改进SVM的多分类研究 代码 结果分析 展望 背影 传统的支持向量机只能进行二分类 本文调用libsvm工具箱 并用鲸鱼算法改进
  • 算法编程7:一个四位数 abcd,满足 abcd * 4 = dcba,求这个数

    描述 一个四位数 abcd 满足 abcd 4 dcba 求这个数 编程实现1 for i in list range 1000 2500 num2 i 4 a i 1000 b i 1000 100 c i 1000 100 10 d i
  • 序列化错误小结:SerializationFailedException

    公司项目 不提供具体代码 仅提供思路 问题描述 错误报告MultipartRequest无法实现序列化 问题解决1 发生SerializationFailedException时 第一时间根据错误报告定位错误类 发现MultipartReq
  • 分布式事务专题之9、分布式事务解决方案之最大努力通知型

    目录 1 支付宝充值案例 假如我们自己有一个电商系统 支持用户使用支付宝充值 流程如下 2 用户支付流程 是一个同步的过程 用户在浏览器发起充值请求 gt 电商服务 电商服务生成充值订单 状态为0 待支付 0 待支付 100 支付成功 20
  • 软件产品质量模型

    ISO IEC 9126是国际标准组织 ISO 制订的用于评估软件质量的国际标准1 ISO IEC 9126标准由6个特性和27个子特性组成 是评价软件质量的国际标准1 ISO IEC 9126已经被ISO IEC 25010取代 后者是国
  • STM32刷Micropython固件参考指南

    STM32刷Micropython固件指南 其实刷固件和普通的程序下载烧录无多大的差异 主要是其他因数的影响导致刷固件或刷完固件无法运行的情况和相关问题 刷固件教程 固件下载 目前所支持的stm32型号有这些 stm32f0 stm32f4
  • linux进阶05——Makefile(二)

    1 源代码 main c int main printf hello world n fun1 fun2 fun1 c void fun1 printf this is fun1 n fun2 c void fun2 printf this
  • BERT:Pre-training of Deep Bidirectional Transformers for Language Understanding

    BERT 个人翻译 并不权威 paper https arxiv org pdf 1810 04805 pdf BERT Pre training of Deep Bidirectional Transformers for Languag