五、BERT
将预训练模型用于下游任务有两种策略:
基于微调的策略。如
GPT
,通过简单微调预训练模型的参数来训练下游任务。该策略在预训练期间通过单向语言模型来学习通用语言
representation
,而单向语言模型严重限制了预训练模型的表达能力。例如,在
token
级别的任务(如:词性标注任务),结合两个方向的上下文对模型性能非常重要。基于特征的策略。如
ELMo
,将预训练模型的representation
作为下游任务模型的额外特征。该策略虽然是双向语言模型,但是该模型是浅层的。
与它们不同,
BERT:Bidirectional Encoder Representations from Transformers
是一个同时利用了左右双向上下文的、深度的预训练模型,它在11项nlp
任务中取得最领先的结果。基于特征的方法具有一定优势:
- 并不是所有的
NLP
任务都可以很容易地用Transformer encoder
架构来表示,因此需要添加特定于任务的模型架构。 - 如果通过训练数据预先计算一次昂贵的数据表示,然后在该表示的基础上用廉价的模型来完成许多任务,这会带来很大的计算优势。
- 并不是所有的
单向语言模型可以是从左到右
Left to Right:LTR
或者从右到左Right to Left :RTL
。BERT
也可以像ELMO
一样训练独立的LTR
和RTL
模型后拼接在一起,但是这么做有两个问题:- 其训练代价是单个双向模型的两倍。
- 对于
Question - Answer
之类的问题是反直觉的,因为RTL
模型需要根据答案来反推问题。 BERT
可以自由的组合左侧上下文和右侧上下文。
5.1 预训练
BERT
预训练模型包含两个预训练任务:预测被屏蔽的单词、预测下一个句子。BERT
的预训练语料库必须使用document-level
的语料库,而不是经过混洗的sentence-level
的语料库。因为混洗句子会破坏句子预测预训练任务。- 这里的 “句子” 不一定是真实的句子,而是一段话或者几段话,代表了一个
token
序列。 BERT
预训练时,每个 ”句子“ 的token
长度小于等于 512 。
- 这里的 “句子” 不一定是真实的句子,而是一段话或者几段话,代表了一个
BERT
的训练语料库经过了WordPiece
词干化。如:原始: He is an engineer
WordPiece词干化: He is an engine ##er
在 ”预测被屏蔽的单词“ 任务中,无需预测单词片段
##er
。BERT
预训练采用gelu
激活函数,训练一百万步,bath size = 256
。
5.1.1 MLM
受完形填空任务启发,
BERT
通过提出一个新的预训练目标来解决前面提到的单向限制:掩码语言模型masked language model:MLM
。从直觉上,深度双向模型要比深度单向模型、单层双向模型表达能力更强。
标准的条件语言模型只能从左到右或者从右到左训练,因为双向条件作用允许每个单词在多层上下文中间接“看到自己”。
MLM
模型从输入中随机屏蔽一些token
,目标是基于上下文预测被屏蔽单词。方法是:将被屏蔽的单词替换为[MASK]
标记,然后被屏蔽的单词作为真实label
。与单向语言模型不同,
MLM
结合了左右两侧上下文。
为了训练
MLM
,模型随机屏蔽一定百分比(论文中为 15%)的token
,然后仅预测那些被屏蔽的token
。这种方式有两个缺陷:
预训练和微调之间的不匹配。因为在微调阶段,模型永远不会看到
[MASK]
标记。为了缓解这种状况,
MLM
在预训练时并不总是用真的[MASK]
标记,而是从输入种随机选择15%
的token
:80%
替换未[MASK]
标记,10%
替换为一个随机单词,10%
保持原样。MLM
并不知道哪些词被替换,因此它总是努力的学习每个单词的正确表达。my dog is hairy -> my dog is [MASK] // 80% 概率
my dog is hairy -> my dog is test // 10% 概率
my dog is hairy -> my dog is hairy // 10% 概率
每个
batch
预测的token
只有15%
,这意味着模型需要更多的训练步才可能收敛。实验证明
MLM
的收敛速度确实比单向语言模型稍慢,但是相对于MLM
的泛化能力的提升,这种代价是值得的。
5.1.2 NSP
许多重要的下游任务,如:知识问答和自然语言推理,都是基于理解两个句子之间的关系,而这种关系不是由语言模型直接捕获的。
为了训练理解句子关系的模型,
BERT
训练一个二元化的句子预测任务,称作Next Sentence Prediction:NSP
:- 每个训练样本由一对句子
A
和B
组成:50% 的样本中 B 是紧跟在 A 之后的句子,50%的样本中二者是随机挑选的。 - 模型需要预测的是 B 是否是 A 的下一个句子。
如:
Input1 = [CLS] the man went to [MASK] store [SEP] he bought a gallon [MASK] milk [SEP]
Label1 = IsNext
Input2 = [CLS] the man [MASK] to the store [SEP] penguin [MASK] are flight ##less birds [SEP]
Label2 = NotNext
- 每个训练样本由一对句子
5.2 模型结构
BERT
采用双向self-attention
的Transformer
来构建。双向
self-attention
的Transformer
也称作Transformer encoder
,而单向self-attention
的Transformer
被称作Transformer decoder
。BERT
有两种尺寸:令BERT
层数为 ,每层每个隐向量的维度均为 ,self-attention
的head
数为 。BERT
将所有前馈层和filter
层的维度设为 。: ,模型参数数量为
110 M
。其模型大小与
GPT V1
大小几乎相同。选择这组参数的目的是为了与GPT V1
进行更好的比较(OpenAI GPT V1
模型的参数也是L=12,H=768,A=12
)。:,模型参数数量为
340M
。
BERT
的模型输入能够表达单个句子或者一对句子。每个
token
的输入representation
由三个部分相加而成:token embedding
、segment embedding
、position embedding
。每个序列的第一个
token
是一个特殊的[CLS]
。网络最后一层对应于该位置的一个隐向量作为整个序列的representation
来用于分类任务。对于非分类任务,该隐向量被忽略。
如果是一对句子,则在句子之间插入特殊的
token
:[SEP]
。然后对句子的前后关系学习一个segment embedding
:- 前一个句子的每个
token
学习和使用A embedding
,代表前后关系的 “前关系” 的表达。 - 后一个句子的每个
token
学习和使用B embedding
,代表前后关系的 “后关系” 的表达。
通过这种方式,模型得以学习和区分两个句子的前后关系。
- 前一个句子的每个
对于单个句子,模型仅学习和使用
A embedding
。position embedding
是模型学习和使用的input
每个绝对位置的表达。token embedding
是模型学习和使用的每个token
的表达。
5.3 微调
对于句子级别的分类任务,微调方式为:
取得预训练模型对应于
[CLS]
位置的最后一层隐向量 (一个H
维的向量) 作为整个句子的representation
。如果是句子对,则在两个句子之间插入分隔符
[SEP]
。增加一个
softmax
输出层,将该隐向量作为输出层的输入,输出为样本对应于各分类类别的概率。
此时新增
softmax
输出层仅仅需要训练额外的权重矩阵 ,其中 为分类类别的数量。文本区间预测任务:给定一个问题和一段话,任务目标是预测正确答案在该段话中的区间位置。
假设问题为
Q
,包含N
个token
; 段落为A
,包含M
个token
。BERT
在微调期间:- 首先将问题和段落通过分隔符
[SEP]
拼接在一起:Q [SEP] A
。 - 然后模型需要预测段落
A
的第i
个token
分别为答案开始、结束的位置。
设起始向量 、终止向量 ,这两个向量是模型需要学习的参数。设段落
A
的第i
个token
的输出向量为 ,则该单词为答案开始、结束的概率分别为:预测的区间开始和结束为:
训练期间,训练目标为最大化开始 + 结束的最大似然:
其中:
- 表示训练集中的第 个样本的序列、答案在段落中的开始位置、答案在段落中的结束位置
- 表示第 个样本预测到段落位置 为答案开始位置的概率
- 表示第 个样本预测到段落位置 为答案结束位置的概率
由于模型并未对预测的结束位置和开始位置施加约束,因此推断期间可能发生结束位置在前、开始位置在后的违反常理的情形。
因此
BERT
在推断期间增加强制约束:结束在开始之后,即 。
- 首先将问题和段落通过分隔符
命名实体识别
NER
任务是为了评估模型的token tagging
能力。BERT
微调阶段增加一个softmax
输出层,然后获取最后一层每个位置 的隐向量 ,并将该隐向量作为输出层的输入,输出为token i
属于各NER label
的概率。注意:这里隐含假设每个
token
的NER label
与周围其它单词无关。在微调阶段,除了
batch size
、学习率、训练epoch
不同之外,其它训练参数与预训练阶段的训练参数相同。微调阶段通常很快,因此建议对超参数进行彻底搜索并选择在验证集上表现最好的模型。
论文发现:数据集越小,模型性能对超参数的选择越敏感。
大数据集(超过10万的标记样本)对超参数的敏感性要低的多。
5.4 性能
BERT
中的一些设计被有意选择为尽可能接近GPT
,从而方便二者的比较。二者除了在结构上不同以外,在预训练阶段还有以下不同:GPT
在BooksCorpus
(800M
单词)上预训练,BERT
在BooksCorpus
和Wikipedia
(2500M
单词)上预训练。GPT
预训练100万步,32000 token/batch
;BERT
训练 100 万步,128000 token/batch
(batch size=256 sentence
,一个序列包含 512token
) 。GPT
仅仅在微调阶段引入句子分隔符[SEP]
和分类符[CLS]
,而BERT
在预训练阶段就引入[SEP],[CLS]
以及句子词序A/B
从而学习它们的embeding
。GPT
对所有的微调任务都使用5e-5
的学习率,而BERT
根据不同任务的验证集来选择合适的学习率。
5.4.1 文本分类任务
GLUE
数据集:通用语言理解评估General language Understanding Evaluation:GLUE
基准是一组各种NLP
文本任务。大多数
GLUE
数据集已经存在多年,而GLUE
将它们收集在一起的目的是:- 为这些数据集建立统一的训练集、验证集、测试集拆分标准。
- 用一个标准的
evaluation
服务器来缓解evaluate
不一致,以及测试集过拟合的问题。
GLUE
不给测试集打标签,用户必须将测试结果上传到GLUE
服务器进行评估(但是提交次数有限)。GLUE
基准包含以下数据集:Multi-Genre Natural Language Inference:MNLI
:大规模的、众包的蕴含分类任务。给定一对句子,其目标是预测第二句相对于第一句是蕴含句
entailment
、矛盾句、还是中性句。Quora Question Pairs:QQP
:一个二元分类任务。给定一对
Quora
上的两个问题,其目标是预测它们在语义上是否等价。Question Natural Language Inference:QNLI
:斯坦福Question Answering
数据集的一个转换为分类任务的版本。正类样本由问题和正确答案组成,负类样本由问题和非正确答案组成,其中非正确答案来自于同一段文本。
Stanford Sentiment Treebank:SST-2
:一个二元单句分类任务。其数据集从电影评论中提取的句子组成,由人类对其进行二元情感标注。
Corpus of Linguistic Acceptability: CoLA
:一个二元单句分类任务。其目标是预测一个英语句子是否在语法上可接受的。
Semantic Textual Similarity Benchmark : STS-B
:一个句子相似度多元分类任务。其数据集从新闻标题和其它数据源提取的句子对,通过人工来标记一对句子在语义上的相似得分(1分到5分)。
Microsoft Research Paraphrase Corpus:MRPC
:一个句子相似度二元分类任务。从在线新闻数据源抽取的句子对,由人工标记一对句子是否语义上相等。
Recognizing Textual Entailment: RTE
:类似MNLI
的二元蕴含关系任务,但是RTE
数据集规模更小。Winograd NLI:WNLI
:一个小型的自然语言推理数据集。GLUE
网页指出该数据集有问题:所有提交上来的结果都不如baseline
(仅仅将结果预测为训练集中出现次数最多的类别)。因此BERT
并未评估该数据集。
BERT
在所有GLUE
任务上选择batch size=32, epoch = 3
,学习率根据验证集的效果在5e-5, 4e-5,3e-5, 2e-5
中选择最好的那个。注意: 在小数据集上的微调效果可能不稳定(发生过拟合),此时会进行随机重启,最终选择使得验证集最好的那个随机重启的模型。
Situations With Adversarial Generations dataset:SWAG
数据集:包含11.3万组句子对,用于评估常识推理。SWAG
数据集的每个样本是视频字幕数据集中的一个句子,任务是在四个选项中选择最合理的延续。SWAG
任务的微调类似于GLUE
:首先将问题和四个选项给自拼接成一个序列,将每个序列的
[CLS]
对应位置的表达 作为该序列的整体表达。然后引入向量 ,它是模型待学习的参数。将它和第 个序列的表达 相乘即可得到评分: 。
最后对评分归一化即可得到每个选项为正确答案的概率:
BERT
在SWAG
任务上选择batch size=16, epoch = 3
,学习率为2e-5
。其中
Human performance
是人类在 100 个问题上回答的结果。
5.4.2 文本区间预测任务
Standford Question Answering Dataset:SQuAD
数据集:包含10万个众包的question-answer
样本。每个样本包含一个问题以及
Wiki
中的、包含答案的一段话,标签信息是人工标注的、从该段话中提取的答案。任务目标是:给定一个问题和
Wiki
中的一段话,预测答案在段落中的位置区间。因此该任务是区间预测任务。考虑到数据的预处理过程(
WordPiece
词干化),最终在评估结果时需要将预处理后的答案区间转换为预处理前的答案区间。
BERT
在SQuAD
任务上选择batch size = 32, epoch = 3
,学习率为5e-5
。其中:
BERT Single
采用单个BERT
模型;BERT Ensemble
使用了 7 个模型的融合,这些模型采用不同的预训练checkpoints
和不同的微调seeds
。+ TriviaQA
表示使用TriviaQA
数据集来扩充训练数据。
5.4.3 命名实体识别任务
CoNLL 2003 Named Entity Recoginition(NER) dataset
数据集:包含20万个单词的命名实体识别数据集。单词被人工标注为:
Person, Organization, Location,Miscellaneous
或者Other
(表示非命名实体)。考虑到数据的预处理过程(
WordPiece
词干化),以##
开头的单词片段不需要进行NER
识别。BERT
在CoNLL-NER
任务上的超参数通过验证集来选取,最终给出的Dev F1
,Test F1
是使用最好的超参数、并且在5个随机重启的模型上的平均结果。
5.4.4 探索实验
对
MLM
和NSP
的效果实验探索结果表明:- 单向语言模型在
token-level
和span-level
任务上表现很差。因为token -level
的隐向量无法感知到右侧的上下文信息。 NSP
对于句子级别任务的效果提升非常显著。
这些模型和 使用相同的训练语料、微调方式 和
Transformer
超参数。其中:No NSP
:使用了MLM
但是未使用NSP
。LTR & No NSP
:使用了单向LTR
的语言模型,而不是MLM
,也未使用NSP
。其结构类似GPT 1.0
。同时在微调阶段也使用
LTR
而不是双向的。因为实验发现:单向的训练双向的微调导致效果较差。+ BiLSTM
:在LTR + No NSP
的微调阶段在模型头部添加一个随机初始化的BiLSTM
。
- 单向语言模型在
对预训练步数的实验探索结果表明:
BERT
需要大量的训练步从而产生一个更好的效果。- 双向语言模型(
MLM
) 比单向语言模型(LTR
)收敛速度稍微慢一点,但是其微调能力几乎一开始就强于单向语言模型模型。
其中每个训练步的模型是从训练过程中生成的
checkpoint
提取出来的。对模型尺寸的实验探索表明:
BERT
模型越大,效果越好。其中:
#L
表示层数,#H
表示隐向量的维度,#A
表示attention heads
,LM(ppl)
表示MLM
困惑度。结果是微调阶段经过5次随机重启的验证集平均准确率。
对
BERT
应用于基于特征的策略而不是基于微调的策略表明:BERT
在基于微调和基于特征的方式上都能够取得很好的效果。这里基于特征的方式为:将
BERT
的一个或多个层的隐向量采取类似于ELMO
的方式灌入到一个两层 768 维度的BiLSTM
。