pydata: Huiming's learning notes

Keep Looking, Don't Settle

DeepSeek-V4: 面向百万Token上下文的高效智能

[TOC]

背景

在之前的文章中,我们详细介绍了 DeepSeek-V3 的 MLA 机制 和 DeepSeek-V3.2 的 Lightning Indexer。MLA 解决了推理时的内存带宽问题,DSA 通过 sparse attention 将计算复杂度从 \(O(L^2)\) 降低到 \(O(L \cdot k)\)。但随着上下文长度推向百万级别(1M tokens),即使是 sparse attention,KV Cache 的绝对大小和注意力的计算开销仍然是瓶颈。

DeepSeek-V4 在 V3.2 的基础上做了根本性的架构升级:引入 Compressed Sparse Attention (CSA)Heavily Compressed Attention (HCA) 的混合注意力架构,从序列维度压缩 KV Cache,再配合 sparse attention,实现了 1M token 上下文下仅需 V3.2 27% 的推理 FLOPs10% 的 KV Cache

本文基于 DeepSeek-V4 技术报告 和开源实现,详细解析 V4 的核心架构创新。

1. 模型概览

DeepSeek-V4 系列包括两个模型:

模型 总参数量 激活参数量 上下文长度 训练数据
DeepSeek-V4-Pro 1.6T 49B 1M tokens 33T tokens
DeepSeek-V4-Flash 284B 13B 1M tokens 32T tokens

相比 DeepSeek-V3.2(671B 总参数 / 37B 激活),V4 的核心创新点:

  1. 混合注意力架构:CSA + HCA 的交替配置,大幅提升长上下文效率
  2. Manifold-Constrained Hyper-Connections (mHC):增强残差连接
  3. Muon 优化器:替代 AdamW,加快收敛并提升训练稳定性

2. 符号定义

以 DeepSeek-V4-Pro 为例,定义本文使用的维度符号:

$$ \begin{aligned} & d = 7168 \quad \text{(模型隐藏维度)} \\ & L = 61 \quad \text{(Transformer 层数)} \\ & n_h = 128 \quad \text{(query head 数)} \\ & d_h = 512 \quad \text{(head 维度)} \\ & d_Q = 1536 \quad \text{(query 压缩维度)} \\ & G = 16 \quad \text{(输出投影分组数)} \\ & d_G = 1024 \quad \text{(中间输出维度)} \\ & H_I = 64 \quad \text{(indexer head 数)} \\ & d_I = 128 \quad \text{(indexer head 维度)} \\ & c = 4 \quad \text{(CSA 压缩率)} \\ & c' = 128 \quad \text{(HCA 压缩率)} \\ & k = 1024 \quad \text{(CSA top-k 选择数)} \\ & w_{\text{win}} = 128 \quad \text{(滑动窗口大小)} \\ & n_{\text{hc}} = 4 \quad \text{(mHC 扩展因子)} \end{aligned} $$

DeepSeek-V4-Flash 的关键差异:\(d = 4096\), \(L = 43\), \(n_h = 64\), \(d_Q = 1024\), \(G = 8\), \(k = 512\)

3. 整体架构

层配置:V4-Pro 的前 2 层使用 HCA,后续层 CSA 和 HCA 交替使用。V4-Flash 的前 2 层使用纯滑动窗口 attention。

4. Compressed Sparse Attention (CSA)

CSA 是 V4 的核心注意力机制:先压缩 KV Cache(序列维度 \(\frac{1}{m}\) 倍),再用 Lightning Indexer 做 sparse selection,只选 top-k 个压缩 entry 做核心注意力

4.1 Compressed Key-Value Entries

设输入隐藏状态为 \(\mathbf{H} \in \mathbb{R}^{n \times d}\)\(n\) 为序列长度,\(d\) 为隐藏维度),CSA 首先计算两组 KV entries 及其对应的压缩权重:

$$\mathbf{C}^a = \mathbf{H} \cdot \mathbf{W}^{aKV}, \quad \mathbf{C}^b = \mathbf{H} \cdot \mathbf{W}^{bKV} \tag{9}$$
$$\mathbf{Z}^a = \mathbf{H} \cdot \mathbf{W}^{aZ}, \quad \mathbf{Z}^b = \mathbf{H} \cdot \mathbf{W}^{bZ} \tag{10}$$

其中 \(\mathbf{W}^{aKV}, \mathbf{W}^{bKV}, \mathbf{W}^{aZ}, \mathbf{W}^{bZ} \in \mathbb{R}^{d \times c}\) 是可训练参数(\(c\) 为 head 维度);\(\mathbf{C}^a, \mathbf{C}^b \in \mathbb{R}^{n \times c}\) 是两组 KV entries;\(\mathbf{Z}^a, \mathbf{Z}^b \in \mathbb{R}^{n \times c}\) 是对应的压缩权重。

Overlapped Compression

\(m\) 个 token 的 KV entries 压缩为一个 entry。核心操作是重叠压缩——每个压缩 entry \(\mathbf{C}^{\text{Comp}}_i\)\(2m\) 个原始 token 加权得到(当前块 \(m\) 个来自 \(\mathbf{C}^a\) + 前一块 \(m\) 个来自 \(\mathbf{C}^b\)):

