Skip to content

Something About DeepSeek


探索未至之境

DeepSeek (深度求索), founded in 2023, is a Chinese company dedicated to making AGI a reality.

Unravel the mystery of AGI with curiosity. Answer the essential question with long-termism.

本文由AI生成,尚未完全完成Review

至于什么时候再把这一页捡起,只有天知道……

DeepSeek-V2

A Strong, Economical, and Efficient Mixture-of-Experts Language Model

基本信息

发布时间:2024 年 5 月

技术报告DeepSeek-V2

模型规模:236B 总参数,21B 激活(MoE);另有 Lite 版 15.7B 总参数,2.4B 激活 | 预训练:8.1T tokens(中英双语,中文 tokens 比英文多约 12%)| 上下文:128K(通过 YaRN 从 4K 扩展)| 架构:60 层 Transformer,隐藏维度 5120,128 注意力头,每头维度 128

性能评价:MMLU 78.5、BBH 78.9、MATH 43.6、HumanEval 48.8、C-Eval 81.7、CMMLU 84.0。仅 21B 激活参数即在开源模型中达到顶级水平,超越 DeepSeek 67B(Dense)在几乎所有基准上的表现,同时节省 42.5% 训练成本、KV Cache 减少 93.3%、最大生成吞吐量提升至 5.76 倍。Chat 版本(RL)在 AlpacaEval 2.0 达到 38.9% 长度控制胜率,MT-Bench 8.97 分,AlignBench 7.91 分(超越 GPT-4-0613)。

外界评价:DeepSeek-V2 是首个在开源 MoE 模型中同时实现高性能和低成本的模型,其 MLA 机制被业界认为是 KV Cache 优化的里程碑式工作,直接影响了后续 V3、V4 的架构设计。

Multi-head Latent Attention(MLA)

传统做法:标准多头注意力(MHA)在推理时需要缓存所有层所有头的 Key 和 Value,KV Cache 大小为 \(2 n_h d_h l\)\(n_h\) 为头数,\(d_h\) 为每头维度,\(l\) 为层数)。这成为长序列推理的瓶颈——batch size 和序列长度都受 KV Cache 内存限制。

已有的优化方案:

方案 KV Cache 性能
MHA(标准) \(2 n_h d_h l\)
GQA(分组查询注意力) \(2 n_g d_h l\) 中等
MQA(多查询注意力) \(2 d_h l\)

GQA 和 MQA 通过减少 K/V 头数来降低缓存,但代价是性能下降。

DeepSeek-V2 的改动:设计了 MLA(Multi-head Latent Attention),核心思想是低秩联合压缩——不直接缓存 K 和 V,而是将它们压缩到一个低维潜向量(latent vector)中:

\[\mathbf{c}_t^{KV} = W^{DKV} \mathbf{h}_t\]
\[\mathbf{k}_t^C = W^{UK} \mathbf{c}_t^{KV}, \quad \mathbf{v}_t^C = W^{UV} \mathbf{c}_t^{KV}\]

其中 \(\mathbf{c}_t^{KV} \in \mathbb{R}^{d_c}\) 是压缩后的潜向量,\(d_c \ll d_h n_h\)。推理时只需缓存 \(\mathbf{c}_t^{KV}\),KV Cache 大小降为 \(d_c l\)

关键优化:上投影矩阵 \(W^{UK}\) 可以被吸收到 \(W^Q\) 中,\(W^{UV}\) 可以被吸收到 \(W^O\) 中——推理时甚至不需要显式计算出 K 和 V,直接用压缩向量做注意力计算。

解耦 RoPE 问题:RoPE 是位置敏感的,如果直接对压缩后的 K 应用 RoPE,\(W^{UK}\) 会与位置相关的 RoPE 矩阵耦合,导致 \(W^{UK}\) 无法被 \(W^Q\) 吸收(矩阵乘法不满足交换律)。解决方案是解耦 RoPE——用额外的多头查询 \(\mathbf{q}_t^{R,i}\) 和共享 key \(\mathbf{k}_t^R\) 来承载位置信息:

\[[\mathbf{q}_t^{R,1}; \ldots; \mathbf{q}_t^{R,n_h}] = \text{RoPE}(W^{QR} \mathbf{c}_t^Q)\]
\[\mathbf{k}_t^R = \text{RoPE}(W^{KR} \mathbf{h}_t)\]
\[\mathbf{q}_{t,i} = [\mathbf{q}_{t,i}^C; \mathbf{q}_{t,i}^R], \quad \mathbf{k}_{t,i} = [\mathbf{k}_{t,i}^C; \mathbf{k}_t^R]\]

推理时需要额外缓存解耦 key,总 KV Cache 为 \((d_c + d_h^R) l\)

MLA 的 KV Cache 对比

机制 KV Cache(每 token 元素数) 性能
MHA \(2 n_h d_h l\)
GQA \(2 n_g d_h l\) 中等
MQA \(2 d_h l\)
MLA \((d_c + d_h^R) l \approx \frac{9}{2} d_h l\) 更强

DeepSeek-V2 中 \(d_c = 4 d_h\)\(d_h^R = d_h / 2\),MLA 的 KV Cache 等效于 GQA 仅 2.25 个分组,但性能超越 MHA。

DeepSeekMoE 架构

传统 MoE 的问题:GShard 等传统 MoE 架构使用少量大粒度专家(如 8 个),每个专家承载大量知识,容易出现知识冗余——不同专家学到相似的内容,专家特化程度低。

DeepSeek-V2 的改动:采用 DeepSeekMoE 架构,两个核心设计:

设计一:细粒度专家分割

将传统的大专家拆成更多小专家。DeepSeek-V2 每个 MoE 层有 160 个路由专家 + 2 个共享专家,每 token 激活 6 个路由专家。中间隐藏维度为 1536(相比传统 MoE 的大专家更小)。

为什么有效?细粒度分割让每个专家更专注于特定知识领域,提高专家特化程度。类比:一个全能工程师 vs 六个各自专精的专家团队,后者在各自领域更深入。

设计二:共享专家隔离

除了路由专家外,设置 2 个共享专家对所有 token 都激活。共享专家捕获通用知识(语法、常见模式等),路由专家专注于特定领域知识。这减少了路由专家之间的知识冗余——不需要每个路由专家都学一遍"的"字怎么用。

FFN 输出计算:

