从0训练LLM · 现代大模型体系 阅读 + 实验 ≈ 50 分钟 页内实验 ×6
C15 前沿解剖:2026 开源模型各自改了什么、为什么 第 3 课

不用线性注意力,DeepSeek-V4.1 怎么把每 token 的全局 KV 压到 890 字节?

DeepSeek-V4.1:不用线性注意力,KV 压到 890 字节
DeepSeek 不走线性注意力,却把每 token 的全局 KV 压到 890 字节——比 Qwen3.8-27B 小 73.6 倍。办法是四刀同时下:K = V 共享的 512 维条目、只有 4 层持有 KV(CSA2 跨层复用)、encoder 的源层每 2 个 token 压 1 条、FP4 存储;每一刀都由 config 逐字节复算,与官方一致。另外还有 CED 把 prefill 砍掉一半、Single-Pass mHC、196.6B 的 Engram 查表、DSpark 取代 MTP。代价是承认近似。「DeepSeek 4.2」并不存在。
❓

本课一问: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。

从已有出发 · 累计数据流 点已学环节看形状与参数
解码层
演进图 · 本课在哪一段 QwenGLMDeepSeekKimi
DeepSeek 2024-05 DeepSeek-V2
引入MLA:不存 K、V,只存一个 512 维潜向量 + 64 维 RoPE 分量;每 token KV 从 67B(GQA-8)的 389,120 B 降到 69,120 B(60 层)。细粒度专家 + 共享专家。
借来MQA / GQA 的「减 KV 头」是它要超越的起点(C3 第 9 课)。
卡在每 token 的注意力计算仍然要读全部历史:计算随长度 O(L²)。
DeepSeek 2024-12 DeepSeek-V3
引入671B-A37B,61 层 MLA(每 token 70,272 B);无辅助损失的偏置均衡;MTP;FP8 训练。
借来MTP 的思想更早见于 Stern 2018、ProphetNet、Gloeckle 2024。
卡在原生 4,096;YaRN 加两段续训到 128K(C11 第 6 课;config 上限 4,096 × 40 = 163,840);长上下文的计算仍是 L²。
DeepSeek 2025-09 DeepSeek-V3.2-Exp
引入DSA:一个轻量的「闪电索引器」给历史 token 打分,每个 query 只读 top-k 个。
借来「压缩 + 选择 + 滑窗」三分支结构 DeepSeek 自己在 NSA(2025-02)里提出过。
卡在稀疏只省计算、不省存储:KV 仍要全量存;索引器自己仍要扫全序列(O(L²))。
DeepSeek 2025-12 mHC 论文
引入把残差流加宽成 n 条,残差映射约束在双随机矩阵上(Sinkhorn 投影),谱范数 ≤ 1、乘法封闭,深层堆叠不会放大。
借来Hyper-Connections(字节 Seed,arXiv 2409.19606)——原版不约束,堆深了数值不稳。
卡在n 条流意味着更多激活访存与流水线通信;V4 报告说优化后 mHC 占重叠 1F1B 流水线阶段的 6.7% 墙钟时间。
DeepSeek 2026-04 DeepSeek-V4(Preview)
引入CSA(每 4 个 token 压 1 条再选 top-k)与 HCA(每 128 个压 1 条、全读)交错,每层另有 128 的滑窗;K = V 共享的 MQA;mHC;Muon(混合 Newton-Schulz);专家 FP4;1M = 65,536 × YaRN 16。
借来NSA(自家)、mHC(自家)、Muon(Jordan / Moonlight)、SwiGLU 截断(gpt-oss)。
卡在官方后来的判断:计算降下来之后,瓶颈转到 HBM / SSD 的容量与搬运带宽(V4.1 报告 §1)。
DeepSeek 2026-09 DeepSeek-V4.1-Flash 本章讲它的那一课 →
引入CED(下 20 层 encoder、上 20 层 decoder,decoder 的全局 KV 由中间层投影)+ CSA2(Full / Reindex / Reuse 跨层复用)+ FP4 KV:全局 KV 890 B / token(由 config 与格式常数逐字节复算,与官方一致);Engram 查表 196.6B 参数;DSpark 取代 MTP。「DeepSeek 4.2」并不存在。
借来CED 受 YOCO(微软 2024-05)启发;跨层复用见 CLA、IndexCache(GLM);分层索引器见 HISA。
卡在代价是承认近似:decoder 的滑窗 KV 只回放最近 128 个 token(Bounded Replay),报告明说「数学上不等价」。

看四条泳道的完整演进图 →

数字口径: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 自己的起点就是这样做的:

  1. ① 朴素方案
  2. ② 它在哪失败
  3. ③ 改进方案
朴素方案只减 KV 头(C3 的 GQA / MQA)
方案每 token 全局 KV1M token 一条序列
DeepSeek LLM 67B:95 层 × 2 × 8 个 KV 头 × 128 维 × 2 B389,120 B380 GiB
V4.1 的形状只减到 1 个 KV 头:40 层 × 2 × 1 × 512 × 2 B81,920 B80 GiB
🎯

试三件事(先点「换成改进方案」):① 每点一次「下一刀」之前,先猜这一刀砍掉几倍——第 1 刀是 128 倍(64 个头 × K、V 两份 → 一条共享条目),第 2 刀是 10 倍,第 3 刀只有 1.6 倍,精度那一刀是 3.6 倍;② 读最后一行:890 B,和数据文件里官方的 890 逐字节一致(✓);③ 点上面的「Kimi K3」「GLM-5.3」按钮,看它们各在哪一刀上下手、哪一刀没动——V4.1 是唯一四刀全下的。

