Bert模型的目的:
预训练Transformer的encoder网络,从而大幅提高准确率
主要有两个任务:
1、预测被遮挡单词:
随机遮挡一个词或多个词,让encoder根据上下文来预测被遮挡的单词
2、预测下一个句子:
把两个句子放在一起,让encoder判断是否是原文中相邻的两个句子
预测被遮挡单词:
首先输入一句话,然后这句话被分词成了一个个的单词,通过embedding层把每一个单词映射成一个个的词向量x1x2...xt ,最后也输出u1u2....ut这么多向量
具体过程:
假如现在我们遮挡住了cat这个单词
那么我们会用mask标记这个被遮挡的单词,紧接着它就会被embedding层标记为Xm向量,输出记为Um向量,我们知道,Transformer的映射是多对一,所以Um向量会依赖所有的X向量,也就是说它会知道整句话的内容,那么就可以用它来预测被遮挡的单词是什么,将这个Um作为特征向量送入softmax分类器输出一个概率分布p,根据这个p值来判断被遮挡的词是什么
这里,我们的希望的p值是越接近mask的one-hot编码越好
我们将被遮挡单词的ont-hot向量记为e,将CrossEntropy(e,p)作为损失函数,用反向传播算出损失函数关于模型的梯度,然后作梯度下降来更新模型参数,bert预训练不需要人工标注数据,它用被遮挡的单词作为标签,可以自动生成标签,这样训练数据就可以想要多少就有多少,从而训练出一个很大的模型
预测下一个句子
输入数据:
[ CLS ] 是用于分类的标识符[SEP]是用于分割句子的标识符
输入两个句子,中间用【SEP】符号隔开,其中一个句子一定是原文中真实存在的句子,另一个句子则是从训练数据中随机抽取的句子,比如:
[CLS] "calculus is a branch of math"
[SEP] "panda is native to south central china"
这两句话是真实的原文我们把它标签为true
[CLS] "calculus is a branch of math"
[SEP]“panda is native to south central china"
这两句话是随机匹配的我们把它标记为false
向量C虽然在CLS的位置上,但它包含的是输入的两句话的全部信息,把C作为特征向量输入分类器Binary,得到一个介于0-1之间的值f,其中,1是代表两句话true,0代表两句话毫无关联,依旧用将CrossEntropy(e,f)作为损失函数,用反向传播算出损失函数关于模型的梯度,然后作梯度下降来更新模型参数
这样作预训练是因为:
相邻的两句话通常有关联,这样作二分类可以强化这种关联,让embedding层包含这种关联,而且encoder层中的self-attention层的作用恰好就是找相关性
bert将上述所讲的这两种任务结合起来训练Transformer,假如有两个单词被遮挡,就需要三个任务,也就是说三个损失函数,第一个损失函数是二分类(判断标签是true还是false),第二三个损失函数就是预测这两个单词,目标函数就是三个损失函数的加和,用反向传播算出损失函数关于模型的梯度,然后作梯度下降来更新模型参数
总结:
预测遮挡单词是一个多分类问题
预测下一个句子是一个二分类问题
合并任务的目标函数就是两个任务的目标函数之和
采用梯度下降方法更新合并任务模型参数
bert可以解决哪些nlp中的高级别下游任务?
●判断两句话意思是否相近
●判断两个问题意思是否相近
●蕴含任务
下图表示:Bert模型已经接近甚至超过人类语言理解水平
如何利用Bert:
1、情感分析
2、词性标注
3、文本蕴含任务
4、抽取式问答系统: