找到该关注谁之后,取回来的是什么?
本课一问:找到该关注谁之后,取回来的是什么?
这一课先不碰:位置怎么影响这一步(第 6 课);好几套 Q/K/V(第 7 课)。
从已有出发
加了因果掩码之后,「给了」这一行的权重是:小明 39.4%、把 2.2%、苹果 56.5%、自己 1.9%(教学世界现算,第 4 课的矩阵里可以核对)。权重告诉我们「从谁那里取、各取多少」。现在要决定:从每个 token 那里取的「东西」是什么向量?取回来之后按权重加权求和,就是「给了」的新表示。
先自己设计:直接取回 K
每个 token 已经有 K 了,打分时刚用过。省一个矩阵,直接按权重把 K 加起来,不行吗?
检验方法:把句子里的「小明」和「小王」对调(「小王把苹果给了小明」,也是 C1 里用真 tokenizer 切过的句子)。意思完全变了——给东西的人换了。好的新表示应该跟着变。
- ① 朴素方案
- ② 它在哪失败
- ③ 改进方案
改进:单独的 V
V 是第三个投影 vj = xj·WV,专门负责「被选中后交出什么」。它和 K 分开训练:K 学的是「凭什么被找到」,可以把无关的差别压掉;V 学的是「交出什么内容」,要把有用的差别留着。上面对调测试里,两个人名的 V 余弦相似度只有 0.285,取回 V 时新表示差 0.639,是取回 K 的 7 倍多 证据等级 · 有理论动机 有数学或机制上的理由说明它可能有效,但没有证明它一定更好。最后是否采用,仍然要看实验。 本条把 K 与 V 分成两个投影是设计动机;本课的对调测试只在手工构造的教学向量上成立,说明「可能」而非「必然」 出处Vaswani et al. 2017 §3.2 ↗ 。
新表示 = Σj wj·vj:每一维都是可见 token 的那一维按权重加起来。权重都是正数、和为 1,所以这是一次加权平均——输出落在这些 V 围成的范围之内,注意力自己造不出新方向 证据等级 · 数学可证明 在写明的前提下可以严格推导出来,不依赖实验。只要前提成立,换数据、换规模仍然成立。 本条凸组合:w_j 不小于 0 且和为 1,输出在 V 的凸包内。新方向要靠后面的 W_O 与 FFN 出处待补 。它只负责搬运和混合;加工留给后面的输出投影 WO 和 FFN(C4)。
到这里,注意力的完整公式凑齐了。点每一项看它是什么、为什么在那:
锚点模型一个头里这一步的真实形状:
| 维度 | 含义 | 真实规模 | 小规模 |
|---|---|---|---|
| T | 序列长度(贯穿例句) | 5 | 5 |
| dh | 每头维数 head_dim | 256 | 4 |
试三件事:① 在「改进方案」一侧,把提问者换成「小王」(最后一个 token,能看全句),看它从谁那里取回最多;② 对比两侧的「两句话相差」:取回 K 差多少、取回 V 差多少;③ 在任一张表里挑一列,自己把「权重 × 那一列」加一遍,核对最后一行。
⚠ 常见误解
「注意力的输出就是被关注最多的那个 token 的 V。」不是。输出是全部可见 token 的 V 按权重的加权平均:「给了」取回的是 56.5% 的苹果 + 39.4% 的小明 + 一点点把和自己,混在一个向量里。没有「选中一个」这一步。
「V 就是原来的 embedding。」V 是 embedding(或上一层的输出)再乘一个 WV 的投影,和 Q、K 一样是学出来的。它可以丢掉一部分信息、强调另一部分,「交出去什么」本身也是被训练决定的。
注意力的演进,你在这里
① 训练时:一个 token 怎么从别的 token 那里取信息
- 解决了能读任意长的序列,参数与长度无关;手里只带一个固定大小的状态 h。卡在ht 要等 ht−1 算完:T = 4,096 时每层 4,096 步不能并行,第 1 个 token 的信息要经过 4,095 次更新才到最后;翻译时整句还得挤进一个定长向量——Bahdanau 2014 说的瓶颈。展开岔路 B1
- 解决了解码器每一步回头给源句的每个位置打分、加权取回,不再只靠那一个定长向量:score = vT·tanh(W1q + W2k)。卡在每一对都要单独过 tanh,交不给矩阵乘单元;朴素实现要先落一个 T×T×da 的中间张量:T = 4,096、da = 256 时单头单层 8.0 GiB(BF16),点积只留 T×T 个分数,32 MiB。它还长在 RNN 翻译模型里,串行没解决。展开第 2 课
- 解决了直接比 embedding 时「给了」最像的是它自己(余弦 1.000),小明、苹果、小王排在最后;投影成 Q、K 再点积,它自己排到最后、前三名是苹果、小王、小明,全部配对一次矩阵乘 QKT;取回用单独的 V——两个人名的 K 余弦 0.995,取回 K 分不清是谁。卡在不缩放:锚点每头 256 维,点积标准差 √256 = 16,同一行分差十几二十是常态(e20 ≈ 4.9 亿),softmax 几乎独占,梯度传不回 WQ、WK。
- 解决了softmax 把分数变成正的、和为 1 的权重,只看分差(按占比分,对话样本的 10、3、−4 会给「汽车」−44.4%);除以 √dk = 16,点积方差回到 1。卡在训练时整句一次喂进去:不加掩码,「给了」一行有 32.5% 的注意力直接落在它要预测的答案「小王」上,loss 低得虚假。展开第 3 课
- 解决了旋转后 q·k 只依赖距离 j − i;V 不参与打分,不转(转了会把绝对位置混进取回的内容)。锚点每头 256 维里只转 64 维。卡在旋转矩阵随位置变,夹在展开矩阵和缓存之间就没法事先并进 Q:MLA 因此把 RoPE 单独拆出 64 维另存(DeepSeek-V2 config,第 10 课)。
- 解决了标准 softmax 逼每行分完 100%:「苹果」一行 3 个分数只差零点几(0.04、0.36、0.00),照样分成 30% / 41% / 29%;分母加可学习的 sink logit,或在输出上乘门,这个头就能「这次不取」——锚点开着输出门(attn_output_gate = true)。卡在出口的效果只有实验证据:Gated Attention 原文说门控「缓解」sink,不是消除;DeepSeek-V4 没给 sink logit 的单独消融。展开岔路 B4
② 生成时:K、V 怎么越存越少
- 解决了缓存直接除以头数:锚点形状下每 token 16 KiB,262,144 上下文 4 GiB。卡在质量会掉、训练可能不稳:GQA 论文表 1(T5-XXL,七个任务平均)MHA 47.2 → MQA 46.6。展开第 9 课
- 解决了24 个 Q 头分 4 组、每组 6 个共用 1 个 KV 头(组数 = KV 头数):每 token 64 KiB、262,144 上下文 16 GiB;T5-XXL 上 GQA-8 平均 47.1、推理 0.28 s,质量接近 MHA(47.2、1.51 s),速度接近 MQA(0.24 s)。卡在再减 KV 头就回到 MQA:DeepSeek LLM 67B 已是 GQA-8,每 token 仍要 389,120 B(每头一份的 MHA 是 3,112,960 B),1M token 单条请求 380 GiB。展开第 9 课
- 解决了不存 K、V,每层每 token 只存 512 维潜向量 + 64 维 RoPE = 576 个数,用时再展开:DeepSeek-V2(60 层)每 token 69,120 B、V3(61 层)70,272 B;相对 67B 按 BF16 降 82.2%,官方「−93.3%」还含约 6 bit 的 KV 量化。卡在仍随长度线性增长,打分仍是 T²:GLM-5.3 同是 576 个数、78 层,每 token 89,856 B,原生 1,048,576 上下文时单条请求只算潜向量就要 87.75 GiB。展开第 10 课
- 解决了换掉「按长度存」本身:锚点 64 层里 48 层不存 KV,只存固定大小的状态(FP32 共 144 MiB),与上下文长度无关(这些层是什么、怎么更新,C11 第 4 课揭晓);DeepSeek-V4.1 叠加压缩、稀疏与低精度,官方报告全局 KV 890 B/token。卡在固定状态装不下任意多对键值,锚点仍留 16 层全注意力;稀疏注意力每步只读挑出来的一部分,挑本身也有代价——各自省了什么、没省什么,C11 讲。
证据三问
- 它解决什么问题?把「凭什么被找到」和「被找到后交出什么」拆开,让匹配可以忽略的差别、内容仍然保留。
- 数学上为什么可能有效?两套投影多了自由度,K 可以把对匹配无用的方向压掉而不损失内容 证据等级 · 有理论动机 有数学或机制上的理由说明它可能有效,但没有证明它一定更好。最后是否采用,仍然要看实验。 本条自由度论证,不是最优性证明;本课的对调测试是手工构造的例子 出处待补 ;输出是凸组合,这一点可证明 证据等级 · 数学可证明 在写明的前提下可以严格推导出来,不依赖实验。只要前提成立,换数据、换规模仍然成立。 本条w 非负且和为 1 出处待补 。
- 实验上呢?标准 Transformer 一直用独立的 V;但前沿里也有让 K、V 共用一个向量的做法(DeepSeek-V4,见下面的 Dig),说明「必须分开」不是定理,而是看实现细节与规模的取舍 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条报告写明 KV entries serve as both attention keys and values;这是它的设计选择,由它自己的实验支持 出处DeepSeek-V4 技术报告 §2.3.3 ↗ 。
一句话
QK 决定听谁的,V 决定听到什么。
下一个缺口
C2 讲 RoPE 时说过:它按位置旋转 Q 和 K,不碰 V。当时 Q、K、V 还是三个名字;现在它们都算过一遍了。为什么偏偏是 Q 和 K?旋转 V 会怎样?→ 第 6 课:回扣——RoPE 为什么偏偏旋转 Q 和 K,不旋转 V?
你可能会问
这一课还没有收到真实提问;你的提问会记到 05-问答记录/C3-L4.md。
🔍 取回 K 就一定不行吗?
在我们的教学向量里不行,因为 WK 被构造成把「是谁」压掉。真实模型里,如果 K 的维数足够大,一个向量可以同时装下「怎么被找到」和「交出什么」。DeepSeek-V4 的压缩注意力就让同一个 512 维向量既当 K 又当 V(报告 §2.3.3),省下一半缓存;代价是位置编码要另外处理(第 6 课会看到它怎么处理)。所以这一课的结论是「分开更自由」,不是「合并一定错」。
🔍 V 的维数必须和 K 一样吗?
不必。打分只需要 q 和 k 同维(要做点积);V 的维数 dv 可以自己定。锚点 Qwen3.8 里两者都是 256;GLM-5.3 的 MLA 里 q、k 是 192 + 64 维、v 是 256 维(第 10 课)。