自注意力机制(Self-Attention)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

一、注意力机制和自注意力机制的区别

二、引入自注意力机制的目的

三、Self-Attention详解

3.1 单个输出

3.2 矩阵形式

四、Multi-head Self-attention

 五、Positional Encoding

六、Self-Attention和RNN的区别


一、注意力机制和自注意力机制的区别

Attention机制与Self-Attention机制的区别

传统的Attention机制发生在Target的元素和Source中的所有元素之间。

简单讲就是说Attention机制中的权重的计算需要Target来参与。即在Encoder-Decoder 模型中Attention权值的计算不仅需要Encoder中的隐状态而且还需要Decoder中的隐状态。

Self-Attention

不是输入语句和输出语句之间的Attention机制而是输入语句内部元素之间或者输出语句内部元素之间发生的Attention机制。

例如在Transformer中在计算权重参数时将文字向量转成对应的KQV只需要在Source处进行对应的矩阵操作用不到Target中的信息。

二、引入自注意力机制的目的

神经网络接收的输入是很多大小不一的向量并且不同向量向量之间有一定的关系但是实际训练的时候无法充分发挥这些输入之间的关系而导致模型训练结果效果极差。比如机器翻译问题(序列到序列的问题机器自己决定多少个标签)词性标注问题一个向量对应一个标签)语义分析问题(多个向量对应一个标签)等文字处理问题。

针对全连接神经网络对于多个相关的输入无法建立起相关性的这个问题通过自注意力机制来解决自注意力机制实际上是想让机器注意到整个输入中不同部分之间的相关性

三、Self-Attention详解

针对输入是一组向量输出也是一组向量输入长度为NN可变化的向量输出同样为长度为N 的向量。

3.1 单个输出

对于每一个输入向量a经过蓝色部分self-attention之后都输出一个向量b这个向量b是考虑了所有的输入向量对a1产生的影响才得到的这里有四个词向量a对应就会输出四个向量b。

下面以b1的输出为例

