DeepseekV4论文解析

一、背景与动机

把模型配置里的最大上下文长度改成 1,000,000,并不等于真正支持 1M Token。随着序列变长,普通全注意力在预填充阶段会面临近似二次增长的计算量;进入逐 Token 解码后,每个新查询仍要读取越来越长的键值缓存(KV cache)。最终限制系统的不只是一个位置编码参数,而是算力、显存容量、显存带宽、缓存管理和内核调度共同形成的瓶颈。

DeepSeek-V4 提出:用压缩稀疏注意力(Compressed Sparse Attention,CSA)保留可检索的中等粒度信息,用高度压缩注意力(Heavily Compressed Attention,HCA)维持低分辨率的全局视野,再用滑动窗口注意力(Sliding Window Attention,SWA)保存最近 Token 的细节;与此同时,KV 缓存布局、低精度计算、训练课程、融合内核和磁盘前缀缓存都围绕这套结构重新设计。

图 1:左:DeepSeek-V4-Pro-Max及其同行的基准性能。右:DeepSeek-V4系列和DeepSeek-V3.2的推断FLOP和KV缓存大小。

图 1:左:DeepSeek-V4-Pro-Max及其同行的基准性能。右:DeepSeek-V4系列和DeepSeek-V3.2的推断FLOP和KV缓存大小。

设当前上下文长度为 $n$。在简化分析中,普通因果自注意力的预填充计算随 $n^2$ 增长;解码阶段虽然每次只生成一个 Token,但这个 Token 的查询仍要与此前大约 $n$ 个键交互,而且每层都要保存随 $n$ 线性增长的 KV 缓存。模型越大、层数越多、KV 头维度越宽,这个问题越明显。

DeepSeek-V4 包含两个混合专家模型:DeepSeek-V4-Flash 为 284B 总参数、激活 13B 参数;DeepSeek-V4-Pro 为 1.6T 总参数、激活 49B 参数。两者都原生训练到 1M 上下文。Flash 有 43 层,Pro 有 61 层,绝大多数层交替使用 CSA 与 HCA,而不是让所有层采用同一种注意力。

这个选择隐含了一个重要判断:超长上下文不是保留全部信息和丢弃大部分信息之间的二选一,而是一个分辨率分层问题。最近的 Token 需要高分辨率,远处的相关细节需要按查询检索,整段历史则需要一个低成本的全局轮廓。

二、方法

1. Manifold-Constrained Hyper-Connections(mHC)

Attention 负责解决长上下文效率,而 DeepSeek-V4 还需要保证超大模型本身能够稳定训练,因此论文引入了 mHC。传统 Transformer 中,每一层都有残差连接:$x_{l+1}=x_l+F(x_l)$。Hyper-Connections 则会扩展 residual stream,使网络拥有多条残差路径。

问题是,当模型变得非常深以后,更复杂的残差变换可能导致:

  • 信号不断放大;
  • 梯度传播不稳定;
  • 数值爆炸。

mHC 的关键设计,是把残差变换矩阵约束在:Doubly Stochastic Matrix 双随机矩阵构成的 Birkhoff Polytope 上。直观点,一个双随机矩阵满足:

  • 所有元素非负;
  • 每行之和为 1;
  • 每列之和为 1。

这样可以限制残差映射不断放大信号。论文使用 Sinkhorn-Knopp Algorithm,通过反复执行行、列归一化,将矩阵投影到这一约束空间。因此 mHC 的核心思想可以概括成:

保留 Hyper-Connections 更强的信息传递能力,同时通过数学约束限制深层网络中的信号爆炸。

2. Hybrid Attention:CSA + HCA

可以把 DeepSeek-V4 的注意力结构理解为三层记忆:

路径保存粒度访问方式主要作用
SWA最近 128 个未压缩 KV 条目每个查询都读取局部窗口保留语法、指代和当前压缩块内的精细依赖
CSA每 4 个原始 Token 形成一个学习到的压缩条目轻量索引器打分后取 Top-k;Pro 取 1024,Flash 取 512找回与当前查询相关的远距离细节
HCA每 128 个原始 Token 形成一个学习到的压缩条目对全部压缩条目做稠密注意力提供低分辨率但连续的全局视野

