目录
在NLP中,利用语言模型去做预训练,能显著提升许多自然语言处理任务的效果。
自然语言处理任务主要包括两种:
sentence-level tasks(句子级别)
: 学习多个句子之间的关系,例如natural language inference(自然语言推理)。token-level tasks(词级别)
:模型要生成fine-gained(细粒度的)的输出 。fine-grained指的是类内细分,与之相对应的是coarse-grained(粗粒度)。例如在分类任务中,coarse-grained只需要分辨出是猫还是狗,而fine-grained则要在每个类别中分辨出具体的品种,比如要能分辨出是哈巴狗还是二哈。
1. Language Model Embedding
语言模型来辅助NLP任务已经得到了学术界较为广泛的探讨,通常有两种方式:
feature-based(基于特征)
:ELMofine-tuning
:OpenAI GPT
1.1 Feature-based方法
Feature-based指利用预训练的语言模型的结果也就是LM embedding, 将其作为额外的特征,引入到原任务的模型(task-specific model)中。
例如在TagLM[1]中,采用了两个单向RNN构成的语言模型(pre-trained bi-LM),将语言模型的结果:
h
i
L
M
=
[
h
i
L
M
→
;
h
i
L
M
←
]
\begin{aligned} \textcolor{white}{h_{i}^{LM}=[ \overrightarrow{h_{i}^{LM}}; \overleftarrow{h_{i}^{LM}}]} \end{aligned}
hiLM=[hiLM;hiLM]引入到序列标注模型中,如下图1所示,其中左边部分为序列标注模型,也就是task-specific model。右边是前向LM(Left-to-right)和后向LM(Right-To-Left), 两个LM的结果进行了合并。并在序列标注模型中将LM embedding与词向量、第一层RNN输出、第二层RNN输出进行了concat操作。
图
1
T
a
g
L
M
模
型
示
意
图
图1 TagLM模型示意图
图1TagLM模型示意图通常feature-based方法包括两步:
- 首先在大的
语料A上无监督地
训练语言模型,训练完毕得到语言模型
- 然后构造
task-specific model
例如序列标注模型,采用有标记的语料B
来有监督
地训练task-sepcific model。将语言模型的参数固定,语料B的训练数据经过语言模型得到LM embedding,作为task-specific model的输入(额外特征)。
1.2 Fine-tuning方法
Fine-tuning方式是指在已经训练好的语言模型的基础上,加入少量的task-specific parameters。 例如对于分类问题在语言模型基础上加一层softmax网络,然后在新的语料上重新训练来进行fine-tune。
例如OpenAI GPT 中采用了这样的方法,模型如下所示
图
2
T
r
a
n
s
f
o
r
m
e
r
L
M
+
f
i
n
e
−
t
u
n
i
n
g
模
型
示
意
图
图2 \space Transformer \space LM + fine-tuning模型示意图
图2 Transformer LM+fine−tuning模型示意图
首先语言模型采用了Transformer Decoder的方法来进行训练,采用文本预测作为语言模型训练任务,训练完毕之后,加一层Linear Project来完成分类/相似度计算等NLP任务。
因此总结来说,LM + Fine-Tuning的方法工作包括两步:
- 构造
语言模型
,采用大的语料A无监督地
来训练语言模型 在语言模型基础上增加少量神经网络层
来完成specific task例如序列标注、分类等,然后采用有标记的语料B来有监督
地训练模型,这个过程中语言模型的参数并不固定,依然是trainable variables.
而BERT论文采用了LM + fine-tuning的方法,同时也讨论了BERT + task-specific model的方法。
2.BERT模型介绍
BERT采用了Transformer Encoder的模型来作为语言模型,完全抛弃了RNN/CNN等结构,而完全采用Attention机制来进行input-output之间关系的计算,如下图中左半边部分所示,其中模型包括两个sublayer:
- Multi-Head Attention 来做模型对输入的Self-Attention
- Feed Forward 部分来对attention计算后的输入进行变换
BERT模型如下图中左边第一个所示,它与OpenAI GPT的区别就在于采用了Transformer Encoder,也就是每个时刻的Attention计算都能够得到全部时刻的输入。而OpenAI GPT采用了Transformer Decoder,每个时刻的Attention计算只能依赖于该时刻前的所有时刻的输入,因为OpenAI GPT是采用了单向语言模型。
3. 预训练
下面我们介绍BERT的Pre-training tasks, 这里为了能够有利于token-level tasks例如序列标注,同时有利于sentence-level tasks例如问答,采用了两个预训练任务分别是
- Masked Language Model(MLM)
- Next Sentence Prediction(NSP)
3.1 Masked Language Model
传统的的语言模型的问题在于,关于传统的语言模型训练, 都是采用left-to-right, 或者left-to-right + right-to-left结合的方式, 但这种单向方式或者拼接的方式提取特征的能力有限,没有同时利用到Bidirectional信息. 为此BERT提出一个深度双向表达模型(deep bidirectional representation). 即采用MASK任务来训练模型。
例如:现有的语言模型例如ELMo号称是双向LM(BiLM),但是实际上是两个单向RNN构成的语言模型的拼接,如下图所示
图
3
E
L
M
o
模
型
示
意
图
图3\space ELMo模型示意图
图3 ELMo模型示意图
语言模型本身的定义是计算句子的概率:
前向RNN构成的语言模型计算的是:
也就是当前词的概率只依赖前面出现词的概率。
而后向RNN构成的语言模型计算的是:
也就是当前词的概率只依赖后面出现的词的概率。
那么如何才能同时利用好前面词和后面词的概率
呢?BERT提出了Masked Language Model,也就是随机去掉句子中的部分token,然后模型来预测被去掉的token是什么
。这样实际上已经不是传统的神经网络语言模型(类似于生成模型)了,而是单纯作为分类问题,根据这个时刻的hidden state来预测这个时刻的token应该是什么,而不是预测下一个时刻的词的概率分布了
。
这里的操作是随机mask语料中15%的token,然后预测masked token,那么masked token 位置输出的final hidden vectors喂给softmax网络即可得到masked token的预测结果。这样操作存在一个问题,fine-tuning的时候没有[MASK] token,因此存在pre-training和fine-tuning之间的mismatch,为了解决这个问题,采用了下面的策略:
- 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
这样存在另一个问题在于在训练过程中只有15%的token被预测,正常的语言模型实际上是预测每个token的,因此Masked LM相比正常LM会收敛地慢一些,后面的实验也的确证实了这一点。
3.2 Next Sentence Prediction
在NLP中有一类重要的问题比如QA(Quention-Answer), NLI(Natural Language Inference), 需要模型能够很好的理解两个句子之间的关系, 从而需要在模型的训练中引入对应的任务. 在BERT中引入的就是Next Sentence Prediction任务. 采用的方式是输入句子对(A, B), 模型来预测句子B是不是句子A的真实的下一句话。具体的操作方法如下:
所有参与任务训练的语句都被选中作为句子A.
- 其中50%的B是原始文本中真实跟随A的下一句话. (标记为IsNext, 代表正样本)
- 其中50%的B是原始文本中随机抽取的一句话. (标记为NotNext, 代表负样本)
N
e
x
t
S
e
n
t
e
n
c
e
P
r
e
d
i
c
t
i
o
n
样
例
Next \space Sentence\space Prediction样例
Next Sentence Prediction样例
而最终该任务得到了97%-98%的准确度。
3.3 模型输入
介绍了两个pre-training tasks之后,我们介绍该模型如何构造输入。如下图所示,输入包括三个embedding的求和,分别是:
一些符号:
-
CLS
:special classification embedding用于分类的向量,会聚集所有的分类信息。例如分类问题中是类别,如果不是分类问题那么就忽略。 -
SEP
:输入是QA或2个句子时,需添加SEP标记以示区别为了能够同时表示单句子和句子对。 -
E A , E B E_{A}, E_{B} EA,EB:输入是QA或2个句子时,标记的sentence向量。如只有一个句子,则是sentence A向量 。
3.4 模型训练
3.4.1 数据组成
语料是下面两个库,合计33亿词汇。采用文档级别的语料,有利于学习长依赖序列。
- BooksCorpus:8亿个词。(800M)
- 英文维基百科:25亿个词。(2,500M)
从语料库中随机选择2个片段(较长)作为两个AB句子,构成一条输入数据:
- 0.5概率A-B两个句子连续,0.5概率随机选择B
- A使用A embedding,B使用B embedding
- A和B总长度最大为512 tokens
WordPiece Tokenization后再mask掉15%的词汇。
3.4.2 训练参数
- batch_size:256。每条数据长度:512
- 100万步,40个epoch。语料合计33亿词汇
- Adam: β 1 = 0.9 \beta_{1}=0.9 β1=0.9, β 2 = 0.999 \beta_{2}=0.999 β2=0.999
- L2权值衰减为0.01。所有层的dropout为0.1
- 学习率的warmup的step为10000
- GELU激活函数
- 训练loss:LM和NSP的loss加起来
- BERT base 16个TPU,Large 64个TPU,训练4天
3.4.3 两种模型选择
本文提出了两个大小的模型,分别是
- BERT-Base: L = 12, H = 768, A = 12, Total parameters = 110M
- BERT-Large: L = 24, H = 1024, A = 16, Total parameters = 340M
其中L表示Transformer层数,H表示Transformer内部维度,A表示Heads的数量
训练过程也是很花费计算资源和时间的,总之表示膜拜,普通人即便有idea没有算力也只能跪着。
5. Fine-tuning
两种不同类型的任务所需要的向量,详情见特定任务的BERT
sentence-level
:一般只拿CLS
位置的向量,过线性层再softmax即可得到分类结果token-level
:SQuAD或NER,取对应位置的向量,过线性层再softmax得到相应的结果
总之不同类型的任务需要对模型做不同的修改,但是修改都是非常简单的,最多加一层神经网络即可。如下图所示
Finetune时超参数基本一致,但有一些是与特定任务相关的。下面是比较好的选择
Batch size:16, 32
学习率:
5
∗
1
0
−
5
,
3
∗
1
0
−
5
,
2
∗
1
0
−
5
5*10^{-5}, 3*10^{-5}, 2*10^{-5}
5∗10−5,3∗10−5,2∗10−5
epoch :3, 4
6. BERT与GPT
BERT和OpenAI GPT都是使用Transformer进行预训练语言模型, 再进行finetune达到不错的效果。区别如下:
7. 实验结果
7.1 9项GLUE任务
General Language Understanding Evaluation `包含了很多自然语言理解的任务。
- MNLI:
Multi-Genre Natural Language Inference
是一个众包大规模的文本蕴含任务。
给2个句子,判断第二个句子与第一个句子之间的关系。蕴含、矛盾、中立的
- QQP:
Quora Question Pairs
给2个问题,判断是否语义相同
- QNLI:
Question Natural Language Inference 是一个二分类任务,由SQuAD数据变成。
给1个(问题,句子)对,判断句子是否包含正确答案
4.SST-2: Stanford Sentiment Treebank
,二分类任务,从电影评论中提取。
给1个评论句子,判断情感
5.CoLA: The Corpus of Linguistic Acceptablity
,二分类任务,判断一个英语句子是否符合语法的。
给1个英语句子,判断是否符合语法
6.STS-B:The Semantic Textual Similarity Benchmark
,多分类任务,判断两个句子的相似性,0-5。由新闻标题和其他组成。
给2个句子,看相似性
- MRPC:
Microsoft Research Paraphrase Corpus
,2分类任务,判断两个句子是否语义相等,由网上新闻组成。05年的,3600条训练数据。
给1个句子对,判断2个句子语义是否相同
-
RTE:
Recognizing Textual Entailment
,二分类任务,类似于MNLI,但是只是蕴含或者不蕴含。训练数据更少。 -
WNLI:
Winograd NLI
一个小数据集的NLI。据说官网评测有问题。所以评测后面的评测没有加入这个。
GLUE评测结果:
对于sentence-level
的分类任务,只用CLS
位置的输出向量来进行分类。
7.2 SQuAD-v1.1
SQuAD属于token-level
的任务,不是用CLS位置,而是用所有的文章位置的向量去计算开始和结束位置。
Finetune了3轮,学习率为
5
∗
1
0
−
5
5*10^{-5}
5∗10−5,batchsize为32。取得了最好的效果。
7.3 NER
7.4 SWAG
The Situations With Adversarial Generations
是一个常识性推理数据集,是一个四分类问题。给一个背景,选择一个最有可能会发生的情景。
Finetune了3轮,学习率为
2
∗
1
0
−
5
2*10^{-5}
2∗10−5,batchsize=16
8. 效果分析
8.1 任务影响
No NSP: 不加NSP任务;LTR单项语言模型。
- NSP: 对SQuAD、QNLI、MNLI有影响,下降1个点左右。
- 双向LM:如果是LTR,SQuAD、MRPC都严重下降10个点。因为
token-level的任务,更需要右边上下文的信息
。
8.2 模型大小
BERT的base和large的参数分别为:110M和340M。
一般来说,对于大型任务,扩大模型会提升效果。但是,BERT得到充分预训练以后,扩大模型,也会对小数据集有提升!
这是第一个证明这个结论的任务。
8.3 训练步数
- 确实需要训练100万步。12800词/batch
- MLM收敛到最优慢,但是效果好。在早期就早早超过单向语言模型了