BERT算法原理
Bert算法背景
随着迁移学习的兴起,在计算机视觉领域中出现了各种各样的预训练模型,它们可以通过简单的微调在下游任务上取得良好的效果。在Bert发布之前,自然语言领域中embedding算法也是大都是在大规模的语料上训练,但对下游任务的兼容性较差。例如Word2vec、Glove,它们的输出的是固定词向量(每个词对应的向量是固定的),所以在不同的上下文场景中缺乏足够强的表征能力;例如Elmo,它通过Bidirectional LSTM来学习文本的上下文特征,但由于LSTM的模型特点,使其难以兼顾长文本中相距较长的词之间的联系。伴随这Transformer模型的出现,上下文学习的问题有了更佳的解决方法。
Bert是基于transfomer结构中的Encoder模块,对文本的上下文进行学习,从而获取动态的文本向量。由于其模型结构的特点,它能够更好的学习到文本的上下文表征。且具备更佳的兼容能力,能够更好的用于问答系统、语言推理和NER等任务。(Bert论文BERT: Pre-training of Deep Bidirectional Transformers for
Language Understanding)
Bert模型结构及其应用
Bert主要有俩个任务,分别是Pre-training和Fine-tuning。
Model input
我们先了解一下模型的输入,这里用WordPiece方法对句子中的token进行拆分 (playing拆成 play + ing,可以大量的减少词汇数量)。然后选择一个句子对,在句首加入[CLS] token代表句向量,句子结尾用[SEP] token 表示结束。同时模型的输入借鉴了Transformer的输入格式。输入由三部分组成,分别是Token Embeddings、Segment Embeddings和Position Embedding。其中Token Embedding是指每个token对应一个embedding,Segement Embedding是用于区分sentence A和sentence B,Position Embedding采用有别于transformer的输入方式,采用了可学习的位置编码。最后三个相加则获得输入向量。
Pre-traning
Bert的预训练使用了俩个无监督训练任务,一个任务是Masked LM,另一个任务是NSP(next sentence prediction)
Masked LM
为了使模型更好地学习到上下文的信息,对语料中 15 % 15\% 15%的WordPiece token进行mask,再让模型去预测这些mask的token。作者对选中的语料做了三种mask方式,第一种是将其中80%的token替换成 [ m a s k ] [mask] [mask] token,第二种是将10%的token随机替换成其他词,第三种是将10%的token保持不变。
Next sentence prediction
为了模型可以更好的用于QA、NLI等任务,作者在预训练中加入了NSP。随机挑选句子AB,50%的B是A的下一句,50%不是A的下一句。通过这个方法,Bert在QA和NLI取得了更好的效果
Fine-tuning
由于作者在预训练中加入了NSP任务,所以可以在Sentence Pair Classification上有较好的表现,而且C(Class Label)可以用于代表整个句向量所以在下游任务微调时十分方便,仅需对C进行softmax即可。同样的在Single Setence Classification中,输入单个句子,再对C做分类即可。当面对NER任务时,每个token是具备对应的embdding的,这时仅需对这些向量做分类即可。对于QA问题,同样可以对next sentence中的token做预测。
由于Bert模型的输入的设计,极大地便利了人们将预训练的Bert模型用于各种下游任务中。同时Bert在各项任务中都表现出了不凡的效果。
模型应用
Bert模型主要有俩种大小,第一种是Bert(Base) 其中共有12层的Multi-Attention,Head数量为12,隐藏层的大小为768,总参数量为110M;第二种是Bert(Large)其中共有24层的Multi-Attention,Head数量为16,隐藏层的大小为1024,总参数量为340M。从这里我们可以发现Bert的参数量是比较多的,所以在运行时是比较吃显存的。
一般我们使用Bert作为预训练模型时,可以通过huggingface提供的库直接调用,极大便利了我们对Bert的使用。