论文中的具体配置还包括:CSA 与 HCA 都使用 128 Token 的滑动窗口;两者的压缩 KV 同时作为注意力的键和值,并采用共享键值的多查询注意力(Multi-Query Attention,MQA)。Flash 的前两层是纯 SWA,Pro 的前两层是 HCA,之后才进入 CSA / HCA 交替结构。

以图 1 使用的 1024K,即 1,048,576 Token 为例,忽略边界和实现细节:

  • CSA 以 $m=4$ 压缩后,候选条目约为 262,144 个;Pro 的核心注意力最终只读取约 $1024+128=1152$ 个条目,Flash 约为 $512+128=640$ 个。
  • HCA 以 $m’=128$ 压缩后,只剩 8,192 个全局条目,再加上 128 个局部条目。

这并不意味着 CSA 的总成本已经与上下文长度无关:轻量索引器仍需扫描压缩后的候选集合,即大约 $n/4$ 个低维条目。真正的节省来自两步配合——先缩短待扫描序列、降低索引器精度和维度,再把昂贵的核心注意力限制在固定的 Top-k 预算内。

三层记忆是对整网信息流的抽象,不是每一层同时运行三套完整注意力。CSA 层与 HCA 层在网络深度方向交替,而 128 Token 的 SWA 是两类层内部共同拥有的局部分支。两类注意力还会在核心计算前对查询和压缩 KV 分头执行 RMSNorm,只在最后 64 个维度施加 RoPE,并对注意力输出执行相反位置的旋转,以尽量让共享键值表示保留相对位置信息。这些细节不会改变三分辨率的主线,却说明压缩结构仍需专门处理数值范围与位置编码,不能直接套用普通注意力的全部实现假设。

CSA:高分辨率、稀疏访问

CSA 的第一步不是简单平均池化。它从隐藏状态生成两组 KV 表示和两组压缩权重;每个输出条目会结合当前块与相邻块的信息,并按通道执行学习到的加权汇聚。虽然一次计算涉及相邻的 $2m$ 个候选位置,但相邻压缩块之间存在重叠,因此最终仍是每 $m$ 个原始 Token 产生一个压缩条目。

随后,CSA 为压缩条目另行构造索引键。当前查询经过低秩投影后形成多头索引查询,轻量索引器(lightning indexer)计算查询与所有压缩块的相关分数,再选出 Top-k 条目送入核心注意力。这个结构很像先建立粗粒度索引,再读取少量正文,但索引和正文表示都由模型端到端学习,而不是外接一个独立向量数据库。

CSA 将原始隐藏状态压缩为 KV 条目,经轻量索引器打分和 Top-k 选择,再与滑动窗口 KV 共同进入共享键值多查询注意力

图 2:CSA 把远距离信息先压缩,再用查询相关的索引器筛选;左侧未压缩的滑动窗口负责补回局部细节。

与 DeepSeek-V3.2 的 DeepSeek Sparse Attention(DSA)相比,V4 的关键变化不是简单地把 Top-k 从 2048 调小。V3.2 的索引器直接在每个原始 Token 对应的 MLA latent KV 条目上选 Top-2048,没有先沿序列维度压缩;V4 的 CSA 则先把序列缩短到四分之一,再从压缩块中选择 Pro 的 1024 或 Flash 的 512 个条目。两代模型的 Top-k 单位不同,因此不能直接把 2048、1024 和 512 当成同一粒度的预算比较。

这种设计有三个值得注意的细节。

第一,索引器只是缩小昂贵注意力的读取集合,而不是让长上下文变短。索引阶段仍随压缩后长度线性增长,因此低维索引键、FP4 计算和专用内核都是整体设计的一部分。

第二,压缩条目同时充当键和值。这样可以避免为多组 KV 头保存重复状态,但也意味着一个压缩向量必须同时承担被匹配和提供内容两种职责。

