为什么需要注意力
循环神经网络用一个固定维度的隐状态压缩整段历史,这在长序列上必然丢失信息。注意力机制的核心洞见是:与其压缩,不如在每一步都动态地回看全部输入,让模型自己决定关注哪里。
注意力不是一个技巧,而是把「检索」这个操作变得可微分。
——本文的核心论点
Query、Key、Value 的直觉
把每个 token 投影成三个向量:Query 是「我在找什么」,Key 是「我能提供什么」,Value 是「我实际携带的信息」。相似度由 Query 与 Key 的点积衡量,经过 softmax 归一化后,对 Value 做加权求和。
import torch
import torch.nn.functional as F
def attention(q, k, v):
d_k = q.size(-1)
scores = q @ k.transpose(-2, -1) / d_k ** 0.5
weights = F.softmax(scores, dim=-1)
return weights @ v
多头:并行的多个视角
单个注意力头只能捕捉一种关系模式。多头注意力把表示切分成若干子空间,让每个头学习不同的关注方式——有的关注语法邻接,有的关注长距离指代——再拼接回来。
- 头数越多,单头维度越小,计算成本基本不变。
- 实践中 8–16 个头是常见甜点区间。
- 可视化注意力图能帮助定位模型的失败模式。
工程要点与延伸
KV Cache、FlashAttention、旋转位置编码是把注意力推向生产的三块关键拼图。理解了第一性原理后,这些优化都会显得顺理成章。