Attention Mechanism
注意力机制通过查询、键和值,按相关性为输入特征分配权重。本文介绍相关数学原理、注意力类型,以及注意力与卷积的比较。
注意力机制是一种神经网络运算,它将每个输出构建为输入特征的加权平均值;权重根据每个输入与当前处理元素的相关性计算得出。相关性通过比较查询向量与键向量来评分,得到的分数用于加权对应的值向量。注意力于 2014 年首次提出,用于机器翻译,让循环神经网络 (RNN)解码器能够回看每个源语言词语,而不必将整句话压缩成一个定长向量。2017 年的 Transformer以注意力机制构建了完整架构;如今,注意力已成为大语言模型、视觉 Transformer和许多物体检测模型的核心运算。
注意力的工作原理#
注意力机制使用输入的三个可学习线性投影。查询 (Q) 表示当前 token要寻找什么,每个键 (K) 表示一个 token 能提供什么,而每个值 (V) 则携带要传递的内容。模型将查询与每个键进行比较,把比较分数转换为权重,然后返回值的加权和。翻译模型将「The black cat」译为「noir」时,该步骤的查询对「black」对应的键给出的分数最高,尽管法语中形容词位于名词之后。
多头注意力并行执行多组这类运算,每组使用各自的低维投影,然后将结果拼接起来。这样,不同的头就能在同一层中专门处理不同的关系。
缩放点积注意力#
Transformer 的注意力机制写作 Attention(Q, K, V) = softmax(QKᵀ / √d_k) V。每个查询都通过点积与每个键进行比较,所得分数再除以键维度 d_k 的平方根,避免分数随着向量大小增长而使 softmax饱和。Softmax 将每个查询的分数转换为总和为 1 的权重,输出则是值向量的加权和。
import torch
import torch.nn.functional as F
torch.manual_seed(0)
# 长度为 4 个 token 的序列,其查询、键和值均为 8 维
q, k, v = torch.randn(3, 4, 8).unbind(0)
# 计算每个查询与每个键的分数,除以 sqrt(d_k) 进行缩放,再用 softmax 对每行归一化
weights = (q @ k.T / k.shape[-1] ** 0.5).softmax(dim=-1)
# 每个输出 token 都是值向量的加权平均值
output = weights @ v
print("Attention weights of token 0:", [round(w, 3) for w in weights[0].tolist()])
print("Matches PyTorch SDPA:", torch.allclose(output, F.scaled_dot_product_attention(q, k, v), atol=1e-6))它会打印 [0.121, 0.741, 0.106, 0.032] 和 True:token 0 的输出有 74% 来自 token 1 的值向量,它的四个权重总和为 1;手动计算结果与 PyTorch融合的 scaled_dot_product_attention一致;在受支持的 GPU上,该实现会调用 FlashAttention等高效内核。
注意力的类型#
- 自注意力:查询、键和值都来自同一序列,因此每个 token 都能从其他所有 token 中获取上下文。这是 Transformer 编码器和 ViT 中使用的注意力机制。
- 交叉注意力:查询来自一个序列,键和值则来自另一个序列。翻译解码器会关注源句子,文本生成图像的扩散模型会关注提示词,而 DETR解码器中的物体查询则会关注图像特征。
- 因果注意力:掩码会阻止每个 token 关注后续 token,因此语言模型从左向右生成文本;较早 token 的键和值则可以存储在 KV 缓存中。
- 高效注意力:稀疏注意力、滑动窗口注意力和线性注意力可以降低逐一比较所有 token 所带来的二次方计算成本;可变形注意力则只在每个参考位置周围采样少量可学习点。
- CNN中的通道注意力:压缩与激励网络利用特征图的全局平均值重新调整各通道的权重。这种计算开销很低的注意力机制,构成了 ILSVRC 2017 分类赛冠军方案的基础。
注意力与卷积#
卷积会在每个位置应用相同的小滤波器,因此每个输出都只看到固定的局部窗口,其权重也不会随图像内容变化。注意力则根据内容计算权重,并能在单层中连接任意两个位置。代价是其计算成本会随 token 数量的平方增长。对于步幅为 32 的 640×640 图像,会得到一个包含 400 个 token 的 20×20 网格和 160,000 对查询—键;同一图像的步幅为 8 的网格包含 6,400 个 token,查询—键对将接近 4,100 万。YOLO26会据此安排注意力模块:位于主干网络末尾的 C2PSA 模块,以及颈部中一个启用注意力的 C3k2 模块,都会在 20×20、步幅为 32 的特征图上运行多头自注意力;所有分辨率更高的层则继续使用卷积。