第三,Top-k 是一种有损门控。一旦索引器漏掉关键块,后续核心注意力就没有机会恢复那段信息。这正是 HCA 与局部窗口不能被省略的原因。

HCA:低分辨率、全局访问

HCA 与 CSA 使用相似的学习式压缩,但目标不同。它把每 128 个 Token 压成一个条目,不再做 Top-k,而是对全部压缩条目执行稠密注意力。换句话说,HCA 牺牲分辨率来换取连续的全局覆盖。

为什么需要两种压缩?只使用 CSA,模型对远处内容的访问完全取决于索引器是否把相关块选进 Top-k;只使用 HCA,128:1 的压缩又可能抹去代码中的一个标识符、合同中的一句限定条件或多轮对话中的精确措辞。交替布置两类层,相当于让网络在不同深度反复进行两种操作:

  1. 通过 HCA 获取整段上下文的低分辨率背景;
  2. 通过 CSA 针对当前查询读取少量更细的远距离信息;
  3. 通过 SWA 保留最近 128 个 Token 的未压缩局部状态。

它并不保证所有信息都被无损保存,但比单一固定稀疏模式更能覆盖长文档中不同尺度的依赖。

局部窗口还有一个严格的因果性作用:当前压缩块尚未完整时,不能提前生成代表整个块的压缩 KV;如果没有未压缩窗口,查询甚至无法读取同一压缩块内已经出现的最近 Token。因此SWA 与缓存中的未完成压缩尾部状态不是附加优化,而是保证可用性的必要组成部分。

从注意力公式到可部署系统

如果推理引擎仍把每层 KV 缓存视为同构的 Token 数组,CSA/HCA 在公式上的节省很难直接落地。DeepSeek-V4 同时存在多类状态:

  • CSA 主注意力的压缩 KV;
  • CSA 索引器的压缩键;
  • HCA 的高度压缩 KV;
  • SWA 的最近窗口;
  • 尚未凑满 4 或 128 个 Token、暂时不能压缩的尾部隐藏状态。

传统 PagedAttention 借鉴虚拟内存的分页思想,用块管理随请求增长的 KV 缓存,减少碎片并支持跨请求共享。DeepSeek-V4 仍然需要分页,但不同层的压缩比例、淘汰策略和内核对齐要求不一致,因此论文把缓存拆为两部分:固定大小的状态缓存保存 SWA 与未完成压缩的尾部;常规分页缓存保存已经完成的 CSA/HCA 压缩条目。

DeepSeek-V4 将每个请求的 SWA 与未完成压缩尾部状态放入状态缓存,将 CSA/HCA 完成的压缩 KV 放入分页缓存

DeepSeek-V4 将每个请求的 SWA 与未完成压缩尾部状态放入状态缓存,将 CSA/HCA 完成的压缩 KV 放入分页缓存

这个布局还有一个很具体的对齐问题。CSA 的压缩率是 4,HCA 是 128,因此最小公共对齐单位为

$$
\operatorname{lcm}(4,128)=128.
$$

以 128 个原始 Token 为一个最小逻辑单元时,它正好对应 32 个 CSA 条目和 1 个 HCA 条目。推理引擎可以在这个共同边界上分配块,避免不同注意力层因为压缩粒度不一致而破坏高性能内核的内存布局;实际块大小也可以取 128 的倍数。

论文还设计了磁盘 KV 缓存来复用共享前缀。完成压缩的 CSA/HCA 条目可以直接落盘;SWA 因为未压缩且每层都存在,数据量更大,因此提供三种策略:完整保存、周期性检查点,或者完全不保存并在命中前缀后重算局部状态。这里没有普适最优解:系统提示词、固定代码仓库快照等高复用前缀适合以存储换预填充;几乎没有前缀重复的请求则未必能收回磁盘 I/O 和索引管理成本。

3. Muon 优化器

DeepSeek-V4 的另一个重要变化是大量采用 Muon Optimizer。论文给出的原因非常明确:

Muon 能够获得更快的收敛速度以及更好的训练稳定性。

