情感测试
情感测试

您现在的位置: 情感测试简介_情感测试玩法 > 情感测试分类 > Bert的预训练和情感分析的应用

Bert的预训练和情感分析的应用

发布时间:2021-10-2 12:01:58   点击数:
北京那家医院专治白癜风 https://baike.baidu.com/item/%E5%8C%97%E4%BA%AC%E4%B8%AD%E7%A7%91%E7%99%BD%E7%99%9C%E9%A3%8E%E5%8C%BB%E9%99%A2/9728824?fr=aladdin
前言

这是Transformer解读的第二部分,这部分是实践的部分,Bert的预训练和情感分析的应用,如果你没有看第一部分:Bert前篇:手把手带你详解Transformer原理,可以跳转先了解什么是Transformer。

下面我将从以下几个方面进行讲解:

进一步理解

,结合注意力矩阵可视化位置编码;语言模型的定义和BERT解读;BERT训练之前的准备工作,语料预处理;BERT的预训练,训练参数;使用BERT预训练模型进行自然语言的情感分类;BERT代码解读.1.进一步理解

,结合注意力矩阵可视化位置编码

#导入依赖库importnumpyasnpimportmatplotlib.pyplotaspltimportseabornassnsimportmathimportplotly.graph_objsasgofromplotly.offlineimportdownload_plotlyjs,init_notebook_mode,plot,iplotfromIPython.displayimportImageinit_notebook_mode(connected=True)defget_positional_encoding(max_seq_len,embed_dim):#初始化一个positionalencoding#embed_dim:字嵌入的维度#max_seq_len:最大的序列长度positional_encoding=np.array([[pos/np.power(,2*i/embed_dim)foriinrange(embed_dim)]ifpos!=0elsenp.zeros(embed_dim)forposinrange(max_seq_len)])positional_encoding[1:,0::2]=np.sin(positional_encoding[1:,0::2])#dim2i偶数positional_encoding[1:,1::2]=np.cos(positional_encoding[1:,1::2])#dim2i+1奇数#归一化,用位置嵌入的每一行除以它的模长#denominator=np.sqrt(np.sum(position_enc**2,axis=1,keepdims=True))#position_enc=position_enc/(denominator+1e-8)returnpositional_encodingpositional_encoding=get_positional_encoding(max_seq_len=,embed_dim=)#3d可视化relation_matrix=np.dot(positional_encoding,positional_encoding.T)[1:,1:]data=[go.Surface(z=relation_matrix)]layout=go.Layout(scene={"xaxis":{title:"sequencelength"},"yaxis":{"title":"sequencelength"}})fig=go.Figure(data=data,layout=layout)iplot(fig)

上图中,我们用位置编码矩阵乘以(矩阵乘)他本身的转置,也就是,我们求

,得出的维度是

.我们看到上图中,矩阵的对角线隆起,也就是值比较大,是因为一个矩阵乘以他本身的转置之后,形成的矩阵的对角线正是这个矩阵的每一行

点乘这一行本身,所以是值最大的区域(红色部分).对于位置编码来说,也就是当前位置与当前位置本身相关程度最高.再往对角线两边看,发现以对角线(红色山峰)区域为中心,两边属于缓慢下降趋势,这就说明了随着离当前位置越远,其位置编码的相关程度就越低.由此可见,位置编码建立在时间维度的关联关系.

2.语言模型的定义和BERT解读

什么是语言模型?其实用一个公式就可以表示

,假设我们有一句话,

是这句话里的

个字,而语言模型就是求的是这句话出现的概率是多少.

比如说在一个语音识别的场景,机器听到一句话是"wowangdaisanle(我忘带伞了)",然后机器解析出两个句子,一个是"我网袋散了",另一个是"我忘带伞了",也就是前者的概率大于后者.然后语言模型就可以判断

我忘带伞了

我网袋散了

,从而得出这句语音的正确解析结果是"我忘带伞了".

BERT的全称是:BidirectionalEncoderRepresentationsfromTransformers,如果翻译过来也就是双向transformer编码表达,我们上篇文章解读了transformer的编码器,编码器输出的隐藏层就是自然语言序列的数学表达,那么双向是什么意思呢?我们来看一下下面这张图.

上图中

是指的单个字或词,

