自注意力机制qkv(【动手深度学习-笔记】注意力机制(四)自注意力、交叉注意力和位置编码)
紧接上回:【动手深度学习-笔记】注意力机制(三)多头注意力
自注意力(Self-Attention)
在注意力机制下 ,我们将词元序列输入注意力汇聚中 ,以便同一组词元同时充当查询 、键和值 。 具体来说 ,每个查询都会关注所有的键-值对并生成一个注意力输出 。
像这样的 ,查询 、键和值来自同一组输入的注意力机制 ,被称为自注意力(self-attention)或者内部注意力(intra-attention) 。
给定一个由词元组成的输入序列x
1
,
…
,
x
n
,
x
i
∈
R
d
\mathbf{x}_1, \ldots, \mathbf{x}_n ,\mathbf{x}_i \in \mathbb{R}^d
x1,…,xn ,xi∈Rd ,该序列的自注意力输出为一个长度相同的序列y
1
,
…
,
y
n
\mathbf{y}_1, \ldots, \mathbf{y}_n
y1,…,yn,其中:
y
i
=
f
(
x
i
,
(
x
1
,
x
1
)
,
…
,
(
x
n
,
x
n
)
)
∈
R
d
\mathbf{y}_i = f(\mathbf{x}_i, (\mathbf{x}_1, \mathbf{x}_1), \ldots, (\mathbf{x}_n, \mathbf{x}_n)) \in \mathbb{R}^d
yi=f(xi,(x1,x1),…,(xn,xn))∈Rdf
f
f是注意力汇聚函数 ,f
f
f的第一个输入参数x
i
\mathbf{x}_i
xi作为query ,剩下的参数为x
\mathbf{x}
x自己和自己组成的键值对 。例子
给出李宏毅老师课上的例子,看看自注意力是怎么工作的 。
首先是将词元序列同时作为
Q
、
K
、
V
\boldsymbol{Q} 、\boldsymbol{K} 、\boldsymbol{V}
Q 、K 、V的输入 。这里的输入词元序列是I
=
[
a
1
,
…
,
a
4
]
,
a
i
∈
R
d
\mathbf{I}=[\mathbf{a}_1, \ldots, \mathbf{a}_4] ,\mathbf{a}_i \in \mathbb{R}^d
I=[a1,…,a4],ai∈Rd ,I
\mathbf{I}
I分别和三个矩阵W
q
、
W
k
、
W
v
\boldsymbol{W}^{q} 、\boldsymbol{W}^{k} 、\boldsymbol{W}^{v}
Wq、Wk 、Wv相乘得到Q
、
K
、
V
\boldsymbol{Q} 、\boldsymbol{K} 、\boldsymbol{V}
Q、K 、V ,这里的W
q
、
W
k
、
W
v
\boldsymbol{W}^{q} 、\boldsymbol{W}^{k} 、\boldsymbol{W}^{v}
Wq 、Wk 、Wv是可学习的参数 。
然后这个例子使用了点积注意力评分 ,对于
Q
\boldsymbol{Q}
Q中的每一个分量q
i
\bold{q}_i
qi ,把它和K
\boldsymbol{K}
K中所有的k
i
\bold{k}_i
ki相乘 ,得到注意力权重向量α
i
\bold{\alpha}_i
αi(图中的灰色部分):
把所有的q
i
\bold{q}_i
qi得到的权重向量拼起来再通过softmax ,得到的就是权重矩阵:
最后将权重矩阵与V
\bold{V}
V相乘 ,得到最终的输出序列O
\bold{O}
O ,它的形状和输入序列I
\bold{I}
I一致:
总结一下 ,自注意力就是一系列如下的矩阵运算过程,只有W
q
、
W
k
、
W
v
\boldsymbol{W}^{q}、\boldsymbol{W}^{k} 、\boldsymbol{W}^{v}
Wq 、Wk、Wv是要学习的参数:
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使用了三角位置编码:
P
E
(
p
o
s
,
2
i
)
=
sin
(
p
o
s
/
1000
2
i
/
d
model
)
P
E
(
p
o
s
,
2
i
+
1
)
=
cos
(
p
o
s
/
1000
2
i
/
d
model
)
\begin{aligned} P E_{(p o s, 2 i)} &=\sin \left(p o s / 10000^{2 i / d_{\text {model }}}\right) \\ P E_{(p o s, 2 i+1)} &=\cos \left(p o s / 10000^{2 i / d_{\text {model }}}\right) \end{aligned}
PE(pos,2i)PE(pos,2i+1)=sin(pos/100002i/dmodel )=cos(pos/100002i/dmodel ) 其中p
o
s
pos
pos是词向量在序列中的位置 ,i
i
i表示的是词向量内的第i
i
i个分量,d
m
o
d
e
l
d_{model}
dmodel是词向量的长度 。由上式可知 ,词向量的偶数维用
sin
\sin
sin编码 ,奇数维用cos
\cos
cos编码 ,这样编码的原因是基于三角函数的和差化积性质:
sin
(
α
+
β
)
=
sin
α
cos
β
+
cos
α
sin
β
cos
(
α
+
β
)
=
cos
α
cos
β
−
sin
α
sin
β
\begin{aligned} \sin (\alpha+\beta)=\sin \alpha \cos \beta+\cos \alpha \sin \beta \\ \cos (\alpha+\beta)=\cos \alpha \cos \beta-\sin \alpha \sin \beta \end{aligned}
sin(α+β)=sinαcosβ+cosαsinβcos(α+β)=cosαcosβ−sinαsinβ 这样一来 ,这表明位置α
+
β
α+β
α+β的向量可以表示成位置α
α
α和位置β
β
β的向量组合 ,这提供了表达相对位置信息的可能性比如
p
o
s
=
10
pos=10
pos=10可以和p
o
s
=
1
,
p
o
s
=
9
pos=1, pos=9
pos=1,pos=9处的词向量建立联系 ,或者p
o
s
=
2
,
p
o
s
=
8
pos=2,pos=8
pos=2,pos=8等 。视觉中的二维位置编码
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.创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!