文章目录
自注意力(Self-Attention)
在注意力机制下,我们将词元序列输入注意力汇聚中,以便同一组词元同时充当查询、键和值。 具体来说,每个查询都会关注所有的键-值对并生成一个注意力输出。
像这样的,查询、键和值来自同一组输入的注意力机制,被称为自注意力(self-attention)或者内部注意力(intra-attention)。
给定一个由词元组成的输入序列,该序列的自注意力输出为一个长度相同的序列
,其中:
是注意力汇聚函数,
的第一个输入参数
作为query,剩下的参数为
自己和自己组成的键值对。
例子
给出李宏毅老师课上的例子,看看自注意力是怎么工作的。
首先是将词元序列同时作为的输入。这里的输入词元序列是
,
分别和三个矩阵
相乘得到
,这里的
是可学习的参数。
然后这个例子使用了点积注意力评分,对于中的每一个分量
,把它和
中所有的
相乘,得到注意力权重向量
(图中的灰色部分):
Self-Attention vs Convolution
我们比较一下自注意力和卷积这两个架构。
卷积具有固定的感受野(receptive field),感受野的大小通常是人为设计的,对于每个像素,考虑的是感受野范围的信息,学习的是过滤器。
而自注意力可以获取到全局的信息,然后经过学习,模型可以自己判断对于每个像素的query,需要考虑到哪些像素的key、多大范围内的key,它同时学习过滤器和感受野的形状。
可以说,卷积是自注意力机制的特例,自注意力是卷积的一般化形式。
有一篇论文专门从数学角度严格分析了卷积和自注意力的关系
On the Relationship between Self-Attention and Convolutional Layers
有兴趣的可以看看,我这里引用一下论文结论中的一句话:
More generally, fully-attentional models seem to learn a generalization of CNNs where the kernel pattern is learned at the same time as the filters—similar to deformable convolutions.
更一般地说,完全注意力模型似乎学习了CNN的一般化,其中内核模式与过滤器同时学习——类似于可变形卷积
Self-Attention vs RNN
再比较一下自注意力和循环神经网络RNN这两个架构。
RNN的输入输出和自注意力很类似,都是输入一个序列输出一个序列。
RNN的特点在于,对于一个输入序列的某个词元,它只考虑该词元之前输入的词元信息(这里指最一般的单向RNN,双向RNN也是可以考虑双向信息的),且如果是一个很长的序列,那么开头的词元信息就很难保留到末尾的词元;
自注意力可以获取到全局的信息,而且对于一个词元,它和任意位置的词元的关联计算都是一样的,不会有长序列信息丢失的问题。
在运算方面,由于RNN的结构限制,每一个词元输出的计算是不能并行执行的,必须要先等之前输入的词元完成计算;
自注意力,我们上面讲过了,可以很好地表示成矩阵运算的形式,使得各个词元输出的计算可以同时进行。
交叉注意力(Cross Attention)
对于交叉注意,键和值相同但与查询不同,从而引入了它们的相互依赖关系。
位置编码(Position Encoding,PE)
在自注意力机制中,词向量是不带位置信息的,也就是说,将词的顺序打乱,得到的输出是一样的。
所以需要给词向量添加位置信息,表示其顺序关系。
Transformer使用了三角位置编码:
其中是词向量在序列中的位置,
表示的是词向量内的第
个分量,
是词向量的长度。
由上式可知,词向量的偶数维用编码,奇数维用
编码,这样编码的原因是基于三角函数的和差化积性质:
这样一来,这表明位置的向量可以表示成位置
和位置
的向量组合,这提供了表达相对位置信息的可能性
比如可以和
处的词向量建立联系,或者
等。
视觉中的二维位置编码
DETR中,为了保留特征的空间信息,没有将二维数据平铺为一维,而是分别对行和列进行位置编码。
参考
10.6. 自注意力和位置编码 — 动手学深度学习 2.0.0-beta1 documentation
位置编码公式详细理解补充_bilibili
让研究人员绞尽脑汁的Transformer位置编码 – 科学空间|Scientific Spaces (kexue.fm)
Jean-Baptiste Cordonnier et al. “On the Relationship between Self-Attention and Convolutional Layers…” Learning (2019): n. pag.
文章出处登录后可见!