指的是最终计算得出的隐藏层,还记得我们在Transformer第一部分中讲到的注意力矩阵和注意力加权,经过这样的操作之后,序列里面的每一个字,都含有这个字前面的信息和后面的信息,这就是双向的理解,在这里,一句话中每一个字,经过注意力机制和加权之后,当前这个字等于用这句话中其他所有字重新表达了一遍,每个字含有了这句话中所有成分的信息.

在BERT中,主要是以两种预训练的方式来建立语言模型:

1)BERT语言模型任务一:MASKEDLM

在BERT中,MaskedLM(MaskedlanguageModel)构建了语言模型,这也是BERT的预训练中任务之一,简单来说,就是随机遮盖或替换一句话里面任意字或词,然后让模型通过上下文的理解预测那一个被遮盖或替换的部分,之后做

的时候只计算被遮盖部分的

,其实是一个很容易理解的任务,实际操作方式如下:

随机把一句话中

替换成以下内容:

这些

的几率被替换成

;有

的几率被替换成任意一个其他的

;有

的几率原封不动.

之后让模型预测和还原被遮盖掉或替换掉的部分,模型最终输出的隐藏层的计算结果的维度是:

我们初始化一个映射层的权重

:

我们用

完成隐藏维度到字向量数量的映射,只要求

的矩阵乘(点积):

之后把上面的计算结果在

(最后一个)维度做

归一化,是每个字对应的

的和为

,我们就可以通过

里概率最大的字来得到模型的预测结果,就可以和我们准备好的

做损失(

)并反传梯度了.

注意做损失的时候,只计算在第1步里当句中随机遮盖或替换的部分,其余部分不做损失,对于其他部分,模型输出什么东西,我们不在意.

2)BERT语言模型任务二:NextSentencePrediction

1.首先我们拿到属于上下文的一对句子,也就是两个句子,之后我们要在这两段连续的句子里面加一些特殊

:

上一句话,

下一句话.

也就是在句子开头加一个

,在两句话之中和句末加

,具体地就像下图一样:

我们看到上图中两句话是

mydogiscute

helikesplaying

,

我的狗很可爱

他喜欢玩耍

,除此之外,我们还要准备同样格式的两句话,但他们不属于上下文关系的情况;

我的狗很可爱

企鹅不擅长飞行

,

可见这属于上下句不属于上下文关系的情况;在实际的训练中,我们让上面两种情况出现的比例为

,也就是一半的时间输出的文本属于上下文关系,一半时间不是.

我们进行完上述步骤之后,还要随机初始化一个可训练的,见上图中,作用就是用

的信息让模型分开上下句,我们一把给上句全

,下句啊全

,让模型得以判断上下句的起止位置,例如:

我的狗很可爱

企鹅不擅长飞行

上面

就是.

还记得我们上篇文章说过,注意力机制就是,让每句话中的每一个字对应的那一条向量里,都融入这句话所有字的信息,那么我们在最终隐藏层的计算结果里,只要取出

所对应的一条向量,里面就含有整个句子的信息,因为我们期望这个句子里面所有信息都会往

所对应的一条向量里汇总:

模型最终输出的隐藏层的计算结果的维度是:

我们

我们要取出

所对应的一条向量,

对应着

维度的第

条:

之后我们再初始化一个权重,完成从

维度到

的映射,也就是逻辑回归,之后用

函数激活,就得到了而分类问题的推断.

我们用

来表示模型的输出的推断,他的值介于

之间:

至此

的训练方法就讲完了,是不是很简单,下面我们来为

的预训练准备数据.

3.BERT训练之前的准备工作,语料预处理

字典的制作,参见目录./corpus/BERT_preprocessing.ipynb文件中的讲解

4.BERT的预训练,训练参数

BERT论文中,推荐的模型参数为:基准模型,可见其中共有

亿参数,除此之外,还有比基准模型还大的高性能模型,参数量为

亿,要想训练并使用这么大参数的模型,需要充裕的计算资源!

但是经过我的实际测试,结合我目前正在研究的命名实体识别,语义分析,关系抽取和知识图谱的需求,发现其实这个参数比较过剩,我们今天训练BERT所用的参数为,可见我把参数缩减到

千万,但即使这样,使用一块11GB显存的Ti显卡,训练维基百科语料的BERT也需要一周的时间.

注意我们今天所使用的模型,是在开源项目

转载请注明:http://www.zmax-alibaba.com/qgfl/138377.html

网站简介 | 发布优势 | 服务条款 | 隐私保护 | 广告合作 | 合作伙伴 | 版权申明 | 网站地图

当前时间: