Transformer动画讲解 - Cross Attention

前言

编码器-解码器注意力:在“编码器-解码器注意力”层中,查询来自前一层解码器,而记忆键和值则来自编码器的输出。这使得解码器中的每个位置都能关注输入序列中的所有位置。这模仿了序列到序列模型中典型的编码器-解码器注意力机制。

(1)论文中对于编码器-解码器注意力的描述,让我们初步了解Encoder-Decoder Attention的Q来自前一层的解码器,K、V来自编码器的输出。

在这里插入图片描述

(2)当我们想深入了解,回到Transformer的架构图时,估计又懵逼了,怎么又变成Muti-Head Attention?

在这里插入图片描述

(3)新手的疑问:架构图中明明是Multi-Head Attention,论文中的描述又变为Encoder-Decoder Attention,怎么又冒出一个新名词Cross Attention?

在这里插入图片描述

Cross Attention:交叉注意力的输入来自两个不同的序列,一个序列用作查询(Q),另一个序列提供键(K)和值(V),实现跨序列的交互。
在这里插入图片描述

Self Attention vs Cross Attention:Self Attention更适用于处理单个序列,而Cross Attention则更适用于处理多个序列之间的交互。

  • 输入来源:
    Self Attention:其输入来自同一序列,即查询(Q)、键(K)和值(V)都来自编码器。这种机制关注于序列内部元素之间的关联。
    Cross Attention:其输入来自不同的序列。解码器序列作为查询(Q),而编码器序列作为键(K)和值(V)。这种机制关注于不同序列之间的元素关联。

  • 应用场景
    Self Attention:在自然语言处理任务中尤为常见,如语言建模、文本分类等。由于它关注的是序列内部元素之间的关联,因此特别适用于处理单个序列,如句子或段落。
    Cross Attention:在自然语言处理、计算机视觉等领域都有应用,如机器翻译、图像描述生成等。它允许模型关注不同序列之间的元素关联,从而能够处理多个序列之间的交互。

  • 作用机制:
    Self Attention:通过对序列中的每个元素(如词或图像patch)生成一个表示,并使用这个表示作为查询去关注序列中的其他元素,从而计算出一个新的表示。这个过程有助于捕捉序列内部的依赖关系。
    Cross Attention:在两个序列之间建立关联,一个序列的元素作为查询去关注另一个序列中的所有元素。这种机制允许模型在翻译或生成任务中关注源序列和目标序列之间的对应关系。

在这里插入图片描述

Cross Attention应用机器翻译:在机器翻译等序列到序列(Seq2Seq)的任务中,交叉注意力机制允许解码器在生成输出的每一步中,都能关注到输入序列中与当前步最相关的信息,从而生成更准确的输出。这种机制大大提高了Seq2Seq模型的性能,特别是在处理长序列和复杂依赖关系时。

  1. 准备输入数据:
    通常有两个不同的输入序列,我们称之为源序列(Source Sequence)和目标序列(Target Sequence)。在机器翻译任务中,源序列可以是原文,而目标序列可以是译文的部分或全部。

  2. 生成查询(Query)、键(Key)和值(Value):
    对于交叉注意力,查询(Q)通常来自目标序列的某个元素或元素的表示。
    键(K)和值(V)则来自源序列的元素或元素的表示。
    这些表示通常是通过嵌入层(Embedding Layer)或者经过某种形式的编码器(Encoder)得到的。

  3. 计算注意力得分:
    对于每一个目标序列中的查询(Q),计算它与源序列中所有键(K)的相似度或相关性得分。这通常通过点积、加性注意力或缩放点积等方式实现。

  4. 归一化注意力得分:
    使用Softmax函数将得分转换成概率分布,这样每个源序列中的键(K)都会有一个与之对应的权重。

  5. 计算加权和:
    使用上一步得到的权重对源序列中的值(V)进行加权求和,得到一个加权表示(也称为上下文向量)。

  6. 输出上下文向量:
    这个加权表示(上下文向量)捕捉了源序列中与目标序列查询最相关的信息,并将其作为交叉注意力的输出。

  7. 使用上下文向量:
    这个上下文向量随后可以被用于目标序列的下一个处理步骤,例如在解码器(Decoder)中用于生成下一个词或预测下一个状态。

在这里插入图片描述

最后

感谢你们的阅读和喜欢,我收藏了很多技术干货,可以共享给喜欢我文章的朋友们,如果你肯花时间沉下心去学习,它们一定能帮到你。

