Java教程

Bert预训练

本文主要是介绍Bert预训练,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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、抽取式问答系统:

 

这篇关于Bert预训练的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!