NLP里的迁移学习:
-
使用预训练好的模型来抽取词、句子的特征
-
例如word2vec或语言模型
-
-
不更新预训练好的模型
-
需要构建新的网络来抓取新任务需要的信息
-
word2vec忽略了时序信息,
语言模型只看了一个方向
-
word2vec的训练模式有两个:利用边上词预测中间词 和 利用中间词预测边上词;
可以看做是一个训练网络,训练起来比较快,可以利用大量的数据去训练。
一般使用这种语言模型,不会去修改预训练好的模型,他的缺点是只能提取比较底层的特征,所以很多时候只是把word2vec模型用在嵌入层,就是替换掉原始的随机嵌入,就是开始就把词语转化为一个嵌入向量,包含了一些底层特征。但是后续还是要利用或设计一些复杂的模型进一步提取特征,如CNN、RNN等,就是利用一些和目标任务相关的网络来抽取需要的特征。
因为word2vec只提取到了一些局部信息,没有看到很多时序信息,一般是只看到了一个方向的信息。语言模型也只看到了一个方向的信息。
BERT的动机:
-
基于微调的NLP模型(迁移学习)
-
预训练的模型抽取了足够多的信息(使得抽取的特征信息能够抓住输入文本的很多语义信息,当做一个新任务是,只需要增加一个简单的输出层就行了(转化为最终任务需要的label空间中),不需要再额外叠加其他的CNN RNN等模型提取特征了)
-
新的任务只需要增加一个简单的输出层
BERT架构:
-
只有编码器的Transfomer
-
两个版本:
-
Base:#blocks=12,hidden size=768,#heads=12,#parameter=110M
-
Large:#blocks=24,hidden size=1024,
-
-
在大规模数据上训练 > 3B词
(第一个在nlp上用的很深的网络,能够抽取出比较好的特征,并很好地用于其他模型)
bert在输入和loss上是有创新的。
对输入的修改:
-
每个样本是一个句子对 通过<SEP>来分割句子 变成 两个小句
-
加入额外的片段嵌入(使得transformer模型能够区分两个句子)
-
位置编码可学习 (不进行手工设计,模型自己学习得到 位置编码向量)
预训练任务1:带掩码的语言模型
-
Transfomer的编码器是双向的,标准语言模型要求单向
-
带掩码的语言模型每次随机(15%)将一些词元换成<mask>
bert不能做预测下一个词
encoder是双向的,它是知道上下文双向信息的;decoder才是单向的
bert不是去预测未来的,是做完形填空的,它能知道双向信息,但因为在微调任务中,data里面没有<mask>这个东西,现在bert训练时加了很多mask,但是在微调的时候是没有mask的,bert不是要看见mask就去预测,所以对mask有如下改动:
保持原来的token:就是看到自己的信息,有点像 作弊
这样改变mask会使得模型不会看见mask就去预测。
因为在实际应用预训练模型时,是没有mask的,所以这种作弊下的改动就是和实际应用预训练 模型而没有mask的情况类似。
预训练任务2:下一句子预测
-
预测一个句子对中两个句子是不是相邻的 二分类任务
-
训练样本中:
-
正样本:50%概率选择相邻句子对:<cls>this movie is great <sep> i like it <sep>
-
负样本:50%概率选择随机句子对:<cls>this movie is great <sep> hello <sep>
-
-
将<cls>对应的输出放到一个全连接层来预测
总结
-
BERT针对微调设计
-
基于Transfomer的编码器做了如下修改
-
模型更大,训练数据更多
-
输入句子对,片段嵌入,可学习的位置编码
-
训练时使用两个任务:
-
带掩码的语言模型
-
下一个句子预测
-
-