0. 最小心智模型: Attention = 两次矩阵乘
-
打分(谁看谁)
S=QKT
-
加权求和(读出内容)
O=softmax(S)V
1. Anchor 1: Q / K / V 的形状(只记这一组)
对 单个 batch, 单个 head:
- Q∈RN×d
- K∈RN×d
- V∈RN×d
含义:
- N: 序列长度(token 数)
- d: 每个 head 的维度(head_dim)
口诀: Q/K/V 都是"每个 token 一行, 每行一个 d 维向量";
2. Anchor 2: 为什么注意力矩阵是 N×N
- KT∈Rd×N
- S=QKT∈RN×N
直觉:
- N 个 query × N 个 key → 一张 N×N 的"匹配分数表";
口诀: N 个 query 看 N 个 key → 一张 N×N 表;
3. Anchor 3: 为什么输出还是 N×d
设 P=softmax(S), 则:
- P∈RN×N(按行 softmax)
- O=PV∈RN×d
直觉:
- 每个 query 输出一个 d 维向量(不改变向量维度, 只是混合 token);
口诀: 注意力"混合 token", 不改变每个 token 的向量维度;
4. 防忘公式: 写成下标版, 永远不会错
4.1 打分(标量)
Sij=⟨Qi, Kj⟩
- Qi: 第 i 个 token 的 query(长度 d)
- Kj: 第 j 个 token 的 key(长度 d)
- 点积是标量 ⇒ Sij 是标量
i/j 各跑 N ⇒ S 是 N×N
4.2 输出(向量)
Oi=∑j=1Nsoftmax(Si:)j⋅Vj
- Vj 是 d 维向量
- 加权和仍是 d 维向量 ⇒ Oi 是 d 维
所有 i 组成 O∈RN×d
5. Multi-Head Attention(最不容易乱的记法)
一句话: 多头 = 多套 Q/K/V 并行算, 最后把 head 的 d 拼回去;
常见形状(单 batch):
- 输入 hidden: X∈RN×Dmodel
- 三个投影:
- Q=XWQ
- K=XWK
- V=XWV
其中:
- WQ,WK,WV∈RDmodel×(H⋅d)
所以:
- Q,K,V∈RN×(H⋅d)
reshape 后(两种写法等价, 只是布局不同):
- Q∈RH×N×d 或 Q∈RN×H×d
- 同理 K,V
每个 head h 独立:
- Sh∈RN×N
- Oh∈RN×d
拼接回去:
- O∈RN×(H⋅d)
最后输出投影回模型维度(常见):
- Ofinal=OWO, WO∈R(H⋅d)×Dmodel
关键等式:
Dmodel=H⋅d
6. 30 秒自检法(不靠记忆, 靠推理)
当你写出 attention 公式后, 检查两条就够:
- QKT 的"内维"必须一致(都是 d)
- 输出形状必须是 N×d(或多头拼接后的 N×Dmodel)
7. 类比记忆: Attention = 数据库检索
- Q: 查询(query)
- K: 索引(key)
- V: 内容(value)
流程:
- QKT: 算"查询对每个 key 的匹配分数"
- softmax: 把分数变成概率/权重
- 乘 V: 按权重把内容加权读出来
8. 一行速记卡片(随手贴)
- Q/K/V: N×d
- Scores: S=QKT⇒N×N
- Weights: P=softmax(S)⇒N×N(按行)
- Output: O=PV⇒N×d
- Multi-head: Dmodel=H⋅d, 每个 head 都是同一套