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

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

自注意力(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,,xnxiRd,该序列的自注意力输出为一个长度相同的序列 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} QKV的输入。这里的输入词元序列是 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} WqWkWv相乘得到 Q 、 K 、 V \boldsymbol{Q}、\boldsymbol{K}、\boldsymbol{V} QKV,这里的 W q 、 W k 、 W v \boldsymbol{W}^{q}、\boldsymbol{W}^{k}、\boldsymbol{W}^{v} WqWkWv是可学习的参数。
在这里插入图片描述

然后这个例子使用了点积注意力评分,对于 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} WqWkWv是要学习的参数:
在这里插入图片描述

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.

  • 16
    点赞
  • 120
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
注意力(Self-Attention)是一种注意力机制,常用于自然语言处理和图像处理领域。它允许模型在处理序列或图像时,根据序列或图像中各个元素之间的关系,自动学习并分配不同的权重给不同的元素。自注意力通过计算每个元素与其他元素之间的相似度,然后将相似度作为权重,对其他元素进行加权求和,从而实现对元素的重要性排序。 交叉注意力(Cross Attention)是一种将不同输入之间的信息进行交互的注意力机制。在自然语言处理任务中,交叉注意力用于将一个输入序列与另一个输入序列进行交互,以获得更丰富的语义信息。在图像处理任务中,交叉注意力用于将一个图像与另一个图像或者一个图像与一个文本进行交互,以实现跨模态的信息传递和融合。 自注意力交叉注意力可以被看作是注意力机制的两种变体,它们在处理不同类型的输入数据时具有不同的应用场景和效果。自注意力主要用于处理一个输入序列或图像自身的内部关系,而交叉注意力则用于处理不同输入之间的关系。这两种注意力机制深度学习中广泛应用,并取得了很好的效果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【动手深度学习-笔记注意力机制)自注意力交叉注意力位置编码](https://blog.csdn.net/qq_41129489/article/details/127362272)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Attention(注意力机制代码)](https://download.csdn.net/download/zds13257177985/10544175)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值