不同于 AdamW 直接逐元素处理梯度,Muon 更强调矩阵结构,通过类似 Newton-Schulz 的正交化过程调整更新方向。不过 DeepSeek-V4 并没有完全抛弃 AdamW,对于:

  • Embedding;
  • Prediction Head;
  • RMSNorm;

等部分仍然使用 AdamW,而主要矩阵参数采用 Muon。这说明 DeepSeek-V4 的训练策略并不是简单地进行 Optimizer 替换,而是采用混合优化策略。

三、实验

百万上下文结构不是在训练结束后替换一个算子就能获得。两款模型都从 4K 序列开始,逐步扩展到 16K、64K,最后到 1M。Flash 在最初 1T 预训练 Token 中使用稠密注意力,到了 64K 阶段才引入稀疏注意力;CSA 的索引器还要先经历单独的预热,再进入主要稀疏训练阶段。Pro 采用类似过程,但稠密阶段更长。

数值精度也被拆成不同等级:

  • KV 条目的 RoPE 维度使用 BF16,其余维度使用 FP8,以接近减半的存储成本保留对位置计算更敏感的部分;
  • CSA 索引器的注意力计算使用 FP4;
  • 后训练阶段对 MoE 专家权重和索引器 QK 路径执行 FP4 量化感知训练;
  • 索引分数从 FP32 降为 BF16,论文报告 Top-k 选择器获得约 2 倍加速,同时对原选择结果保持 99.7% 的 KV 条目召回率。

最后一个数字需要准确理解:99.7% 指量化后 Top-k 条目相对高精度选择结果的召回,不是长上下文问答准确率。低精度只是在尽量维持索引决策的同时降低访存和计算成本。

此外,DeepSeek-V4 并非只改了注意力。标准残差连接是一条 $x_{l+1}=x_l+\mathcal{F}_l(x_l)$ 的 identity skip path;mHC 则把残差流扩展为 4 条并行通道,分别学习从多路状态中读出子层输入、在跳连路径上混合状态和把子层输出写回多路状态。其中负责跳连混合的矩阵会通过 20 次 Sinkhorn-Knopp 迭代投影到非负双随机矩阵集合,使每行、每列之和都为 1。这个约束允许残差通路学习跨通道混合,同时把谱范数限制在不超过 1 的非扩张映射范围内;多层映射相乘后仍保持双随机性质。mHC 改造的是层与层之间的信息通道,与 CSA/HCA 处理 Token 间依赖的职责正交。

四、结论

我把DeepSeek-V4 的设计归结成了五条设计原则:

  1. 把长上下文看成分层存储,而不是一块等分辨率内存。 最近内容保留原始状态,远处细节按查询检索,完整历史保留低分辨率摘要。
  2. 把找什么和读什么分开。 索引器可以低维、低精度、扫描更多候选;核心注意力只处理少量高价值条目。但必须单独评估索引漏召回带来的质量损失。
  3. 让缓存语义进入模型与推理引擎的共同设计。 不同状态拥有不同生命周期、压缩边界、淘汰策略和持久化价值,统一 KV 数组会掩盖这些差异。
  4. 同时测量预填充、解码、缓存、I/O 与质量。 单步 FLOPs、峰值显存、吞吐、首 Token 延迟和极长上下文召回率回答的是不同问题,不能互相替代。
  5. 区分最大窗口与有效窗口。 真正有意义的指标不是 API 是否接受 1M Token,而是在具体任务、位置分布和成本预算下,模型还能稳定利用多少信息。

因此,DeepSeek-V4 的百万 Token 上下文并不是单靠扩大窗口实现的,而是通过多种机制共同降低长文本带来的开销。CSA 主要负责从长上下文中选择重要信息,HCA 通过更高比例的压缩保留全局信息,SWA 则更关注局部和近期内容。再配合不同形式的 KV Cache 与低精度计算,最终把百万 Token 的存储和注意力计算成本控制在可接受范围内。

当然,这并不意味着模型可以无损地记住一百万个 Token,也不意味着长上下文的成本消失了。DeepSeek-V4 做的是:在有限的计算和显存预算下,模型应该记住什么,又应该在什么时候去读取什么。

参考资料