注意力机制和自注意力机制

有很多自己的理解,仅供参考

Attention注意力机制

对于一张图片,我们第一眼看上去,眼睛会首先注意到一些重点的区域,因为这些区域可能包含更多或更重要的信息,这就是注意力机制,我们会把我们的焦点聚焦在比较重要的事物上。大数据中对于重要的数据,我们要使用;对于不重要的数据,我们不太想使用,但是,对于一个模型而言(CNN、LSTM),很难决定什么重要,什么不重要。由此,注意力机制诞生了。

当前最流行的Attention机制当属Scaled-Dot Attention
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K ⊤ ) V Attention(Q,K,V)=softmax(Q\mathbf{K}^\top)V Attention(Q,K,V)=softmax(QK)V
其中 Q ∈ R n × d k Q \in \mathbb{R}^{n \times d_k} QRn×dk K ∈ R m × d k K \in \mathbb{R}^{m \times d_k} KRm×dk V ∈ R m × d v V \in \mathbb{R}^{m \times d_v} VRm×dv

注意力机制是一个很宽泛的概念,可以极端地理解为QKV(三个向量分别称为Query、Key、Value)相乘就是注意力。通过一个查询变量 Q,去找到 V 里面比较重要的东西。Q 可以是任何一个东西,V 也是任何一个东西, 但K往往是等同于 V 的(同源),当然K和V不同源不相等也可以。

Attention 通常可以进行如下描述,表示为将 Query(Q) 和 key-value pairs(把 Values 拆分成了键值对的形式) 映射到输出上,其中 query、每个 key、每个 value 都是向量,输出是 V 中所有 values 的加权,其中权重是由 Query 和每个 key 计算出来的,计算方法分为三步:

  1. 计算比较 Q 和 K 的相似度,用 f 来表示: f ( Q , K i ) i = 1 , 2 , ⋯   , m f(Q,K_i)\quad i=1,2,\cdots,m f(Q,Ki)i=1,2,,m,一般计算方法包括四种

    点乘(Transformer使用): f ( Q , K i ) = Q T K i f(Q,K_i) = Q^T K_i f(Q,Ki)=QTKi

    权重: f ( Q , K i ) = Q T W K i f(Q,K_i) = Q^TWK_i f(Q,Ki)=QTWKi

    拼接权重: f ( Q , K i ) = W [ Q T ; K i ] f(Q,K_i) = W[Q^T;K_i] f(Q,Ki)=W[QT;Ki]

    感知器: f ( Q , K i ) = V T tanh ⁡ ( W Q + U K i ) f(Q,K_i)=V^T \tanh(WQ+UK_i) f(Q,Ki)=VTtanh(WQ+UKi)

  2. 将得到的相似度进行 softmax 操作,进行归一化: α i = s o f t m a x ( f ( Q , K i ) d k ) \alpha_i = softmax(\frac{f(Q,K_i)}{\sqrt d_k}) αi=softmax(d kf(Q,Ki))

  3. 针对计算出来的权重 a i a_i ai,对 V V V中的所有 values 进行加权求和计算,得到 Attention 向量: A t t e n t i o n = ∑ i = 1 m α i V i Attention = \sum_{i=1}^m \alpha_i V_i Attention=i=1mαiVi

第二步中除以 d k \sqrt d_k d k的作用:
假设 Q , K Q,K Q,K里的元素的均值为0,方差为 1,那么 A T = Q T K A^T=Q^TK AT=QTK中元素的均值为 0,方差为 d。当 d 变得很大时, A A A中的元素的方差也会变得很大,如果 A A A中的元素方差很大(分布的方差大,分布集中在绝对值大的区域),在数量级较大时, softmax 将几乎全部的概率分布都分配给了最大值对应的标签,由于某一维度的数量级较大,进而会导致 softmax 未来求梯度时会消失。总结一下就是 s o f t m a x ( A ) softmax(A) softmax(A)的分布会和d有关。因此 A A A中每一个元素乘上 1 d k \frac{1}{\sqrt{d_k}} dk 1 后,方差又变为 1,并且 A A A 的数量级也将会变小。

Attention没有规定 QKV 怎么来,只规定 QKV 怎么做,即上述描述的操作。
在这里插入图片描述



具体计算过程

至于Attention机制的具体计算过程,上面已经较为详细了,这里再说一下。对目前大多数方法进行抽象的话,可以归纳为两个过程:第一个过程是根据Query和Key计算权重系数第二个过程根据权重系数对Value进行加权求和。而第一个过程又可以细分为两个阶段:第一个阶段根据Query和Key计算两者的相似性或者相关性;第二个阶段对第一阶段的原始分值进行归一化处理;这样,可以将Attention的计算过程抽象为如图展示的三个阶段。
在这里插入图片描述

