Cross-Attention 与 Self-Attention 的区别

Self-Attention
Self-Attention(自注意力)是注意力机制的核心形式,用于处理单个序列内部的关系。它通过计算序列中每个元素与其他所有元素的相关性权重,动态聚合全局信息。

  • 输入:单一序列(如文本中的词向量或图像中的像素块)。
  • 计算方式:查询(Query)、键(Key)、值(Value)均来自同一序列。公式如下:
    Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dk QKT)V
  • 应用场景:Transformer 编码器(如 BERT)、图像分类中的 Vision Transformer。

Cross-Attention
Cross-Attention(交叉注意力)用于处理两个不同序列之间的关系,常见于多模态任务或编解码结构。

  • 输入:两个不同序列(如源语言和目标语言的词向量)。
  • 计算方式:Query 来自一个序列,Key 和 Value 来自另一个序列。公式与 Self-Attention 相同,但输入来源不同。
  • 应用场景:机器翻译(解码器关注编码器输出)、图像描述生成(文本关注图像特征)。

关键差异

  1. 输入来源:Self-Attention 的 Q/K/V 来自同一序列;Cross-Attention 的 Q 与 K/V 分属不同序列。
  2. 功能目标:Self-Attention 捕捉序列内部依赖;Cross-Attention 建立序列间关联。
  3. 典型应用:Self-Attention 用于特征提取;Cross-Attention 用于信息对齐(如翻译中的源-目标对齐)。

代码示例

# Self-Attention 示例  
self_attn = nn.MultiheadAttention(embed_dim, num_heads)  
output, _ = self_attn(query=x, key=x, value=x)  

# Cross-Attention 示例  
cross_attn = nn.MultiheadAttention(embed_dim, num_heads)  
output, _ = cross_attn(query=seq1, key=seq2, value=seq2)  

Cross-Attention中的Q、K、V含义

在跨注意力(Cross-Attention)机制中,Q(Query)、K(Key)、V(Value)是注意力计算的核心组成部分,其具体含义根据应用场景(如图文匹配或机器翻译)有所不同。

图文匹配中的Q、K、V
  • Query (Q): 通常来自一个模态的信息(例如图像的特征向量),用于“查询”另一个模态中的相关信息。
  • Key (K) 和 Value (V): 来自另一个模态的信息(例如文本的特征向量)。K用于计算与Q的相似度,V是实际被加权聚合的信息。
  • 作用: 通过计算图像特征(Q)与文本特征(K)的相似度,从文本特征(V)中提取与图像最相关的部分。
机器翻译中的Q、K、V
  • Query (Q): 目标语言(解码器)的当前状态,用于查询源语言(编码器)的相关信息。
  • Key (K) 和 Value (V): 来自源语言(编码器)的特征表示。K与Q计算注意力权重,V是编码器的隐藏状态,用于生成目标语言的输出。
  • 作用: 解码器通过Q与编码器的K匹配,从V中获取源语言中对当前翻译步骤最重要的信息。

核心区别

  • 图文匹配: Q和K/V通常来自不同模态(如图像和文本),目的是实现跨模态对齐。
  • 机器翻译: Q来自解码器,K/V来自编码器,目的是实现源语言到目标语言的动态信息检索。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