先记住一句话
Query 与 Key 决定“从哪里取多少信息”,Value 决定“实际取什么”。Self-attention 的 Q/K/V 来自同一组 hidden states;cross-attention 的 Q 来自当前序列,K/V 来自另一组上下文。
0. 一眼看清共同计算顺序
| Query 从哪里来 | Key / Value 从哪里来 | Score matrix 形状 | |
|---|---|---|---|
| Self-attention | 当前序列 $X$ | 同一个当前序列 $X$ | $n\times n$ |
| Cross-attention | 当前序列 $X_q$ | 外部上下文 $X_c$ | $n_q\times n_c$ |
两者后面的点积、缩放、mask、softmax 和 Value 加权完全相同,区别只在信息从哪里来。Self-attention 也不意味着 $Q=K=V$;它们共享原始来源 $X$,但通常经过三套不同的投影矩阵。
1. Self-attention:一组 hidden states 怎样互相读取
Self-attention 中,每一行既会产生 query,也会产生供其他位置读取的 key 和 value。假设三个 token 为 A、B、C,模型宽度 $d=2$:
例 1:从 X 线性投影出 Q、K、V
例如 C 的 hidden state 是 $[1,1]$:
$q_C=[1,1]W_Q=[1,1]$
$k_C=[1,1]W_K=[1,2]$
$v_C=[1,1]W_V=[2,2]$
全部结果:
同一个输入变成三种角色:拿什么去问、别人如何匹配它、匹配后实际发送什么。
2. 单个 self-attention Query 怎样完成计算?
只计算 token C 的输出。$q_C=[1,1]$ 分别与三个 key 点积:
例 2:score → scale → softmax → 加权 Value
scores:$[1,1]\cdot[1,1]=2$,与 $[0,1]$ 得 1,与 $[1,2]$ 得 3,所以为 $[2,1,3]$。
$d_k=2$,缩放后 $[2,1,3]/\sqrt2\approx[1.414,0.707,2.121]$。
指数约 $[4.113,2.028,8.340]$,总和 $14.481$。
softmax 权重 $a_C\approx[0.284,0.140,0.576]$。
第一维:$0.284+0.140+1.152=1.576$;第二维:$0+0.280+1.152=1.432$。
为什么除以 $\sqrt{d_k}$?
若 Q、K 每维独立、均值 0、方差 1,那么点积是 $d_k$ 项之和,方差约为 $d_k$。除以 $\sqrt{d_k}$ 后方差回到约 1,避免 softmax 过早饱和。
例 3:缩放如何保留梯度
logits 为 $[8,0]$ 时,softmax 第一项约 $0.9997$;若 $d_k=64$,除以 8 后变成 $[1,0]$,概率约 $0.731$。
二分类 softmax 的局部斜率 $p(1-p)$:前者约 $0.0003$,后者约 $0.197$。缩放让初始梯度健康得多。
3. Self-attention 一次算完整个 $QK^\top$
所有 query 对所有 key 的点积写成一次矩阵乘法:
| query ↓ / key → | A | B | C |
|---|---|---|---|
| A | 1 | 0 | 1 |
| B | 1 | 1 | 2 |
| C | 2 | 1 | 3 |
行是“谁在问”,列是“它在读谁”。矩阵有 $n^2$ 个元素,这是标准 attention 长序列成本的来源。
4. Cross-attention:用一组 token 读取另一组 token
Cross-attention 中,query 与 key/value 的来源不同。经典 encoder-decoder 模型里,decoder hidden states 产生 Q,encoder outputs 产生 K/V;在 VLM 或机器人模型里,也可以让语言、动作或 learned query 去读取视觉特征。
例 4A:一个动作 query 读取三个视觉 token
假设动作 query 投影后为 $q=[1,1]$。图像编码器给出三个视觉 token 的 key 和 value:
| 视觉 token | Key | Value | $q\cdot k$ |
|---|---|---|---|
| 红色方块 | [1, 0] | [2, 0] | 1 |
| 蓝色碗 | [0, 1] | [0, 4] | 1 |
| 方块与碗的空间关系 | [1, 1] | [1, 1] | 2 |
原始 scores:$[1,1,2]$。
$d_k=2$,缩放后:$[0.707,0.707,1.414]$。
指数值约为:$[2.028,2.028,4.113]$,总和为 $8.169$。
Softmax 权重约为:$[0.248,0.248,0.503]$。
这个输出仍然属于动作 query 的位置,但内容混入了视觉上下文。若有 8 个动作 queries 和 196 个视觉 tokens,score matrix 的形状就是 $8\times196$,而不是 self-attention 的 $196\times196$。
Decoder self-attention
当前生成位置读取 decoder 自己已经允许看到的 token;自回归时通常使用 causal mask。
Encoder-decoder cross-attention
decoder query 读取 encoder memory;通常不需要因果遮住 encoder 内容,但仍可能使用 padding 或有效区域 mask。
一个 encoder–decoder layer 的实际计算顺序
例 4B:训练时输入为什么要右移
| 位置 | 0 | 1 | 2 | 3 |
|---|---|---|---|---|
| Decoder 输入 | <BOS> | I | love | robot |
| 正确标签 | I | love | robot | <EOS> |
位置 2 只能用 <BOS>, I, love 形成自己的 decoder state,然后通过 cross-attention 读取完整 encoder memory,预测 robot。右移负责把答案放到下一格;causal mask 负责阻止当前格沿 self-attention 偷看右侧答案。
一种模型会保留独立视觉编码器,再用 cross-attention 融合;另一种会先把图像、文字、动作 token 拼成一个序列,再使用带特定 mask 的 self-attention。两者都能交换跨模态信息,但连接方式、计算形状与缓存策略不同。
5. Mask 为什么必须在 softmax 前?
Causal 不是一种新的神经网络层,而是加在 self-attention score matrix 上的可见性约束。先照常计算所有 query 与 key 的分数,再把未来位置加上 $-\infty$,最后逐行做 softmax:
第 $i$ 行代表位置 $i$ 发出的 query;它只能读取列号 $j\le i$ 的 key。被加上 $-\infty$ 的位置经过指数运算后变成 0,因此未来 token 对输出的贡献严格为 0。
例 5:B 不能偷看 C
B 行是 $[1,1,2]$,causal mask 后为 $[1,1,-\infty]$。除以 $\sqrt2$ 后前两项相同,softmax 是 $[0.5,0.5,0]$。
若 softmax 后才遮住第三项,剩余权重通常不再和为 1。
训练:整句并行
整条右移序列一次进入 decoder,所有位置的 Q/K/V 和 logits 可以用矩阵乘法同时算出;三角 mask 保证每一行虽然同时存在,却只能使用自己的过去。
推理:逐 token + KV cache
未来 token 尚不存在,只计算最新位置的 query。过去各层的 K/V 缓存在显存中,新 query 读取缓存并追加自己的 K/V,避免每一步重复计算整个前缀。
6. 互动:拖动 score,观察 softmax 与输出
7. Multi-head:并行的多套信息路由
若 $d_{model}=4$、$h=2$,每个 head 常取 $d_k=d_v=2$。两套投影各自计算,再拼接。
例 6:两个 head 如何拼回模型宽度
假设两个 head 输出 $o^{(1)}=[1.2,-0.4]$、$o^{(2)}=[0.5,2.0]$:
Concat:$[1.2,-0.4,0.5,2.0]$。
若 $W_O=I_4$,MHA 输出不变。
若 $W_O=0.5I_4$,输出为 $[0.6,-0.2,0.25,1.0]$。
每个 head 有独立投影,不是把相同结果重复计算。
8. Attention 之后:完整 pre-norm block
例 7:手算 residual、LayerNorm 与两层 MLP
某 token 输入 $x=[1,2]$,attention 输出 $a=[0.5,-0.5]$,残差后 $y=[1.5,1.5]$。另取 $y=[1,3]$ 演示 LayerNorm:均值 2、方差 1,忽略 $\epsilon$ 且 $\gamma=1,\beta=0$:
若第一层产生 $[-1,2,1]$,ReLU 后为 $[0,2,1]$;第二层输出 $[1,0]$,最后 residual 得 $[1,3]+[1,0]=[2,3]$。
9. 位置信息与计算代价
没有位置机制的 self-attention 不区分排列。原始 Transformer 加正弦位置编码;RoPE 按位置旋转 Q/K,使点积带相对位置信息。
例 8:长度翻倍,score matrix 增长四倍
$n=1{,}024$ 时每 head 有 $1{,}024^2=1{,}048{,}576$ 个 score;$n=2{,}048$ 时有 $4{,}194{,}304$ 个,恰好 4 倍。若每项 fp16 占 2 bytes,一张显式矩阵约从 2 MiB 增至 8 MiB。
高 attention weight 不自动等于“这个 token 对答案最重要”,更不是因果解释。它只是某一层、某一 head、某一 query 的路由系数;后续 residual、MLP 与其他层还会继续改变信息。
自测:先算后展开
1. $q=[1,2]$,keys 为 $[1,0]$、$[0,1]$,scores 是多少?
$[1,2]$。
2. scores 为 $[0,0]$、Values 为 $[2,0]$ 和 $[0,4]$,输出是什么?
权重 $[0.5,0.5]$,输出 $[1,2]$。
3. Self-attention 与 cross-attention 的核心区别是什么?
Self-attention 的 Q、K、V 都投影自同一组 hidden states;cross-attention 的 Q 来自当前序列,K、V 来自另一组上下文。后续 score、softmax 和 Value 加权算法相同。
4. 8 个动作 queries 读取 196 个视觉 tokens,score matrix 是什么形状?
$Q$ 为 $8\times d_k$,$K^\top$ 为 $d_k\times196$,所以 score matrix 为 $8\times196$。
5. 为什么 self-attention 中 Q、K、V 不一定相等?
它们虽然都来自同一个 $X$,但分别乘以可训练的 $W_Q$、$W_K$、$W_V$,承担匹配问题、匹配索引和被搬运内容三种角色。
6. 长度为 4 的 causal attention 中,位置 2 能读取哪些位置?
能读取位置 0、1、2,不能读取位置 3。对应 mask 行为 $[0,0,0,-\infty]$,softmax 后最后一项权重为 0。
7. 为什么训练能并行,而推理仍要逐 token?
训练时整条正确序列已知,可一次计算所有位置,再用 causal mask 防止信息泄漏;推理时下一个 token 尚未产生,下一轮输入依赖本轮选择结果,只能依次生成。KV cache 只能减少重复计算,不能消除这个依赖。
8. Attention 与 MLP 分别负责什么?
Attention 跨 token 路由;MLP 在每个 token 内变换通道。
9. $d_{model}=768$、12 heads,每头维度和缩放因子?
$768/12=64$,缩放因子 $\sqrt{64}=8$。
原始资料
Attention Is All You Need;RoFormer / RoPE。下一篇比较 attention mask 与网络拓扑怎样产生 BERT、GPT、T5。