0


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

文章目录

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

自注意力(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​))∈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​],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
         
         
          
           0
          
          
           
            2
           
           
            i
           
           
            /
           
           
            
             d
            
            
             model 
            
           
          
         
         
          )
         
        
       
      
     
    
    
     
      
       
        
         P
        
        
         
          E
         
         
          
           (
          
          
           p
          
          
           o
          
          
           s
          
          
           ,
          
          
           2
          
          
           i
          
          
           +
          
          
           1
          
          
           )
          
         
        
       
      
     
     
      
       
        
        
         =
        
        
         cos
        
        
         ⁡
        
        
         
          (
         
         
          p
         
         
          o
         
         
          s
         
         
          /
         
         
          1000
         
         
          
           0
          
          
           
            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.


本文转载自: https://blog.csdn.net/qq_41129489/article/details/127362272
版权归原作者 wonder-wall 所有, 如有侵权,请联系我们删除。

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

还没有评论