NLP笔记 | BERT
2018年Google团队发表论文《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》,对NLP的发展具有里程碑的意义,其证明了一个非常深的模型可以显著提高NLP任务的准确率,而这个模型可以从无标记数据集中预训练得到。
BERT是一种语言模型:通过在海量的语料的基础上运行自监督学习方法为单词学习一个好的特征表示。它使用了Transformer作为算法的主要框架,能更彻底的捕捉语句中的双向关系;它使用了Mask Language Model(MLM)和Next Sentence Prediction(NSP)的多任务训练目标;它使用更强大的机器训练更大规模的数据,使BERT的结果达到了全新的高度。Google已经开源了BERT模型,用户可以直接使用BERT作为Word2Vec的转换矩阵并高效地将其应用到自己的任务中。
BERT的模型结构源自Transformer的Encoding部分,作者构建了BERT Base模型和BERT Large模型。Base用于和之前的模型做比较以证明模型的性能,Large用于取得更好的效果。
BERTbase: L=12, H=768, A=12, Total Parameters=110M
BERTlarge: L=24, H=1024, A=16, Total Parameters=340M
其中L代表Transformer的层数,H代表Hidden size即隐藏层的维数,A代表Multi-Head Attention中Head的个数。
Inputs
1.在第一个句子的开头加[CLS],用于标记分类问题的类别,在每个句子的末尾加[SEP]。
2.Token Embeddings是采用Wordpiece Embeddings技术的包含30000个Token的词汇表,用##表示分词。
3.Segment Embeddings用于区分句子,输入序列可以是多个句子,同一个句子的该向量相同。
4.Position Embeddings与Transformer的不一样,BERT使用学习的位置向量,支持的序列长度最多为512个Token。
Pre-training BERT
为了使模型学习到句子left-to-right和right-to-left的全局的信息,采取两种策略:
策略1:Masked Language Model(MLM)
现有的语言模型的问题在于,没有同时利用到Bidirectional信息。
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,为了解决这个问题,采用了下面的策略:
(1)80%的时间中:将选中的词用[MASK]token来代替。
(2)10%的时间中:将选中的词用任意的词来进行代替。
(3)10%的时间中:选中的词不发生变化。
这样存在另一个问题在于在训练过程中只有15%的token被预测,正常的语言模型实际上是预测每个token的,因此Masked LM相比正常LM会收敛地慢一些,后面的实验也的确证实了这一点。
策略2:Next Sentence Prediction(NSP)
很多需要解决的NLP tasks依赖于句子间的关系,例如问答任务等,这个关系语言模型是获取不到的,因此将下一句话预测作为了第二个预训练任务。模型接收成对的句子作为输入,并且预测其中第二个句子是否在原始文档中也是后续句子。在训练期间,50%的输入在原始文档中是前后关系,另外50%中是从语料库中随机组成并且与第一句断开的,这样做是针对句子间的任务。
Fine-tuning BERT
对于句子级的分类任务,BERT的微调方法非常直观。论文用刚才介绍过的特殊符号[CLS]来对应整个句子的表征。我们只需要把它作为输入通过一层网络,最后做softmax就可以了。对于词级的任务需要稍做修改。微调阶段根据不同任务使用不同网络模型。在微调阶段,大部分模型的超参数跟预训练时差不多,除了batchsize,学习率,epochs。
训练参数:
Batch size: 16, 32
Learning rate (Adam): 5e-5, 3e-5, 2e-5
Number of epochs: 3, 4
最后附上一个知乎文章:从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史