文章目录
bert的优势
- bert是Word2Vec的替代,Word2Vec文章一写过,是词嵌入的一种方法,作用是将自然语言转化为词向量。
- bert使用transformer为主要框架,transformer可以准确把握语句的双向关系。
- bert是通过自监督学习方法,自监督学习方法指在没有标签的数据集上进行监督学习,学习结果是学习到如何更好的对单词进行特征表示。学习完毕后,在具体的NLP任务上,使用学到的特征表示法,为任务进行词嵌入,即将任务数据中的自然语言转化为词向量(该词向量比一般方法获得的词向量要更优秀)。所以bert的工作大致分为两步:预训练(学习过程)和微调(执行具体的NLP任务时,根据具体任务调整为适合该任务的特征提取器)。
bert的结构
之前提过,transformer的优点是舍弃传统的RNN和CNN,通过attention机制,将任意两个位置单词之间的距离置为1,有效解决了NLP中的长期依赖问题。
长期依赖:指当前系统的状态,可能受很长时间之前系统状态的影响,是RNN中无法解决的一个问题。
- 例如:如果从“这块冰糖味道真?”来预测下一个词,是很容易得出“甜”结果的。但是如果有这么一句话,“他吃了一口菜,被辣的流出了眼泪,满脸通红。旁边的人赶紧给他倒了一杯凉水,他咕咚咕咚喝了两口,才逐渐恢复正常。他气愤地说道:这个菜味道真?”,让你从这句话来预测下一个词,确实很难预测的。因为出现了长期依赖,预测结果要依赖于很长时间之前的信息。
理论上,通过调整参数,RNN是可以学习到时间久远的信息的。但是,实践中的结论是,RNN很难学习到长期信息。RNN 会丧失较远以前的信息的能力,导致长期记忆失效。
——————————————————————————
transformer由若干encoder和decoder组成,下图左侧为encoder,encoder由Multi-Head-Attention(多个Self-Attention)和一个全连接层(Feed Forward前向传播)组成。实现自然语言到词向量的转换。右侧是decoder,decoder由Masked Multi-Head Attention, Multi-Head Attention和一个全连接组成,输出结果是最后结果的条件概率。
上图左侧是一个transformer block,即Multi-Head Attention和一个全连接层(Feed Forward),对应下图中一个Trm,Trm数量不固定。
bert有简单和复杂两种模型,对应的超参数分别如下:
- L=12,H=768,A=12,参数总量110M
- L=24,H=1024,A=16,参数总量340M
在上面的超参数中,L表示网络的层数(即Transformer blocks的数量),A表示Multi-Head Attention中self-Attention的数量,H是Hidden Layers的数量。
bert的输入
bert的输入是一个长度为512的3个词嵌入特征(词向量)的单位和。
三个特征词向量分别是:
- WordPiece(Token Embedding):将单词拆分为一组数量有限的子词单元,例如将palying拆分为play和ing
- 位置嵌入(Position Embedding):该特征向量表示单词的位置信息,因为transformer计算中不涉及单词位置,因此需要额外添加位置信息。
- 分割嵌入(Segment Embedding):用于输入是多个句子(对话场合或问答场合)的情况,例如有两个具有上下文关系的句子,第一个句子用特征值0表示,第二个用特征值1表示。
此外,特殊符号[CLS]和[SEP],若输入出现[CLS],说明该模型为分类模型;[SEP]用于分割输入中的两个句子。
input是bert的输入,等于token Embeddings + 位置Embeddings + 分割Embeddings 的单位和
bert的预训练任务
bert属于多任务模型,由Masked Language Model和Next Sentence Prediction两个自监督任务组成。
-
Masked Language Model
MLM是指在训练的时候对输入的语句进行随机mask,可以mask一些单词,也可以mask一些字。之后让模型通过语料的上下文来预测被mask的字词是什么。类似于英语的完形填空。
bert中的mask规则是,语句拆分为的全部token中,有15%的token被随机mask,mask的方式有三种:在这15%中,有80%被直接替换为[Mask];10%被替换为其他单词,10%不做变化。- 80%:my dog is hairy -> my dog is [mask]
- 10%:my dog is hairy -> my dog is apple
- 10%:my dog is hairy -> my dog is hairy
-
Next Sentence Prediction
NSP是指当输入为多个句子时,判断句子B是否是句子A的下文。如果是的话输出"IsNext",不是的话输出"NotNext"。训练集的来源是,在全部语料库中,随机抽取两句话。其中50%保留在原语料库中的位置关系,即符合上下句关系,剩下50%不符合上下文关系。关系保存上面提到的在[CLS]符号中。
bert的微调工作
对bert进行与训练之后,需要根据具体的NLP任务,对bert的预训练模型进行微调。微调的时间比预训练的时间消耗要少得多,因此Google已经将预训练好的不同bert模型进行了公开。
- 若NLP任务是NSP任务,其计算两个句子是否是上下文关系的概率的公式为
C是bert输出中的[CLS]符号,W是可进行学习的权值矩阵。根据Softmax函数的性质,该输出符合概率要求,是一个[0,1]的数。 - 若NLP任务是其他任务,例如根据输入可以分为:单句和多句。根据输出可以分为:单词分类/句子分类,回答问题,生成句子。
通过在原有bert结构的基础上再添加一个输出层来实现对bert的微调。
具体的NLP任务有:
(a)当输入为多个句子时,即句子对(sentence pair):
MNLI:给定一个前提(Premise),根据前提判断假设(Hypothesis)于前提的关系,关系可分为三种:蕴含关系(Entailment),矛盾关系(Contradiction),中立关系 (Neutral)。因为关系类型有限,所以究其根本,该任务属于分类任务。
QQP(quora question pairs) 文本匹配:基于类似知乎的问答软件Quora,用来判断两个问题是不是同一个意思,即是不是等价问题。由于是结果只有Y/N,所以也属于分类任务。
QNLI:判断问题和答案是否匹配,是一个二分类问题,。两个句子是一个(question, answer)对. 正样本为answer是对应question的答案, 负样本则相反。
STS-B:用于预测两个句子的相似度,结果可分为5种级别,使用1~5的评分评价两者在语义上的相似度。
MRPC:与STS-B类似,句子对来源于对同一条新闻的评论. 判断这一对句子在语义上是否相同,是一个二分类问题。
RTE:与MNLI类似,对存在蕴含关系的句子对进行二分类,数据集相较而言会更小。
SWAG:在四个句子中判断哪个句子是前句的下一个句子的概率最大。
(b)当输入为单个句子时:
SST-2:对影评进行正负向情感分类,是一个二分类问题。
CoLA:判断一个句子在语言学上的语法和含义是否是可接受的,是一个二分类问题。
GLUE基准数据集的分类任务(MNLI,QQP,QNLI,SST-B,MRPC,RTE,SST-2,CoLA),bert的微调方法是根据[CLS]符号生成一组特征向量C,并通过一层全连接层进行微调。对于不同的具体NLP任务,损失函数的选择也不同。常用的损失函数有:用于多分类的Softmax函数和用于二分类的Sigmoid函数。
SWAG数据集的微调方法与GLUE数据集类似,根据上文SWAG任务的描述,其用来在四个句子中做出判断,故其输出为4个经过Softmax函数处理的概率结果,概率计算公式如下:
(c)问答任务
SQuAD v1.1:用于进行QA回答,输入一篇文章和一个问题,如果该文章中包括该问题的答案,则返回两个数字,这两个数字分别表示答案在文章中的起始索引和结束索引,通过在文章上增加一层激活函数为Softmax的全连接层实现。
(d)命名实体识别
CoNLL-2003 NER:判断一个句子中的单词是不是Person,Organization,Location,Miscellaneous或者other(无命名实体)。输入是一个句子,在每个时间片输出一个概率,通过Softmax函数得到分类结果。