Q Q Q K = k 1 , k 2 , ⋯   , k n K=k_1, k_2, \cdots, k_n K=k1,k2,,kn ,然后我们一般使用点乘(求内积)的方法计算Q 和 K 里的每一个事物的相似度,就拿到了 Q 和 k 1 k_1 k1的相似值 s 1 s_1 s1,Q 和 k 2 k_2 k2的相似值 s 2 s_2 s2,Q 和 k n k_n kn的相似值 s n s_n sn,接着做一层 s o f t m a x ( s 1 , s 2 , ⋯   , s n ) softmax(s_1,s_2,\cdots,s_n) softmax(s1,s2,,sn)得到概率 ( a 1 , a 2 , ⋯   , a n ) (a_1,a_2,\cdots,a_n) (a1,a2,,an),进而就可以找出哪个对Q 而言更重要了;最后进行一个汇总,当使用 Q 查询结束了后,Q 已经失去了它的使用价值,我们最终是要拿到这张图片(以图片举的例子),原图 V = ( v 1 , v 2 , ⋯   , v n ) V=(v_1,v_2,\cdots,v_n) V=(v1,v2,,vn),现在这张图片变为了 V ′ = ( a 1 ∗ v 1 + a 2 ∗ v 2 + ⋯ + a n ∗ v 1 ) V'=(a_1*v_1+a_2*v_2+\cdots+a_n*v_1) V=(a1v1+a2v2++anv1),得到了一个新的 V’,这个新的 V’ 就多了哪些更重要、哪些不重要的信息在里面(对Q来说),然后用 V’ 代替 V它。

一般在Transformer中 K=V,当然也可以不相等,但是 K 和 V 之间一定具有某种联系,这样的 QK 点乘才能指导 V 哪些重要,哪些不重要。


Attention不依赖于RNN

前面已经说了Attention是一个很宽泛宏大的概念,所以显然Attention机制本身并不依赖于RNN(循环神经网络)。它是一种独立于具体模型结构的机制,可以与多种模型结构结合使用。

在自然语言处理任务中,Attention机制最初是与RNN结合使用的。具体来说,常见的组合是将Attention机制应用于RNN编码器-解码器模型,如机器翻译任务中的序列到序列模型。在这种情况下,RNN编码器用于将输入序列编码为固定长度的上下文向量,然后解码器使用Attention机制来动态地关注编码器输出的不同部分。

然而,Attention机制不仅限于与RNN结合使用。它可以与其他类型的模型结构一起使用,例如卷积神经网络(CNN)和自注意力机制(如Transformer模型)。在Transformer模型中,Attention机制被广泛应用,并且成为其核心组件之一,用于实现序列中不同位置之间的自注意力计算。

因此,尽管Attention机制最初与RNN结合使用,但它并不是RNN的特定部分,而是一种通用的机制,可以与各种模型结构结合使用,以提高模型在序列处理任务中的性能和效果。


Self-Attention自注意力机制

和Attention类似,他们都是一种注意力机制。不同的是Attention是source对target,输入的source和输出的target内容不同。例如英译中,输入英文,输出中文。而Self-Attention是source对source,是source内部元素之间或者target内部元素之间发生的Attention机制,也可以理解为Target=Source这种特殊情况下的注意力机制。

简单说,Self-Attention不仅固定了QKV的操作(Attention机制),还规定了QKV同源(Q≈K≈V来源于同一个输入X),也就是通过X找到X里面的关键点,QKV通过X与三个参数(矩阵) W Q , W K , W V W^Q,W^K,W^V WQ,WK,WV相乘得到。注意力机制包括自注意力机制和其他种类的注意力机制,比如交叉注意力机制。


具体计算操作和Attention一样

  1. 将输入单词X转化成嵌入向量(embedding) a a a

  2. 根据嵌入向量 a a a得到q,k,v三个向量; q i = W q a i q^i=W^qa^i qi=Wqai k i = W k a i k^i=W^ka^i ki=Wkai v i = W v a i v^i=W^va^i vi=Wvai
    QKV的获取

  3. 为每个向量计算一个score, a i j a_{ij} aij=score = q i ∗ k j q^i*k^j qikj;若需要计算 a 1 a^{1} a1(embedding后的向量)和 a 1 , a 2 , a 3 , ⋯   , a n a^{1},a^{2},a^{3},\cdots,a^{n} a1,a2,a3,,an之间的关系(或关联),则需要用 q 1 q^{1} q1 k 1 , k 2 , k 3 , ⋯   , k n k^{1},k^{2},k^{3},\cdots,k^{n} k1,k2,k3,,kn进行匹配计算

  4. 为了梯度的稳定,Transformer使用了score归一化,即除以 d k \sqrt{dk} dk ,原因是防止q和k的点乘结果较大

  5. 对score施以softmax激活函数

  6. softmax点乘Value值v,得到加权的每个输入向量的评分v

  7. 相加之后得到最终的输出结果z= ∑ v
    在这里插入图片描述

与RNN和LSTM的区别

