BERT: Pre-training of Deep Bidirectional Transformers forLanguage Understanding
embedding
input embedding = token embedding + segmentation embedding + position embedding
segment embedding
-
对于句子对来说(两个句子放在一起训练),EA表示坐标的句子,EB表示右边的句子
-
[CLS]每个序列的第一个标记
[SEP]句子分开标记
position embedding
-
由于网络结构中没有RNN,所以无法获得位置信息,所以要构建一个position embedding(引自transformer)
-
三个embedding相加
- embedding的最初本质就是one-hot
Bert的pre-training
两个任务
1、Masked LM策略(MLM)
- 一般来说,深度双向模型要比单向(left-to-right或right-to-left,每个词只能用这个词左边或者右边的词进行学习)要更强,但是对于标准的语言模型只能使用单向模型,因为双向模型需要每个单词能间接地“观察到自己”(预测的下一个词在给定的序列已经出现的情况)且这个模型能从一个多层文本来预测一个目标词(利用上下文的信息)
- 把词mask了就不会出现自己预测自己的情况
- 而使用MLM可以实现深度的双向语言模型
- 1、随机选取15%的word(word不是 token,全部相同的word都被mask)
- 2、如果这个词被选取了,那么它有80%的概率被标记上[mask];有10%的概率被标记上随机的token;有10%的概率不做变化
- 3、预测被mask的word(我们只是预测被mask的word而不是重构整个输入)
- 如果只选取什么词要mask的话,会有一个缺点:造成pre-training层和fine-tunning层的不匹配(要保持训练任务一致),因为[mask]并不会出现呢在fine-tunning层。所以为了减缓这种影响,对于选取的词会有一定概率不mask
- 这里使用transformer模型(下面也是)
2、预测下一个句子(NSP:Next Sentence Prediction)
- 有些重要的NLP下游任务像QA和NLI并不能直接被语言模型捕捉,所以我们为了使预训练模型能理解这些句子之间的关系,我们预训练一个简单的二值任务:一个句子A是不是一个句子B的下一个句子:
- 我们构造数据集:50%A是B的下一个句子,50%A是一个随机的句子
- 尽管这种方式非常的简单,但是对于QA和NPI的下游任务非常的适用(The final model achieves 97%-98% accuracy on NSP.)
进行了消融实验后证明,模型的大部分改善来自于两个预训练任务以及他们所带来的双向性
- 下图为几个模型之间的对比
Bert的fine-tunning(迁移策略)
这里的fine-tunning堆模型只用简单的修改
- 比如情感分析:取第一个token的输出表示 ,给一个softmax分类
- 比如NER:取最后层的transformer输出给softmax分类
Bert+feature-based
- 因为不是所有的NLP任务都能容易的使用transformer encoder来表示,所以还是需要一个task-specific model结构。这个视任务情况而定。