前面聊 NLP 演进时说过,Transformer 取代 RNN 靠的是注意力机制。但”注意力”三个字到底在计算什么?本文把 Q/K/V、缩放点积、多头与位置编码四层一次讲透,读完能手推一遍注意力的完整计算。

为什么需要注意力

RNN 处理序列必须逐步传递隐藏状态,长句开头的信息传到句尾已衰减殆尽(长距离依赖问题),且串行计算无法并行。注意力换了一个思路:让每个位置直接”看向”序列中所有位置,按相关性加权取信息——距离不再是问题,一步直达。

Q/K/V:注意力的三要素

每个 token 的表示被线性变换成三个向量:

  • Query(查询):我正在找什么信息
  • Key(键):我能提供什么信息的”标签”
  • Value(值):我实际携带的信息内容

类比检索:Query 是你的搜索词,Key 是文档的标题摘要,Value 是文档正文。注意力就是用搜索词和所有标题匹配,按匹配度加权阅读正文。

缩放点积注意力的计算流

Attention(Q, K, V) = softmax(Q K^T / √d_k) V

四步拆解:

  1. 打分:Q 与每个 K 做点积,得相关性分数矩阵(n×n)
  2. 缩放:除以 √d_k——维度高时点积值方差大,softmax 会进入梯度极小的饱和区,缩放把分数拉回合理范围
  3. 归一化:softmax 按行转成权重(和为 1,可解释为”注意力分配比例”)
  4. 加权求和:权重乘 V 矩阵,每个位置得到”融合了全序列相关信息”的新表示

多头注意力:多个子空间并行

单头注意力只有一种”匹配视角”。多头把 Q/K/V 切成 h 份(如 8 头),每头独立做注意力再拼接:

  • 不同头可以学到不同关系:有的头关注语法依赖(主谓),有的头关注位置邻近,有的头关注指代共现
  • 类比 CNN 的多通道:每通道提取不同特征

头数×头维度=模型维度,计算量与单头全维基本持平,表达力却成倍增加。

位置编码:补上被注意力丢掉的顺序

点积注意力本身对位置无序(打乱 token 顺序,注意力结果只是相应打乱)。Transformer 用位置编码(正弦函数族或可学习向量)加到输入嵌入上,让每个位置带上”序号签名”,顺序信息由此进入计算。

复杂度与代价

模型 单步计算 序列内路径长
RNN O(n) 串行 O(n)
自注意力 O(n²·d) 并行 O(1)

注意力用 O(n²) 的内存与计算换了并行性和短路径——序列短时无敌,序列超长时 n² 成为瓶颈(这正是后来稀疏注意力、线性注意力、KV cache 等优化的出发点)。

与大模型的连接

GPT 类模型 = 多层”掩码自注意力 + 前馈网络”堆叠:掩码保证生成时只能看到前文(因果性);KV cache 缓存历史 K/V 避免重复计算;层数越深,注意力的组合视角越丰富。理解了一层注意力,就理解了大模型每一层在做的事——其余都是工程优化。