V4.1 报告自己把这件事总结成三个可以相乘的维度:条目大小、序列长度、层数,再加精度;报告的立场是,此前的方法都没有同时覆盖这三个维度 。下面逐刀看,每一刀都回扣前面的某一章。

改进:四刀,各回扣一章

第 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,其余层复用。点下面任意一层,看它算什么、复用谁:

DeepSeek-V4.1-Flash:40 层主干 + 3 个草稿层(由 config 现画)
🎯

试三件事:① 点第 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)
CSA 的压缩:把 m 个 token 的 KV 合成 1 条(DeepSeek-V4 报告 Eq.11–12)
👆 公式里带下划线的每一项都可以点——点哪项,讲哪项。
旧版课程在这里写「m 的具体取值论文正文没给,Raschka 博客的 4 / 128 是二手来源」。旧版这句本身就错:V4 报告 §4.2.1 写明 CSA 的 m = 4、HCA 的 m′ = 128,config 的 compress_ratios 与之一致(R3 §1.3 读 HF config;C11 第 5 课已更正)。
闪电索引器的打分(DeepSeek-V4 报告 Eq.16)
)
👆 公式里带下划线的每一项都可以点——点哪项,讲哪项。
对比 GLM-5.3:它的 DSA 索引器给全部 S 个 token 打分(不压缩序列),所以它在「层」上省——每 4 层只算一次(第 2 课)。同一个瓶颈,两个方向的解法。HCA(每 128 个压 1 条、不做稀疏选择、全读)是 V4 的「全局概览」层,V4.1 把它整个去掉了。

第 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。为什么可以去掉,是算出来的:

前两步是算术 ,最后一步是实测 。同一个模型里,KV 用类 NVFP4(块 16、E4M3 scale,精度更高;KV 只存储、不进矩阵乘,不需要硬件原生支持),索引器用 MXFP4(块 32、E8M0 scale,硬件兼容面最广)——用途不同,格式不同。

另一刀在 prefill:CED(回扣 C13)

四刀压的是存储。V4.1 还动了计算:把 40 层切成下面 20 层 causal encoder、上面 20 层 decoder。

CED:decoder 的全局 KV 从哪来(V4.1 报告 §2.2)
= ·
👆 公式里带下划线的每一项都可以点——点哪项,讲哪项。
V4.1 的做法是只回放最近 128 个 token(Bounded Replay),接受近似状态;报告明说「数学上不等价」,内部测试影响可以忽略,并在后训练中模拟回放做适配。YOCO 的提前退出是精确的,CED 用一个可以忽略的近似,换掉了滑窗的逐层依赖。
DeepSeek-V4.1-Flash:40 层主干 + 3 个草稿层(由 config 现画)

报告说 prefill 每 token 激活 8B、decode 激活 16B;上面的「层 × token」告诉你一半从哪来,8B / 16B 这两个具体数只能引官方 。

分层索引器:索引器自己也要省

跨层复用减少了索引器的次数,但剩下的索引器仍要扫全长。V4.1 让第 20 层在给出自己的 top-512 时,按块取最大分数选出 2,048 块 × 8 = 16,384 个候选,之后的 Reindex 层只在候选里打分:

DeepSeek-V4.1-Flash:40 层主干 + 3 个草稿层(由 config 现画)

候选池固定后,后续打分层每个 query 的成本与上下文长度无关 。先粗后细的思路来自 HISA;「浅层给深层限定候选、不加额外状态」是 V4.1 的贡献。

不在 KV 上的改动

mHC 与 Single-Pass(回扣 C4 第 2 课、C8)

C4 与 C8 都把「加宽残差」留到了这一章。mHC 是 DeepSeek 的(arXiv 2512.24880),V4 量产、V4.1 沿用并改成 Single-Pass。先看公式:

mHC 的一层(DeepSeek-V4 报告 §2.2,Eq.1–8)
= Xl + (Xl)
👆 公式里带下划线的每一项都可以点——点哪项,讲哪项。
V4 报告称经过融合 kernel、选择性重计算与流水线调度优化后,mHC 的墙钟开销是重叠 1F1B 流水线阶段的 6.7%。
mHC 一层的张量形状(V4.1 config:n = hc_mult,d = hidden_size;可切小规模)
Xl+1 = Bl·Xl + Cl·Fl(Al·Xl)
输入输出中间结果
边长按对数比例缩放,块边上的数字是真实值;同一维度符号的边在全图等长。
维度含义 真实规模 小规模
n 残差流条数 hc_mult 4 4
d hidden_size 5120 6
1 单个向量 1 1
层内部(F_l)仍然只处理 d 维;代价在层与层之间:残差状态是 n 倍宽,每层都要读写它。

「谱范数 ≤ 1、乘法封闭」到底在防什么?在浏览器里用真 Sinkhorn 跑一遍:

mHC:把残差映射约束成双随机矩阵,深堆不放大
🎯

试三件事:① 默认设置(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

新旧分离:DeepSeek-V4-Flash → DeepSeek-V4.1-Flash

先自己判断每一行属于哪一类,再点「揭晓」。机制变了 = 新增、换掉或删掉了一个部件;数值变了 = 同一个东西放大或缩小;没变。

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 路由」:它的结论只到「推断」——删掉一个机制也要有证据,字段消失本身只是线索。

DeepSeek-V4.1 报告里的数字

⚠ 常见误解

⚠

「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 是字节计数,每一刀都能复算 ;双随机矩阵谱范数 ≤ 1 且乘法封闭 ;候选池固定后打分成本与长度无关
③ 实验上为什么最后选了它?FP4 KV「只有边际损失」、Bounded Replay「影响可忽略」、Single-Pass mHC「效果损失可忽略」都是官方实验 ;第三方 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。