首页IT科技自注意力机制qkv(【动手深度学习-笔记】注意力机制(四)自注意力、交叉注意力和位置编码)

自注意力机制qkv(【动手深度学习-笔记】注意力机制(四)自注意力、交叉注意力和位置编码)

时间2025-07-08 01:52:09分类IT科技浏览5772
导读:紧接上回:【动手深度学习-笔记】注意力机制(三)多头注意力 自注意力(Self-Attention)...

紧接上回:【动手深度学习-笔记】注意力机制(三)多头注意力

自注意力(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                     ,xiRd
             ,该序列的自注意力输出为一个长度相同的序列

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))Rd

f

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]       ,aiRd
              ,

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版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
python多次赋值(python多值参数是什么) 刷新bios教程(如何刷新bios?刷新BIOS失败后有哪些方法恢复?)