$$[\mathbf{S}^a_{mi:m(i+1)-1}; \mathbf{S}^b_{m(i-1):mi-1}] = \text{Softmax}_{\text{row}}([\mathbf{Z}^a_{mi:m(i+1)-1} + \mathbf{B}^a; \mathbf{Z}^b_{m(i-1):mi-1} + \mathbf{B}^b]) \tag{11}$$
$$\mathbf{C}^{\text{Comp}}_i = \sum_{j=mi}^{m(i+1)-1} \mathbf{S}^a_j \odot \mathbf{C}^a_j + \sum_{j=m(i-1)}^{mi-1} \mathbf{S}^b_j \odot \mathbf{C}^b_j \tag{12}$$

其中:

  • \(\odot\) 表示 Hadamard 积(逐元素乘法)
  • \(\text{Softmax}_{\text{row}}(\cdot)\) 沿行维度做归一化,跨当前块和前一块共 \(2m\) 个元素
  • \(\mathbf{B}^a, \mathbf{B}^b \in \mathbb{R}^{m \times c}\) 是可学习的位置偏置
  • \(i = 0\) 时,\(\mathbf{Z}^b_{m(i-1):mi-1}\) 填充 \(-\infty\)\(\mathbf{C}^b_{m(i-1):mi-1}\) 填充零

直觉解释

整个序列被划分为连续的块,每块 \(m\) 个 token:块 0 是 token \([0, m-1]\),块 1 是 token \([m, 2m-1]\),…,块 \(i\) 是 token \([mi, m(i+1)-1]\)\(\mathbf{C}^{\text{Comp}}_i\) 就是\(i\) 个压缩块的表示——将块 \(i\) 的信息浓缩为一个 \(c\) 维向量。

