全部文档/系列目录
DeepSeek-V4.1 Flash:从两本书接上去
这一页写给这样的读者:读过《Build a Large Language Model (From Scratch)》和《Build a Reasoning Model (From Scratch)》,微积分和线代学过但计算细节忘了。所以不假设你记得 softmax 的导数、凸组合的定义、矩阵吸收的推导;每用一个概念,就在原地重新定义一遍,再用这一节自己的数字验算。
两本书带你到的地方是"一层标准的因果自注意力 + KV cache + 采样"。DeepSeek-V4.1 Flash 的技术报告则默认你已经知道 MLA 的潜在向量、滑动窗口、稀疏 Top-K 检索、跨层 KV 复用、FP4 量化、专家混合。中间那一段就是这九篇正文加一篇附录要补的:每补一个,都标出它对应两本书的哪一节,以及它在 KV 账单上省掉了多少字节。
全篇围绕技术报告的一句话展开:KV Cache 的成本是三个因子的乘积,而 V4.1 Flash 把三个因子各自压了一次。
三把旋钮
后面每一章只回答一个问题:这三个因子里的哪一个被动了,动了多少。
KV 字节 = 条目 x 条数 x 层数
条目 <- 1 章 GQA / MLA
4.4 节 FP4
条数 <- 2 章 窗口 / 稀疏
4.2 节 压缩比 m
层数 <- 3 章 CED
4.3 节 跨层复用
写成公式就是报告里那行(第 1 章会把它逐项对上字节):
\[ \text{KV 总成本} =\underbrace{d_{\text{entry}}}_{\text{条目}} \times\underbrace{\frac{N}{m}}_{\text{条数}} \times\underbrace{L_{\text{eff}}}_{\text{层数}} . \]三个因子是乘法关系,所以任一项减半,总账单就减半;V4.1 Flash 的 890 B/token 是三项同时动手的结果,不是某一项特别神奇。
怎么读
- 第一次:0 → 8 顺序读。第 0 章是地图,第 1 章决定后面所有字节数,第 5 章是全篇的数学核心。
- 只想看懂结论:第 0 章的对照表 + 第 4.4 节的 890 字节账 + 附录 A。
- 只想看数学:第 5 章(凸组合、softmax 的 Jacobian、指数倾斜、像集是相对内部)。这一章不依赖前四章的具体结构,但依赖你已经知道注意力是什么。
- 手边开着两本书:每节开头都写了"对应 bllm 第几章 / barm 第几节";没读到的部分可以先跳到本节末尾的"判断方法"看结论。
章节
-
两本书的目录逐条对上报告:哪些概念已经会了(注意力、因果掩码、KV cache、采样),哪些是新的(MLA 潜在向量、SWA、稀疏索引、跨层复用、FP4、MoE)。一张对照表 + 一条最短路径。
-
从 barm 2.8 的 KV cache 出发,把一条条目从 131,072 B(64 个 KV 头的 MHA)压到 1,024 B(一个 512 维潜在向量);MLA 的"矩阵吸收"为什么成立;64 维 RoPE + 448 维 NoPE 的来历。
-
全局注意力为什么在 1M 上下文下必然爆掉;窗口 128 的真实感受野(两层 255,20 层 2541,常用近似 2560);Indexer 的打分公式与 Top-512;decode 每步的存储、检索、读出三本账为什么要分开。
-
YoCo 的核心:KV 只由第 20 层产出,后 20 层复用这一份(一般 CED 则允许每层自己的投影)。prefill 计算量比 \(1/2+B/2N\) 的推导,N=32768 时 50.2%;bounded replay 为什么只回放最后 128 个位置。
-
压缩比 m=2 的合并、m=1 的退化;Full / Reindex / Reuse 三种模式的两个指示量;FP4 的 288 B 与 68 B 逐项算;从 3514 B/token 到 890 B/token 的四步;HSI 候选池 16384 个位置怎么来的。
-
全篇数学核心。输出是凸组合;softmax 的 Jacobian 就是协方差;改 Q 等于对基线分布做指数倾斜;可达倾斜空间的维数只有 512;像集恰是顶点集凸包相对内部;Reuse 相比 Full 缺的三件事。
-
384 选 6 与 8B/16B 激活参数的对应;mHC 的 4 条残差流与 Sinkhorn 迭代为什么收敛到双随机矩阵(注意它只约束直接混合路径,不是完整 Jacobian);Engram 的 n-gram 哈希查表;DSpark 的期望接受长度 \(\sum\alpha^k\) 与实际输出长度 \(1+\sum\alpha^k\)。
-
从 bllm 的 token embedding 接过去:patch 14、
max_image_tokens=1024与 544²–1344² 的两端约束、1344² 为什么正好顶格、5184 → 576 的 3×3 pixel-unshuffle、2D RoPE、多模态的两组专家偏置。顺带清掉一个曾经的错误:视觉侧没有"行标记"。 -
预训练(64K→1M,无 HSI)与后训练(HSI + FP4 QAT + 模拟 bounded replay)的分工;运行时 1/4 = 架构+精度,持久化 1/8 = 1/2(不再存 SWA KV)× 1/4;4/8/40 三个刷新次数。Indexer 训练目标报告未披露,本篇已标注为外推。
-
一页公式表、全部数字的出处、术语中英对照、以及"哪里容易算错"的清单。
符号约定
| 符号 | 含义 | V4.1 Flash 的取值 |
|---|---|---|
| \(L\) | 主干层数 | 40(20 Encoder + 20 Decoder) |
| \(E,\ D\) | Encoder / Decoder 各自的层数 | 各 20 |
| \(d\) | 主干隐维 hidden dim | 5120 |
| \(d_c\) | KV 潜在向量维数(即 head_dim) | 512 |
| \(H\) | Q 头数(KV 只有一个共享潜在) | 64 |
| \(W\) | 滑动窗口宽度 | 128 |
| \(K\) | 稀疏检索选中的条目数 idx_topk | 512 |
| \(m\) | 序列压缩比 | Encoder 2 / Decoder 1 |
| \(N\) | 上下文长度(token) | 最长约 1M |
| \(S\) | 每 token 的全局 KV 字节 | 890 B |
数学惯例下标从 1 开始,而报告与代码里的 layer_idx 从 0 开始。本篇正文一律用 1-based 层号 \(l\in\{1,\dots,40\}\)(第 1–20 层是 Encoder,第 21–40 层是 Decoder);介绍来源层时同时给出 0-based 下标,例如 layer_idx = 2, 8, 14, 20 就是第 3、9、15、21 层。