语言模型预训练已被证明对改善许多自然语言处理任务是有效的。这些任务包括:
sentence-level
的任务,如自然语言推理 natural language inference
和转述paraphrasing
,其目的是通过整体分析来预测句子之间的关系。token-level
的任务,如命名实体识别 named entity recognition: NER
和 SQuAD
问答 question answering: QA
,其中模型需要在 token-level
产生细粒度的输出。目前有两种策略将预训练的 language representation
应用于下游任务: feature-based
和 fine-tuning
:
feature-based
方法(如 ELMo
)使用 tasks-specific
架构,其中使用预训练的 representation
作为额外的特征。fine-tuning
方法(如 GPT
),引入了最小的 task-specific
参数,并通过简单地微调 pretrained parameter
从而对下游任务进行训练。在之前的工作中,这两种方法在pre-training
期间共享相同的目标函数,其中它们使用单向语言模型来学习通用的 language representation
。
即,
feature-based
方法和fine-tuning
方法采用相同的预训练方式,但是在应用到下游任务阶段才有所差异。
论文 《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》
认为:目前的技术严重限制了 pre-trained representation
的能力,特别是对于微调 fine-tuning
方法。主要的限制是:标准的语言模型是单向的,这就限制了在预训练中可以使用的架构。例如,在 GPT
中,作者使用了一个从左到右的架构,其中在 Transformer
的self-attention layer
中每个 token
只能关注前面的 token
。
sentence-level
的任务,这样的限制是次优的。token-level
的任务(如 SQuAD
问答任务),当应用基于微调的方法时,这样的限制可能是毁灭性的。因为在这种情况下,从两个方向融合上下文是至关重要的(因为可能需要关注后面的 token
而不是前面的,从而找到问题的答案)。在论文 《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》
中,作者通过从 Transfromer
中提出 Bidirectional Encoder Representation: BERT
来改善基于微调的方法。BERT
通过提出一个新的预训练目标来解决前面提到的单向约束:masked language model: MLM
任务,其灵感来自 Cloze
任务(即,完形填空任务)。 MLM
从输入中随机掩码一些 token
,任务的目标是仅根据上下文来预测被掩码单词的原始 vocabulary id
。与从左到右的语言模型预训练不同的是,MLM
目标允许representation
同时融合左侧和右侧的上下文,这使得我们可以预训练一个深度的双向 Transformer
。除了MLM
,论文还引入了一个 next sentence prediction: NSP
任务来联合预训练 text-pair representation
。
论文贡献如下:
language representation
的重要性。与 《Improving language understanding with unsupervised learning》
使用单向语言模型进行预训练不同,BERT
使用 MLM
来实现 pre-trained deep bidirectional representation
。这也与 ELMo
相反,后者使用独立训练的从左到右和从右到左的语言模型的浅层拼接 shallow concatenation
。representation
消除了许多严重工程化的 task-specific
架构的需要。BERT
是第一个基于微调的 representation model
,它在大量的 sentence-level
和 token-level
任务上取得了SOTA
的性能,超过了许多具有 task-specific
架构的系统。BERT
推动了 11
项 NLP
任务的 state-of-the-art
。作者还报告了BERT
的大量消融实验,表明 BERT
模型的双向特性是唯一最重要的新贡献。相关工作:
feature-based
方法:几十年来,学习广泛适用的 word representation
一直是一个活跃的研究领域,包括非神经方法和神经方法。预训练的 word embeddin
被认为是现代 NLP
系统的一个组成部分,与从头开始学习的 embedding
相比,有很大的改进。
这些方法已被推广到更粗的粒度,如 sentence embedding
或 paragraph embedding
。与传统的 word embedding
一样,这些学到的 representation
通常也被用作下游模型的特征。
ELMo
沿着不同的维度推广了传统的 word embedding
研究。他们提出从语言模型中提取 context-sensitive
的特征。当将contextual word embedding
与现有的 task-specific
架构相结合时,ELMo
推进了几个主要 NLP benchmark
的 SOTA
,包括 SQuAD
上的问答、情感分析 sentiment analysis
和命名实体识别 named entity recognition
。
fine-tuning
方法:最近从语言模型中进行迁移学习的一个趋势是,在为下游监督任务微调同一模型之前,在语言模型目标上预训练该模型架构。这些方法的优点是,只需要从头开始学习非常少的参数。至少部分由于这一优势,GPT
在 GLUE benchmark
的许多 sentence-level
任务上取得了当时 SOTA
的结果。
从监督数据 supervised data
迁移学习:虽然无监督预训练的优势在于几乎有不限量的数据可用,但也有工作表明,可以从具有大型数据集的监督任务中有效地迁移学习,如自然语言推理和机器翻译 machine translation
。在 NLP
之外,计算机视觉领域的研究也证明了从大型预训练模型进行迁移学习的重要性,其中一个有效的秘方是:对基于 ImageNet
预训练的模型进行微调。
BERT
的模型架构是一个多层的、双向的 Transformer encoder
,基于 《Attention is allyou need》
描述的原始实现。由于最近 Transformer
的使用已经变得无处不在,而且我们的实现实际上与原版相同,因此我们将省略对模型架构的详细描述,请读者参考 《Attention is allyou need》
以及 《The Annotated Transformer》
等优秀出版物。
在这项工作中,我们将层数(即 Transformer block
)记做 hidden size
记做 self-attention head
数记做 feed-forward/filter size
设为 4096
。我们主要报告两种模型尺寸的结果:
BERT_BASE
:110M
。BERT_LARGE
:340M
。前馈神经网络是一个双层的全连接网络,输入维度为
、中间层的维度为 、输出层的维度为 。
BERT_BASE
被选择为具有与 GPT
相同的模型大小,以便于比较。然而,关键的是,BERT Transformer
使用的是双向自注意力,而GPT Transformer
使用的是受约束的自注意力(每个token
只能关注其左侧的上下文)。我们注意到,在文献中,双向 Transformer
通常被称为 Transformer encoder
,而只关注左侧上下文的 Transformer
被称为 Transformer decoder
(因为它可以用于文本生成)。
BERT
、GPT
和 ELMo
之间的比较如下图所示。
我们的 input representation
能够在一个token
序列中明确地表示单个文本句子或一对文本句子(如,[Question, Answer]
)。对于一个给定的token
,它的 input representation
是由相应的token embedding
、segment emebdding
和 position embedding
相加而成的。下图给出了我们的 input representation
的直观表示。
具体而言:
我们使用具有 30k
个 token
的vocabulary
的 WordPiece embedding
(《Google’s neural machine translation system: Bridging the gap between human and machine translation》
)。我们用 ##
指示被拆分的 word piece
。
我们使用学到的 positional embedding
,最大可以支持长度为 512
个 token
的序列。
每个序列的第一个 token
总是特殊的 classification embedding
,即 [CLS]
。与这个 token
相对应的 final hidden state
(即 Transformer
的输出)被用作分类任务的 aggregate sequence representation
。对于非分类任务,这个向量被忽略。
sentence pair
被打包成一个单一的序列。我们以两种方式区分这些句子。
首先,我们用一个特殊的 token
(即,[SEP]
)将这两个句子分开。(注意,每个句子的结尾都有一个 [SEP]
)
其次,我们在第一句的每个 token
上添加一个学到的 segment A Embedding
,在第二句的每个 token
上添加一个学到的 segment B Embedding
。
假设
segment
编号为1
和2
,那么segment A embedding
就是segment=1
对应的embedding
,segment B embedding
就是segment=2
对应的embedding
。
对于单个句子的输入,我们只使用 segment A Embedding
。注意,segment A
也称作 sentence A
,因为这里一个句子就是一个 segment
。
进一步地,我们是否可以对句子内部的子句、或者短语也作为更细粒度的
segment
来提供embedding
?
ELMo
和 GPT
不同,我们没有使用传统的从左到右、或从右到左的语言模型来预训练 BERT
。相反,我们使用两个新颖的无监督预训练任务对 BERT
进行预训练。直观而言,我们有理由相信:深度双向模型严格来说比 left-to-right
的模型、或浅层拼接了 left-to-right and right-to-left
的模型更强大。不幸的是,标准的 conditional language model
只能从左到右或从右到左进行训练,因为双向条件会让每个词在multi-layered context
中间接地 "看到自己" 。
为了训练深度双向 representation
,我们采取了一种直接的方法,即随机掩码一定比例的 input token
,然后只预测那些被掩码的 token
。我们把这个过程称为 "masked LM
"(MLM
),尽管它在文献中经常被称为 Cloze task
。在这种情况下,对应于 mask token
的 final hidden vector
被馈入 output softmax
(输出空间为整个 vocabulary
),就像在标准语言模型中一样。在我们所有的实验中,对于每个序列我们随机掩码 15%
的 WordPiece token
。
与降噪自编码器不同的是,我们只预测被掩码的单词,而不是重建整个输入。
被掩码的
token
填充以[MASK]
。
尽管这确实允许我们获得一个双向的预训练模型,但这种方法有两个缺点:
首先,我们在预训练和微调之间产生了不匹配 mismatch
,因为在微调过程中从来没有看到 [MASK]
这个 token
。
为了缓解这一问题,我们并不总是用实际的 [MASK] token
来替换被掩码的 token
。相反,训练数据生成器随机选择 15%
的 token
(例如,在句子 "my dog is hairy"
中它选择了hairy
),然后它将执行以下程序:
80%
的情况下用 [MASK] token
替换该词,例如,"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"
。这样做的目的是为了使 representation
偏向于实际观察到的单词。Transformer encoder
不知道哪些单词会被要求预测、哪些单词已经被随机词所取代,所以它被迫保持每个 input token
的 distributional contextual representation
。此外,由于随机替换只发生在所有 token
的 1.5%
(即 15%
的 10%
),这似乎并不损害模型的语言理解能力。
似乎论文并没有实验来验证这一点。
其次,每个 batch
中只有 15%
的token
被预测,这表明可能需要更多的 pre-training step
来使模型收敛。在实验部分,我们证明了 MLM
的收敛速度确实比left-to-right
的模型(预测每个 token
)稍慢,但是 MLM
模型的经验改进 empirical improvement
远远超过了增加的训练成本。
许多重要的下游任务,如 Question Answering: QA
和 Natural Language Inference: NLI
,都是基于对两个文本句子之间关系的理解,而语言建模并没有直接捕获到这一点。为了训练一个能够理解句子关系的模型,我们预训练了一个二元化的 next sentence prediction task
,该任务可以从任何单语种的语料库中简单地生成。
具体而言,在为每个预训练样本选择句子 A
和句子 B
时:
50%
的情况下句子 B
是紧随句子 A
的实际的下一句。50%
的情况下句子 B
是语料库中的一个随机句子。例如:
xInput = [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%
的准确率。尽管该任务很简单,但我们在实验中证明,针对这个任务的预训练对 QA
和 NLI
都非常有利。
实际上后续的论文表明:
NSP
预训练任务是没什么作用甚至是有害的。
预训练程序主要遵循现有的关于语言模型预训练的文献。对于预训练语料库,我们使用 BooksCorpus
(800M
单词)和 English Wikipedia
(2500M
单词)的组合。对于 Wikipedia
,我们只提取文本段落,忽略了 list
、table
、和 header
。至关重要的是,我们使用document-level
语料库而不是混洗过的 sentence-level
语料库(如 Billion Word Benchmark
)从而提取长的连续文本序列。
为了生成每个训练输入序列,我们从语料库中采样两个区间 span
的文本,我们称之为 "句子",尽管它们通常比单个句长得多(但也可能更短)。
Segment A Embedding
,第二个句子接受 Segment B Embedding
。50%
的情况下句子 B
是紧随句子 A
之后的实际的下一句,50%
的情况下句子 B
是一个随机的句子。这是用于 next sentence prediction
任务。512
个 token
。语言模型的 masking
是在 WordPiece tokenization
之后进行的,其中使用 15%
的均匀的掩码率 masking rate
,并没有对部分 word piece
给予特殊考虑。
我们用 batch size = 256
来训练一百万个 step
,每个 mini-batch
有 256 * 512 = 128000
个 token
(这里是近似值,精确值为 131072
),因此相当于在 0.33B
单词的语料库上训练 40
个 epoch
。
Adam
优化器,学习率为L2
权重衰减为 0.01
。学习率在前 10000
步进行 warmup
,学习率线性衰减。layer
上使用 0.1
的 dropout rate
。GPT
,我们使用 gelu
激活函数不是标准的 relu
。training loss
是 mean masked LM likelihood
和 mean next sentence prediction likelihood
之和。BERT_BASE
的训练在 Pod configuration
的 4 Cloud TPUs
上进行(共 16
个TPU
芯片)。BERT_LARGE
的训练在 16 Cloud TPUs
上进行(共 64
个TPU
芯片)。BERT_BASE
和 BERT_LARGE
的预训练都需要 4
天的时间来完成。
对于 sequence-level
分类任务,BERT
的微调是直接的。为了获得输入序列的固定维度的、被池化的 representation
,我们采用输入的第一个 token
的 final hidden state
,这对应于特殊的[CLS]
对应的 word embedding
。我们把这个向量表示为 softmax
计算的,即 BERT
和 ground-truth
标签的对数概率最大化。
对于 span-level
和 token-level
的预测任务,上述过程必须以 task-specific
的方式稍作修改。细节在实验部分给出。
对于微调,模型的大部分超参数与预训练时相同,除了 batch size
、learning rate
和训练 epoch
的数量。 dropout rate
始终保持在 0.1
。最佳的超参数值是 task-specific
的,但我们发现以下数值范围在所有任务中都能很好地发挥作用:Batch size
为 16 、32
;Learning rate (Adam)
为5e-5、3e-5、2e-5
;epoch
数量为3、4
。
微调采用更小的
batch size
、更小的学习率、更少的epoch
。
我们还观察到:大数据集(例如,100k+
带标记的训练样本)对超参数选择的敏感性远低于小数据集。
微调通常是非常快的,所以简单地对上述超参数进行暴力搜索并选择在验证集上表现最好的模型是合理的。
与 BERT
最具可比性的、现有的预训练方法是OpenAI GPT
,它在一个大型文本语料库上训练了一个 left-to-right
的 Transformer
语言模型。事实上,BERT
中的许多设计决定都是有意选择的,以尽可能地接近 GPT
,从而使这两种方法能够得到最低限度的比较。我们工作的核心论点是:我们提出的两个新颖的预训练任务占了经验改进的大部分,但我们确实注意到 BERT
和 GPT
的训练方式还有几个不同之处:
GPT
是在 BooksCorpus
(800M
单词)上训练的,而 BERT
是在 BooksCorpus
和 Wikipedia
( 2500M
单词)上训练的。
通常而言,更大的预训练语料库会带来更好的微调效果。
GPT
使用句子分隔符sentence separator
([SEP]
)和 classifier token
([CLS]
),它们仅在微调期间引入;而 BERT
在预训练期间学习 [SEP]
、[CLS]
和 segment A/B embedding
。
GPT
被训练了 1M
个 step
,batch size
为 32000
个单词;BERT
被训练了 1M
个 step
,batch size
为 128000
个词。
GPT
在所有微调实验中使用相同的学习率 5e-5
;BERT
选择了 task-specific
的、用于微调的学习率,这个学习率在验证集上表现最好。
为了隔绝 isolate
这些差异的影响,我们在实验部分进行了大量消融实验,证明大部分的改进实际上来自新颖的预训练任务。
General Language Understanding Evaluation: GLUE
基准是各种自然语言理解 natural language understanding
任务的集合。大多数 GLUE
数据集已经存在多年,但 GLUE
的目的是:
Train/Dev/Test
的拆分。evaluation server
从而缓解评估不一致和测试集过拟合的问题。GLUE
并未提供测试集的标签,用户必须将他们的预测上传到 GLUE server
进行评估,并对提交的次数有所限制。GLUE benchmark
包括以下数据集:
Multi-Genre Natural Language Inference: MNLI
:是一个大规模、众包式的蕴含分类 entailment classification
任务。给定一对句子,任务的目标是:预测第二个句子相对于第一个句子是蕴含关系entailment
、矛盾关系contradiction
还是中性关系 neutral
。
Quora Question Pairs: QQP
:是一个二元分类任务,任务的目标是确定在 Quora
上提出的两个问题是否在语义上等价 semantically equivalent
。
Question Natural Language Inference: QNLI
:是 Stanford Question Answering Dataset
的一个版本,它被转换为一个二元分类任务。正样本是 sentence
确实包含正确答案的 (question, sentence) pair
,负样本是 sentence
中不包含答案的 (question, sentence) pair
。
Stanford Sentiment Treebank: SST-2
:是一个二元单句分类任务,由从电影评论中提取的句子组成,并具有人类对这些评论的情感的注释 annotation
。
Corpus of Linguistic Acceptability: CoLA
:是一个二元单句分类任务,任务的目标是预测一个英语句子是否在语言上 "acceptable
"。
Semantic Textual Similarity Benchmark: STS-B
:是一个从新闻 headlines
和其他来源抽取的 sentence pair
的集合。它们被标记为 1 ~ 5
分,表示这两个句子在语义上的相似程度。
Microsoft Research Paraphrase Corpus: MRPC
:从在线新闻来源中自动提取的 sentence pair
组成,并由人类注释该 sentence pair
是否具有语义上的等价性。
Recognizing Textual Entailment: RTE
:是一个类似于 MNLI
的二元蕴含任务,但训练数据少得多。
Winograd NLI: WNLI
:是一个小型自然语言推理 natural language inference
数据集,源于 《The winograd schema challenge》
。GLUE
的网页指出:这个数据集的构建存在问题,而且每一个提交给 GLUE
的训练好的系统的表现都比一个简单的 baseline
更差。这个简单的 baseline
直接预测 majority class
,并达到 65.1
的准确率。因此,出于对 OpenAI GPT
的公平比较,我们排除了这个数据集。对于我们的 GLUE submission
,我们总是预测 majority class
。
即,对于每一个测试样本,预测它的类别为训练集中出现概率最高的那个类别(即
majority class
)。
为了在 GLUE
上进行微调,我们根据前文所述来表示输入序列或 sequence pair
,并使用对应于第一个输入 token
([CLS]
)的final hidden vector
aggregate representation
。这在下图 (a)
和 (b)
中得到了直观的证明。在微调过程中引入的唯一新参数是一个分类层
因为
GLUE
数据集都是文本分类任务。
对于所有的 GLUE
任务,我们使用 batch size = 32
以及 3
个 epoch
。
对于每个任务,我们用 5e-5、4e-5、3e-5、2e-5
的学习率进行微调,并选择在验证集上表现最好的一个。
此外,对于 BERT_LARGE
,我们发现微调在小数据集上有时是不稳定的(也就是说,一些 runs
会产生退化degenerate
的结果),所以我们运行了几个随机重启 random restart
,并选择了在验证集上表现最好的模型。
通过随机重启,我们使用相同的 pre-trained checkpoint
,但在微调期间进行不同的数据混洗和 classifier layer
初始化 。
我们注意到,GLUE
数据集不包括测试集的标签,我们只为每个 BERT_BASE
和 BERT_LARGE
做一次 evaluation server submission
。
从图
(a)
中看到,在微调期间只有一个[SEP]
符号,这与预训练阶段不一致。在预训练阶段每个句子的末尾都添加一个[SEP]
。这种不一致是否影响效果?可以通过实验来评估。
实验结果如下表所示:
BERT_BASE
和 BERT_LARGE
在所有任务上的表现都大大超过了现有的系统,分别比 SOTA
的系统获得了 4.4%
和 6.7%
的平均精确度提升。请注意,BERT_BASE
和 OpenAI GPT
在 attention masking
之外的模型架构方面几乎是相同的。
对于最大和最广泛报道的GLUE
任务 MNLI
,BERT
(这里是 BERT_LARGE
)相比 SOTA
获得了 4.7%
的绝对提升。
在 GLUE
的官方排行榜上,BERT_LARGE
获得了80.4
分;相比之下,排在榜首的系统(即 OpenAI GPT
)截至本文撰写之日获得了 72.8
分。
下图中的
Average
稍有差异,因为这里我们排除了有问题的WNLI
数据集。
值得注意的是,BERT_LARGE
在所有任务中都显著优于 BERT_BASE
,即使是那些训练数据非常少的任务。BERT
模型大小的影响将在下面的实验中进行更深入的探讨。
Standford Question Answering Dataset: SQuAD
是一个由 10
万个众包的 (question, answer) pair
组成的集合。给定一个问题和来自维基百科中包含答案的段落,任务的目标是预测该段落中的答案文本的区间 answer text span
。例如:
xxxxxxxxxx
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
这种类型的区间预测任务 span prediction task
与 GLUE
的序列分类任务截然不同,但我们能够以一种直接的方式使 BERT
在SQuAD
上运行。
就像 GLUE
一样,我们将输入的问题和段落表示为一个 single packed sequence
,其中 question
使用 segment A embedding
,段落使用 segment B embedding
。在微调过程中学习到的唯一的新参数是一个 start vector
end vector
input token
在 BERT
中的的 final hidden vector
表示为 Figure 3(c)
所示。然后,单词 answer span
的起点start
的概率被计算为 softmax
:
其中
取值为从段落开始到段落结束。
同样的公式用于 answer span
的终点end
,最大得分的 span
被用作预测。训练目标是正确的起点位置和终点位置的对数可能性。
这里假设起点和终点之间是相互独立的。实际上这种假设通常不成立,终点和起点之间存在关联,如终点的位置大于等于起点。
我们用 5e-5
的学习率和 batch size = 32
训练了 3
个 epoch
。在推理时,由于终点预测并没有考虑以起点为条件,我们增加了终点必须在起点之后的约束条件,但没有使用其他启发式方法。tokenized labeled span
被调整回原始的 untokenized input
以进行评估。
因为经过了
tonenization
之后,原始的单词被拆分为word piece
,这将影响span
的位置。
结果如下表所示。SQuAD
采用了高度严格的测试程序,提交者必须手动联系 SQuAD
的组织者,在一个隐藏的测试集上运行他们的系统,所以我们只提交了我们最好的系统进行测试。下表中显示的结果是我们第一次也是唯一一次向 SQuAD
提交的测试结果。
我们注意到:SQuAD
排行榜上的榜首结果没有最新的公开的系统描述,而且在训练他们的系统时允许使用任何公共数据。因此,我们在提交的系统中使用了非常适度的数据增强:在 SQuAD
和 TriviaQA
上联合训练。
我们表现最好的系统相比排行榜上榜首的系统高出 +1.5 F1
(以 ensembling
系统的方式 )和 +1.7 F1
(以 single
系统的方式)。事实上,我们的单一 BERT
模型在F1
得分方面优于 top ensemble system
。如果我们只对 SQuAD
进行微调(不包括TriviaQA
),我们会损失0.1-0.4 F1
,但仍然以很大的优势胜过所有现有系统。
BERT ensemble
使用了7
个模型,它们分别使用不同的预训练checkpoint
和fine-tuning seed
。
为了评估 token tagging
任务的性能,我们在 CoNLL 2003
命名实体识别(NER
)数据集上对 BERT
进行了微调。这个数据集由 20
万个训练单词组成,这些单词被标注为人物 Person
、组织Organization
、位置Location
、杂项Miscellaneous
、或其他Other
(非命名实体)。
为了进行微调,我们将每个token
final hidden representation
non-autoregressive
和 no CRF
)。
为了与 WordPiece tokenization
兼容,我们将每个 CoNLL-tokenized input word
馈入我们的 WordPiece tokenizer
,并使用与第一个 sub-token
对应的 hidden state
作为分类器的输入。例如:
xxxxxxxxxx
Jim Hen ##son was a puppet ##eer
I-PER I-PER X O O O X
其中 X
没有预测。Figure 3(d)
中也给出了一个直观的表示。在NER
中使用了 cased WordPiece model
(即,保留字母的大小写) ,而在所有其他任务中则使用了 uncased model
(即,所有字母转化为小写)。
结果如下表所示。BERT_LARGE
在 CoNLL-2003 NER Test
中优于现有的 SOTA
(Cross-View Training with multi-task learning
)达到 +0.2
的改进。
如果在
BERT
的final hidden representation
之上再接入自回归或CRF
,预期将得到更好的效果。
Situations With Adversarial Generations: SWAG
数据集包含11.3
万个 sentence-pair completion
的样本,评估了 grounded commonsense inference
。
给定视频字幕数据集中的一个句子,任务是在四个选项中决定最合理的延续concatenation
。例如:
xxxxxxxxxx
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
。对于每个样本,我们构建四个输入序列,每个序列都包含给定句子(句子 A
)和一个可能的延续(句子B
)的拼接。我们引入的唯一 task-specific
参数是一个向量 final aggregate representation
softmax
:
我们用 2e-5
的学习率和 batch size = 16
对模型进行了 3
个 epoch
的微调。结果如下表所示。BERT_LARGE
比作者的 baseline
(即,ESIM+ELMo
系统)要提高 27.1%
。
BERT
框架的每个方面 aspect
的具体贡献分离出来。这里我们对 BERT
的一些方面进行了消融实验,以便更好地了解其相对重要性。我们的核心主张claim
之一是 BERT
的深度双向性deep bidirectionality
,这是由 masked LM pre-training
实现的并且是BERT
与以前的工作相比最重要的一个改进。为了证明这一主张,我们评估了两个新模型,它们使用了与 BERT_BASE
完全相同的预训练数据、微调方案、以及 Transformer
超参数。
No NSP
:该模型使用 MLM
任务预训练,但是没有 NSP
任务。
LTR & No NSP
:该模型使用 Left-to-Right: LTR
的语言模型来训练,而不是使用MLM
来训练 。在这种情况下,我们预测每一个input word
,不应用任何 masking
。在微调时也应用了 left-only
约束,因为我们发现:用 left-only-context
进行预训练然后用 bidirectional context
进行微调总是更糟糕。此外,这个模型没有使用 NSP
任务进行预训练。
这与OpenAI GPT
有直接的可比性,但使用了我们更大的训练数据集、我们的input representation
、以及我们的微调方案。
BERT
在预训练期间学习[SEP]
、[CLS]
和segment A/B embedding
,而GPT
仅在微调期间学习这些input representation
。
结果如下表所示。
我们首先检查了NSP
任务带来的影响。可以看到:去掉NSP
对 QNLI
、MNLI
和SQuAD
的性能有很大的伤害。这些结果表明,我们的预训练方法对于获得前面介绍的强大的经验结果至关重要。
后续的
XLNet
和RoBERTa
都表明:NSP
任务不重要。而且RoBERTa
的作者认为:BERT
得出NSP
任务重要的原因是,BERT
的输入是两个句子的拼接,因此如果此时没有NSP
任务则效果较差。在RoBERTa
中,由于没有NSP
任务,因此预训练样本就是一个完整的、来自单个文件的文档块。
接下来,我们通过比较 "No NSP
"和 "LTR & No NSP
"来评估训练 bidirectional representation
的影响。LTR
模型在所有任务上的表现都比MLM
模型更差,在 MRPC
和 SQuAD
上的下降幅度非常大。
SQuAD
,直观而言,LTR
模型在span
预测和 token
预测方面的表现非常差,因为 token-level hidden state
没有右侧的上下文。MRPC
而言,不清楚这种糟糕的表现是由于数据量小还是由于任务的性质,但是我们发现这种糟糕的表现在多次随机重启的full
超参数扫描中是一致的。为了加强 LTR
系统,我们尝试在它上面添加一个随机初始化的 BiLSTM
进行微调。这确实大大改善了 SQuAD
的结果,但结果仍然比预训练的双向模型差得多。它还损害了其它所有四个 GLUE
任务的性能。
我们认识到:也可以像 ELMo
那样,单独训练LTR
和 RTL
模型,并将每个 token
表示为两个模型的拼接。然而:
QA
这样的任务来说是不直观的,因为 RTL
模型不能以答案作为条件来回答问题(即,条件概率 deep bidirectional model
强大,因为深度双向模型可以选择使用 left context
或 right context
。这里我们探讨了模型大小对微调任务准确性的影响。我们训练了一些具有不同层数、隐单元、以及注意力头的 BERT
模型。除此之外,我们还使用了与前面所述相同的超参数和训练程序。
选定的 GLUE
任务的结果如下表所示。在这个表中,我们报告了 5
次随机重启微调的平均验证准确率。可以看到:
更大的模型在所有四个数据集上都导致了一致的准确性提高,即使是只有 3600
个标记的训练样本的 MRPC
。
同样令人惊讶的是,我们能够在相对于现有文献已经相当大的模型之上实现如此显著的改进。例如:
《Attention is all you need》
探索的最大的 Transformer
是 (L=6,H=1024,A=16)
,编码器的参数为100M
。Transformer
是 (L=64,H=512,A=2)
,参数为 235M
(《Character-level language modeling with deeper self-attention》
)。BERT_BASE
包含 110M
参数,BERT_LARGE
包含 340M
参数。多年以来人们都知道,增加模型规模将导致大型任务(如机器翻译、语言建模)的持续改进,这可以通过下表所示的 held-out
训练数据的 LM perplexity
来证明。然而,我们认为这是第一项工作,证明了扩展到极端的 model size
也会导致在非常小型的任务上有很大的改进,只要模型已经被充分地预训练过。
即,增加模型规模不仅对大型任务有效,对小型任务也有效(模型需要被预训练)。
下图展示了从一个已经预训练了 step
的 checkpoint
进行微调后的 MNLI
验证准确性。这使我们能够回答以下问题。
问题:BERT
是否真的需要如此大量的预训练(128,000 words/batch * 1,000,000 steps
)来实现高的微调准确率?
答案:是的。BERT_BASE
预训练一百万步时,与五十万步相比,在 MNLI
上实现了接近 1.0%
的微调准确率提升。
问题:MLM
预训练的收敛速度是否比 LTR
预训练慢,因为每个 batch
中只有 15%
(而不是 100%
)的单词被预测?
答案:是的,MLM
模型的收敛速度比LTR
稍慢。然而,就绝对准确率而言,MLM
模型几乎从一开始就超过了 LTR
模型。
迄今为止,所有的 BERT
结果都采用了微调方法,即在预训练的模型中加入一个简单的分类层,并在下游任务中联合微调所有的参数。然而,feature-based
的方法,即从预训练的模型中抽取固定的特征,具有一定的优势:
NLP
任务都可以很容易地用 Transformer
编码器架构来表示,因此需要增加一个 task-specific
的模型架构。expensive representation
,然后在这个 representation
的基础上用不太昂贵的模型进行许多实验,这有很大的计算优势。这里我们通过在 CoNLL-2003 NER
任务上生成类似于 ELMo
的 pre-trained contextual representation
来评估 BERT
在 feature-based
的方法中的表现如何。为了做到这一点,我们使用与本文在 Named Entity Recognition
章节中相同的 input representation
,但是使用 BERT
的一个或多个层的激活值而没有微调任何参数。这些 contextual embedding
被用作一个双层 BiLSTM
的输入,这个双层 BiLSTM
具有 768
维并且是随机初始化的,并且这个双层 BiLSTM
位于最终的分类层之前。
结果如下表所示。表现最好的方法是将预训练的 Transformer
的最后四个隐层的 token representation
拼接起来,这比微调整个模型仅相差 0.3 F1
。这表明:BERT
对微调方法和 feature-based
方法都是有效的。
无监督表示学习 unsupervised representation learning
在自然语言处理领域取得了巨大的成功。通常情况下,这些方法首先在大规模的无标签文本语料库中预训练神经网络,然后在下游任务中对模型或 representation
进行微调。在这个共同的 high-level
思想下,人们在各种文献中探讨了不同的无监督预训练目标 unsupervised pretraining objective
。其中,自回归 autoregressive: AR
语言建模language modeling
和自编码 autoencoding: AE
是两个最成功的预训练目标。
自回归语言建模旨在用自回归模型估计文本语料的概率分布。具体而言,给定一个文本序列 likelihood
分解为前向乘积 forward product
backward product
deep bidirectional context
。相反,下游的语言理解任务往往需要双向的上下文信息。这就造成了自回归语言建模和有效的预训练之间的 gap
。
为文本序列 前 个位置的子序列, 为文本序列 后 个位置的子序列。
相比之下,基于自编码的预训练并不进行显式的密度估计 density estimation
(BERT
,它一直是 SOTA
的预训练方法。给定输入的 token
序列,其中输入的某一部分 token
被一个特殊的符号 [MASK]
所取代,模型被训练为从破坏的版本中恢复原始 token
。由于任务目标不包含密度估计,所以 BERT
可以利用双向上下文来重建原始数据。作为一个直接的好处,这弥补了上述自回归语言建模中的 bidirectional information gap
,导致了性能的提高。然而:
BERT
在预训练时使用的 [MASK]
等人造符号在微调时不存在于真实数据中,从而导致了 pretrain-finetune
的不一致。predicted token
在输入中被 masked
了,BERT
不能像自回归语言建模那样使用乘积规则 product rule
建立联合概率模型。换句话说,BERT
假设在给定 unmasked token
的条件下,predicted token
之间是相互独立的。这是过于简化的,因为在自然语言中普遍存在着高阶的、长程的依赖性。面对现有语言预训练目标的优点和缺点,在论文 《XLNet: Generalized Autoregressive Pretraining for Language Understanding》
工作中,作者提出了一种广义的自回归方法,即 XLNet
。XLNet
同时利用了自回归语言建模和自编码的优点,并避免了它们的局限。
XLNet
不是像传统的自回归模型那样使用固定的前向分解顺序forward factorization order
或后向分解顺序 backword factorization order
,而是最大化关于分解顺序的所有可能的排列组合中,序列的期望对数似然 expected log likelihood
。由于排列操作permutation operation
,每个位置的上下文可以同时由左右两侧的 token
组成。在预期中,每个位置学会利用来自所有位置的上下文信息,即捕获双向的上下文。XLNet
不依赖于数据破坏 data corruption
。因此,XLNet
不会受到 BERT
所带来的pretrain-finetune discrepancy
的影响。同时,自回归目标还提供了一种自然的方法,可以使用乘积法则对 predicted token
的联合概率进行分解,消除了 BERT
中的独立性假设 independence assumption
。除了新颖的预训练目标外,XLNet
还改进了预训练的架构设计。
XLNet
将 Transformer-XL
的segment
递归机制和相对编码方案 relative encoding scheme
融合到预训练中。根据经验,特别是在涉及较长文本序列的任务中,这会提高下游任务的性能。Transformer(-XL)
架构应用于 permutation-based
的语言建模是行不通的,因为分解顺序是任意的、目标是模糊ambiguous
的。作为一个解决方案,作者建议重新参数化 reparameterize
Transformer(-XL)
网络从而消除模糊性 ambiguity
。根据经验,XLNet
在 18
个任务上取得了 SOTA
的结果,即: 7
个 GLUE
语言理解任务,3
个阅读理解任务(包括 SQuAD
和RACE
)、7
个文本分类任务(包括 Yelp
和 IMDB
)、以及 ClueWeb09-B
文档排序任务。在一组公平的比较实验下,XLNet
在多个 benchmark
上一直优于 BERT
。
相关工作:permutation-based
的自回归建模的思想已经在 《Neural autoregressive distribution estimation》
和 《Made: Masked autoencoder for distribution estimation》
中进行了探讨,但有几个关键的区别。以前的模型是无序 orderless
的,而 XLNet
基本上是顺序感知 order-aware
的(带 positional encoding
)。这对语言理解 language understanding
很重要,因为无序模型会退化为 bag-of-word
,缺乏基本的表达能力。
上述差异源于动机 motivation
的根本差异:以前的模型旨在通过在模型中加入 "无序" 的归纳偏置 inductive bias
来改善密度估计,而 XLNet
的动机是使自回归语言模型学习双向上下文。
这里我们首先针对语言预训练language pretraining
来回顾并比较传统的自回归语言建模和 BERT
。
给定一个文本序列 forward autoregressive factorization
下的对数似然 likelihood
来进行预训练:
其中:
RNN
或 Transformer
)产生的 context representation
,embedding
。vocabulary
。相比之下,BERT
是基于降噪自编码 denoising auto-encoding
的。具体来说,对于一个文本序列 BERT
首先通过随机设置 15%
)的 token
为特殊符号 [MASK]
从而构建一个破坏的版本 masked token
记做
其中:
masked
。Transformer
,它将一个长度为 T
的文本序列 hidden vector
序列:Transformer
的参数,hidden vector
。 可以看到:在自回归语言建模中,
context representation
为,即模型在位置 仅能看到前面 个位置的 token
(即,);在 BERT
中,context representation
为,即模型在位置 能够看到所有的 token
(即,)。
两种预训练目标的优点和缺点比较如下:
独立性假设 Independence Assumption
:正如 BERT
基于独立性假设来分解联合条件概率 mask token
相比之下,自回归语言建模目标使用普遍适用的乘积规则对
输入噪声 Input Noise
:BERT
的输入包含像 [MASK]
这样的人工符号,而这些符号在下游任务中从未出现过,这就造成了 pretrain-finetune discrepancy
。像 BERT
论文中那样用原始 token
替换 [MASK]
并不能解决问题,因为原始 token
只能以很小的概率被使用,否则
相比之下,自回归语言建模并不依赖于任何输入破坏 input corruption
,因此不会受到这个问题的影响。
上下文不一致 Context Dependency
:自回归 representation
token
作为条件(即,左侧的 token
)。
相比之下, BERT representation
BERT
目标允许对模型进行预训练以更好地捕捉双向的上下文。
根据上面的比较,自回归语言模型和 BERT
拥有各自独特的优势。一个自然的问题是:是否存在一种预训练目标,既能带来两者的优点又能避免它们的缺点?
借用 orderless NADE
(《Neural autoregressive distribution estimation》
)的思路,我们提出了排列语言建模 permutation language modeling
目标,它不仅保留了自回归模型的优点,而且还允许模型捕获双向上下文。
具体而言,对于一个长度为 autoregressive factorization
。直观地说,如果模型参数在所有分解顺序中都是共享的,那么在预期中,模型将学会从两侧的所有位置收集信息。
为了形式化这个思想,令
基本上,对于一个文本序列 likelihood
pretrain-finetune discrepancy
。
前向自回归分解和后向自回归分解分别采用了两种特殊的分解顺序:
。
Permutation
的备注:所提出的目标只是排列分解顺序 factorization order
,而不是序列顺序 sequence order
。换句话说,我们保持原始的序列顺序,使用对应于原始序列的positional encoding
,并依靠 Transformer
中恰当的 attention mask
来实现分解顺序的排列。请注意,这种选择是必要的,因为模型在微调期间只会遇到具有自然顺序的文本序列。
XLNet
在实现过程中并未采样,而是通过生成合适的 attention mask
来达到采样的效果。
为了提供一个总体概览,我们在下图中展示了一个例子:给定相同的输入序列 token
mem
表示 Transformer-XL
的 memory
机制。
虽然排列语言建模目标具有理想的属性,但是标准 Transformer
的朴素实现 naive implementation
可能无法工作。为了说明这个问题,假设我们使用标准的 softmax
公式对 next-token
分布 parameterize
,即:
其中 Transformer
网络生成的 hidden representation
(通过适当的掩码得到)。
现在注意到:representation
representation
。为了避免这个问题,我们建议重新参数化 next-token
分布,使其感知到目标位置:
其中 representation
类型,它还将目标位置
原始的
Transformer
没有这个问题,因为Transformer
输入序列的分解顺序是固定的(),第 个要预测的 token
就是位于序列中的位置。 但是,在排列语言建模目标,由于分解顺序是随机的,因此第
个要预测的 token
的位置不确定(可能是原始序列中第一个位置、也可能是原始序列中最后一个位置)。
标准的语言模型参数化失败的例子:考虑两个不同的排列
如果采用标准 Transformer
的朴素实现,则有:
从效果上看,两个不同的目标位置 ground-truth
分布应当是不同的。
双流自注意力 Two-Stream Self-Attention
:虽然 target-aware representation
的思想消除了 target prediction
中的模糊性 ambiguity
,但如何形式化
目标位置
代表了目标 token
位于原始序列中的位置(而不是排列之后的位置,排列之后的位置就是)。
为了使这个参数化 parameterization
发挥作用,有两个要求在标准的 Transformer
架构中是矛盾的:
token
token
为了解决这样的矛盾,我们建议使用两组 hidden representation
而不是一组:
content representation
Transformer
中的标准 hidden state
类似。这个 representation
同时编码了上下文和
注意,这里是小于等于号:
。
query representation
在计算上:
query stream
以 trainable vector
来初始化(即, content stream
被设置为相应的 word embedding
(即, 对于每个自注意力层 representation stream
用一组共享的参数进行更新:
其中:query, key, value
。
注意:
query stream
中的key, value
使用(小于号); content stream
中的key, value
使用(小于等于号)。
content representation
的更新规则与标准的自注意力完全相同,因此在微调过程中,我们可以简单地放弃 query stream
,将 content stream
作为普通的 Transformer(-XL)
。
最后,我们可以使用最后一层的 query representation
因为
query representation
包含了位置(而 content representation
不包含),因此使用 query representation
来计算。
query representation
会利用content representation
来计算,而content representation
就是传统的自注意力机制而不会用到query representation
。
双流自注意力的示意图如下图所示,其中分解顺序为 3 -> 2 -> 4 -> 1
而当位置
图 (a)
:content stream
,query
,key/value
。
图 (b)
:query stream
,query
,key/value
。
图 (c)
:在 attention mask
中,第 mask
,白色代表不可见(掩码)、红色代表可见。 query stream
无法看到当前位置的内容,因此相比 conent stream
的 attention mask
,query stream
的 attention mask
掩码了对角线。
这就是通过生成合适的
attention mask
来达到采样的效果。
例如,attention mask
的第一行):
content stream
中它可以看到所有位置(包括它自己),因此 attention mask
第一行全部是红色(可见)。query stream
中它可以看到除了自己之外的所有其它位置,因此 attention mask
第一行除了第一个位置之外全部是红色。部分预测 Partial Prediction
:虽然排列语言建模目标有几个好处,但由于排列组合,它是一个更具挑战性的优化问题,并在实验中导致收敛缓慢。为了降低优化难度,我们选择仅预测分解顺序中的最后一批 token
。
正式地,我们把 non-target
子序列 target
子序列 non-target
子序列的条件下最大化 target
子序列的对数似然 log-likelihood
,即: