先记住一句话

Query 与 Key 决定“从哪里取多少信息”,Value 决定“实际取什么”。Self-attention 的 Q/K/V 来自同一组 hidden states;cross-attention 的 Q 来自当前序列,K/V 来自另一组上下文。

Query 来源+Context 来源Q / K / VQKᵀ / √dMask + Softmax加权 VResidual + MLP

0. 一眼看清共同计算顺序

① 输入$X\in\mathbb R^{n\times d}$
② 三次投影$Q,K,V$
③ 两两匹配$QK^\top/\sqrt{d_k}$
④ 归一化mask → softmax
⑤ 搬运内容$AV$
⑥ 完整 blockresidual → MLP
Attention score 只决定路由权重;真正进入输出的是 Value。softmax 与乘 V 的顺序不能对调。
Query 从哪里来Key / Value 从哪里来Score matrix 形状
Self-attention当前序列 $X$同一个当前序列 $X$$n\times n$
Cross-attention当前序列 $X_q$外部上下文 $X_c$$n_q\times n_c$
$$\text{Self: }Q=XW_Q,\ K=XW_K,\ V=XW_V$$
$$\text{Cross: }Q=X_qW_Q,\ K=X_cW_K,\ V=X_cW_V$$

两者后面的点积、缩放、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

$$X=\begin{bmatrix}1&0\\0&1\\1&1\end{bmatrix},\ W_Q=\begin{bmatrix}1&0\\0&1\end{bmatrix},\ W_K=\begin{bmatrix}1&1\\0&1\end{bmatrix},\ W_V=\begin{bmatrix}1&0\\1&2\end{bmatrix}$$

例如 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]$

全部结果:

$$Q=\begin{bmatrix}1&0\\0&1\\1&1\end{bmatrix},\quad K=\begin{bmatrix}1&1\\0&1\\1&2\end{bmatrix},\quad V=\begin{bmatrix}1&0\\1&2\\2&2\end{bmatrix}$$

同一个输入变成三种角色:拿什么去问、别人如何匹配它、匹配后实际发送什么。

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]$。

$$o_C=0.284[1,0]+0.140[1,2]+0.576[2,2]=[1.576,1.432]$$

第一维:$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 的点积写成一次矩阵乘法:

$$QK^\top=\begin{bmatrix}1&0&1\\1&1&2\\2&1&3\end{bmatrix}$$
query ↓ / key →ABC
A101
B112
C213

行是“谁在问”,列是“它在读谁”。矩阵有 $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 去读取视觉特征。

当前解码/动作状态$X_q$ → Q
提出问题我要读取什么?
图像/编码器上下文$X_c$ → K, V
返回结果上下文加权和
输出行数跟 query 数量 $n_q$ 相同;每个 query 都从 $n_c$ 个上下文位置收集一份信息。

例 4A:一个动作 query 读取三个视觉 token

假设动作 query 投影后为 $q=[1,1]$。图像编码器给出三个视觉 token 的 key 和 value:

视觉 tokenKeyValue$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]$。

$$o\approx0.248[2,0]+0.248[0,4]+0.503[1,1]=[1.000,1.497]$$

这个输出仍然属于动作 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 的实际计算顺序

Encoder 输入源文本 / 图像 tokens
Encoder双向 self-attention
固定 memory$M$ 提供 K、V
Decoder 输入右移后的目标 tokens
子层 1causal self-attention
当前状态$H$ 提供 Q
融合输入Q 来自 $H$;K、V 来自 $M$
子层 2cross-attention
子层 3MLP + residual
输出下层 hidden states / logits
先在 decoder 内部整理“到目前为止生成了什么”,再拿这个状态作为 Query 去读取已经编码好的源信息。一个 decoder layer 通常按 masked self-attention → cross-attention → MLP 排列,每个子层外还有 normalization 与 residual。

例 4B:训练时输入为什么要右移

位置0123
Decoder 输入<BOS>Iloverobot
正确标签Iloverobot<EOS>

位置 2 只能用 <BOS>, I, love 形成自己的 decoder state,然后通过 cross-attention 读取完整 encoder memory,预测 robot。右移负责把答案放到下一格;causal mask 负责阻止当前格沿 self-attention 偷看右侧答案。

多模态不一定等于显式 cross-attention:

一种模型会保留独立视觉编码器,再用 cross-attention 融合;另一种会先把图像、文字、动作 token 拼成一个序列,再使用带特定 mask 的 self-attention。两者都能交换跨模态信息,但连接方式、计算形状与缓存策略不同。

5. Mask 为什么必须在 softmax 前?

Causal 不是一种新的神经网络层,而是加在 self-attention score matrix 上的可见性约束。先照常计算所有 query 与 key 的分数,再把未来位置加上 $-\infty$,最后逐行做 softmax:

$$S=QK^\top/\sqrt{d_k},\qquad A=\operatorname{softmax}(S+M_{\text{causal}})$$
$$M_{\text{causal}}=\begin{bmatrix}0&-\infty&-\infty&-\infty\\0&0&-\infty&-\infty\\0&0&0&-\infty\\0&0&0&0\end{bmatrix}$$

第 $i$ 行代表位置 $i$ 发出的 query;它只能读取列号 $j\le i$ 的 key。被加上 $-\infty$ 的位置经过指数运算后变成 0,因此未来 token 对输出的贡献严格为 0。

上三角被屏蔽。Padding mask 则屏蔽补齐位置,两种 mask 可以叠加。

例 5:B 不能偷看 C

B 行是 $[1,1,2]$,causal mask 后为 $[1,1,-\infty]$。除以 $\sqrt2$ 后前两项相同,softmax 是 $[0.5,0.5,0]$。

$$o_B=0.5v_A+0.5v_B=0.5[1,0]+0.5[1,2]=[1,1]$$

若 softmax 后才遮住第三项,剩余权重通常不再和为 1。

训练:整句并行

整条右移序列一次进入 decoder,所有位置的 Q/K/V 和 logits 可以用矩阵乘法同时算出;三角 mask 保证每一行虽然同时存在,却只能使用自己的过去。

推理:逐 token + KV cache

未来 token 尚不存在,只计算最新位置的 query。过去各层的 K/V 缓存在显存中,新 query 读取缓存并追加自己的 K/V,避免每一步重复计算整个前缀。

6. 互动:拖动 score,观察 softmax 与输出

2.0

另外两个 score 固定为 1 和 0;三个 Value 是 $[1,0]$、$[1,2]$、$[2,2]$。score 只改混合比例。

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

输入$x$
子层 1LN → MHA
残差 1$y=x+\mathrm{MHA}$
子层 2LN → MLP
残差 2$z=y+\mathrm{MLP}$
Attention 跨位置混合;MLP 在每个位置独立跨通道变换;Residual 提供恒等路径。

例 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$:

$$\operatorname{LN}([1,3])=[-1,1]$$

若第一层产生 $[-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 NeedRoFormer / RoPE。下一篇比较 attention mask 与网络拓扑怎样产生 BERT、GPT、T5。