因为这个行业不同于其他行业,知识体系实在是过于庞大,知识更新也非常快。作为一个普通人,无法全部学完,所以我们在提升技术的时候,首先需要明确一个目标,然后制定好完整的计划,同时找到好的学习方法,这样才能更快的提升自己。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

五、面试资料

我们学习AI大模型必然是想找到高薪的工作,下面这些面试题都是总结当前最新、最热、最高频的面试题,并且每道题都有详细的答案,面试前刷完这套面试题资料,小小offer,不在话下。
在这里插入图片描述

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

### Cross Attention 的定义 Cross attention 是一种注意力机制,在深度学习和神经网络中广泛应用于涉及两个不同序列或多模态输入的任务。它允许一个序列(称为查询序列)关注另一个序列(称为键值序列)的不同部分,从而捕捉两者之间的关系[^1]。 具体来说,cross attention 可以看作是一个双向映射过程,其中一个序列作为查询 (query),另一个序列作为键 (key) 和值 (value)。这种设计使得模型能够专注于另一组输入中最相关的部分,进而增强跨域信息交互的能力。 --- ### 实现方式 在实际实现中,cross attention 基于标准的自注意力机制 (self-attention mechanism) 进行扩展。以下是其实现的核心步骤: #### 输入准备 假设存在两个不同的输入序列 \( Q \in \mathbb{R}^{n_q \times d_k} \) (查询序列)、\( K \in \mathbb{R}^{n_k \times d_k} \) (键序列)和 \( V \in \mathbb{R}^{n_k \times d_v} \) (值序列)。这里: - \( n_q \): 查询序列长度; - \( n_k \): 键/值序列长度; - \( d_k \): 键向量维度; - \( d_v \): 值向量维度; #### 计算注意力权重 通过计算查询与键之间的相似度矩阵得到注意力分数,并对其进行 softmax 归一化操作: \[ \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V. \] 这里的除法项 \( \sqrt{d_k} \) 被用来缩放点积结果,防止数值过大影响 softmax 输出稳定性[^2]。 #### Python 实现示例 下面展示了一个简单的 cross attention 层实现代码片段: ```python import torch import torch.nn as nn import math class CrossAttention(nn.Module): def __init__(self, dim_query, dim_key_value, num_heads=8, dropout=0.1): super(CrossAttention, self).__init__() assert dim_query % num_heads == 0 and dim_key_value % num_heads == 0 self.num_heads = num_heads self.head_dim = dim_query // num_heads self.scale = self.head_dim ** -0.5 self.to_queries = nn.Linear(dim_query, dim_query) self.to_keys_values = nn.Linear(dim_key_value, dim_key_value * 2) self.attend = nn.Softmax(dim=-1) self.dropout = nn.Dropout(dropout) def forward(self, query, key_value): q = self.to_queries(query).view(query.shape[0], -1, self.num_heads, self.head_dim).transpose(1, 2) k, v = self.to_keys_values(key_value).chunk(2, dim=-1) k = k.view(k.shape[0], -1, self.num_heads, self.head_dim).transpose(1, 2) v = v.view(v.shape[0], -1, self.num_heads, self.head_dim).transpose(1, 2) dots = torch.matmul(q, k.transpose(-1, -2)) * self.scale attn = self.attend(dots) attn = self.dropout(attn) out = torch.matmul(attn, v) out = out.transpose(1, 2).contiguous().view(out.shape[0], -1, self.num_heads * self.head_dim) return out ``` 此模块接受 `query` 和 `key_value` 序列作为输入,并返回经过 cross attention 处理后的输出张量。 --- ### 应用场景 Cross attention 广泛用于多种多模态融合任务以及复杂序列建模问题,主要包括以下几个方面: #### 1. 图像与文本联合建模 在视觉问答 (Visual Question Answering, VQA) 或图像描述生成 (Image Caption Generation) 中,cross attention 将来自 CNN 提取的图像特征视为键值对,而将 LSTM 或 Transformer 编码器产生的文本嵌入当作查询。这样可以让模型动态调整哪些区域的信息对于当前单词预测更重要[^3]。 #### 2. 神经机器翻译 当构建双语平行语料库上的 seq2seq 架构时,解码阶段会利用 encoder 隐藏状态充当 keys/values 来指导 decoder 更好地生成目标语言句子[^4]。 #### 3. 时间序列分析 例如金融预测、天气预报等领域内的多元时间序列数据处理也可以借助 cross attention 方法挖掘变量间潜在依赖模式。 #### 4. 自然语言理解中的对比学习 通过引入外部知识源(如常识数据库),采用 cross attention 结合主句表示形式进行细粒度匹配评估,有助于提升下游 NLU 性能表现。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值