Self-Attention 自注意力计算:Q、K、V 矩阵的数学本质
📂 所属阶段:第三阶段 — Transformer 革命(核心篇)
🔗 前置关联:Seq2Seq 标准注意力入门 · 词嵌入与位置编码基础
🧱 后续模块:多头注意力 Multi-Head Attention · Transformer 编码器-解码器
1. 入门:Self-Attention 和标准 Seq2Seq 注意力,究竟差在哪?
注意力机制的核心思想就三个字——「挑重点」。无论是读书、看图片还是处理序列,我们都希望模型能把“目光”放在最关键的地方。但同样是“挑重点”,Self-Attention 和经典 Seq2Seq 中的注意力,选材范围完全不同。
1.1 一张表看懂两种注意力
一句话总结:标准注意力是「解码器看编码器」,Self-Attention 是「序列自己看自己」。
🧠 小思考:正是因为 Self-Attention 完全工作在同一个序列上,所以 Transformer 的编码器可以并行计算所有词的更新,而 RNN 必须一步接一步,这是性能革命的关键。
2. 核心:Q、K、V 矩阵的物理意义与完整计算
Self-Attention 的核心工具是三个可以学习的投影矩阵:W_q、W_k、W_v。它们就像三副不同的“眼镜”,让同一个词向量去扮演三种不同的角色。
2.1 给 Q/K/V 一个“人话”版本的比喻
假设你有一堆待整理的便签,每张便签代表一个词(向量 x),你的任务是给每张便签写一个更丰富、更有上下文信息的新版本。
- 🕵️ Query(Q): 我在便签上写:「我现在需要找什么样的信息?」
- 🏷️ Key(K): 我在便签上写:「我自己身上有哪些核心标签?」
- 📦 Value(V): 我在便签上写:「如果有人选中我,我能分享给他哪些具体内容?」
整个 Self-Attention 的运行流程就像一场“全员匹配大会”:
- 给所有便签都写上 Q、K、V(通过
W_q、W_k、W_v投影得到)。 - 对于便签 A,拿着它的 Q 去和所有便签的 K 做「相似度匹配」(点积),得到匹配分数。
- 把分数平滑一下,再转换成 0~1 之间的权重(加起来等于 1)。
- 用这些权重去加权所有便签的 V,得到便签 A 的全新表示。
于是,每个词都带着整个序列的“集体智慧”重新出炉了。
2.2 纯 PyTorch 实现单头 Self-Attention
下面的代码完整实现了单头 Self-Attention,每一处关键计算都标注了张量维度的变化——对于理解 Transformer,维度就是生命线。
💡 看不懂维度?没关系,记住一条法则:
Q和K点积产生 (seq_len × seq_len) 的“关系矩阵”,每一行代表该词对所有词的关注分数。- 归一化后变成权重,再乘上
V,得到融合了全局信息的新表示。
3. 进阶:多头注意力(Multi-Head Attention)
单头 Self-Attention 已经能解决很多问题,但它一次只能学会一种“关注模式”。就像你闭上一只眼睛看世界,能感知距离,但看不清立体深度。
3.1 为什么要多个头?
多头注意力相当于同时戴上好几副不同的眼镜,每副眼镜关注不同的语言特征:
- 🧐 头1:负责捕捉语法关系(主语-谓语搭配)
- 🧐 头2:负责捕捉语义关系(猫-喵喵叫)
- 🧐 头3:负责捕捉指代关系(it → animal)
- 🧐 头4:负责捕捉长程依赖(因为……所以……)
每个注意力头都有自己独立的一套投影矩阵(W_q、W_k、W_v),因此可以通过训练学到完全不同的匹配规则。最后,把所有头的输出拼接起来,再做一次线性变换,就得到了语义更丰富的词表示。
3.2 纯 PyTorch 实现多头注意力
下面是一个可以直接使用的多注意力模块。为了通用性,我们支持 Q、K、V 来自不同输入(编码器-解码器注意力),也支持它们全部来自同一个输入(Self-Attention)。
✅ 使用方法建议:
- 在构建 Transformer 层时,
MultiHeadAttention就是核心积木。 - PyTorch 官方也有现成的
torch.nn.MultiheadAttention,但其输入维度顺序是 (seq_len, batch, embed_dim),与我们的习惯 (batch, seq_len, embed_dim) 不同,使用时记得加batch_first=True。
4. 小结:一图流 + 两大优势
4.1 单头 Self-Attention 极简流程
这个过程每计算一次,序列中的每一个词就和所有词“交流”了一遍。
4.2 Self-Attention 为什么这么强?
-
长距离依赖一步到位
序列中任意两个词,无论相距多远,它们的交互路径长度都是 1。相比之下,RNN 需要 O(n) 步,CNN 需要 O(log n) 步。对于“开头主语、结尾谓语”这种依赖,Self-Attention 直接捕获。 -
完全并行,GPU 友好
所有词的 Q/K/V 投影、相似度计算、权重归一化,都可以一大块张量直接扔进 GPU 并行算完。这是 Transformer 训练速度快、能轻松扩展到大模型的关键。
🔗 优质扩展阅读
- The Illustrated Transformer(图解 Transformer,新手必看)
- PyTorch 官方 MultiheadAttention 文档(注意默认的维度顺序)
- Attention Is All You Need(Transformer 原始论文)
📘 掌握了 Q/K/V 和多头注意力,下一步就是搭建一个完整的 Transformer 编码器,敬请期待!

