当前位置:   article > 正文

第六节:自注意力机制与Bert_bert中的自注意力机制

bert中的自注意力机制

1.字的表示

图片可以用矩阵表示,那么对于文字,我们可以采用向量。

1.1.One-hot Encoding

需要使用到的汉字的个数设为n左右,这意味着我们需要将向量设置为n*1的维度,要想表示某个汉字,就把对应下标的值置为1,其余为0,显然,这n维的向量有些过长,字与字之间关系平等,无法得到逻辑关联性。

改进:

让模型自己学习如何编码,即把内容放到一个全连接网络中,如21128维的向量经过一层之后变成了768维的向量,大幅度减少了维度。

1.2.Word Embedding

不同类相距远,相同类相聚近。但现在使用较少,归根结底还是要用One-hot Encoding表示方法。

2.RNN和LSTM

2.1RNN(循环神经网络)

每个词都有一个输出,它们经过的模型是同样的。当遇到相同的字表意不同的情况时,便难以作出判断,为了解决这个问题,引入了RNN。RNN关注了每个神经元在时间上的成长变化,可以产生对先前出现过的文字内容的有序的记忆。

每一段文字我们都会输入并输出一个向量,它记录了顺序和上下文情况。如下例,当读到第一个‘爱’字时,判断出‘爱’为名词,而到下一个‘爱’字时,由于传入的‘传家宝’记录了之前的情况,经由模型机器认为这个‘爱’为动词。

然而,当文本量过大时便很难得到正确的答案,如下图,当问到谁结下了不解之缘时,由于每一个文字都要传入一个向量,此时的向量早已面目全非找不到‘我’的痕迹。为了防止‘传家宝’被‘污染’,我们引入了长短期记忆(LSTM)。

2.2LSTM(长短期记忆)

简单的RNN不能记忆长时间的信息,而LSTM则有取舍地记忆信息,选择留下更重要的文字。LSTM引入‘门’,0表示舍去,1表示留下。

遗忘门:决定丢弃多少信息

记忆门:决定保留记忆多少信息

输出门:决定多大程度输出信息

3.Self-attention

上述的RNN与LSTM必须依赖那个‘传家宝’向量,只能一代接一代执行,速度太慢。Self-attention(自注意力机制)可以并行执行,不需要等待这么久。抽象的说,self-attention就是输入若干向量a_{i}得出相应的向量b_{i}

3.1何为注意力

每一个字都有注意力值,表示某一个字的权重即应该多么关注某件事/某个字。 如下图:a_{1,1},a_{1,2},a_{1,3},a_{1,4}表示了a1对所有事件的关注度。

3.2注意力计算

一种想法是,要想求a1对a2的注意力,就将二者向量相乘即可。但这样做乘起来永远是一个值,"吃苹果"和"用苹果"中"苹果"的值都是一样的,不会根据前面动词不同而变化,模型没有参与感。

故此,我们用a1乘一个方阵Wq得到向量q,a2乘一个方阵Wk得到向量k,这个分别将a1,a2乘方阵的过程便是经过一个全连接的过程。最终将q与k求内积得到a1与a2的目标值,机器学习的过程就体现在两个矩阵上,他们作为中间商。

q表示query询问,k表示key关键值。若将q理解为扫码器,那k就是二维码。注意力的计算过程就是分别用a1, a2, a3, a4的扫码器去扫含自己在内的所有二维码并求内积。最终得到a_{1,1}a_{n,n}的若干个数,a_{1,1}~a_{1,n}就表示所有事件对a1的注意力,再把a_{1,1}~a_{1,n}代入Softmax函数归一化求得概率分布,使它们的和为1。

此外,还有一个value,计算方式也为vi=ai*Wv,最终把v与注意力相乘求和得到a1的输出b1,剩下的同理。

归结上述过程,每一个文字由一个向量a^{i}表示,W^q,W^k, W^va^i相乘得到向量q^i, k^i, v^i不妨假设a^i都是768*1的列向量,当前有四个文字由a^1, a^2, a^3, a^4表示,W^q,W^k, W^v是768*768的方阵,那么每一列q,k,v所组成的矩阵Q, K, V可以表示为:

Q=W_{q}\begin{pmatrix} a1 & a2 & a3& a4 \end{pmatrix}

K=W_{k}\begin{pmatrix} a1 & a2 & a3& a4 \end{pmatrix}

V=W_{v}\begin{pmatrix} a1 & a2 & a3& a4 \end{pmatrix}

不难得出,它们都是768*4的矩阵。根据上述流程,k与q求内积后经Softmax函数处理后与各自的v向量分别相乘求和得到最终结果,即K^TQ=AA\rightarrow softmax\rightarrow A'VA'=output。其中A表示a_{11}~a_{44}16个数组成的4*4矩阵,A'将A中元素全部归一化成概率,output中记录着4列768维的向量,每一列分别表示一个字的输出内容。

可见,最终的矩阵维度也为768*4与输入一致。我们自然可以将上述过程重复执行已得到更准确的结果。

3.3多头注意力机制(Multi-Head Attention)

多头注意力主要用于处理序列数据,如自然语言处理中的文本或语音识别任务。它的核心思想是在序列的不同位置上分别计算注意力权重,并将这些权重应用于序列的各个部分,从而能够捕捉到序列内部的各种依赖关系。

多头注意力机制可以提高整个计算过程的并行性,相比于单一的注意力机制,对一些特定的特征不是那么的依赖。

关于多头注意力的具体内容见下一章节。

4.位置信息

对于很多语句,他们需要的文字相同,可是顺序不同。而Self-attention不像RNN等机制,当每一个bi值相加,同样的文字得到同样的和,故每一个文字都是等价的,看不出顺序关系。

为了解决这个问题,每一个文字配了一个位置向量,与一个表示文字的向量的维度一致,并将表示文字的向量与位置向量直接相加,相加的结果就是Self-attention的输入向量。

5.Bert

5.1Bert的结构

现在我们能够理解transformer图左半部内容了。Input Embedding是输入的文字对应的向量;Positional Encoding则是位置信息向量,通过与Input Embedding相加得到含有位置信息的结果;Multi-Head Attention则是多头注意力机制,其中输入的三个箭头分别代表q,k,v;之所以输入部分会连接到输出的Add&Norm,是因为残差连接,解决梯度消失网络退化的问题;Feed Forward就是几层全连接,多层感知器(MLP)。以上被框住的区域就是一层,N*代表有很多个这样的层。

下图左侧部分,即transformer的左侧就是Encoder编码区,把输入变成一个特征;transformer的右侧为Decoder解码器把特征转为输出生成文字。Bert就是左侧部分的一个经典模型,而右侧也有一个经典模型名为GPT。

Bert的Inputs的内容如下:Token Embeddings表示输入文本的向量形式,注意开始结束符;Segement Embeddings表示该文字属于哪一句;Position Embeddings则是位置信息。

Bert的整体结构大致如下:embedding代表输入内容input;bert layers则是若干个self-attention层; Bert就是为了得到特征,而pooler_output(池化输出)就可以理解成该句子语义的特征向量并降维。

5.2迁移学习

Bert就是一个特征提取器,如下图的过程,由前人呕心沥血在庞大的数据中分类训练得到的一个特征提取器,效果极好,这就是预训练。我们则把这个特征提取器取来提取特征做出分类,我们只需要将某些特征分为11类,那么需要更改部分内容,这个过程叫做微调

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/781660
推荐阅读
相关标签
  

闽ICP备14008679号