首先如何计算sequence中各向量与a1的关联程度有下面两种方法

        Dot-product方法是将两个向量乘上不同的矩阵w得到q和k做点积得到αtransformer中就用到了Dot-product。

        上图中绿色的部分就是输入向量a1和a2灰色的Wq和Wk为权重矩阵需要学习来更新用a1去和Wq相乘得到一个向量q然后使用a2和Wk相乘得到一个数值k。最后使用q和k做点积得到α。α也就是表示两个向量之间的相关联程度。

        上图右边加性模型这种机制也是输入向量与权重矩阵相乘后相加然后使用tanh投射到一个新的函数空间内再与权重矩阵相乘得到最后的结果。

        可以计算每一个α(又称为attention scoreq称为queryk称为key

 另外也可以计算a1和自己的关联性再得到各向量与a1的相关程度之后用softmax计算出一个attention distribution这样就把相关程度归一化通过数值就可以看出哪些向量是和a1最有关系。

 下面需要根据 α′ 抽取sequence里重要的资讯

 先求vv就是键值valuev和q、k计算方式相同也是用输入a乘以权重矩阵W得到v后与对应的α′ 相乘每一个v乘与α'后求和得到输出b1。

如果 a1 和 a2 关联性比较高 α1,2′ 就比较大那么得到的输出 b1 就可能比较接近 v2 即attention score决定了该vector在结果中占的分量

3.2 矩阵形式

用矩阵运算表示b1的生成

Step 1q、k、v的矩阵形式生成

写成矩阵形式

 

把4个输入a拼成一个矩阵I这个矩阵有4个column也就是a1到a4I乘上相应的权重矩阵W得到相应的矩阵Q、K、V分别表示query,key和value。

三个W是我们需要学习的参数

Step 2利用得到的Q和K计算每两个输入向量之间的相关性也就是计算attention的值α α的计算方法有多种通常采用点乘的方式。

先针对q1通过与k1到k4拼接成的矩阵K相乘得到\alpha _{1,n}拼接成的矩阵。

同样q1到q4也可以拼接成矩阵Q直接与矩阵K相乘

 

公式为

矩阵形式

矩阵A中的每一个值记录了对应的两个输入向量的Attention的大小αA'是经过softmax归一化后的矩阵。

Step 3利用得到的A'和V计算每个输入向量a对应的self-attention层的输出向量b

 

写成矩阵形式

 对self-attention操作过程做个总结输入是I输出是O

矩阵Wq、 Wk 、Wv是需要学习的参数。

四、Multi-head Self-attention

self-attention的进阶版本Multi-head Self-attention多头自注意力机制

因为相关性有很多种不同的形式有很多种不同的定义所以有时不能只有一个q要有多个q不同的q负责不同种类的相关性。

对于1个输入a

 首先和上面一样用a乘权重矩阵W得到q^i然后再用q^i乘两个不同的W得到两个不同的q^{i,n}i代表的是位置1和2代表的是这个位置的第几个q。

这上面这个图中有两个head代表这个问题有两种不同的相关性。

同样k和v也需要有多个两个k、v的计算方式和q相同都是先算出来ki和vi然后再乘两个不同的权重矩阵。

对于多个输入向量也一样每个向量都有多个head

 

算出来q、k、v之后怎么做self-attention呢

和上面讲的过程一样只不过是1那类的一起做2那类的一起做两个独立的过程算出来两个b。

对于1

 对于2

这只是两个head的例子有多个head过程也一样都是分开算b。

最后把b^{i,1},b^{i,2}拼接成矩阵再乘权重矩阵W得到b^i也就是这个self- attention向量ai的输出如下图所示

五、Positional Encoding

在训练self attention的时候实际上对于位置的信息是缺失的没有前后的区别上面讲的a1,a2,a3不代表输入的顺序只是指输入的向量数量不像rnn对于输入有明显的前后顺序比如在翻译任务里面对于“机器学习”机器学习依次输入。而self-attention的输入是同时输入输出也是同时产生然后输出的。

如何在Self-Attention里面体现位置信息呢就是使用Positional Encoding

也就是新引入了一个位置向量e^i非常简单如下图所示

每一个位置设置一个vector,叫做positional vector用e^i表示不同的位置有一个专属的ei。

如果ai加上了ei就会体现出位置的信息i是多少位置就是多少。

vector长度是人为设定的也可以从数据中训练出来。

六、Self-Attention和RNN的区别

Self-attention和RNN的主要区别在于

1.Self-attention可以考虑全部的输入而RNN似乎只能考虑之前的输入左边。但是当使用双向RNN的时候可以避免这一问题。
2.Self-attention可以容易地考虑比较久之前的输入而RNN的最早输入由于经过了很多层网络的处理变得较难考虑。
3.Self-attention可以并行计算而RNN不同层之间具有先后顺序。

1.Self-attention可以考虑全部的输入而RNN似乎只能考虑之前的输入左边。但是当使用双向RNN的时候可以避免这一问题。

比如对于第一个RNN只考虑了深蓝色的输入绿色及绿色后面的输入不会考虑而Self-Attention对于4个输入全部考虑

 2.Self-attention可以容易地考虑比较久之前的输入而RNN的最早输入由于经过了很多层网络的处理变得较难考虑。

比如对于最后一个RNN的黄色输出想要包含最开始的蓝色输入必须保证蓝色输入在经过每层时信息都不丢失但如果一个sequence很长就很难保证。而Self-attention每个输出都和所有输入直接有关。

 3.Self-attention可以并行计算而RNN不同层之间具有先后顺序。

Self-attention的输入是同时输入输出也是同时输出。

参考

第四节 2021 - 自注意力机制(Self-attention)(上)_哔哩哔哩_bilibili

(53条消息) Attention机制与Self-Attention机制的区别_At_a_lost的博客-CSDN博客_attention和self attention的区别

自注意力机制 - 知乎 (zhihu.com)

Self-Attention 自注意力机制 - 知乎 (zhihu.com)

【自然语言处理】自注意力机制(self-attention)原理介绍 - Geeksongs - 博客园 (cnblogs.com)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6