赞
踩
在NLP中,利用语言模型去做预训练,能显著提升许多自然语言处理任务的效果。
自然语言处理任务主要包括两种:
sentence-level tasks(句子级别)
: 学习多个句子之间的关系,例如natural language inference(自然语言推理)。token-level tasks(词级别)
:模型要生成fine-gained(细粒度的)的输出 。fine-grained指的是类内细分,与之相对应的是coarse-grained(粗粒度)。例如在分类任务中,coarse-grained只需要分辨出是猫还是狗,而fine-grained则要在每个类别中分辨出具体的品种,比如要能分辨出是哈巴狗还是二哈。语言模型来辅助NLP任务已经得到了学术界较为广泛的探讨,通常有两种方式:
feature-based(基于特征)
:ELMofine-tuning
:OpenAI GPTFeature-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
←
]
语料A上无监督地
训练语言模型,训练完毕得到语言模型
task-specific model
例如序列标注模型,采用有标记的语料B
来有监督
地训练task-sepcific model。将语言模型的参数固定,语料B的训练数据经过语言模型得到LM embedding,作为task-specific model的输入(额外特征)。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的方法。
BERT采用了Transformer Encoder的模型来作为语言模型,完全抛弃了RNN/CNN等结构,而完全采用Attention机制来进行input-output之间关系的计算,如下图中左半边部分所示,其中模型包括两个sublayer:
BERT模型如下图中左边第一个所示,它与OpenAI GPT的区别就在于采用了Transformer Encoder,也就是每个时刻的Attention计算都能够得到全部时刻的输入。而OpenAI GPT采用了Transformer Decoder,每个时刻的Attention计算只能依赖于该时刻前的所有时刻的输入,因为OpenAI GPT是采用了单向语言模型。
下面我们介绍BERT的Pre-training tasks, 这里为了能够有利于token-level tasks例如序列标注,同时有利于sentence-level tasks例如问答,采用了两个预训练任务分别是
传统的的语言模型的问题在于,关于传统的语言模型训练, 都是采用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,为了解决这个问题,采用了下面的策略:
my dog is hairy → my dog is [MASK]
my dog is hairy → my dog is apple
my dog is hairy → my dog is hairy
这样存在另一个问题在于在训练过程中只有15%的token被预测,正常的语言模型实际上是预测每个token的,因此Masked LM相比正常LM会收敛地慢一些,后面的实验也的确证实了这一点。
在NLP中有一类重要的问题比如QA(Quention-Answer), NLI(Natural Language Inference), 需要模型能够很好的理解两个句子之间的关系, 从而需要在模型的训练中引入对应的任务. 在BERT中引入的就是Next Sentence Prediction任务. 采用的方式是输入句子对(A, B), 模型来预测句子B是不是句子A的真实的下一句话。具体的操作方法如下:
所有参与任务训练的语句都被选中作为句子A.
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%的准确度。
介绍了两个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向量 。
语料是下面两个库,合计33亿词汇。采用文档级别的语料,有利于学习长依赖序列。
从语料库中随机选择2个片段(较长)作为两个AB句子,构成一条输入数据:
WordPiece Tokenization后再mask掉15%的词汇。
本文提出了两个大小的模型,分别是
其中L表示Transformer层数,H表示Transformer内部维度,A表示Heads的数量
训练过程也是很花费计算资源和时间的,总之表示膜拜,普通人即便有idea没有算力也只能跪着。
两种不同类型的任务所需要的向量,详情见特定任务的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
BERT和OpenAI GPT都是使用Transformer进行预训练语言模型, 再进行finetune达到不错的效果。区别如下:
General Language Understanding Evaluation `包含了很多自然语言理解的任务。
Multi-Genre Natural Language Inference
是一个众包大规模的文本蕴含任务。给2个句子,判断第二个句子与第一个句子之间的关系。蕴含、矛盾、中立的
Quora Question Pairs
给2个问题,判断是否语义相同
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个句子,看相似性
Microsoft Research Paraphrase Corpus
,2分类任务,判断两个句子是否语义相等,由网上新闻组成。05年的,3600条训练数据。给1个句子对,判断2个句子语义是否相同
RTE: Recognizing Textual Entailment
,二分类任务,类似于MNLI,但是只是蕴含或者不蕴含。训练数据更少。
WNLI:Winograd NLI
一个小数据集的NLI。据说官网评测有问题。所以评测后面的评测没有加入这个。
GLUE评测结果:
对于sentence-level
的分类任务,只用CLS
位置的输出向量来进行分类。
SQuAD属于token-level
的任务,不是用CLS位置,而是用所有的文章位置的向量去计算开始和结束位置。
Finetune了3轮,学习率为
5
∗
1
0
−
5
5*10^{-5}
5∗10−5,batchsize为32。取得了最好的效果。
The Situations With Adversarial Generations
是一个常识性推理数据集,是一个四分类问题。给一个背景,选择一个最有可能会发生的情景。
Finetune了3轮,学习率为
2
∗
1
0
−
5
2*10^{-5}
2∗10−5,batchsize=16
No NSP: 不加NSP任务;LTR单项语言模型。
token-level的任务,更需要右边上下文的信息
。BERT的base和large的参数分别为:110M和340M。
一般来说,对于大型任务,扩大模型会提升效果。但是,BERT得到充分预训练以后,扩大模型,也会对小数据集有提升!
这是第一个证明这个结论的任务。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。