Self-Attention 自注意力计算:Q、K、V 矩阵的数学本质
📂 所属阶段:第三阶段 — Transformer 革命(核心篇)
🔗 前置关联:Seq2Seq 标准注意力入门 · 词嵌入与位置编码基础
🧱 后续模块:多头注意力 Multi-Head Attention · Transformer 编码器-解码器
1. 入门:Self-Attention vs 标准Seq2Seq Attention
注意力机制的核心目标是「选择性聚焦」——从一堆信息里挑出当前任务需要的重点,但Self-Attention和Seq2Seq的注意力,聚焦的来源/范围完全不一样:
1.1 差异对比表
2. 核心:Q、K、V 矩阵的物理意义与计算
要实现「每个词都看遍全序列再更新自己」,核心工具就是三个独立训练的投影矩阵:W_q、W_k、W_v。
2.1 Q/K/V的「人话」类比
假设你正在整理一堆杂乱的便签(每个便签是一个输入词的嵌入向量x),要给每个便签重新写更有信息量的版本:
- W_q投影得到Query(Q):便签上写「我现在需要找什么样的内容?」
- W_k投影得到Key(K):便签上写「我自己有哪些核心标签?」
- W_v投影得到Value(V):便签上写「如果别人需要我,我能分享什么具体信息?」
Self-Attention的流程就是:
- 给所有便签都写上Q/K/V
- 对每一张便签A,拿它的Q去和所有便签的K做「相似度匹配」,得到匹配分数
- 给分数加个“平滑处理”,再转成0-1之间的权重(权重加起来是1)
- 用权重去加权所有便签的V,得到便签A的「新版信息量表示」
2.2 纯PyTorch实现单头Self-Attention
代码里补全了缺失的F导入,调整了注释的对齐和可读性,加入了关键步骤的维度说明(代码的维度是技术博客的灵魂!):
3. 进阶:Multi-Head Attention(多头注意力)
单头Self-Attention虽然能解决指代、关联的问题,但表达能力有限——只能学习一种「关注模式」。
3.1 为什么要做多头?
想象你只靠一只眼睛看世界,只能捕捉到「平面的距离信息」;如果是两只眼睛(两个头),就能捕捉「立体的深度」;如果是八只眼睛(NLP常用的8头),甚至能同时关注:
- 语法关系(比如“主语-谓语”的搭配)
- 语义关系(比如“猫-喵喵叫”的常识)
- 指代关系(比如前面的“it”指“animal”)
- 上下文窗口(比如“因为-所以”的因果对)
每个头的W_q、W_k、W_v都是独立初始化、独立训练的,所以能学到完全不同的「匹配规则」,最后再把所有头的输出「拼起来」,就能得到更丰富的词表示。
3.2 PyTorch实现多头注意力
同样补全了维度注释,优化了变量命名的一致性,还调整了多头合并的顺序逻辑:
4. 小结
4.1 单头Self-Attention的极简流程
4.2 Self-Attention的两个核心优势
- 全局关联直接建立:序列中任意两个位置的词,路径长度都是1(RNN是n,CNN是log n),完美解决长距离依赖问题
- 完全并行化计算:所有词的Q/K/V投影、相似度计算、权重归一化,可以同时在GPU上完成,训练速度远快于RNN
🔗 优质扩展阅读

