不用线性注意力,DeepSeek-V4.1 怎么把每 token 的全局 KV 压到 890 字节?
本课一问:DeepSeek 没有像 Qwen、GLM-5.3-Flash、Kimi K3 那样换上线性注意力,每一层都还是 softmax。它怎么把每 token 的全局 KV 压到 890 字节?
这一课先不碰:CSA 压缩与闪电索引器打分的公式解剖(C11 第 5 课;下面第 3 刀的 Dig 只作回顾)、DSpark 的接受率(本课程没有展开;投机解码为什么不改输出见 C13 第 3 课)、V4.1 后训练的环境工程(C12)。
先核一个事实:「DeepSeek 4.2」截至 2026-09-26 并不存在——HF 仓库、API 新闻页、更新日志、GitHub 组织四个一手渠道都没有。最新版本是 DeepSeek-V4.1-Flash(2026-09-10 开源,MIT);官方说 V4.1-Pro「将发布」,没有给日期(R3 §1.2)。
从已有出发
「小明把苹果给了小王」如果按每个 token 890 字节存全局 KV,5 个 token 一共 4,450 B;同样 5 个 token 在 Qwen3.8-27B 里是 327,680 B,差 73.6 倍(DeepSeek 的词表不同,切出的 token 数可能不同,这里只比「每个 token」)。C3 第 10 课讲过这个故事的前半段:DeepSeek LLM 67B 的 GQA-8 每 token 389,120 B,V2 的 MLA 降到 69,120 B。这一课接着往下走,走到 890。
数字口径:KV 字节、固定状态、稀疏度、GLM 的参数差值都由 frontier-models.json / anchor-model.json 的官方 config 在构建时现算,并与数据文件的 _meta.checks 逐项核对(对不上就构建失败);V4.1 的 890 B 另用了两个格式常数(FP4 条目 288 B、索引 key 68 B,见 R3 §1.5e)。其余文字出自各家技术报告与模型卡,归属判断见 R2 §0.1、R3 §1.7。
先自己设计:只减 KV 头
C3 教过最直接的一刀:减 KV 头。DeepSeek 自己的起点就是这样做的:
- ① 朴素方案
- ② 它在哪失败
- ③ 改进方案
| 方案 | 每 token 全局 KV | 1M token 一条序列 |
|---|---|---|
| DeepSeek LLM 67B:95 层 × 2 × 8 个 KV 头 × 128 维 × 2 B | 389,120 B | 380 GiB |
| V4.1 的形状只减到 1 个 KV 头:40 层 × 2 × 1 × 512 × 2 B | 81,920 B | 80 GiB |
口径:BF16 每元素 2 B,只算随序列长度增长的全局 KV(与 frontier-models.json _meta.checks 同一口径,✓ = 现算值与核对值一致);线性注意力的固定状态与滑窗常数不随长度变,另列。V4.1 的原生格式用两个格式常数:FP4 KV 条目 288 B(256 B E2M1 + 32 B E4M3 scale)、索引 key 68 B(OCP MXFP4 推算),出自模型卡、FlashMLA README 与 R3 §1.5e。
试三件事(先点「换成改进方案」):① 每点一次「下一刀」之前,先猜这一刀砍掉几倍——第 1 刀是 128 倍(64 个头 × K、V 两份 → 一条共享条目),第 2 刀是 10 倍,第 3 刀只有 1.6 倍,精度那一刀是 3.6 倍;② 读最后一行:890 B,和数据文件里官方的 890 逐字节一致(✓);③ 点上面的「Kimi K3」「GLM-5.3」按钮,看它们各在哪一刀上下手、哪一刀没动——V4.1 是唯一四刀全下的。
V4.1 报告自己把这件事总结成三个可以相乘的维度:条目大小、序列长度、层数,再加精度;报告的立场是,此前的方法都没有同时覆盖这三个维度 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条「第一个联合利用三者的设计」是官方自述;890 B 本身是字节计数,可以复算。 出处V4.1 报告 §2.3(arXiv 2609.19969) ↗需联网 。下面逐刀看,每一刀都回扣前面的某一章。
改进:四刀,各回扣一章
第 1 刀 · 条目:K = V 共享的 512 维 MQA(回扣 C3 第 9、10 课)
C3 讲过两条减条目的路:GQA 减 KV 头,MLA 让所有头共享一个低秩潜向量。V4 系走的是第三条:所有 64 个 query 头共用一条 512 维的条目,而且这一条既当 K 又当 V(config:num_key_value_heads = 1)。RoPE 只施加在末尾 64 维上。
🔍 K 与 V 是同一条,位置怎么办?(部分 RoPE + 输出侧 −i)
压缩条目既是 K 又是 V,如果对它施加 RoPE,注意力的输出也会带上绝对位置。V4 的解法是在输出上再施加位置 −i 的旋转,把绝对位置转回相对位置;而且只对最后 64 维施加 RoPE(DeepSeek-V4 报告 §2.3.3)。对比 K3 与 GLM-5.3-Flash 干脆不用位置编码(NoPE)——两种相反的选择都做到了 1M,这里没有唯一正解。另注:V4 用一个可学习的 sink logit 让一个头「可以什么都不看」(C3 岔路 B4),用 Q 与 KV 上的 RMSNorm 按住 logit、因此不需要 K2 的 QK-Clip(C8)。
第 2 刀 · 层:只有 4 层持有 KV(CSA2 的跨层复用)
40 层里,只有 kv_source_layer_ids = [2, 8, 14, 20] 这 4 层自己算并持有 main KV,其余层复用。点下面任意一层,看它算什么、复用谁:
试三件事:① 点第 2 层(Full)再点第 5 层(Reuse):第 5 层连 top-k 都直接用第 2 层的;② 点第 24 层(Reindex):KV 用第 20 层的,但它用自己的索引 query 重新打分,而且只在第 20 层给出的 16,384 个候选里打分;③ 数一数深绿色格子:4 个。这就是「层」这一刀的 10 倍从哪来(40 ÷ 4)。
跨层复用不是 DeepSeek 首创:跨层 KV 共享见 CLA 与 YOCO(都在 2024-05),跨层复用索引见 GLM 团队的 IndexCache(2026-03)。有意思的是 Qwen 的报告说跨层共享索引在混合架构里效果差(第 1 课),而 V4.1 没有线性层、层间是连续的 softmax 层——同一个技巧,放在不同的骨架里,结论可以不同。
第 3 刀 · 序列:每 2 个 token 压 1 条(回扣 C11)
encoder 的 3 个源层 compress_ratios = 2,每 2 个 token 压成 1 条;decoder 的源层 = 1,不压。V4 原来压得更狠(CSA 每 4 个 1 条、HCA 每 128 个 1 条,交错排布),V4.1 反而压得轻,因为省存储的主力已经换成了「层」和「精度」两刀。V4 的压缩与索引器公式,旧版课程逐项拆过,这里迁入并标出 V4.1 改了什么(逐项讲解以 C11 第 5 课 为准):
🔍 V4 的 CSA 压缩与闪电索引器:两个公式、十个可点项(V4 报告 Eq.11–12、Eq.16)
第 4 刀 · 精度:FP4(回扣 C9)
main KV 用 E2M1 存值、每 16 个通道配一个 E4M3 的 scale:一条 512 维条目 256 + 32 = 288 字节(BF16 是 1,024 字节)。索引 key 用 OCP MXFP4:128 维 64 字节 + 4 个 E8M0 scale(每 32 个值 1 个,每个 1 字节)共 4 字节 = 68 字节(按 MXFP4 每 32 个值一个 scale 推出,官方没有直接写,R3 §1.5e)。滑窗 KV 对量化敏感,保留 FP8。C9 的岔路讲过 4 位只剩 16 个数、必须靠块缩放;这里还有一个少见的细节:V4.1 去掉了 NVFP4 的第二级全局 scale。为什么可以去掉,是算出来的:
- 这个格式能表示的最大幅度:E4M3 的 448 × E2M1 的 6 = 2,688;
- 512 维潜向量经过 RMSNorm(权重最大约 1),L2 范数 ≤ √512,RoPE 不改变范数,所以单个通道最大 ≤ √512 ≈ 22.6;
- 训练中实测的最大值约 10。
前两步是算术 证据等级 · 数学可证明 在写明的前提下可以严格推导出来,不依赖实验。只要前提成立,换数据、换规模仍然成立。 本条范数不等式:单通道绝对值不超过向量的 L2 范数;旋转不改变范数。 出处待补 ,最后一步是实测 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条官方自报的训练中最大值。 出处V4.1 报告 §2.4.4 ↗需联网 。同一个模型里,KV 用类 NVFP4(块 16、E4M3 scale,精度更高;KV 只存储、不进矩阵乘,不需要硬件原生支持),索引器用 MXFP4(块 32、E8M0 scale,硬件兼容面最广)——用途不同,格式不同。
另一刀在 prefill:CED(回扣 C13)
四刀压的是存储。V4.1 还动了计算:把 40 层切成下面 20 层 causal encoder、上面 20 层 decoder。
报告说 prefill 每 token 激活 8B、decode 激活 16B;上面的「层 × token」告诉你一半从哪来,8B / 16B 这两个具体数只能引官方 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条官方数字;激活参数还取决于 MoE 路由。 出处V4.1 报告摘要 ↗需联网 。
分层索引器:索引器自己也要省
跨层复用减少了索引器的次数,但剩下的索引器仍要扫全长。V4.1 让第 20 层在给出自己的 top-512 时,按块取最大分数选出 2,048 块 × 8 = 16,384 个候选,之后的 Reindex 层只在候选里打分:
候选池固定后,后续打分层每个 query 的成本与上下文长度无关 证据等级 · 数学可证明 在写明的前提下可以严格推导出来,不依赖实验。只要前提成立,换数据、换规模仍然成立。 本条候选数由 config 固定,计数与 T 无关。 出处待补 。先粗后细的思路来自 HISA;「浅层给深层限定候选、不加额外状态」是 V4.1 的贡献。
不在 KV 上的改动
mHC 与 Single-Pass(回扣 C4 第 2 课、C8)
C4 与 C8 都把「加宽残差」留到了这一章。mHC 是 DeepSeek 的(arXiv 2512.24880),V4 量产、V4.1 沿用并改成 Single-Pass。先看公式:
| 维度 | 含义 | 真实规模 | 小规模 |
|---|---|---|---|
| n | 残差流条数 hc_mult | 4 | 4 |
| d | hidden_size | 5120 | 6 |
| 1 | 单个向量 | 1 | 1 |
「谱范数 ≤ 1、乘法封闭」到底在防什么?在浏览器里用真 Sinkhorn 跑一遍:
试三件事:① 默认设置(60 层、ε = 0.20、t = 20):红线(不加约束的 HC)一路涨到上百倍,绿线钉在 1;② 把 t 拖到 0——只取 exp、不投影,绿线爆得比红线还凶;再拖到 1,几乎就够了;③ 换种子 2、3:红线的具体数变,绿线永远是 1——这是定理,不是这一组随机数的巧合。
Engram:第二条稀疏轴(回扣 C1、C11)
V4.1 在第 1、14 层挂了两个 Engram 模块:按 2 到 4 个 token 的组合哈希查表,每个头一张约 1,600 万条的表(表大小取互不相同的素数)。参数量由 config 现算:两个模块的表行数之和 768,022,850 × 256 维 = 196,613,849,600 个参数,就是官方说的 196B。HF 的合计 763,205,315,794 减去它,约 566.6B,即 552B 骨干加约 14.6B 的草稿层——第三方标题里的「763B」就是这么来的。
查表几乎不计算,地址确定,所以可以从主机内存经 RDMA 预取。给 196B 参数配 Adam 的两份状态太占显存,V4.1 给 Engram、embedding 与预测头换成只存一份动量的 Sinkhorn 动量更新(交替做行、列归一化),其余矩阵参数用按头切开的 Muon,norm 用 AdamW(C5 第 7 课)。同月 Qwen3.8-Flash-Next 的 51.2B n-gram 表是同一方向:两家独立地把「查表记忆」当成 MoE 之外的第二条稀疏轴。
DSpark 取代 MTP(回扣 C11 岔路、C13)
config 里 num_nextn_predict_layers = 3,但语义已经变了:这 3 层不是和主干一起预训练的 MTP,而是预训练之后冻结主干、单独训练的 DSpark 草稿块,一次前向并行给出 5 个位置。V4 还在联合预训练 MTP;V4.1 预训练阶段完全不用。报告没有给出「去掉 MTP 后主干质量」的消融——这是一个真实的分歧点。
训练与后训练(回扣 C5、C7、C12)
45T 多模态 token(文本 : 多模态 = 7 : 1);batch 全程固定 100.6M、不做 warmup(和 Qwen3.8-Flash-Next 同月、同方向);学习率 2.6×10⁻⁴ 保持到 28T,28T → 40T cosine 降到 2.6×10⁻⁵,40T → 45T 保持;从头就用稀疏注意力、64K 起训,34T 时扩到 1M。后训练:官方明确说没有任何算法创新——全部改进来自数据与环境流水线(自建的沙箱平台单节点可承载 2,500 个以上活跃容器,报告还公开了 reward hacking 的实例)。
逐行核对 V4 → V4.1
先自己判断每一行属于哪一类,再点「揭晓」。机制变了 = 新增、换掉或删掉了一个部件;数值变了 = 同一个东西放大或缩小;没变。
V4-Flash 一列的 config 字段(层数、hidden、专家、索引头、滑窗、head_dim、压缩率)读自 C11 章的补充文件 c11-config-supplement.json(deepseek-ai/DeepSeek-V4-Flash @ 60d8d70),并与 R3 §1.6 逐项核对一致;其余格(Hash 路由、量化块、MTP、batch 等)取自 R3 §1.6 与 V4 报告;V4.1 一列由 frontier-models.json 读取与现算。
试三件事:① 这一对里「机制变了」的行特别多(11 行)——V4.1 被官方称为「新架构家族里最小的型号」;② 第二级揭晓后看「对领域首创」:只有 Single-Pass mHC 一行;CED、分层索引器、batch 策略各算一半;③ 点「前 3 层 Hash 路由」:它的结论只到「推断」——删掉一个机制也要有证据,字段消失本身只是线索。
⚠ 常见误解
「890 B 就是全部的 KV。」它只算随长度增长的全局 KV,而且是原生 FP4 格式;BF16 口径是 3,200 B。每条序列另有滑窗常数:128 × 40 层 × 528 B(FP8)≈ 2.7 MB,与长度无关。估显存还要加上权重和激活。
「CED 和 YOCO 一样,提前退出是无损的。」YOCO 在论文规模下是精确的;CED 的 decoder 滑窗只回放最近 128 个 token,报告明说数学上不等价,并把「边界情况下的鲁棒性」列为局限。
「稀疏注意力省了显存。」DSA 一类的 top-k 只省计算:KV 仍要全量存,索引器自己还要扫全长。V4.1 省显存靠的是条目、跨层与 FP4;省计算靠的是 top-512、滑窗和候选池。实验课会把「存」与「读」分开算。
「DeepSeek 的文档里 CSA 和 DSA 是两个东西。」V4 时期,官方 API 新闻页写的是「Token-wise compression + DSA」,论文与模型卡写的是「CSA + HCA」;两套术语是否指同一机制,一直没有官方澄清。读 DeepSeek 的材料时,以论文与 config 为准。
在演进图上的位置
DeepSeek 这条线是一部「KV 压缩史」:V2 的 MLA(条目)→ V3.2 的 DSA(只省计算,暴露出「稀疏不省存储」)→ V4 的压缩 + 稀疏 + 滑窗(序列)→ V4.1 的跨层复用、FP4 与 CED(层、精度、prefill)。泳道图里点「DeepSeek-V4」一格,读它的「卡在」:计算降下来之后,瓶颈转到了存储与带宽——这正是 V4.1 的出发点。
同一段历史在 C11 第 5 课的 KV 阶梯里按代际算过一遍,每一级都用该模型自己的原生缓存格式(FlashMLA README)与官方 config:V3.2 每 token 48,068 B → V4-Flash 3,514 B → V4.1-Flash 890 B。本课走的是另一条路:在 V4.1 一个模型内部,从同形 MHA 起一刀一刀拆开,终点同样是 890 B。两条路的中间数不能混用——阶梯的中间级是真实发布过的模型,本课的中间级是假想的「只下了前几刀的 V4.1」,而且按 BF16 口径算。
证据三问
| 问 | 本课的回答 |
|---|---|
| ① 它解决什么问题? | 长程 agent 让负载「输入重」,前代稀疏注意力把计算降下来后,瓶颈转到 HBM / SSD 的容量与搬运带宽(官方动机) |
| ② 数学上为什么可能有效? | 890 B 是字节计数,每一刀都能复算 证据等级 · 数学可证明 在写明的前提下可以严格推导出来,不依赖实验。只要前提成立,换数据、换规模仍然成立。 本条config 字段 + 两个格式常数,与官方逐字节一致。 出处待补 ;双随机矩阵谱范数 ≤ 1 且乘法封闭 证据等级 · 数学可证明 在写明的前提下可以严格推导出来,不依赖实验。只要前提成立,换数据、换规模仍然成立。 本条Birkhoff 多面体的性质。 出处DeepSeek-V4 报告 §2.2(本地 PDF) ↗ ;候选池固定后打分成本与长度无关 证据等级 · 数学可证明 在写明的前提下可以严格推导出来,不依赖实验。只要前提成立,换数据、换规模仍然成立。 本条计数。 出处待补 |
| ③ 实验上为什么最后选了它? | FP4 KV「只有边际损失」、Bounded Replay「影响可忽略」、Single-Pass mHC「效果损失可忽略」都是官方实验 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条官方自报,报告自己称之为近似,并列为局限。 出处V4.1 报告 ↗需联网 ;第三方 AA 指数 39 分高于 V4-Pro 的 36 分,方向与官方一致 |
一句话
不换线性注意力也能把 KV 压到极限:在条目、层、序列、精度四个维度同时下刀,代价是承认近似。
先停在这里:能说出 890 = 3 × (288 + 68) ÷ 2 + (288 + 68),每一项来自哪个字段、回扣哪一章。
再深一层:打开 V4 报告 §2.2 把 mHC 的 Eq.1–8 读一遍,再回到上面的 Sinkhorn 模拟,把 t 从 0 拖到 20。
下一个缺口
DeepSeek 的答案是「全 softmax + 压缩 + 跨层 + 低精度」。Kimi K3 走了完全相反的路:69 层线性注意力只维护固定大小的状态,全局层连位置编码都不要。K3 的报告说它有 15 项以上的变化——它哪些是真新东西,哪些只是放大? → 第 4 课:Kimi K3
你可能会问
这一课还没有收到真实提问;你的提问会记到 05-问答记录/C15-L3.md。
- 「为什么 DeepSeek 不用线性注意力?」 官方没有正面回答;它的立场是把 V4 理解成「以滑窗为主干的局部处理,再叠加压缩过的全局上下文」,下一步的瓶颈在存储与带宽而不在计算。同一时期 MiniMax 从线性混合退回全注意力、又转向块稀疏,列过 4 条线性注意力的工程难题(实验课与第 4 课)。
- 「V4.1-Pro 什么时候发布?」 官方只说「将发布」,没有日期;在它发布前,
deepseek-v4-pro的 API 请求从 2026-09-14 起转发给 V4.1-Flash。 - 「百度百科说 V4.1 支持音频输入?」 官方模型卡写的是「images and text」,没有音频,以官方为准。