RNN无法解决长序列依赖问题,LSTM无法做并行计算,而self-attention很好的解决了这两个问题。

  1. 长距离依赖建模:Self-Attention可以对序列中的任意两个位置进行直接的关联和交互,因此能够更好地建模长距离依赖。
  2. 并行计算:在序列中的每个时间步,Self-attention可以同时计算所有位置的注意力权重,从而并行处理整个序列。相比之下,LSTM是逐个时间步进行计算,需要依赖前一时间步的隐藏状态,限制了并行性。
  3. 句法特征和语义特征:Self-Attention得到的新的词向量具有句法特征和语义特征(表征更完善)。

简单了解:

句法特征:句法特征关注的是语言中单词之间的结构和关系。它们描述了句子中的语法规则、词性、句法依存关系等。句法特征可以帮助我们理解句子的结构和语法规则,例如主谓宾结构、修饰关系等。

语义特征:语义特征则关注的是句子和单词的语义含义。它们描述了单词之间的关联和句子的意义。语义特征帮助我们理解句子的意思、推断隐含信息和进行语义推理。

理论上Self-Attention (Transformer 50个左右的单词效果最好)解决了RNN模型的长序列依赖问题,但是由于文本长度增加时,训练时间也将会呈指数增长,因此在处理长文本任务时可能不一定比LSTM(200个左右的单词效果最好)等传统的RNN模型的效果好。LSTM通过这些门控机制,避免了传统RNN中梯度消失和梯度爆炸的问题,在一些情况下仍然是一种有效的模型选择,研究者也提出了一些结合LSTM和Self-attention的模型,以发挥它们各自的优势。



Cross-Attention

  • 如果是 s e l f − a t t e n t i o n self-attention selfattention Q , K Q,K Q,K特征都是通过同一个输入 X X X得到的,也就是都是自己的特征,在自己的特征中计算它们之间的一一对应的关系,当作后面与 V a l u e Value Value中特征加权的权重。也就是 a t t e n t i o n m a p attention map attentionmap
  • 如果是 c r o s s − a t t e n t i o n cross-attention crossattention V V V代表的是encoder输出的特征,在CV领域,这个 V V V就是encoder的输出,表示输入图像的feature, K K K也是包含了图像的feature信息,还要加上一个position编码信息。 Q Q Q代表的是和任务相关的特征,在DETR检测任务中, Q Q Q可以理解为用于目标检测的检测器, 它用自己的检测器与 K K K也就是图像的feature 做叉乘计算得到的内积,表示的是我们的检测器与feature之间的相关性,比如detr的Q中有100个检测器(embeddings),第一个检测器可能与 Q , K Q,K Q,K中的某几个特征的关联特别大。

从总体来看 Q K T V QK^TV QKTV的过程就是用 Q Q Q中的特征向量与 K K K的特征向量叉乘计算相关性。然后用这个attention map( Q K T QK^T QKT相乘得到的矩阵)对 V a l u e Value Value中的feature进行加权。

参考(讲的非常好,包含了在视觉上的应用):https://zhuanlan.zhihu.com/p/677614600

个人的理解,做完attention后得到了一个理解全局各部分之间关系的输入的一种表示,也就是被加权后的 V V V


参考:

ChatGPT

https://www.cnblogs.com/nickchen121/p/15105048.html

https://zhuanlan.zhihu.com/p/265108616

https://zhuanlan.zhihu.com/p/619154409

https://zhuanlan.zhihu.com/p/631398525

https://www.cnblogs.com/nickchen121/p/16470569.html

  • 19
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
注意力机制是一种用于加权计算输入序列中不同位置的重要性的方法。它通过计算每个位置与其他位置之间的关联程度,然后根据这些关联程度对输入进行加权求和,从而得到一个加权表示。注意力机制在自然语言处理、计算机视觉等领域广泛应用。 自注意力机制是一种特殊的注意力机制,它用于计算输入序列中每个位置与其他位置之间的关联程度。在自注意力机制中,通过将输入序列映射为查询(Q)、键(K)和值(V)向量,然后计算查询与键之间的相似度得到注意力权重,最后将注意力权重与值向量相乘并求和得到加权表示。 以下是一个演示自注意力机制的例子: ```python import torch import torch.nn as nn # 定义自注意力层 class SelfAttention(nn.Module): def __init__(self, input_dim): super(SelfAttention, self).__init__() self.query = nn.Linear(input_dim, input_dim) self.key = nn.Linear(input_dim, input_dim) self.value = nn.Linear(input_dim, input_dim) self.softmax = nn.Softmax(dim=-1) def forward(self, x): q = self.query(x) k = self.key(x) v = self.value(x) scores = torch.matmul(q, k.transpose(-2, -1)) attention_weights = self.softmax(scores) output = torch.matmul(attention_weights, v) return output # 输入序列 input_sequence = torch.tensor([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]], dtype=torch.float32) # 创建自注意力层 attention = SelfAttention(input_dim=5) # 计算注意力表示 attention_output = attention(input_sequence) print(attention_output) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值