Eq. (11) 做了什么:为了计算第 \(i\) 个压缩 entry,我们需要从 \(2m\) 个 token 中学习贡献权重:

  • \(\mathbf{Z}^a_{mi:m(i+1)-1}\):从 \(\mathbf{Z}^a\) 中取出当前块 \(i\)\(m\) 个 token 的压缩分数(位置 \(mi\)\(m(i+1)-1\)
  • \(\mathbf{Z}^b_{m(i-1):mi-1}\):从 \(\mathbf{Z}^b\) 中取出前一个块 \(i-1\)\(m\) 个 token 的压缩分数(位置 \(m(i-1)\)\(mi-1\)

将这 \(2m\) 个分数拼接,加上位置偏置 \(\mathbf{B}^a, \mathbf{B}^b\),然后跨 \(2m\) 个元素做 Softmax 归一化,得到权重 \(\mathbf{S}^a\)(当前块 \(m\) 个)和 \(\mathbf{S}^b\)(前一块 \(m\) 个)。Softmax 确保 \(2m\) 个权重在每个维度上之和为 1,形成竞争关系——模型自适应地决定哪些 token 对该压缩 entry 贡献最大。

Eq. (12) 做了什么:用 Eq. (11) 得到的权重对 KV entries 做加权求和:

  • 第一项 \(\sum_{j=mi}^{m(i+1)-1} \mathbf{S}^a_j \odot \mathbf{C}^a_j\):取当前块 \(i\)\(m\) 个 KV entries(\(\mathbf{C}^a\)),用对应权重 \(\mathbf{S}^a\) 逐维度缩放后求和
  • 第二项 \(\sum_{j=m(i-1)}^{mi-1} \mathbf{S}^b_j \odot \mathbf{C}^b_j\):取前一块 \(i-1\)\(m\) 个 KV entries(\(\mathbf{C}^b\)),用对应权重 \(\mathbf{S}^b\) 逐维度缩放后求和

两项加在一起就是最终的 \(\mathbf{C}^{\text{Comp}}_i \in \mathbb{R}^c\)。注意 \(\odot\) 是 Hadamard 积(逐维度乘法),意味着每个维度独立地选择权重——比 scalar 加权更有表达力,模型可以在不同维度上关注不同的 token。

重叠的意义:块 \(i\) 的压缩 entry 不仅看当前块的 token,还看前一块 \(i-1\) 的 token(通过 \(\mathbf{C}^b\));而块 \(i+1\) 又会看块 \(i\) 的 token。这样相邻压缩块之间共享了边界信息,避免了硬切分导致的信息断裂——跨块边界的语义依赖得以保留。

为何压缩率是 \(\frac{1}{m}\) 而非 \(\frac{1}{2m}\):虽然每个 \(\mathbf{C}^{\text{Comp}}_i\) 来自 \(2m\) 个 token,但 \(\mathbf{C}^a\) 用于 \(\mathbf{C}^{\text{Comp}}_i\) 的 token 位置 \([mi, m(i+1)-1]\),恰好是 \(\mathbf{C}^b\) 用于 \(\mathbf{C}^{\text{Comp}}_{i+1}\) 的 token 位置(重叠部分)。每个原始 token 位置只"主导"一个压缩 entry(通过 \(\mathbf{C}^a\)),同时"辅助"下一个压缩 entry(通过 \(\mathbf{C}^b\))。因此整体压缩率仍为 \(\frac{1}{m}\),最终产出 \(\mathbf{C}^{\text{Comp}} \in \mathbb{R}^{\frac{n}{m} \times c}\)

4.2 Lightning Indexer (Sparse Selection)

压缩后仍有 \(\frac{n}{m}\) 个 KV entries。CSA 用 Lightning Indexer 选出 top-k 个做核心注意力。

Step 1: 压缩 Indexer Keys

对 indexer keys 执行与 \(\mathbf{C}^{\text{Comp}}\) 相同的压缩操作,得到 \(\mathbf{K}^{I\text{Comp}} \in \mathbb{R}^{\frac{n}{m} \times c^I}\),其中 \(c^I\) 是 indexer head 维度。

Step 2: Indexer Queries(低秩投影,与主注意力共享压缩向量 \(\mathbf{c}^Q_t\)

$$\mathbf{c}^Q_t = \mathbf{h}_t \cdot \mathbf{W}^{DQ} \in \mathbb{R}^{d_c} \tag{13}$$
$$[\mathbf{q}^I_{t,1}; \mathbf{q}^I_{t,2}; ...; \mathbf{q}^I_{t,n^I_h}] = \mathbf{q}^I_t = \mathbf{c}^Q_t \cdot \mathbf{W}^{IUQ} \in \mathbb{R}^{n^I_h \cdot c^I} \tag{14}$$

其中 \(\mathbf{W}^{DQ} \in \mathbb{R}^{d \times d_c}\) 为 query 下投影(\(d_c\) 为 query 压缩维度);\(\mathbf{W}^{IUQ} \in \mathbb{R}^{d_c \times c^I n^I_h}\) 为 indexer query 上投影;\(n^I_h\) 为 indexer head 数量。

Step 3: 计算 Index Score(加权多头 ReLU 点积)

$$[w^I_{t,1}; w^I_{t,2}; ...; w^I_{t,n^I_h}] = \mathbf{w}^I_t = \mathbf{h}_t \cdot \mathbf{W}^w \tag{15}$$
$$I_{t,s} = \sum_{h=1}^{n^I_h} w^I_{t,h} \cdot \text{ReLU}\left(\mathbf{q}^I_{t,h} \cdot \mathbf{K}^{I\text{Comp}}_s\right) \tag{16}$$

其中 \(\mathbf{W}^w \in \mathbb{R}^{d \times n^I_h}\) 是可学习权重矩阵;\(w^I_{t,h} \in \mathbb{R}\) 是第 \(h\) 个 indexer head 的标量权重;\(s < \lfloor\frac{t}{m}\rfloor\) 保证因果性。

Step 4: Top-k 选择

$$\mathcal{C}^{\text{SprsComp}}_t = \left\{\mathbf{C}^{\text{Comp}}_s \mid I_{t,s} \in \text{Top-k}(I_{t,:})\right\} \tag{17}$$

每个 query token \(t\)\(\frac{n}{m}\) 个压缩 entry 中选出 \(k\) 个。

4.3 Shared Key-Value MQA

选出稀疏 KV entries 后,CSA 执行核心注意力。关键设计:每个压缩 KV entry 同时作为 key 和 value(Shared Key-Value MQA)。

主注意力的 queries 从同一个 \(\mathbf{c}^Q_t\) 上投影得到(与 indexer queries 共享压缩向量 \(\mathbf{c}^Q_t\)):

$$[\mathbf{q}_{t,1}; \mathbf{q}_{t,2}; ...; \mathbf{q}_{t,n_h}] = \mathbf{q}_t = \mathbf{c}^Q_t \cdot \mathbf{W}^{UQ} \tag{18}$$
$$\mathbf{o}_{t,i} = \text{CoreAttn}\left(\text{query}=\mathbf{q}_{t,i}, \text{key}=\mathcal{C}^{\text{SprsComp}}_t, \text{value}=\mathcal{C}^{\text{SprsComp}}_t\right) \tag{19}$$

其中 \(\mathbf{W}^{UQ} \in \mathbb{R}^{d_c \times c \cdot n_h}\)\(n_h\) 为主注意力 head 数量。注意 key 和 value 是同一组 entry。

与 V3.2 MLA 的关键区别:MLA 为 key 和 value 分别做上投影 (\(\mathbf{W}^{UK}\), \(\mathbf{W}^{UV}\)),KV Cache 中需要存独立的压缩向量。而 CSA 的 Shared KV 设计使得每个 entry 只需存一份,KV Cache 开销大幅减少。

4.4 Grouped Output Projection

\(n_h\) 很大时,直接将 \([\mathbf{o}_{t,1}; ...; \mathbf{o}_{t,n_h}] \in \mathbb{R}^{n_h \cdot c}\) 投影到 \(\mathbb{R}^d\) 计算量巨大。V4 设计了分组输出投影:

  1. \(n_h\) 个 head 分成 \(G\)
  2. 每组 \(\frac{n_h}{G}\) 个 head 的拼接输出 \(\mathbf{o}^g_t \in \mathbb{R}^{\frac{n_h}{G} \cdot c}\) 先投影到中间维度 \(d_G\)
  3. 再将 \(G\) 组中间输出拼接后投影到最终维度 \(d\)
$$\mathbf{o}^{g'}_t = \mathbf{o}^g_t \cdot \mathbf{W}^g_{\text{proj1}}, \quad \mathbb{R}^{\frac{n_h}{G} \cdot c} \to \mathbb{R}^{d_G}$$
$$\hat{\mathbf{o}}_t = [\mathbf{o}^{1'}_t; ...; \mathbf{o}^{G'}_t] \cdot \mathbf{W}_{\text{proj2}}, \quad \mathbb{R}^{G \cdot d_G} \to \mathbb{R}^{d}$$

4.5 其他细节

论文还描述了 CSA(及 HCA)的几项附加技术:

Query 和 KV Entry 归一化:在核心注意力之前,对每个 query head 和压缩 KV entry 执行 RMSNorm,避免 attention logits 爆炸。

Partial RoPE:对 query 向量和 KV entry 向量的最后 64 维施加 RoPE。由于 KV entry 同时作为 key 和 value,朴素注意力输出 \(\mathbf{o}_{t,i}\) 会带有绝对位置编码。对策:对 \(\mathbf{o}_{t,i}\) 的最后 64 维施加位置为 \(-t\) 的 RoPE,使最终输出携带相对位置信息。

滑动窗口分支(Sliding Window KV Entries)

为什么需要(两个互补的原因):

原因一:因果性硬约束——同块 token 通过压缩路径完全不可达。 压缩 entry \(\mathbf{C}^{\text{Comp}}_i\) 是块 \(i\)全部 \(m\) 个 token 的加权融合(Eq. 12),包含了块内所有 token 的信息——包括块内靠后位置的"未来"token。由于 autoregressive 因果性,位于块 \(i\) 内位置 \(t\) 的 query 不能使用 \(\mathbf{C}^{\text{Comp}}_i\)(否则会偷看到 \(t\) 之后的 token)。论文的约束是 \(s < \lfloor\frac{t}{m}\rfloor\),即 query \(t\) 只能 attend 到完全在它之前的压缩块。这意味着块 \(i\) 内位于 \(t\) 之前的 token(位置 \(mi\)\(t-1\)),虽然是合法的"过去",但被融合进了含有未来信息的 \(\mathbf{C}^{\text{Comp}}_i\),通过压缩路径根本无法访问

原因二:局部细节需要高精度——压缩会丢失 fine-grained 信息。 在语言模型中,当前 query 与刚过去的邻近 token 关系最为紧密和微妙。即使前面的压缩块(\(s < \lfloor\frac{t}{m}\rfloor\))可以访问,这些块的信息也是 \(m\) 个 token 融合后的"粗粒度摘要"。对于局部上下文(最近几十个 token),模型需要逐 token 级别的精确表示,而非压缩后的混合信号。

具体做法:为每个 query token 额外产出最近 \(n_{\text{win}}\) 个 token 的未压缩 KV entries。这些 entries 与 compressed entries 维度相同(都是 \(c = 512\)),但不经过任何压缩操作,以原始精度保留。在核心注意力中,query 同时 attend to 两部分:

  • Compressed KV entries:经过压缩(和 sparse selection)的全局长程记忆
  • Sliding Window KV entries:未压缩的最近 \(n_{\text{win}}\) 个 token,负责精确的局部上下文

两者参与同一个 softmax attention 计算(因为维度相同,可以直接拼接为统一的 key/value 集合)。

具体配置与 attention 总 entry 数

参数 V4-Pro V4-Flash
attention top-k(indexer 选出的压缩 entry 数) 1024 512
\(n_{\text{win}}\)(sliding window 大小) 128 128
每个 query 实际 attend to 的 entry 总数 \(1024 + 128 = 1152\) \(512 + 128 = 640\)

Top-k 远大于 \(n_{\text{win}}\):top-k 覆盖全局长程依赖(从 \(\frac{n}{m}\) 个压缩 entries 中选出最相关的),\(n_{\text{win}}\) 覆盖局部精细依赖(最近 128 个 token 的未压缩表示)。两者拼接后共同参与同一个 softmax attention 计算(再加上 attention sink)。

工程实现:滑动窗口 entries 存储在固定大小的 state cache 中。随着新 token 生成,最老的 token 滑出窗口并被送入压缩路径。因此滑动窗口的内存开销是固定的、不随上下文长度增长。

与 compressed entries 维度相同的原因:从代码看,self.wkv = Linear(self.dim, self.head_dim) 同时用于产出 sliding window entries 和作为压缩路径的输入——两者共享同一个投影矩阵和 head 维度 \(c\)。这是 Shared Key-Value MQA 的设计要求:所有 entries(无论压缩与否)都同时充当 key 和 value,必须在同一个 attention 运算中兼容。

Attention Sink:设可学习的 sink logits \(\{s'_1, ..., s'_{n_h}\}\),修改注意力分数计算:

$$a_{h,t,j} = \frac{\text{Exp}(l_{h,t,j})}{\sum_k \text{Exp}(l_{h,t,k}) + \text{Exp}(s'_h)} \tag{27}$$

使得每个 head 的注意力分数之和可以不等于 1(甚至接近 0),允许 head "不关注任何东西"。

4.6 CSA 完整数据流图

20260628_deekseekV4_CSA

5. Heavily Compressed Attention (HCA)

HCA 采用更激进的压缩(\(m' \gg m\)),但不使用 sparse attention——直接对所有压缩 entries 做 dense attention。

5.1 非重叠压缩

与 CSA 不同,HCA 只使用一组 KV entries,且压缩是非重叠的:

$$\mathbf{C} = \mathbf{H} \cdot \mathbf{W}^{KV}, \quad \mathbf{Z} = \mathbf{H} \cdot \mathbf{W}^{Z} \tag{20-21}$$
$$\mathbf{S}_{m'i:m'(i+1)-1} = \text{Softmax}_{\text{row}}(\mathbf{Z}_{m'i:m'(i+1)-1} + \mathbf{B}) \tag{22}$$
$$\mathbf{C}^{\text{Comp}}_i = \sum_{j=m'i}^{m'(i+1)-1} \mathbf{S}_j \odot \mathbf{C}_j \tag{23}$$

\(m'\) 个 token 压缩为一个 entry,无重叠。结果 \(\mathbf{C}^{\text{Comp}} \in \mathbb{R}^{\frac{n}{m'} \times c}\)。对于 1M 上下文,HCA 的 KV entries 数量仅为 \(\frac{10^6}{128} \approx 7812\) 个。

5.2 Dense Shared Key-Value MQA

由于压缩后 entries 极少,HCA 直接对全部压缩 entries 做 dense attention。Query 投影方式与 CSA 相同(低秩):

$$\mathbf{c}^Q_t = \mathbf{h}_t \cdot \mathbf{W}^{DQ}, \quad [\mathbf{q}_{t,1}; ...; \mathbf{q}_{t,n_h}] = \mathbf{c}^Q_t \cdot \mathbf{W}^{UQ} \tag{24-25}$$
$$\mathbf{o}_{t,i} = \text{CoreAttn}\left(\text{query}=\mathbf{q}_{t,i}, \text{key}=\mathbf{C}^{\text{Comp}}, \text{value}=\mathbf{C}^{\text{Comp}}\right) \tag{26}$$

HCA 同样使用 Shared Key-Value MQA(KV entry 同时作为 key 和 value)、Grouped Output Projection、RMSNorm、Partial RoPE、滑动窗口和 Attention Sink。

5.3 HCA 完整数据流图

20260628_deekseekV4_HCA

6. CSA 与 HCA 的对比

特性 CSA HCA
压缩率 \(m = 4\) \(m' = 128\)
压缩方式 重叠压缩(\(2m\) tokens, 两组 \(C^a, C^b\) 非重叠压缩(\(m'\) tokens, 一组 \(C\)
Sparse Attention 是(Lightning Indexer + Top-k) 否(dense)
KV entries 数(1M context) \(\frac{10^6}{4} = 250K\),sparse 选 \(k\) \(\frac{10^6}{128} \approx 7812\)
层配置(V4-Pro) 偶数层(Layer 2, 4, 6, ...) 奇数层 + 前 2 层
适合场景 需要 fine-grained token-level 信息 粗粒度语义理解

设计哲学:CSA 先轻度压缩再 sparse select,保留 token-level 精度;HCA 做极度压缩但保持 dense,确保全局信息覆盖。两者互补。

7. 注意力层的其他细节

7.1 Partial RoPE

CSA 和 HCA 都对 queries、KV entries、以及 attention outputs 的最后 64 维应用 RoPE:

$$\mathbf{q}_{t,i} \leftarrow [\mathbf{q}^{\text{nope}}_{t,i} \;;\; \text{RoPE}(\mathbf{q}^{\text{pe}}_{t,i})] \tag{18}$$

特殊处理:由于 KV entry 同时作为 key 和 value,naive attention output 会携带绝对位置编码。为此,对 attention output 的最后 64 维也应用 RoPE(position \(-t\)),使最终输出只携带相对位置信息。

7.2 滑动窗口注意力 (SWA)

由于压缩操作的因果性要求,每个 query 只能 attend 已完成压缩的前置块。为补充当前块内的局部信息,引入一个额外的滑动窗口分支:

  • 窗口大小 \(w_{\text{win}} = 128\)
  • 为最近 128 个 token 生成未压缩的 KV entries
  • 在 core attention 中与压缩 KV entries 一起使用

7.3 Attention Sink

在 core attention 的 softmax 分母中加入一个可学习的 sink logit,允许注意力权重总和不为 1:

$$a_{h,t,s} = \frac{\text{Exp}(l_{h,t,s})}{\sum_{s'} \text{Exp}(l_{h,t,s'}) + \text{Exp}(s'_h)} \tag{19}$$

其中 \(s'_h\) 是每个 head 的可学习 sink logit。

7.4 Query/KV Entry Normalization

在 core attention 之前,对 queries 和 KV entries 分别做 RMSNorm,防止 attention logits 爆炸。

8. Manifold-Constrained Hyper-Connections (mHC)

V4 使用 mHC 替代传统残差连接,增强信号在层间的传播。

8.1 基本思想

标准 Hyper-Connections (HC) 将残差流宽度扩展 \(n_{\text{hc}}\) 倍:从 \(\mathbb{R}^d\) 扩展到 \(\mathbb{R}^{n_{\text{hc}} \times d}\)\(n_{\text{hc}} = 4\))。

每层的变换包含三个映射:

  • Input mapping \(\mathbf{A}_i \in \mathbb{R}^{1 \times n_{\text{hc}}}\):从扩展残差流中提取 \(d\) 维输入给层
  • Residual mapping \(\mathbf{M}_i \in \mathbb{R}^{n_{\text{hc}} \times n_{\text{hc}}}\):变换残差流本身
  • Output mapping \(\mathbf{O}_i \in \mathbb{R}^{n_{\text{hc}} \times 1}\):将层输出注入回扩展残差流

8.2 Manifold 约束

mHC 的核心创新是将残差映射矩阵 \(\mathbf{M}_i\) 约束到双随机矩阵的流形(Birkhoff 多面体)

$$\mathbf{M}_i \in \mathcal{M} \triangleq \{\mathbf{A} \in \mathbb{R}^{n \times n} \mid \mathbf{A}\mathbf{1}_n = \mathbf{1}_n, \; \mathbf{1}_n^T\mathbf{A} = \mathbf{1}_n^T, \; \mathbf{A} \geq 0\} \tag{20}$$

这确保:

  1. 谱范数有界 \(\|\mathbf{M}_i\|_2 \leq 1\):残差变换是非扩张的,前向传播和反向传播数值稳定
  2. 乘法封闭\(\mathcal{M}\) 在矩阵乘法下封闭,多层 mHC 堆叠后仍然稳定

8.3 动态参数化

三个映射的参数由动态(输入依赖)+ 静态(偏置)两部分组成:

$$\hat{\mathbf{x}}_i = \text{RMSNorm}(\text{vec}(\mathbf{x}_i)) \in \mathbb{R}^{1 \times n_{\text{hc}} d} \tag{21}$$
$$\tilde{\mathbf{A}}_i = \Psi^{\text{pre}}_i \cdot (\hat{\mathbf{x}}_i \mathbf{W}^{\text{pre}}_i) + \mathbf{b}^{\text{pre}}_i \tag{22}$$
$$\tilde{\mathbf{M}}_i = \Psi^{\text{res}}_i \cdot \text{Mat}(\hat{\mathbf{x}}_i \mathbf{W}^{\text{res}}_i) + \mathbf{B}^{\text{res}}_i \tag{23}$$
$$\tilde{\mathbf{O}}_i = \Psi^{\text{post}}_i \cdot (\hat{\mathbf{x}}_i \mathbf{W}^{\text{post}}_i)^T + \mathbf{b}^{\text{post}}_i \tag{24}$$

其中 \(\Psi\) 是可学习的 gating factors(初始化为小值),\(\mathbf{W}\) 是动态投影矩阵。

8.4 约束应用

对原始参数应用约束:

  • Input/Output mapping:用 Sigmoid 确保非负有界
$$\mathbf{A}_i = \sigma(\tilde{\mathbf{A}}_i), \quad \mathbf{O}_i = 2\sigma(\tilde{\mathbf{O}}_i) \tag{25}$$
  • Residual mapping:用 Sinkhorn-Knopp 迭代投影到双随机矩阵
$$\mathbf{M}_i = \text{SinkhornKnopp}(\exp(\tilde{\mathbf{M}}_i), \; n_{\text{max}}=20) \tag{26}$$

9. Muon 优化器

V4 系列的大部分参数使用 Muon 优化器(而非 AdamW),其核心思想是对梯度做近似正交化

9.1 算法

对于每个逻辑独立的权重矩阵 \(\mathbf{W} \in \mathbb{R}^{m \times n}\)

$$ \begin{aligned} & \mathbf{G}_t = \nabla_\mathbf{W} \mathcal{L}_t(\mathbf{W}_{t-1}) \\ & \mathbf{M}_t = \beta \mathbf{M}_{t-1} + \mathbf{G}_t \\ & \mathbf{U}'_t = \text{HybridNewtonSchulz}(\beta \mathbf{M}_t + \mathbf{G}_t) \\ & \mathbf{U}_t = \mathbf{U}'_t \cdot \sqrt{\max(m, n)} \cdot \rho \\ & \mathbf{W}_t = \mathbf{W}_{t-1} \cdot (1 - \lambda \varepsilon) - \varepsilon \mathbf{U}_t \end{aligned} \tag{27} $$

其中:

  • \(\beta = 0.95\):动量系数
  • \(\lambda = 0.1\):权重衰减
  • \(\rho\):RMS 重缩放因子(V4 中设为 0.18)
  • HybridNewtonSchulz:将矩阵近似正交化为 \(\mathbf{U}\mathbf{V}^T\) 形式

9.2 Hybrid Newton-Schulz 迭代

目标:将矩阵 \(\mathbf{X}\)(SVD = \(\mathbf{U}\Sigma\mathbf{V}^T\))正交化为 \(\mathbf{U}\mathbf{V}^T\)

先归一化 \(\mathbf{X}_0 = \mathbf{X} / \|\mathbf{X}\|_F\),然后迭代:

$$\mathbf{X}_k = a\mathbf{X}_{k-1} + b(\mathbf{X}_{k-1}\mathbf{X}_{k-1}^T)\mathbf{X}_{k-1} + c(\mathbf{X}_{k-1}\mathbf{X}_{k-1}^T)^2\mathbf{X}_{k-1} \tag{28}$$

V4 使用 10 次迭代,分两阶段:

  • 前 8 步:\((a, b, c) = (3.4445, -4.7750, 2.0315)\),快速收敛
  • 后 2 步:\((a, b, c) = (2, -1.5, 0.5)\),精确稳定在 1

9.3 使用范围

优化器 应用模块
Muon 绝大部分参数(attention, MoE experts, etc.)
AdamW Embedding, Prediction Head, RMSNorm, mHC 的静态偏置和 gating

10. MoE (Mixture-of-Experts)

V4 沿用 DeepSeekMoE 架构,但做了若干调整:

10.1 V4-Pro 配置

  • 每层 1 个 shared expert + 384 个 routed experts
  • 每个 expert 的 intermediate dimension = 3072
  • 每个 token 激活 6 个 routed experts
  • 激活函数:\(\sqrt{\text{Softplus}(\cdot)}\)(替代 V3 的 Sigmoid)

10.2 Hash Routing

V4-Pro 的前 3 层 MoE 使用 Hash routing(根据 input token ID 的哈希函数确定目标 expert),后续层使用标准 learned routing。

10.3 负载均衡

  • Auxiliary-loss-free 策略(bias update speed = 0.001)
  • 额外的 sequence-wise balance loss(weight = 0.0001)防止单序列内极端不均衡

11. 效率分析

11.1 单 Token 推理 FLOPs 对比(1M context)

模型 单 Token FLOPs 相对 V3.2
DeepSeek-V3.2 基准 100%
DeepSeek-V4-Pro 约 0.27× 27%
DeepSeek-V4-Flash 约 0.10× 10%

11.2 KV Cache 对比(1M context)

模型 累计 KV Cache 相对 V3.2
DeepSeek-V3.2 ~50 GB 100%
DeepSeek-V4-Pro ~5 GB 10%
DeepSeek-V4-Flash ~3.6 GB 7%

11.3 效率来源分析

CSA 的效率提升路径:

$$L \xrightarrow{\text{压缩} \div c} \frac{L}{c} \xrightarrow{\text{sparse top-k}} k$$

以 V4-Pro 为例(\(L = 10^6\), \(c = 4\), \(k = 1024\)):

  • 压缩后 KV entries 数:\(\frac{10^6}{4} = 250K\)
  • Sparse 选择后实际 attend 数:\(1024\)
  • 总压缩比:\(\frac{1024}{10^6} \approx 0.1\%\)

HCA 的效率:

  • 直接压缩 \(128 \times\)\(\frac{10^6}{128} \approx 7812\) entries
  • Dense attend,无需 indexer 开销

11.4 精度优化

  • KV entries 存储:RoPE 维度用 BF16,其余用 FP8(接近减半存储)
  • Lightning Indexer 的 QK 计算:FP4 精度
  • Routed expert 参数:FP4 精度(推理时)
  • Index scores:量化存储

12. 训练策略

12.1 Pre-training 阶段

阶段 序列长度 说明
初始 4K Dense attention
中期 16K → 64K 引入 sparse attention (两阶段)
后期 1M Sparse attention

Sparse attention 引入流程:

  1. 前 1T tokens 使用 dense attention warmup
  2. 序列长度扩展到 64K 时引入 sparse attention
  3. 先短暂 warmup lightning indexer,然后全程 sparse training

12.2 Hyper-parameters(V4-Pro)

$$ \begin{aligned} & \text{Batch size (max)}: 94.4M \text{ tokens} \\ & \text{Peak LR}: 2.0 \times 10^{-4} \\ & \text{End LR}: 2.0 \times 10^{-5} \\ & \text{AdamW}: \beta_1 = 0.9, \; \beta_2 = 0.95, \; \varepsilon = 10^{-20} \\ & \text{Weight decay}: 0.1 \\ & \text{MTP loss weight}: 0.3 \to 0.1 \text{ (LR decay 时切换)} \end{aligned} $$

12.3 训练稳定性技术

Anticipatory Routing:将 routing 的计算和 backbone 更新解耦——在 step \(t\) 时,使用当前参数 \(\theta_t\) 做特征计算,但 routing indices 使用历史参数 \(\theta_{t - \Delta t}\) 预计算。

SwiGLU Clamping:将 SwiGLU 的线性部分 clamp 到 \([-10, 10]\),gate 部分上界 clamp 到 10。

13. Post-Training

V4 的 post-training 采用两阶段范式:

13.1 Specialist Training

针对不同领域(math, code, agent, instruction following)独立训练 specialist 模型:

  1. SFT 阶段:在高质量领域数据上做 supervised fine-tuning
  2. RL 阶段:使用 GRPO (Group Relative Policy Optimization) + 领域专用 reward model

13.2 On-Policy Distillation (OPD)

将多个 specialist 合并为统一模型:

$$\mathcal{L}_{\text{OPD}}(\theta) = \sum_{i=1}^{N} \lambda_i \cdot D_{\text{KL}}\left(\pi_\theta \| \pi_{T_i}\right) \tag{29}$$

其中:

  • \(\pi_\theta\):student 模型
  • \(\pi_{T_i}\):第 \(i\) 个 teacher (specialist)
  • \(\lambda_i\):teacher 权重
  • \(D_{\text{KL}}(\pi_\theta \| \pi_{T_i})\)reverse KL

关键技术选择:

  • 使用 full-vocabulary logit distillation(而非 token-level KL 近似),梯度估计更稳定
  • 采用 reverse KL(student \(\to\) teacher),鼓励 mode-seeking behavior
  • 训练轨迹从 student 采样(on-policy),超过 10 个 teacher 参与蒸馏

13.3 FP4 Quantization-Aware Training

在 post-training 阶段引入 QAT,让模型适应量化带来的精度损失:

  • MoE expert weights → FP4 (MXFP4)
  • CSA Indexer 的 QK path → FP4
  • Forward:用 FP4 模拟量化(通过 FP8 中间格式)
  • Backward:STE (Straight-Through Estimator)

13.4 推理模式

模式 特点 格式
Non-think 快速直觉响应 </think> summary
Think High 有意识的逻辑分析 <think>..tokens..</think> summary
Think Max 推理能力的极限 特殊 system prompt + <think>..tokens..</think>

14. Benchmark 结果

14.1 Pre-training 基座模型

Benchmark V3.2-Base (37B/671B) V4-Flash-Base (13B/284B) V4-Pro-Base (49B/1.6T)
MMLU 87.8 88.7 90.1
MMLU-Pro 65.5 68.3 73.5
SimpleQA verified 28.3 30.1 55.2
FACTS Parametric 27.1 33.9 62.6
HumanEval 62.8 69.5 76.8
MATH 60.5 57.4 64.5
LongBench-V2 40.2 44.7 51.5

关键发现:V4-Flash(13B 激活)以 V3.2(37B 激活)不到一半的参数量,在大多数 benchmark 上超越 V3.2。

14.2 Post-training (V4-Pro-Max vs 竞品)

Benchmark Opus-4.6 Max GPT-5.4 xHigh Gemini-3.1-Pro High V4-Pro-Max
SimpleQA-Verified 46.2 45.3 75.6 57.9
GPQA Diamond 91.3 93.0 94.3 90.1
HLE 40.0 39.8 44.4 37.7
LiveCodeBench 88.8 - 91.7 93.5
Codeforces (Rating) - 3168 3052 3206
Apex Shortlist 85.9 78.1 89.1 90.2
SWE Verified 80.8 - 80.6 80.6
Terminal Bench 2.0 65.4 75.1 68.5 67.9

15. 设计选择总结

设计选择 原因
混合 CSA + HCA CSA 提供 fine-grained 信息, HCA 提供全局覆盖,互补
重叠压缩 (CSA) 相邻块边界信息不丢失,提升 recall
Shared Key-Value MQA 同一 entry 作为 key 和 value,大幅减少 KV Cache
Grouped Output Projection 解决高 head 数导致的输出投影计算量
mHC (Birkhoff polytope) 双随机矩阵约束确保深层堆叠的数值稳定性
Muon 优化器 比 AdamW 更快收敛,配合 RMSNorm 免去 QK-Clip
FP4 Indexer + Expert 进一步压缩计算和存储开销
Anticipatory Routing 解耦 routing 和 backbone 更新,消除 loss spikes
SwiGLU Clamping 直接抑制异常值,稳定训练
On-Policy Distillation 替代 mixed RL,更稳定地合并多领域 specialist
滑动窗口注意力分支 补充压缩导致的局部信息缺失

16. 与 V3.2 架构的关键区别

维度 DeepSeek-V3.2 DeepSeek-V4
注意力机制 MLA + DSA (Lightning Indexer) CSA + HCA (混合压缩)
KV Cache 形式 低秩压缩 (\(\mathbf{c}^{KV}\), 512d per token) 序列维度压缩 (每 4/128 tokens → 1 entry)
残差连接 标准 residual mHC (Birkhoff polytope)
优化器 AdamW Muon (大部分参数)
上下文长度 128K 1M
Indexer 作用对象 原始 token 压缩后的 KV entries
总参数量 (大模型) 671B 1.6T
激活参数量 37B 49B

17. 总结

DeepSeek-V4 的核心设计哲学可以概括为:多层次压缩 + 精准选择

  1. 序列维度压缩:CSA 将 \(L\) 个 token 压缩为 \(\frac{L}{c}\) 个 entry,HCA 压缩为 \(\frac{L}{c'}\) 个 entry
  2. Sparse Selection:CSA 进一步从 \(\frac{L}{c}\) 个 entry 中只选 \(k\)
  3. 混合配置:CSA 层保留细粒度信息,HCA 层保证全局覆盖
  4. 精度优化:FP4 indexer, FP8/FP4 KV cache, FP4 expert weights

最终实现了在 1M token 上下文下:

  • FLOPs 仅为 V3.2 的 27%(V4-Pro)/ 10%(V4-Flash)
  • KV Cache 仅为 V3.2 的 10%(V4-Pro)/ 7%(V4-Flash)
  • 性能上 V4-Pro-Max 在多数 benchmark 达到或接近 frontier 水平

这使得百万级别上下文从"理论可行"变为"日常可用",为未来的 test-time scaling 和长程 agentic 任务奠定了基础。

参考