\[\mathbf{h}_t' = \mathbf{u}_t + \sum_{i=1}^{N_s} \text{FFN}_i^{(s)}(\mathbf{u}_t) + \sum_{i=1}^{N_r} g_{i,t} \cdot \text{FFN}_i^{(r)}(\mathbf{u}_t)\]

其中 \(g_{i,t}\) 由 top-K 路由决定:

\[g_{i,t} = \begin{cases} s_{i,t} & \text{if } s_{i,t} \in \text{TopK}(\{s_{j,t} | 1 \leqslant j \leqslant N_r\}, K_r) \\ 0 & \text{otherwise} \end{cases}\]
\[s_{i,t} = \text{Softmax}_i(\mathbf{u}_t^T \mathbf{e}_i)\]

设备限制路由(Device-Limited Routing):专家并行时,如果 token 被路由到太多设备,通信开销会很大。DeepSeek-V2 限制每个 token 最多发送到 \(M = 3\) 个设备——先选 3 个亲和力最高的设备,再在这些设备内做 top-K 选择。实验表明 \(M \geqslant 3\) 时性能接近无限制路由。

三重辅助损失:为保证负载均衡,设计了三个辅助损失:

损失 目标 公式
专家级平衡 \(L_{\text{ExpBal}}\) 防止路由崩溃(部分专家不被选中) \(\alpha_1 \sum_{i=1}^{N_r} f_i P_i\)
设备级平衡 \(L_{\text{DevBal}}\) 各设备计算量均衡 \(\alpha_2 \sum_{i=1}^{D} f_i' P_i'\)
通信平衡 \(L_{\text{CommBal}}\) 各设备通信量均衡 \(\alpha_3 \sum_{i=1}^{D} f_i'' P_i''\)

其中 \(f_i\) 是实际被路由到专家 \(i\) 的 token 比例,\(P_i\) 是路由概率均值。超参数 \(\alpha_1 = 0.003\)\(\alpha_2 = 0.05\)\(\alpha_3 = 0.02\)

Token-Dropping 策略:辅助损失无法保证严格均衡,因此在训练时采用设备级 token 丢弃——计算每个设备的平均计算预算(容量因子 = 1.0),丢弃亲和力最低的 token 直到满足预算。约 10% 训练序列的 token 永不被丢弃,以保证训练-推理一致性。

训练细节

训练基础设施:基于 HAI-LLM 框架,使用 NVIDIA H800 GPU 集群。节点内 8 GPU 通过 NVLink/NVSwitch 连接,跨节点通过 InfiniBand 通信。采用流水线并行部署不同层,每层的路由专家均匀部署在 8 个设备上。

训练超参数:AdamW 优化器(\(\beta_1 = 0.9\)\(\beta_2 = 0.95\),weight_decay = 0.1),学习率采用 warmup-and-step-decay 策略——前 2K 步线性升温至 \(2.4 \times 10^{-4}\),训练 60% tokens 后乘以 0.316,90% 后再乘以 0.316。batch size 从 2304 逐步增至 9216。最大序列长度 4K。

长上下文扩展:初始预训练后,使用 YaRN 将上下文从 4K 扩展到 128K。YaRN 仅应用于承载 RoPE 的解耦共享 key \(\mathbf{k}_t^R\)。额外训练 1000 步(32K 序列长度),模型在 128K 上下文下仍表现稳健(NIAH 测试全绿)。

对齐训练

SFT:使用约 150 万条数据,涵盖对话、代码、数学、推理等场景。

RL(GRPO):采用 Group Relative Policy Optimization,省去与策略模型同等大小的 Critic 模型,用组内分数估计基线。对每个问题采样一组输出 \(\{o_1, \ldots, o_G\}\),优化目标:

\[\mathcal{J}_{\text{GRPO}}(\theta) = \mathbb{E}\left[\frac{1}{G} \sum_{i=1}^{G} \min\left(\frac{\pi_\theta(o_i|q)}{\pi_{\theta_{old}}(o_i|q)} A_i, \text{clip}(\cdot, 1-\varepsilon, 1+\varepsilon) A_i\right) - \beta D_{KL}(\pi_\theta \| \pi_{ref})\right]\]
\[A_i = \frac{r_i - \text{mean}(\{r_1, \ldots, r_G\})}{\text{std}(\{r_1, \ldots, r_G\})}\]

两阶段 RL 策略

  1. 推理对齐阶段:用代码和数学的奖励模型训练,提升推理能力
  2. 人类偏好对齐阶段:多奖励框架——有用性奖励模型 + 安全性奖励模型 + 规则奖励模型,加权求和

DeepSeek-V2 是 GRPO 的首次大规模应用,验证了该算法的有效性,为后续 R1 的纯 RL 训练奠定了基础。


DeepSeek-Coder-V2

基本信息

发布时间:2024 年 6 月 14 日(Lite 版)/ 6 月 17 日(完整版)

技术报告DeepSeek-Coder-V2

模型规模:236B 总参数,21B 激活(MoE);Lite 版 16B 总参数,2.4B 激活 | 预训练:10.2T tokens(基于 DeepSeek-V2 中间检查点 + 6T 代码/数学 tokens)| 上下文:128K

性能评价:HumanEval 90.2%、MBPP+ 76.2%、MATH 75.7%、Aider 73.7%、SWE-Bench Lite 12.7%,在代码和数学任务上超越 GPT-4-Turbo、Claude 3 Opus、Gemini 1.5 Pro,是首个在编码任务上达到 GPT-4-Turbo 水平的开源模型。支持 338 种编程语言。

外界评价:DeepSeek-Coder-V2 被业界称为"价格屠夫"和"AI 界的拼多多"——其 API 价格仅为 GPT-4 Turbo 的 1%,却在编码基准上达到甚至超越后者的水平。这一性价比震动了整个 AI 行业,证明了开源模型在代码任务上追赶闭源模型的可行性。

基于中间检查点的持续预训练

传统做法:训练代码模型时,通常从零开始在纯代码语料上预训练(如 CodeLlama、StarCoder)。这需要海量计算资源,且模型缺乏自然语言理解能力,限制了代码注释生成、文档理解等需要语言能力的任务。

DeepSeek 的改动:从通用语言模型 DeepSeek-V2 的中间检查点(已训练 4.2T tokens)出发,用 6T 额外 tokens 持续预训练,总计 10.2T tokens。

为什么这样做有效:持续预训练(Continual Pre-training)相比从零训练有两个关键优势:

  • 知识迁移:通用语言模型已习得的语法、语义、世界知识可以直接迁移到代码理解中,减少所需训练 tokens
  • 多语言代码能力:保持 30% 自然语言比例,使模型不会"遗忘"语言能力,能处理代码注释、文档字符串、自然语言编程指令

数据配比:60% 源代码 + 10% 数学 + 30% 自然语言。

  • 代码语料:1,170B tokens,从 GitHub 和 CommonCrawl 收集,支持 338 种语言(从 DeepSeek-Coder 的 86 种大幅扩展)
  • 数学语料:221B tokens,使用与 DeepSeekMath 相同的 fastText 流水线从 CommonCrawl 收集,规模约为 DeepSeekMath 语料的 2 倍
  • 自然语言语料:直接从 DeepSeek-V2 训练语料中采样

数据收集的 fastText 分类器

传统做法是用关键词匹配或正则表达式过滤代码网页,召回率低且对新语言泛化差。DeepSeek 训练了一个有监督分类器:

  1. 种子语料构建:从 StackOverflow、PyTorch 文档、StackExchange 等高质量站点抓取已知的代码/数学页面,作为正样本
  2. fastText 模型训练:以正样本和随机网页训练二分类器。由于中文等语言无法通过空格分词,使用 DeepSeek-V2 的 BPE tokenizer 替代默认的空格分词,显著提升了召回准确率
  3. 迭代扩充:用训练好的分类器扫描 CommonCrawl,召回新的代码/数学页面;对每种编程语言统计被召回网页来自各域名的比例,若某域名超过 10% 的页面被分类为代码/数学相关,则整个域名被标记为代码/数学来源,并将该域名下未收集的 URL 加入种子语料
  4. 重复 3 轮:每轮用扩充后的正样本重新训练分类器,逐步提高召回率。最终从 CommonCrawl 收集到 70B 代码相关 tokens 和 221B 数学相关 tokens;对 GitHub 进行 2 轮迭代收集,额外获得 94B 源代码

与从零训练的对比

从零训练 持续预训练(DeepSeek-Coder-V2)
训练 tokens 需要全部从零消耗 复用 4.2T 已有 + 6T 新增
自然语言能力 需额外混合语言数据 天然保留(30% 语言语料)
计算成本 极高 约为从零训练的 60%

成效:消融实验显示,新代码语料使 1B 模型在 HumanEval 上提升 6.7%(30.5% → 37.2%),MBPP 上提升 9.4%(44.6% → 54.0%)。

FIM 训练策略(Fill-in-the-Middle)

传统做法:标准自回归语言模型只训练从左到右生成 \(P(x_t | x_1, \ldots, x_{t-1})\)。对于代码补全中的"填充中间部分"任务(如函数体补全、代码重构),模型无法利用右侧上下文。

DeepSeek 的改动:仅对 DeepSeek-Coder-V2-Lite(16B) 采用 FIM 训练(236B 完整版仅使用标准 Next-Token Prediction),采用 PSM(Prefix-Suffix-Middle) 模式,将原始序列 \(\mathbf{x} = (x_1, \ldots, x_n)\) 在随机位置 \(k\) 处拆分为前缀 \(\mathbf{p} = (x_1, \ldots, x_{k-1})\)、中间 \(\mathbf{m} = (x_k, \ldots, x_{l-1})\)、后缀 \(\mathbf{s} = (x_l, \ldots, x_n)\),重排为:

<|fim_begin|> p_1 ... p_{k-1} <|fim_hole|> s_l ... s_n <|fim_end|> m_k ... m_{l-1} <|eos_token|>

数学形式化:给定原始序列的自回归训练目标 \(\mathcal{L}_{\text{AR}} = -\sum_{t=1}^{n} \log P(x_t | x_{<t})\),FIM 变换后训练目标变为:

\[ \mathcal{L}_{\text{FIM}} = -\sum_{t=k}^{l-1} \log P(x_t \mid x_1, \ldots, x_{k-1}, x_l, \ldots, x_n, \text{special tokens}) \]

即模型学习条件概率 \(P(\mathbf{m} \mid \mathbf{p}, \mathbf{s})\)——给定前缀和后缀,预测中间部分。

FIM 率设为 0.5:每个文档以 50% 概率应用 FIM 变换、50% 保持标准 AR 训练。这是因为:

  • FIM 率过高会损害标准左到右生成质量(模型看到的 AR 训练样本太少)
  • FIM 率过低则双向上下文能力不足
  • 消融实验表明 0.5 是最佳平衡点

在文档级别应用:FIM 变换在文档级别(而非 token 级别)进行——整个文档要么完全应用 FIM,要么完全保持 AR。这避免了同一文档内混杂两种训练信号导致的梯度冲突。

成效:在 FIM 任务上,Lite 版(2.4B 激活)达到 Python 80.0%、Java 89.1%、JavaScript 87.2%,与更大的 33B 模型相当。

GRPO 用于代码强化学习

传统做法:代码 RL 通常直接使用编译器/测试用例的通过与否作为奖励信号(0/1 奖励)。问题在于:

  • 二值奖励信号稀疏——大量生成的代码只得到 0(不通过),梯度信号噪声大
  • 某些编程题测试用例有限,无法全面评估代码质量
  • 不同代码质量(如时间复杂度、可读性)被压缩为同一个 1

DeepSeek 的改动:两阶段奖励设计

  1. 阶段一:用编译器信号训练一个奖励模型 \(\text{RM}: (\text{prompt}, \text{code}) \to \mathbb{R}\),将离散的编译器反馈转化为连续分数
  2. 阶段二:用奖励模型的分数作为 GRPO 的奖励信号,替代原始编译器信号

为什么奖励模型优于编译器信号

编译器信号(0/1) 奖励模型(连续)
信号粒度 二值,无梯度方向 连续,区分代码质量
泛化能力 仅对有测试用例的题有效 对新题目也能给出评分
训练稳定性 高方差,收敛慢 低方差,收敛快

成效:在 LeetCode 和 LeetCode-zh 内部测试集上,使用奖励模型信号的 RL 训练显著优于直接使用编译器信号。

训练稳定性改进

在训练 236B 模型时,遇到了训练不稳定和梯度尖峰问题,追溯到指数归一化技术。解决方案是回退到传统归一化方法(推测为 RMSNorm 或 LayerNorm),保证了训练的稳定进行。

DeepSeek-V3

发布时间:2024 年 12 月 26 日 | 技术报告arXiv:2412.19437

模型规模:671B 总参数,每 token 激活 37B(MoE 架构)| 预训练:14.8T tokens,2.788M H800 GPU hours | 架构细节:61 层 Transformer,隐藏维度 7168,128 注意力头(每头 128 维),256 路由专家 + 1 共享专家,每 token 激活 8 个路由专家,每 token 最多路由到 4 个节点 | 训练集群:2048 H800 GPU,16 路流水线并行 + 64 路专家并行(跨 8 节点)+ ZeRO-1 数据并行

性能评价:在 MMLU(88.5)、MATH-500(90.2)、AIME 2024(39.2)、Codeforces(51.6 百分位)等基准上达到与 GPT-4o、Claude-3.5-Sonnet 相当的水平,是当时最强的开源模型。

外界评价:DeepSeek-V3 发布后,在聊天机器人竞技场(Chatbot Arena)中排名开源模型第一、全球前十,并被评为性价比最高的模型。更令业界震惊的是其训练成本——仅 557 万美元(2.788M H800 GPU hours),远低于同等水平闭源模型的训练开销。这打破了"只有巨头才能训练顶级模型"的共识,引发了关于 AI 训练成本结构的广泛讨论。

Multi-head Latent Attention(MLA)— 注意力的低秩压缩

传统方案:Multi-Head Attention(MHA)的 KV cache 问题

标准 MHA 有 \(n_h\) 个注意力头,每个头的维度为 \(d_h\),对序列中每个 token \(t\) 需缓存:

\[ \text{KV cache per token} = 2 \times n_h \times d_h \times \text{bytes} \]

\(n_h = 128, d_h = 128\) 为例,每个 token 需缓存 \(2 \times 128 \times 128 = 32{,}768\) 个参数。在 128K 上下文下,KV cache 达到 \(128K \times 32K \times 2\text{bytes (FP16)} = 8\text{GB}\) 每层每请求。对于 80 层模型,仅 KV cache 就需要 640GB,远超单卡显存。

已有改进方案的局限

  • Multi-Query Attention(MQA):所有头共享同一组 K/V,cache 缩小 \(n_h\) 倍,但性能明显下降
  • Grouped-Query Attention(GQA):将 \(n_h\) 个头分为 \(g\) 组,每组共享 K/V,cache 缩小 \(n_h/g\) 倍。是 MQA 和 MHA 的折中,但性能仍不如 MHA

DeepSeek-V3 的方案:MLA——低秩联合压缩

MLA 的核心洞察:标准 MHA 中,不同头的 K/V 虽然独立计算,但它们的输入相同(都是 \(\mathbf{h}_t\)),因此不同头的 K/V 之间存在大量冗余信息。可以用一个低维潜在向量 \(\mathbf{c}_t^{KV}\) 联合表示所有头的 K/V。

KV 压缩与恢复

\[ \mathbf{c}_t^{KV} = \mathbf{W}^{DKV} \mathbf{h}_t \in \mathbb{R}^{d_c}, \quad d_c \ll d_h n_h \]
\[ \mathbf{k}_t^C = \mathbf{W}^{UK} \mathbf{c}_t^{KV}, \quad \mathbf{v}_t^C = \mathbf{W}^{UV} \mathbf{c}_t^{KV} \]

其中 \(\mathbf{W}^{DKV} \in \mathbb{R}^{d_c \times d}\) 为下投影(压缩)矩阵,\(\mathbf{W}^{UK} \in \mathbb{R}^{n_h d_h \times d_c}\)\(\mathbf{W}^{UV} \in \mathbb{R}^{n_h d_h \times d_c}\) 为上投影(恢复)矩阵。

DeepSeek-V3 的具体配置\(n_h = 128\) 个注意力头,每头维度 \(d_h = 128\),KV 压缩维度 \(d_c = 512\),Query 压缩维度 \(d'_c = 1536\),解耦位置 key 的每头维度 \(d_h^R = 64\)。总隐藏维度 \(d = 7168\)。压缩比为 \(d_c / (n_h \cdot d_h) = 512 / 16384 = 3.125\%\)

位置编码的解耦:RoPE 位置编码与低秩压缩不兼容——RoPE 需要在 Q 和 K 上施加位置相关的旋转,但压缩后的 \(\mathbf{c}_t^{KV}\) 是位置无关的。解决方案是解耦位置 key

\[ \mathbf{k}_t^R = \text{RoPE}(\mathbf{W}^{KR} \mathbf{h}_t) \in \mathbb{R}^{d_R} \]
\[ \mathbf{k}_{t,i} = [\mathbf{k}_{t,i}^C; \mathbf{k}_t^R] \]

即每个头的 key 由两部分拼接:内容部分 \(\mathbf{k}_{t,i}^C\)(从压缩向量恢复)和位置部分 \(\mathbf{k}_t^R\)(直接从 \(\mathbf{h}_t\) 投影并施加 RoPE)。

推理时的 cache 对比

每 token cache 典型值 (\(d_c = 512, d_R = 64\))
标准 MHA \(2 n_h d_h\) 32,768
GQA (8 组) \(2 \times 8 \times d_h\) 2,048
MLA \(d_c + d_R\) 576

MLA 的 cache 仅为标准 MHA 的 1.8%,甚至小于 GQA,同时性能与标准 MHA 相当。

为什么低秩压缩不损失性能:消融实验表明,当 \(d_c \geqslant 512\) 时,MLA 与标准 MHA 的性能差距可忽略。这是因为不同注意力头的 K/V 矩阵确实近似低秩——它们的"有效秩"远小于 \(n_h d_h\),一个 \(d_c\) 维的潜在空间足以捕获其主要信息。

Query 侧的压缩(训练时减少激活内存):

\[ \mathbf{c}_t^Q = \mathbf{W}^{DQ} \mathbf{h}_t, \quad \mathbf{q}_{t,i} = [\mathbf{W}^{UQ}_i \mathbf{c}_t^Q; \text{RoPE}(\mathbf{W}^{QR} \mathbf{c}_t^Q)] \]

Query 压缩在推理时不减少 cache(Q 不需要缓存),但在训练时大幅减少反向传播需要存储的激活值。

吸收技巧(Absorption Trick):上投影矩阵 \(\mathbf{W}^{UK}\) 可以被"吸收"到输出投影矩阵 \(\mathbf{W}^O\) 中,推理时无需显式恢复完整 K/V,进一步减少计算:

\[ \mathbf{o}_t = \sum_{i=1}^{n_h} \text{Attn}_i(\mathbf{q}_{t,i}, \mathbf{k}_{t,i}, \mathbf{v}_{t,i}) \mathbf{W}_i^O = \sum_{i=1}^{n_h} \alpha_{t,i} (\mathbf{c}_t^{KV} \mathbf{W}^{UK}_i)^\top \mathbf{q}_{t,i} \cdot \mathbf{c}_t^{KV} \mathbf{W}^{UV}_i \mathbf{W}_i^O \]

由于 \(\mathbf{W}^{UK}_i\)\(\mathbf{W}^O_i\) 都是静态矩阵,可以预计算 \(\hat{\mathbf{W}}_i^O = \mathbf{W}^{UV}_i \mathbf{W}_i^O\),推理时直接用 \(\mathbf{c}_t^{KV}\)\(\hat{\mathbf{W}}_i^O\) 相乘。

Auxiliary-Loss-Free Load Balancing — 无辅助损失的负载均衡

传统方案及其问题

MoE(Mixture-of-Experts)模型中,每个 token 只激活 \(K_r\) 个专家(\(K_r \ll N_r\)\(N_r\) 为专家总数)。如果某些专家总是被选中而其他专家很少被激活,会导致:

  • 专家塌缩:被忽略的专家参数得不到更新,浪费模型容量
  • 负载不均:热门专家过载导致计算瓶颈,冷门专家空闲

传统解决方案(GShard、Switch Transformer)引入辅助损失 \(\mathcal{L}_{\text{aux}}\)

\[ \mathcal{L}_{\text{aux}} = \alpha \cdot N_r \sum_{i=1}^{N_r} f_i \cdot p_i \]

其中 \(f_i\) 是专家 \(i\) 被选中的 token 比例,\(p_i\) 是专家 \(i\) 的平均路由概率。这个损失鼓励 \(f_i\)\(p_i\) 均匀分布。

核心矛盾:辅助损失 \(\mathcal{L}_{\text{aux}}\) 与主目标 \(\mathcal{L}_{\text{LM}}\) 存在冲突——为了降低 \(\mathcal{L}_{\text{aux}}\),模型被迫将 token 路由到非最优的专家上,损害语言建模质量。\(\alpha\) 越大,负载越均衡,但模型性能越差。

DeepSeek-V3 的创新:偏置驱动的负载均衡

核心思想:将"路由决策"与"门控值计算"解耦

首先,用 sigmoid(而非 softmax)计算每个 token 与每个专家的亲和力分数:

\[ s_{i,t} = \text{Sigmoid}(\mathbf{e}_i^\top \mathbf{h}_t) \]

其中 \(\mathbf{e}_i\) 是专家 \(i\) 的嵌入向量。注意 sigmoid 是逐元素独立的(不像 softmax 会归一化),因此不同专家的分数不互相制约。

然后,引入可学习偏置 \(b_i\)仅用于决定哪些专家被选中,但不参与门控值计算

\[ g_{i,t}' = \begin{cases} s_{i,t}, & \text{if } s_{i,t} + b_i \in \text{Top-}K_r(\{s_{j,t} + b_j\}_{j=1}^{N_r}) \\ 0, & \text{otherwise} \end{cases} \]

最后对选中的门控值归一化:

\[ g_{i,t} = \frac{g_{i,t}'}{\sum_{j=1}^{N_r} g_{j,t}'} \]

关键区别

传统辅助损失法 DeepSeek-V3 偏置法
门控值 受负载均衡约束影响 仅由原始亲和力 \(s_{i,t}\) 决定
路由决策 与门控值耦合 \(s_{i,t} + b_i\) 独立决定
对 LM 目标的影响 直接冲突 无冲突(偏置不参与梯度计算)

偏置的动态调整:训练过程中每步监控每个专家的实际负载 \(f_i\),用简单规则动态调整偏置:

\[ b_i \leftarrow \begin{cases} b_i - \gamma, & \text{if } f_i > \bar{f} \text{(过载)} \\ b_i + \gamma, & \text{if } f_i < \bar{f} \text{(欠载)} \end{cases} \]

其中 \(\bar{f} = \frac{1}{N_r} \sum_{i=1}^{N_r} f_i\) 是平均负载,\(\gamma = 0.001\) 是调整步长(前 14.3T tokens 使用,之后设为 0 停止调整)。这个过程不引入任何额外损失项,不参与梯度计算。

补充的序列级平衡损失:虽然主要依赖偏置策略,但为防止单个序列内的极端不平衡(如某序列所有 token 都路由到同一个专家),额外引入一个极小权重的序列级平衡损失:

\[ \mathcal{L}_{\text{Bal}} = \alpha \cdot N_r \sum_{i=1}^{N_r} f_i \cdot P_i \]

其中 \(f_i\) 是专家 \(i\) 在该序列中被选中的 token 比例,\(P_i\) 是专家 \(i\) 的平均归一化亲和力分数,\(\alpha = 0.0001\)(极小,仅起"安全网"作用)。

成效:实现负载均衡的同时不损害模型性能,训练全程无 token 丢弃。

Multi-Token Prediction(MTP)— 多 token 预测

传统方案:标准语言模型在每个位置只预测下一个 token,训练目标为:

\[ \mathcal{L}_{\text{LM}} = -\frac{1}{T} \sum_{t=1}^{T} \log P(t_{t+1} | t_1, \ldots, t_t) \]

每个位置仅产生一个训练信号(下一个 token 的对数似然),训练效率受限于 token 序列长度。

DeepSeek-V3 的 MTP:因果链式多步预测

MTP 在每个位置预测未来 \(D\) 个 token(\(D = 1\) 时退化为标准 LM)。与 Meta 的 MTP(独立预测)不同,DeepSeek-V3 的 MTP 保持因果链:第 \(k\) 步的预测依赖第 \(k-1\) 步的输出。

\(k\) 深度(\(k = 1, \ldots, D\))的计算:

\[ \mathbf{h}_i'^k = \mathbf{M}_k [\text{RMSNorm}(\mathbf{h}_i^{k-1}); \text{RMSNorm}(\text{Emb}(t_{i+k}))] \]
\[ \mathbf{h}_{1:T-k}^k = \text{TransformerBlock}_k(\mathbf{h}_{1:T-k}'^k) \]
\[ P_{i+k+1}^k = \text{OutHead}(\mathbf{h}_i^k) \]

其中 \(\mathbf{h}_i^{k-1}\) 是上一深度的输出(\(k=1\) 时为主模型最后一层的输出),\(\text{Emb}(t_{i+k})\) 是第 \(i+k\) 个 token 的嵌入,\(\mathbf{M}_k\) 是线性投影将拼接后的向量映射回 \(d\) 维,\(\text{TransformerBlock}_k\) 是独立的 Transformer 层。

因果链的设计

\[ \underbrace{\mathbf{h}^0}_{\text{主模型}} \xrightarrow{k=1} \underbrace{\mathbf{h}^1, P^1(t_{i+2})}_{\text{预测 2 步后}} \xrightarrow{k=2} \underbrace{\mathbf{h}^2, P^2(t_{i+3})}_{\text{预测 3 步后}} \xrightarrow{k=3} \cdots \]

\(k\) 步的输入 \(\mathbf{h}^{k-1}\) 包含了前 \(k-1\) 步预测的隐含信息,因此第 \(k\) 步的预测可以"修正"前几步的错误,形成自校正链。

MTP 损失

\[ \mathcal{L}_{\text{MTP}} = \frac{\lambda}{D} \sum_{k=1}^{D} \mathcal{L}_{\text{MTP}}^k, \quad \mathcal{L}_{\text{MTP}}^k = -\frac{1}{T} \sum_{i=2+k}^{T+1} \log P_i^k[t_i] \]

总训练目标为 \(\mathcal{L} = \mathcal{L}_{\text{LM}} + \lambda \mathcal{L}_{\text{MTP}}\)。DeepSeek-V3 设置 \(D = 1\)(每个位置额外预测 1 个 token),\(\lambda\) 采用退火策略:前 10T tokens 设为 0.3,后 4.8T tokens 降为 0.1。

与 Meta MTP 的关键区别

Meta MTP DeepSeek-V3 MTP
预测方式 \(D\) 个独立头并行预测 因果链,第 \(k\) 步依赖第 \(k-1\)
参数共享 各头完全独立 embedding 和 output head 与主模型共享
推理时使用 可用于 speculative decoding 丢弃 MTP 模块,零额外开销
信号密度 \(D\) \(D\) 倍(但有因果链的额外信息增益)

共享 embedding 和 output head 的好处:MTP 模块不引入新的 embedding 矩阵或 output head,而是复用主模型的。这既减少参数量,又保证 MTP 预测的分布与主模型一致——MTP 损失的梯度可以直接更新主模型的 embedding 和 output head,避免训练信号的割裂。

成效:消融实验表明,\(D = 1\) 时在代码和数学任务上有显著提升(Small MoE 在 MMLU 上提升 3.3%,BBH 上提升 2.4%),且推理时可将 MTP 模块用于 speculative decoding 进一步加速生成。推理时也可直接丢弃 MTP 模块,零额外开销。

其他工程优化

FP8 混合精度训练:V3 率先在 671B 规模模型上验证了 FP8 训练的可行性。关键挑战是矩阵乘法的累积误差——FP8 的动态范围有限,大量 FP8 乘积的累加容易溢出。V3 采用细粒度量化策略:权重按 \(128 \times 128\) 的 tile 量化,激活按 \(1 \times 128\) 的 block 量化(每元素独立缩放因子),累加时在 CUDA core 上以 FP32 精度累积 128 个 FP8×FP8 乘积的结果,避免精度损失。这种 tile-wise/block-wise 量化相比 per-tensor 量化能更好地保留异常值(outlier)信息。

DualPipe 流水线并行:将前向和反向计算重叠执行,每个 micro-batch 的前向计算与上一个 micro-batch 的反向计算并行。每个 chunk 被拆分为注意力、dispatch、MLP、combine 四个组件,反向 chunk 进一步拆分为"对输入的反向"和"对权重的反向"。气泡比率对比:1F1B 为 \((PP-1)(F+B)\),ZB1P 为 \((PP-1)(F+B-2W)\),DualPipe 仅为 \((\frac{PP}{2}-1)(F\&B+B-3W)\),代价是峰值激活内存增加 \(1/PP\) 倍(因需保持两份模型参数)。

从 R1 蒸馏:V3 的后训练阶段从 DeepSeek-R1 蒸馏了推理能力——用内部 R1 模型生成推理数据(数学、代码、逻辑推理),经 SFT + RL 流水线训练专家模型,再用专家模型生成最终训练数据。这使 V3 在 STEM 问题上获得显著提升,同时保持了输出风格和长度的可控性。


DeepSeek-R1

发布时间:2025 年 1 月 20 日 | 技术报告arXiv:2501.12948

模型规模:基于 DeepSeek-V3(671B MoE)| 开源:MIT 许可证,含 1.5B~70B 蒸馏模型

性能评价:AIME 2024(79.8%)、MATH-500(97.3%)、Codeforces(96.3 百分位)、GPQA Diamond(71.5%),与 OpenAI o1 相当。蒸馏模型中,R1-Distill-Qwen-7B(55.5% AIME)超越 QwQ-32B-Preview。

外界评价:DeepSeek-R1 的发布被西方媒体称为 AI 领域的"史普尼克时刻"(Sputnik moment)——一家中国公司以极低成本(训练成本仅 29.4 万美元)复现了 OpenAI o1 级别的推理能力,并完全开源,震动了全球科技界。2025 年 9 月,DeepSeek-R1 登上《自然》(Nature)杂志封面,标志着其学术影响力获得最高认可。R1 证明了纯强化学习可以涌现出复杂的推理行为,改变了"推理能力需要大量人工标注数据"的行业共识。

纯强化学习涌现出推理能力(R1-Zero)

传统做法与预设

在 R1 之前,业界普遍认为推理能力(链式思维、自我验证、反思)需要通过监督微调(SFT)注入——即用人类标注的高质量推理数据微调模型(如 OpenAI o1 的训练方式被认为是大量人工标注的 CoT 数据 + RLHF)。

R1-Zero 的颠覆性发现

R1-Zero 直接在 DeepSeek-V3 基座模型上进行大规模 RL,完全不使用任何 SFT 数据。训练模板极简——只告诉模型用 <think><answer> 标签包裹推理过程和答案,不提供任何示例:

User: {question}
Assistant: <think> reasoning process here </think>
<answer> answer here </answer>

奖励设计采用纯规则,避免神经奖励模型的 reward hacking:

  • 准确性奖励:数学题用规则验证答案正确性,编程题用编译器运行测试用例
  • 格式奖励:检查输出是否正确使用 <think><answer> 标签

奖励函数的形式化:

\[ r(o, q) = r_{\text{acc}}(o, q) + r_{\text{fmt}}(o) \]
\[ r_{\text{acc}}(o, q) = \begin{cases} 1, & \text{if answer extracted from } o \text{ matches ground truth} \\ 0, & \text{otherwise} \end{cases} \]
\[ r_{\text{fmt}}(o) = \begin{cases} 1, & \text{if } o \text{ uses \texttt{<think>} and \texttt{<answer>} tags correctly} \\ 0, & \text{otherwise} \end{cases} \]

注意:这里没有使用任何神经网络奖励模型——纯规则奖励避免了 reward hacking(模型找到奖励模型的漏洞而非真正解决问题)。

"Aha Moment"现象:训练中间版本的模型自发学会了在解题时说"Wait, let me reevaluate this step-by-step",主动分配更多思考时间重新评估初始方法。这不是人工编程的行为,而是 RL 环境中自然涌现的——当模型发现"重新思考"能提高正确率从而获得更高奖励时,这一行为被自然强化。

推理时间(thinking time)的自适应增长:随着训练进行,模型的平均输出长度自然增长——它学会了"用更多 token 换取更高准确率"。这与人类解题时"花更多时间思考更难的题目"的行为高度类似。

成效:R1-Zero 在 AIME 2024 上从初始 15.6% 提升至 71.0%(pass@1),多数投票(majority voting)下达到 86.7%,超越 OpenAI o1-0912。

失败尝试的启示:论文坦诚分享了两种未成功的探索:

  • 过程奖励模型(PRM):为推理的每一步提供奖励信号,理论上比只看最终答案更精细。但实践中遇到三个困难:(1) 推理步骤的粒度难以明确定义;(2) 判断中间步骤是否正确本身就很困难,自动标注效果不佳,人工标注难以扩展;(3) 引入神经网络 PRM 后不可避免地导致 reward hacking,且重训奖励模型增加了训练复杂度
  • 蒙特卡洛树搜索(MCTS):受 AlphaGo 启发,将答案拆分为小步骤进行树搜索。但 LLM 的动作空间远大于围棋——每个步骤可生成几乎无限数量的 token,搜索空间指数爆炸。即使设置节点扩展上限,模型也容易陷入局部最优。训练细粒度价值模型本身也很困难,难以像 AlphaGo 那样通过自我对弈迭代提升

GRPO:Group Relative Policy Optimization

传统方案:PPO 的瓶颈

PPO(Proximal Policy Optimization)是 RLHF 的标准算法。PPO 需要四个模型同时参与训练:

模型 作用 显存占用
Actor(策略模型) 生成回答 全量参数
Critic(价值模型) 估计状态价值 \(V(s)\) 全量参数(与 Actor 同等大小)
Reference(参考模型) 计算 KL 散度约束 全量参数(冻结)
Reward(奖励模型) 评估回答质量 通常较小

其中 Critic 模型与 Actor 同等大小(都是大语言模型),占用大量显存和计算。且 Critic 的训练本身不稳定——价值估计的方差直接影响策略梯度的质量。

DeepSeek 的创新:GRPO——去掉 Critic

GRPO 的核心思想:用同一问题下多个采样的组内统计量(均值和标准差)替代 Critic 模型的基线估计

对每个问题 \(q\),从旧策略 \(\pi_{\theta_{old}}\) 采样一组输出 \(\{o_1, o_2, \cdots, o_G\}\)\(G\) 通常为 16~64),优化目标:

\[ \mathcal{J}_{\text{GRPO}}(\theta) = \mathbb{E}\left[ q \sim P(Q), \{o_i\}_{i=1}^G \sim \pi_{\theta_{old}}(O|q) \right] \frac{1}{G} \sum_{i=1}^{G} \left[ \min\left( \frac{\pi_\theta(o_i|q)}{\pi_{\theta_{old}}(o_i|q)} A_i, \text{clip}\left( \frac{\pi_\theta(o_i|q)}{\pi_{\theta_{old}}(o_i|q)}, 1-\varepsilon, 1+\varepsilon \right) A_i \right) - \beta D_{KL}(\pi_\theta \| \pi_{ref}) \right] \]

优势函数通过组内归一化计算(不需要 Critic):

\[ A_i = \frac{r_i - \text{mean}(\{r_1, r_2, \cdots, r_G\})}{\text{std}(\{r_1, r_2, \cdots, r_G\})} \]

为什么组内归一化是有效的基线估计

  • 在 RL 中,优势函数 \(A(s, a) = Q(s, a) - V(s)\) 需要一个基线 \(V(s)\) 来降低方差
  • PPO 用 Critic 网络估计 \(V(s)\),需要额外训练且不稳定
  • GRPO 观察到:同一问题 \(q\) 的多个采样的奖励均值 \(\frac{1}{G}\sum r_i\)\(V(q)\) 的无偏蒙特卡洛估计(因为 \(\mathbb{E}_{o \sim \pi}[r(o, q)] = V(q)\)
  • 用均值替代 \(V\),标准差归一化,得到零均值、单位方差的优势估计

KL 散度项(非标准形式,来自 DeepSeek-Math):

\[ D_{KL}(\pi_\theta \| \pi_{ref}) = \frac{\pi_{ref}(o_i|q)}{\pi_\theta(o_i|q)} - \log \frac{\pi_{ref}(o_i|q)}{\pi_\theta(o_i|q)} - 1 \]

这是 \(D_{KL}(\pi_\theta \| \pi_{ref})\) 的一个上界近似(基于 \(f\)-divergence 的形式),避免了直接计算 KL 散度需要对整个词表求和的开销。

GRPO vs PPO 的全面对比

PPO GRPO
所需模型数 4(Actor + Critic + Ref + RM) 3(Actor + Ref + RM)
Critic 训练 需要,不稳定 不需要
基线估计 Critic 网络 \(V_\phi(s)\) 组内均值 \(\bar{r}\)
超参数 Critic 学习率、GAE \(\lambda\) 更少(无 Critic 相关超参)
显存 极高(2 个全量模型) 降低约 30%~40%
适用场景 通用 RL 特别适合有明确奖励的任务

成效:相比 PPO 省去了 Critic 模型的显存和计算开销,训练效率大幅提升,同时保持了稳定的策略优化。

四阶段训练流水线(DeepSeek-R1 完整版)

R1-Zero 虽然推理能力强,但存在可读性差、语言混杂、格式不规范等问题。R1 完整版采用四阶段流水线解决这些问题:

阶段一:Cold Start SFT

用数千条高质量长 CoT 数据微调基座模型,提供推理行为的"种子"。这些数据包括:

  • <think> 标签的详细推理过程
  • 规范的格式和语言
  • 自我验证和反思的示例

与 R1-Zero 的"零 SFT"不同,这里的 SFT 不是为了"教会"模型推理(RL 可以做到),而是为了规范输出格式——让模型知道 <think> 标签中应该放什么、用什么语言、如何组织答案。

阶段二:Reasoning-oriented RL

与 R1-Zero 相同的大规模 RL,但奖励函数增加语言一致性奖励

\[ r_{\text{lang}}(o, q) = \text{target\_lang\_ratio}(\text{think}(o)) \]

即 CoT 推理过程中目标语言词汇的比例,避免中英文混杂。消融实验表明该奖励会轻微降低模型性能,但使输出更符合人类阅读偏好。

阶段三:Rejection Sampling + SFT

从阶段二的 RL 模型中采样大量回答,筛选高质量推理数据(通过规则验证答案正确性 + 格式规范性,部分使用 DeepSeek-V3 作为生成式奖励模型判断),加上 200k 非推理数据(写作、问答、翻译等),共约 800k 样本,微调 2 个 epoch。这一步的目的是:

  • 将 RL 探索到的高质量推理模式"固化"到模型中
  • 补充非推理能力,避免模型成为"偏科生"

阶段四:RL for All Scenarios

最终 RL 阶段,针对不同任务使用不同奖励:

任务类型 奖励信号
数学/代码推理 规则验证(答案正确性、测试用例通过率)
通用问答 奖励模型(评估 helpfulness)
安全相关 奖励模型(评估 harmlessness)

最终奖励函数:

\[ r(o, q) = \begin{cases} r_{\text{rule}}(o, q) + \beta_{\text{help}} r_{\text{help}}(o, q) + \beta_{\text{harm}} r_{\text{harm}}(o, q), & \text{推理任务} \\ r_{\text{help}}(o, q) + r_{\text{harm}}(o, q), & \text{通用任务} \end{cases} \]

知识蒸馏:小模型也能强推理

用 R1 生成的推理数据微调 Qwen 和 Llama 系列的小模型:

模型 AIME 2024 MATH-500 Codeforces Rating
R1-Distill-Qwen-1.5B 28.9% 83.9% 954
R1-Distill-Qwen-7B 55.5% 92.8% 1189
R1-Distill-Qwen-14B 69.7% 93.9% 1481
R1-Distill-Qwen-32B 72.6% 94.3% 1691
R1-Distill-Llama-70B 70.0% 94.5% 1633

蒸馏 vs 直接 RL 的关键发现

消融实验对比了两种让小模型获得推理能力的方法:

直接在小模型上做 RL 蒸馏 R1 数据到小模型
AIME 2024 (7B) ~15% 55.5%
训练成本 高(大量采样) 低(SFT 即可)
推理风格 不稳定,需大量探索 稳定,继承 R1 的推理模式

为什么蒸馏优于直接 RL:小模型的探索能力有限——在 RL 环境中,小模型很难自发发现高质量的推理路径(因为它的策略空间太小)。而蒸馏直接将 R1 已经探索到的高质量推理模式"传授"给小模型,相当于跳过了探索阶段,直接进入利用阶段。这与人类学习中"先模仿大师解题,再自己创新"的路径一致。

成效:7B 蒸馏模型在 AIME 上超越 GPT-4o(9.3%)数倍。蒸馏 + RL 的效果 > 单独蒸馏 > 直接 RL。

使用注意:R1 对提示词敏感——few-shot prompting 反而会降低性能,建议使用 zero-shot 设置,直接描述问题并指定输出格式。


DeepSeek-V4

发布时间:2026 年 4 月 24 日 | 技术报告Hugging Face

模型规模:V4-Pro(1.6T 参数,49B 激活)、V4-Flash(284B 参数,13B 激活)| 上下文:100 万 tokens | 预训练:32T~33T tokens

性能评价:V4-Pro 在推理、编码、长上下文等任务上达到 GPT-5.2 和 Gemini-3.0-Pro 水平。在 1M token 上下文下,单 token 推理 FLOPs 仅为 V3.2 的 27%,KV cache 仅为 10%。

外界评价:DeepSeek-V4 发布时与 GPT-5.5 同期(2026 年 4 月),被评价为"疯狂划算的交易"(insanely good deal)——以远低于对手的成本提供同等级的性能。V4 的百万 token 上下文能力和极致的推理效率(KV cache 仅为 V3 的 10%)再次证明了 DeepSeek 在模型效率优化上的领先地位。

相比 V3 的架构变更

  • 亲和力函数:从 Sigmoid 改为 \(\text{Sqrt}(\text{Softplus}(\cdot))\),即 \(\sqrt{\log(1 + e^{\mathbf{e}_i^\top \mathbf{h}_t})}\)
  • Hash 路由:前几层的 dense FFN 替换为使用 Hash 路由的 MoE 层——根据 token ID 的哈希函数直接确定目标专家,无需学习路由权重
  • 移除节点限制:V3 中每 token 最多路由到 4 个节点的约束被移除,通过重新设计并行策略保持训练效率

混合注意力架构:CSA + HCA

传统方案的瓶颈:标准全注意力的复杂度为 \(O(n^2 d)\),KV cache 为 \(O(n)\)。当上下文长度 \(n = 1{,}000{,}000\) 时:

  • 注意力计算:\(10^{12} \times d\) FLOPs,单 token 不可承受
  • KV cache:\(10^6 \times 2 n_h d_h \times\) 层数,单请求超过 TB 级别

已有长上下文方案的局限

方案 思路 局限
FlashAttention IO 优化,不改变计算量 计算量仍是 \(O(n^2)\),只是更快
Ring Attention 分布式注意力 通信开销大,且仍是全注意力
Sparse Attention 只关注部分 token 固定模式(如局部+全局),灵活性不足

V4 的方案:CSA(Compressed Sparse Attention)+ HCA(Heavily Compressed Attention)交替使用

两种注意力互补——CSA 在精度和效率之间取得平衡,HCA 追求极致效率,两者在不同层交替使用。

CSA 详细机制

第一步:重叠压缩(Overlapping Compression)

将 KV 序列压缩为更短的条目序列。每 \(m\) 个 token 压缩为 1 个条目,但使用重叠窗口(当前块和前一个块有重叠),保证相邻条目之间信息连续:

\[ [S_{mi:m(i+1)-1}^a; S_{m(i-1):mi-1}^b] = \text{Softmax}_{\text{row}}([Z_{mi:m(i+1)-1}^a + B^a; Z_{m(i-1):mi-1}^b + B^b]) \]
\[ C_i^{\text{Comp}} = \sum_{j=mi}^{m(i+1)-1} S_j^a \odot C_j^a + \sum_{j=m(i-1)}^{mi-1} S_j^b \odot C_j^b \]

其中 \(C^a, C^b \in \mathbb{R}^{n \times c}\) 是两组 KV 条目(通过不同的线性投影 \(W^{a,KV}, W^{b,KV}\) 计算),\(Z^a, Z^b\) 是对应的压缩权重,\(B^a, B^b \in \mathbb{R}^{m \times c}\) 是可学习的位置偏置,\(S\) 是 softmax 归一化后的注意力权重,\(\odot\) 为逐元素乘法。每个压缩条目 \(C_i^{\text{Comp}}\) 实际聚合了 \(2m\) 个 token 的信息(来自 \(C^a\)\(m\) 个 token 和 \(C^b\)\(m\) 个 token),但由于 \(C^b\) 用于 \(C_i^{\text{Comp}}\) 的部分与 \(C^a\) 用于 \(C_{i-1}^{\text{Comp}}\) 的部分重叠,实际压缩率为 \(1/m\)

直觉理解:这类似于对 KV 序列做带注意力权重的池化——不是简单平均,而是让模型学习哪些 token 更重要,分配更高权重。重叠窗口保证了相邻压缩条目之间的信息连续性。

第二步:Lightning Indexer 稀疏选择

压缩后仍可能有大量条目(\(n/m\) 个)。Lightning Indexer 用极轻量的方式计算每个 token 与所有压缩条目的相关性分数,选出 top-\(k\) 个最相关的:

\[ I_{t,s} = \sum_{h=1}^{n_h^I} w_{t,h}^I \cdot \text{ReLU}(\mathbf{q}_{t,h}^I \cdot \mathbf{K}_s^{\text{IComp}}) \]
\[ C_t^{\text{SprsComp}} = \{C_s^{\text{Comp}} \mid I_{t,s} \in \text{Top-}k(I_{t,:})\} \]

Indexer 的设计极其轻量

  • ReLU 代替 Softmax——避免归一化开销,且 ReLU 的稀疏性可以利用硬件加速
  • 加权求和 代替多头注意力——\(n_h^I\) 个头的分数直接加权求和,不涉及矩阵乘法
  • 计算复杂度仅为 \(O(n \cdot (n/m) \cdot n_h^I)\),远小于标准注意力的 \(O(n^2 d)\)

第三步:滑动窗口 + 压缩条目的混合注意力

最终注意力由两部分组成:

\[ \text{Attn}(Q_t) = \text{Attn}_{\text{win}}(Q_t, K_{t-n_{\text{win}}:t}, V_{t-n_{\text{win}}:t}) + \text{Attn}_{\text{comp}}(Q_t, C_t^{\text{SprsComp}}, C_t^{\text{SprsComp}}) \]
  • 滑动窗口:对最近 \(n_{\text{win}}\) 个 token 做全注意力(保证局部细粒度依赖)
  • 压缩条目:对 top-\(k\) 个压缩条目做注意力(获取远程信息)

HCA(Heavily Compressed Attention):与 CSA 类似但压缩率更大(\(m' \gg m\),如 \(m' = 64\) vs \(m = 4\)),不做重叠压缩,不做稀疏选择——直接对所有压缩条目做注意力。适合需要全局感知但精度要求不那么高的层。

CSA/HCA 的共享 Key-Value MQA:压缩后的 KV 条目同时作为 key 和 value(Shared KV),核心注意力采用 Multi-Query Attention(MQA)模式——所有 query 头共享同一组压缩 KV 条目,减少计算量。

额外技术细节

  • Query/Key 归一化:在核心注意力前对每个头的 query 和压缩 KV 条目施加 RMSNorm,防止 attention logits 爆炸
  • 部分 RoPE:仅对 query 和 KV 条目的最后 64 维施加 RoPE 位置编码;对核心注意力输出也施加位置 \(-i\) 的 RoPE,使输出携带相对位置信息
  • Attention Sink:引入可学习的 sink logits \(\{z'_h\}\),在注意力分母中加入 \(\exp(z'_h)\),允许每个头调整总注意力权重使其不等于 1(甚至接近 0),提升对噪声 token 的鲁棒性
  • 混合精度 KV 存储:RoPE 维度用 BF16 存储,其余维度用 FP8 存储,KV cache 大小减半
  • Lightning Indexer 使用 FP4 精度:在超长上下文下进一步加速注意力计算

复杂度分析

每 token FLOPs KV cache
标准全注意力 \(O(n \cdot d)\) \(O(n \cdot d)\)
CSA(\(m\)=4, \(k\)=1024, \(n_{\text{win}}\)=4096) \(O((k + n_{\text{win}}) \cdot d)\) \(O(n/m \cdot d + n_{\text{win}} \cdot d)\)
HCA(\(m'\)=64) \(O(n/m' \cdot d)\) \(O(n/m' \cdot d)\)

\(n = 1{,}000{,}000\)\(k = 1024\)\(n_{\text{win}} = 4096\) 时,CSA 的每 token FLOPs 约为标准注意力的 0.5%。

成效:1M token 上下文下,V4-Pro 的单 token FLOPs 仅为 V3.2 的 27%,KV cache 仅为 10%。

Manifold-Constrained Hyper-Connections(mHC)— 流形约束的超连接

传统方案:残差连接及其问题

标准 Transformer 使用残差连接 \(\mathbf{y} = \mathbf{x} + \mathcal{F}(\mathbf{x})\) 来稳定深层训练。然而:

  • 当层数 \(L\) 很大时(V4 有 90+ 层),残差累积 \(\mathbf{x} + \sum_{l=1}^{L} \mathcal{F}^l(\mathbf{x})\) 可能导致范数增长
  • 虽然 Pre-Norm 缓解了梯度消失,但残差路径的非扩张性没有理论保证

Hyper-Connections(HC)的改进

HC 引入可学习的输入变换 \(\mathbf{A}^l\)、残差变换 \(\mathbf{B}^l\)、输出变换 \(\mathbf{C}^l\)

\[ \tilde{\mathbf{X}}^l = \mathbf{A}^l \hat{\mathbf{X}}^{l-1}, \quad \mathbf{H}^l = \text{Layer}^l(\tilde{\mathbf{X}}^l), \quad \hat{\mathbf{X}}^l = \mathbf{C}^l \mathbf{H}^l + \mathbf{B}^l \hat{\mathbf{X}}^{l-1} \]

其中 \(\hat{\mathbf{X}}^l = [\mathbf{x}^1; \ldots; \mathbf{x}^l]\) 是所有前序层输出的拼接(不只是上一层)。

问题\(\mathbf{B}^l\) 是任意矩阵,深层堆叠时 \(\prod_{l=1}^{L} \mathbf{B}^l\) 的谱范数可能指数增长或衰减,导致训练不稳定。

V4 的创新:mHC——将 \(\mathbf{B}^l\) 约束在双随机矩阵流形上

双随机矩阵(Doubly Stochastic Matrix)集合:

\[ \mathcal{M} := \{ \mathbf{M} \in \mathbb{R}^{n \times n} \mid \mathbf{M} \mathbf{1}_n = \mathbf{1}_n, \mathbf{1}_n^\top \mathbf{M} = \mathbf{1}_n^\top, \mathbf{M} \geqslant 0 \} \]

即每行和每列的元素之和都为 1,且所有元素非负。这个集合在数学上称为 Birkhoff 多面体

为什么约束在双随机矩阵上有效

定理 1(谱范数界):对于任意 \(\mathbf{M} \in \mathcal{M}\)\(\|\mathbf{M}\|_2 \leqslant 1\)

证明\(\mathbf{M}\) 是非负矩阵且每行和为 1,由 Perron-Frobenius 定理,其谱半径 \(\rho(\mathbf{M}) = 1\)。对于非负矩阵,\(\|\mathbf{M}\|_2 \leqslant \sqrt{\|\mathbf{M}\|_1 \|\mathbf{M}\|_\infty}\)。由于 \(\|\mathbf{M}\|_1 = \max_j \sum_i M_{ij} = 1\)(列和为 1),\(\|\mathbf{M}\|_\infty = \max_i \sum_j M_{ij} = 1\)(行和为 1),因此 \(\|\mathbf{M}\|_2 \leqslant 1\)\(\square\)

定理 2(乘法封闭性):若 \(\mathbf{M}_1, \mathbf{M}_2 \in \mathcal{M}\),则 \(\mathbf{M}_1 \mathbf{M}_2 \in \mathcal{M}\)

证明\((\mathbf{M}_1 \mathbf{M}_2) \mathbf{1} = \mathbf{M}_1 (\mathbf{M}_2 \mathbf{1}) = \mathbf{M}_1 \mathbf{1} = \mathbf{1}\),同理 \(\mathbf{1}^\top (\mathbf{M}_1 \mathbf{M}_2) = \mathbf{1}^\top\)。非负性由非负矩阵乘法保持。\(\square\)

推论:深层堆叠时,\(\prod_{l=1}^{L} \mathbf{B}^l\) 的谱范数 \(\leqslant 1\),保证残差变换是非扩张的(non-expansive),前向和反向传播数值稳定。

输入变换 \(\mathbf{A}^l\) 和输出变换 \(\mathbf{C}^l\) 的约束:通过逐元素 Sigmoid 约束为非负有界 \((0, 1)\),避免信号抵消。

动态参数化:三个变换矩阵由输入动态生成(而非静态参数):

\[ \tilde{\mathbf{A}}^l = \alpha_{\text{pre}}^l \cdot (\hat{\mathbf{X}}^l \mathbf{W}_{\text{pre}}^l) + \mathbf{S}_{\text{pre}}^l \]
\[ \tilde{\mathbf{B}}^l = \alpha_{\text{res}}^l \cdot \text{Mat}(\hat{\mathbf{X}}^l \mathbf{W}_{\text{res}}^l) + \mathbf{S}_{\text{res}}^l \]

其中 \(\mathbf{S}\) 是静态(输入无关)分量,\(\alpha\) 是可学习缩放因子。对于 \(\mathbf{B}^l\),先用指数函数确保正性 \(\mathbf{M}^{(0)} = \exp(\tilde{\mathbf{B}}^l)\),再通过 Sinkhorn-Knopp 算法 投影到双随机矩阵流形:交替进行行归一化 \(\mathbf{T}_r\) 和列归一化 \(\mathbf{T}_c\),即 \(\mathbf{M}^{(t)} = \mathbf{T}_r(\mathbf{T}_c(\mathbf{M}^{(t-1)}))\),直到收敛。

与标准残差连接的对比

标准残差 Pre-Norm 残差 mHC
变换矩阵 固定 \(\mathbf{I}\) 固定 \(\mathbf{I}\) 可学习,输入动态生成
谱范数保证 \(\|\mathbf{B}^l\|_2 \leqslant 1\)(理论保证)
跨层信息 仅上一层 仅上一层 所有前序层(\(\hat{\mathbf{X}}^l\)
参数量 0 0 \(O(n^2)\)(但 \(n\) 很小,通常 \(\leqslant 8\)

Muon 优化器 — 混合 Newton-Schulz 正交化

传统方案:AdamW 的局限

AdamW 是 Transformer 训练的标准优化器。它对每个参数独立维护一阶矩 \(m_t\) 和二阶矩 \(v_t\),更新量为 \(\frac{m_t}{\sqrt{v_t} + \epsilon}\)。局限在于:

  • 各向同性缩放:AdamW 对梯度的每个维度独立缩放,不考虑参数矩阵的整体结构
  • 对矩阵参数次优:权重矩阵的最优更新方向应该考虑矩阵的谱结构(奇异值分解),而非逐元素缩放

Muon 的核心思想:矩阵正交化

Muon 优化器对矩阵参数(如 Linear 层的权重)使用基于矩阵分解的更新方向。给定梯度矩阵 \(\mathbf{G}\),其 SVD 为 \(\mathbf{G} = \mathbf{U} \mathbf{\Sigma} \mathbf{V}^\top\),Muon 的目标是找到 \(\mathbf{U}\mathbf{V}^\top\)——即梯度方向的正交极分解(去除奇异值大小,只保留方向)。

正交极分解的性质:\(\mathbf{U}\mathbf{V}^\top\) 是与 \(\mathbf{G}\) 最近的正交矩阵(在 Frobenius 范数下),它将梯度的每个奇异方向"归一化"为 1,使得更新量在所有方向上均匀,避免某些方向更新过大而其他方向更新过小。

问题:SVD 的计算复杂度为 \(O(\min(mn^2, m^2n))\),对大矩阵不可行。

Newton-Schulz 迭代近似:用多项式迭代近似 \(\mathbf{U}\mathbf{V}^\top\)。先将梯度矩阵按 Frobenius 范数归一化 \(\mathbf{M}_0 = \mathbf{G} / \|\mathbf{G}\|_F\)(确保最大奇异值不超过 1),然后进行迭代:

\[ \mathbf{M}_k = a \mathbf{M}_{k-1} + b (\mathbf{M}_{k-1} \mathbf{M}_{k-1}^\top) \mathbf{M}_{k-1} + c (\mathbf{M}_{k-1} \mathbf{M}_{k-1}^\top)^2 \mathbf{M}_{k-1} \]

为什么这能收敛到 \(\mathbf{U}\mathbf{V}^\top\):设 \(\mathbf{M}_{k-1} = \mathbf{U} \mathbf{D}_k \mathbf{V}^\top\)(SVD 形式保持),则迭代变为对奇异值 \(d\) 的标量迭代:

\[ d_{k} = a \cdot d_{k-1} + b \cdot d_{k-1}^3 + c \cdot d_{k-1}^5 \]

不动点为 \(d = 1\)(正交矩阵的奇异值全为 1)。通过选择 \((a, b, c)\) 使得 \(f(d) = ad + bd^3 + cd^5\) 满足 \(f(1) = 1\)\(f'(1) = 0\)(二次收敛),可以保证快速收敛。

混合策略

  • 前 8 步\((a, b, c) = (3.4445, -4.7750, 2.0315)\)——大步长快速收敛,但可能在 \(d = 1\) 附近振荡
  • 后 2 步\((a, b, c) = (2, -1.5, 0.5)\)——小步长精确稳定,保证最终奇异值精确等于 1

验证 \(f(1)\)\(f'(1)\)

对于 \((a, b, c) = (2, -1.5, 0.5)\): - \(f(1) = 2 - 1.5 + 0.5 = 1\) \(\checkmark\) - \(f'(d) = 2 - 4.5d^2 + 2.5d^4\)\(f'(1) = 2 - 4.5 + 2.5 = 0\) \(\checkmark\)

额外优化(完整算法见 Algorithm 1):

  • Nesterov 动量:维护动量缓冲 \(M_t = \mu M_{t-1} + G_t\),在计算 Newton-Schulz 迭代前使用 Nesterov trick:输入为 \(\mu M_t + G_t\)(而非 \(G_t\)
  • RMS Rescaling:正交化后的更新量按 \(\sqrt{\max(n, m)} \cdot \gamma\) 重新缩放(\(n, m\) 为矩阵维度),使得 Muon 可以复用 AdamW 的学习率等超参数
  • 权重衰减:与 AdamW 相同,\(W_t = W_{t-1} \cdot (1 - \eta \lambda) - \eta O_t\)

配置:embedding 模块、预测 head、mHC 的静态偏置/门控因子、所有 RMSNorm 权重仍使用 AdamW;其余所有模块使用 Muon。

成效:相比 AdamW 收敛更快、训练更稳定。V4 不使用 QK-Clip 技术(因为 CSA/HCA 的 query/key 已经施加了 RMSNorm,attention logits 不会爆炸)。

细粒度专家并行(Fine-Grained EP)

传统 MoE 专家并行的通信瓶颈

在多节点训练中,MoE 的专家分布在不同 GPU 上。每个 token 需要被路由到远程专家处理,再返回结果。传统实现中,通信和计算是串行的:

\[ \text{Dispatch (通信)} \to \text{Expert Compute (计算)} \to \text{Combine (通信)} \]

通信时间占比随节点数增加而增大,成为瓶颈。

V4 的流水线化方案

将 MoE 计算拆分为 5 个阶段,每个阶段处理一批专家(一个 wave):

阶段 操作 类型
1. Dispatch 将 token 发送到目标专家所在 GPU 通信
2. Linear-1 专家的第一层线性变换 计算
3. SwiGLU + FP8 Cast 激活函数 + 精度转换 计算
4. Linear-2 专家的第二层线性变换 计算
5. Combine 将专家输出发回原 GPU 并聚合 通信

不同 wave 的不同阶段可以同时执行——当 wave 1 在做 Combine(通信)时,wave 2 可以在做 Linear-1(计算),通信被计算完全隐藏。

通信隐藏的条件:设峰值计算吞吐为 \(C\),互联带宽为 \(B\)。通信可被完全隐藏的条件是 \(C/B \leqslant V_{\text{comp}} / V_{\text{comm}}\),其中 \(V_{\text{comp}}\) 为计算量,\(V_{\text{comm}}\) 为通信量。对 DeepSeek-V4-Pro,每个 token-expert 对需要 \(6hd\) FLOPs(SwiGLU gate、up、down 三个投影)但仅需 \(3h\) Bytes 通信(FP8 Dispatch + BF16 Combine),因此:

\[ \frac{C}{B} \leqslant \frac{6hd}{3h} = 2d = 6144 \text{ FLOPs/Byte} \]

即每 GBps 带宽足以隐藏 6.1 TFLOP/s 的计算。一旦带宽达到此阈值,增加带宽的边际收益递减。

成效:理论加速 1.92×(相比未融合基线),实测 1.50~1.73×(通用推理场景),RL rollout 等延迟敏感场景可达 1.96×。已开源 CUDA 实现 MegaMoE。

FP4 量化感知训练

V4 对 MoE 层的路由专家参数采用 FP4 精度(4-bit 浮点数),这是业界首次在如此大规模模型上使用 FP4。虽然在当前硬件上 FP4×FP8 的峰值 FLOPs 与 FP8×FP8 相同,但在未来硬件上理论上可额外提升 33% 效率。结合 CSA/HCA 的混合精度 KV 存储(BF16 + FP8)和 Lightning Indexer 的 FP4 计算,V4 在精度和效率之间取得了极致平衡。

其他工程细节

TileLang 内核开发:V4 的复杂架构若用标准 PyTorch 算子实现,会产生数百个细粒度 ATen 算子。V4 采用 TileLang 开发融合内核替代大部分算子,在保持开发灵活性的同时达到接近手写 CUDA 的性能。

训练不稳定性缓解:V4 在预训练中遇到了训练不稳定性问题,论文提到通过多种策略缓解(包括 mHC 的谱范数约束、Query/Key 归一化等),确保了训练全程的稳定性。


总结对比

DeepSeek-V2 (2024.05) DeepSeek-Coder-V2 (2024.06) DeepSeek-V3 (2024.12) DeepSeek-R1 (2025.01) DeepSeek-V4 (2026.04)
核心创新 MLA + DeepSeekMoE 持续预训练 + FIM + 奖励模型 RL MLA + 无辅助损失负载均衡 + MTP 纯 RL 涌现推理 + GRPO CSA/HCA 混合注意力 + mHC + Muon
解决的问题 KV cache 效率、MoE 训练成本 开源模型代码能力追赶闭源、多语言支持 KV cache 效率、MoE 负载均衡、训练信号稀疏 推理能力是否需要 SFT、RL 训练效率 百万 token 注意力效率、深层训练稳定性
关键数学 低秩 KV 联合压缩、细粒度专家分割 fastText 数据筛选、PSM-FIM 低秩压缩、偏置动态调整 组内归一化优势函数 双随机矩阵约束、Newton-Schulz 迭代
模型规模 236B (21B active) 236B (21B active) / 16B (2.4B) 671B (37B active) 671B (37B active) 1.6T (49B active) / 284B (13B active)
上下文长度 128K 128K 128K 128K 1M tokens
对标 LLaMA 3 70B, Mixtral 8x22B GPT-4-Turbo, Claude 3 Opus GPT-4o, Claude-3.5-Sonnet OpenAI o1 GPT-5.2, Gemini-3.0-Pro
外界评价 MLA 里程碑、开源 MoE 标杆 "价格屠夫"、"AI 界的拼多多" 开源第一、性价比最高 "史普尼克时刻"、登上 Nature 封面 "疯狂划算的交易"