DeepSeek 技术演进与原理

本文从项目中手动实现的 Transformer 出发,系统梳理 DeepSeek 系列模型(V1 → V2 → V3 → R1)的技术演进,重点剖析其相对 GPT 路线的核心创新。


前置:DeepSeek 的定位

DeepSeek(深度求索,2023 年由幻方科技成立)的核心命题是:

在有限算力预算下,逼近甚至超越顶尖闭源模型的能力

这一约束催生了一系列极具工程价值的技术创新——不是堆算力,而是在架构和训练策略上做精细的效率优化。

所有 DeepSeek 模型均基于 Decoder-Only Transformer,与 GPT 路线相同,但在以下几个维度进行了系统性的重新设计:

技术维度 GPT 路线 DeepSeek 创新
注意力机制 MHA / GQA MLA(多头潜在注意力)
FFN 结构 密集 FFN / MoE DeepSeekMoE(细粒度 + 共享专家)
推理能力 RLHF + SFT GRPO 纯强化学习
训练精度 BF16 FP8 混合精度
长度外推 ALiBi / RoPE YaRN + 动态 RoPE 缩放

一、DeepSeek-V1(2024 年初):扎实的基座

论文DeepSeek LLM: Scaling Open-Source Language Models with Longtermism

1.1 架构基线

DeepSeek-V1 是一个"正统"的 Decoder-Only LLM,没有激进的架构创新,重点在于数据质量和 Scaling Law 的精细研究。

规模:

版本 参数量 层数 d_model 注意力头
DeepSeek-7B 7B 32 4096 32
DeepSeek-67B 67B 95 8192 64

关键设计选择:

  • Pre-RMS Norm(Pre-Norm + RMSNorm,同 LLaMA)
  • SwiGLU 激活函数(同 LLaMA 2)
  • RoPE 位置编码
  • GQA(Grouped Query Attention):67B 版本使用,减少 KV 缓存压力

1.2 对 Chinchilla Scaling Law 的修正

OpenAI 的 Chinchilla 结论是"最优 token 数 ≈ 20× 参数量"。DeepSeek 对此做了更细粒度的分析,发现:

对于推理部署场景,应该用比 Chinchilla 更多的数据训练更小的模型——因为推理成本比训练成本更重要。

Ctotal=Ctrain+Nqueries×Cinference C_{\text{total}} = C_{\text{train}} + N_{\text{queries}} \times C_{\text{inference}} Ctotal=Ctrain+Nqueries×Cinference

NqueriesN_{\text{queries}}Nqueries 很大时(生产部署),用 2 万亿 token 训练 7B 模型比用 1000 亿 token 训练 67B 模型更经济,且推理时延更低。

这一洞察直接影响了 DeepSeek 此后系列的数据配比策略:持续用超过 Chinchilla 最优量的数据训练


二、DeepSeek-V2(2024 年 5 月):两项核心架构创新

论文DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model

规模:236B 总参数,每次推理激活 21B,上下文长度 128K。

V2 是 DeepSeek 技术跃升的关键版本,引入了两项根本性的架构创新。

2.1 MLA — 多头潜在注意力(Multi-head Latent Attention)

这是 DeepSeek 最重要的原创贡献之一,从根本上重新设计了注意力机制的 KV 缓存问题。

问题背景:KV Cache 是推理的瓶颈

回顾本项目的 scaled_dot_product_attention

attn_scores = torch.matmul(Q, K.transpose(-1, -2)) / math.sqrt(self.d_k)
output = torch.matmul(attn_probs, V)

推理时,自回归生成需要保留历史所有位置的 K 和 V 向量(即 KV Cache),以避免重复计算:

第 1 步:生成 token_1,缓存 K_1, V_1
第 2 步:生成 token_2,缓存 K_1,K_2, V_1,V_2
...
第 L 步:KV Cache 大小 = 2 × L × num_heads × d_k × num_layers × sizeof(dtype)

对 128K 上下文的 MHA 模型,KV Cache 可达数十 GB,严重限制并发量和可部署性。

GQA(Grouped Query Attention)的局限

GPT 路线的 GQA 让多个 Q 头共享同一组 K/V,减少 KV Cache:

MHA:  num_heads 组 Q,num_heads 组 K/V   KV = num_heads × d_k
GQA:  num_heads 组 Q,num_groups 组 K/V  KV = num_groups × d_k(num_groups << num_heads)

但 GQA 本质上是牺牲了注意力头的表达多样性来换空间。

MLA 的解法:低秩压缩

MLA 的核心思想是:不缓存原始的 K/V,而是缓存一个低维的"潜在向量",需要时再解压还原出 K/V

原始输入 h  (d_model 维)
    ↓ 压缩投影 W_DKV   (d_model → d_c,d_c << d_model)
潜在向量 c_KV  (d_c 维)  ← 只缓存这个!
    ↓ 解压投影 W_UK / W_UV
K, V  (num_heads × d_k 维)

KV Cache 从 2 × num_heads × d_k 降至 d_c(约为原来的 5%~10%)。

类比本项目 MultiHeadAttention 的线性投影层:

# 本项目:直接投影到 K/V 并缓存
self.W_k = nn.Linear(d_model, d_model)
self.W_v = nn.Linear(d_model, d_model)

# MLA:先压缩到潜在空间,只缓存压缩向量
self.W_DKV = nn.Linear(d_model, d_c)     # 压缩(Down-projection)
self.W_UK  = nn.Linear(d_c, num_heads * d_k)  # K 解压(Up-projection)
self.W_UV  = nn.Linear(d_c, num_heads * d_v)  # V 解压

推理时:

  • Prefill 阶段(处理输入 prompt):对每个 token 计算并缓存 c_KV(d_c 维)
  • Decode 阶段(逐步生成):从缓存中取 c_KV,实时解压出 K/V,做注意力计算

Q 的解耦 RoPE 处理

标准 RoPE 直接将位置旋转施加在 Q/K 上,但 MLA 的 K 是从潜在向量解压出来的,如果先旋转再压缩,位置信息会被压缩矩阵破坏。

MLA 的解法是解耦(Decoupled)RoPE

  • 给 Q/K 各额外附加一小段专门用于携带 RoPE 位置信息的子向量(d_R 维)
  • 这部分不经过低秩压缩,直接缓存带 RoPE 的完整键向量
K_final = concat(K_content, K_rope)
         = concat(解压的内容键,  带RoPE旋转的位置键)

内容信息走低秩压缩(节省空间),位置信息独立存储(保证 RoPE 正确性)。

效果:相比等规模 MHA,KV Cache 减少 93.3%,推理吞吐量提升 5.76×,且性能几乎不降。

2.2 DeepSeekMoE — 细粒度专家混合

GPT-4 使用的 MoE 将 FFN 层替换为若干个专家网络,路由器选 top-k 激活。DeepSeek-V2 对 MoE 做了两处关键改进。

传统 MoE 的问题

以 GShard / Switch Transformer 的设计为例:

num_experts = 8(粗粒度)
top_k = 2     每次激活 2 个专家
参数利用率 = 2/8 = 25%

问题一:专家粒度太粗,每个专家需要学习太多不同类型的知识,表达能力分散。
问题二:专家间负载不均衡(Popular Expert Problem),热门专家被频繁激活,冷门专家浪费。

改进一:细粒度专家分解

DeepSeekMoE 将每个粗粒度专家切分为多个细粒度的小专家:

传统 MoE:8 个大专家,激活 2 个
DeepSeekMoE:64 个小专家(每个参数量 = 原来 1/8),激活 6 个

保持相同的激活参数量(activated = top_k × expert_size),但:

  • 专家更细粒度,每个专家专注更窄的知识领域,组合更灵活
  • 路由器从大量候选中选取最优组合,搭配方式呈指数级增长

改进二:共享专家(Shared Expert)

部分专家被设置为"永远激活"的共享专家,负责处理通用知识:

# DeepSeekMoE 结构(概念示意)
def forward(self, x):
    # 共享专家:始终激活
    shared_output = sum(expert(x) for expert in self.shared_experts)

    # 路由专家:动态选择
    scores = self.router(x)
    top_k_idx = scores.topk(self.top_k, dim=-1).indices
    routed_output = sum(scores[i] * self.routed_experts[i](x) for i in top_k_idx)

    return shared_output + routed_output

共享专家防止不同路由专家重复学习相同的通用模式,使路由专家可以专注于差异化的特殊知识。

负载均衡的无辅助损失方案

传统 MoE 使用辅助损失(Auxiliary Loss)来强制专家负载均衡:

Laux=α∑i=1Nfi⋅Pi \mathcal{L}_{\text{aux}} = \alpha \sum_{i=1}^{N} f_i \cdot P_i Laux=αi=1NfiPi

但辅助损失会与主任务目标相互干扰,损害模型性能。

DeepSeek-V3 进一步提出无辅助损失的负载均衡:给每个专家维护一个可学习的偏置项 bib_ibi,路由时加到分数上:

scorei′=scorei+bi \text{score}'_i = \text{score}_i + b_i scorei=scorei+bi

bib_ibi 根据实时负载动态调整(负载高则降低 bib_ibi,抑制该专家被选中)。路由决策用 score',但 Top-K 门控的梯度计算仍用原始 score,实现了负载均衡与主任务解耦。


三、DeepSeek-V3(2024 年 12 月):工程极致化

论文DeepSeek-V3 Technical Report

规模:671B 总参数,每次推理激活 37B。
训练成本:约 278 万 H800 GPU 小时(约 600 万美元),而同期竞品的训练成本估计超过 1 亿美元。

V3 本质上是 V2 架构的精细工程化,核心创新集中在训练效率。

3.1 FP8 混合精度训练

大多数 LLM 用 BF16(16位浮点)训练。V3 引入 FP8(8位浮点),将显存和带宽需求减半:

BF16:1 位符号 + 8 位指数 + 7 位尾数  (精度高,范围大)
FP8:  1 位符号 + 4 位指数 + 3 位尾数  (精度低,需要精细处理)

关键挑战:FP8 精度低,朴素使用会导致训练不稳定。V3 的方案:

  • 细粒度量化:不对整个张量用一个缩放因子,而是对每个 1×128 的小块独立量化,降低量化误差
  • 高精度累加:矩阵乘法的中间累加步骤保持 FP32 精度
  • 关键参数保持 BF16:Embedding、输出 softmax、LayerNorm 等敏感层不降精度

效果:训练速度提升约 1.6×,显存降低约 40%,性能几乎不损失。

3.2 多 Token 预测(Multi-Token Prediction,MTP)

标准语言模型每次只预测下一个 token:

# 本项目 / 标准 LM
output = self.fc(dec_output)  # (B, L, vocab_size),每个位置预测下一个 token
loss = criterion(output, tgt[:, 1:])

MTP 让模型同时预测接下来的 D 个 token(V3 中 D=1,即同时预测 2 个):

位置 i 的隐状态
  → 主预测头:预测 token_{i+1}
  → 辅助预测头_1:预测 token_{i+2}

辅助预测头的 loss 作为额外训练信号,迫使模型的中间表示必须蕴含更多的未来规划信息,从而提升表示质量。

推理时辅助头可用于 Speculative Decoding(投机解码)——用辅助头快速生成候选 token,主模型验证,加速生成速度。

3.3 DualPipe 流水线并行

训练 671B 参数的模型需要跨数千张 GPU 进行模型并行。传统流水线并行(Pipeline Parallelism)存在"气泡"问题:

传统流水线(4 个阶段):
GPU0: [前向]........[反向]
GPU1: ....[前向].[反向]...
GPU2: ......[前向][反向].
GPU3: .......[前向][反向]
时间: ████░░░░████░░░░  (░ 为等待气泡,约 50% 利用率)

DualPipe 将前向和反向计算重叠调度,并利用 MoE 的计算-通信重叠(专家 All-to-All 通信与本地计算并行),将气泡比例降至接近 0。


四、DeepSeek-R1(2025 年 1 月):用强化学习激发推理

论文DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning

R1 是 DeepSeek 影响力最大的工作,在推理能力上与 OpenAI o1 直接对标,但技术路线截然不同——且完全开源。

4.1 “顿悟时刻”(Aha Moment)

在研究过程中,DeepSeek 团队发现了一个令人震惊的现象:

仅用强化学习(不经过 SFT 监督微调),在基座模型 DeepSeek-V3-Base 上训练一个中间版本 DeepSeek-R1-Zero,模型自发涌现出了:

  • 自我反思(Self-Reflection):主动检查自己的推理步骤
  • 回溯重试(Backtracking):发现错误后重新思考
  • 逐步拆解(Step-by-step reasoning):将复杂问题分解为子问题

这些能力没有在任何监督数据中被明确教授,而是在 RL 过程中自然涌现——模型"学会了思考"。

这被称为大语言模型训练中的"顿悟时刻"(Aha Moment),类比 AlphaGo 自我对弈中发现人类从未使用过的棋局策略。

4.2 GRPO — 替代 PPO 的高效算法

GPT 路线(InstructGPT)使用 PPO(Proximal Policy Optimization)做强化学习,需要维护 4 个模型:

PPO 四模型架构:
1. Actor(被训练的语言模型)
2. Critic(价值估计网络,预测期望奖励)
3. Reference Model(SFT 初始化,冻结,用于 KL 惩罚)
4. Reward Model(打分网络)

同时维护 4 个大模型,显存开销是模型本身的 4 倍,对 671B 规模模型不现实。

DeepSeek 提出 GRPO(Group Relative Policy Optimization),核心思想:用组内相对排名替代 Critic 的价值估计

GRPO 流程

对同一个问题 qqq,从当前策略 πθ\pi_\thetaπθ 采样 GGG 个回答:

问题 q → 生成回答 {o_1, o_2, ..., o_G}
       → 奖励模型打分:{r_1, r_2, ..., r_G}
       → 组内归一化:advantage_i = (r_i - mean(r)) / std(r)

用组内均值和方差估计基线(baseline),替代 Critic 网络的作用:

LGRPO=−Eq1G∑i=1Gmin⁡ ⁣(πθ(oi∣q)πθold(oi∣q)A^i, clip(⋯ )A^i)−β⋅DKL[πθ∥πref] \mathcal{L}_{\text{GRPO}} = -\mathbb{E}_q \frac{1}{G}\sum_{i=1}^{G} \min\!\left(\frac{\pi_\theta(o_i|q)}{\pi_{\theta_\text{old}}(o_i|q)} \hat{A}_i,\ \text{clip}(\cdots) \hat{A}_i\right) - \beta \cdot D_{\text{KL}}[\pi_\theta \| \pi_{\text{ref}}] LGRPO=EqG1i=1Gmin(πθold(oiq)πθ(oiq)A^i, clip()A^i)βDKL[πθπref]

其中 A^i=ri−mean(r)std(r)\hat{A}_i = \frac{r_i - \text{mean}(\mathbf{r})}{\text{std}(\mathbf{r})}A^i=std(r)rimean(r) 是组内归一化的优势估计。

GRPO vs PPO 对比

项目 PPO GRPO
需要的模型数 4 2(Actor + Reference)
Critic 网络 需要(与 Actor 同规模) 不需要
基线估计 Critic 网络预测 组内统计量
显存需求 4× 模型大小 2× 模型大小
实现复杂度

4.3 可验证奖励(Verifiable Reward)

R1 的奖励函数不依赖可能被"欺骗"的神经网络奖励模型,而是使用规则基础的可验证奖励

准确性奖励(Accuracy Reward)

  • 数学题:答案是否与标准答案一致(精确匹配或数值等价)
  • 代码题:生成代码是否通过测试用例(编译 + 运行验证)
reward = 1.0   如果答案正确
reward = 0.0   如果答案错误

格式奖励(Format Reward)

强制模型把推理过程写在 <think>...</think> 标签内,答案写在 <answer>...</answer> 标签内:

reward += 0.1   如果输出符合格式规范
reward -= 0.5   如果出现格式违规(如把答案混在思考过程中)

无"过程监督":注意 R1 的奖励只看最终答案,不评判推理过程的每一步。模型完全自主探索推理链的形式,这是顿悟涌现的关键条件。

4.4 R1 完整训练流程

为了解决 R1-Zero 存在的问题(推理链可读性差、语言混乱),最终 R1 采用了精心设计的多阶段流程:

阶段一:冷启动(Cold Start)SFT
  来源:精心收集的数千条长思维链(Chain-of-Thought)样本
  目的:让模型学会使用 <think> 格式,避免 RL 初期的格式混乱
        ↓

阶段二:面向推理的 RL(GRPO)
  奖励:数学/代码的可验证正确性 + 格式奖励
  目的:激发推理能力的大幅提升
        ↓

阶段三:拒绝采样 SFT(Rejection Sampling Fine-tuning)
  来源:用阶段二的模型大量采样,保留正确回答作为新的 SFT 数据
  目的:同时提升写作、问答等非推理任务的能力(RL 阶段这些能力可能退化)
        ↓

阶段四:多任务对齐 RL(GRPO)
  奖励:混合推理奖励 + 偏好奖励(人类标注)
  目的:全面对齐,兼顾推理能力和通用有用性

4.5 蒸馏:小模型也能推理

R1 的另一重要贡献是通过知识蒸馏将推理能力迁移到小模型:

用 R1(671B)生成的推理数据(含 <think> 过程)微调小模型(1.5B、7B、14B、32B),使小模型获得远超同规模直接 RL 训练的推理能力。

R1(671B) → 生成带思维链的训练数据 → SFT 微调 DeepSeek-R1-Distill-7B

DeepSeek-R1-Distill-7B 在 AIME 数学竞赛上超越 OpenAI o1-mini,证明推理能力可以被高效地从大模型"教给"小模型。


五、技术演进全景图

DeepSeek-V1 (2024 年初)
  67B 密集模型,Chinchilla 修正,高质量中英数据
  → 确立中文 LLM 开源基线,提出推理导向的训练配比
        ↓
  [MLA 注意力 + DeepSeekMoE 架构革新]
        ↓
DeepSeek-V2 (2024 年 5 月)
  236B 总参数 / 21B 激活,128K 上下文
  → MLA 将 KV Cache 压缩 93%,MoE 推理成本降至极低
        ↓
  [FP8 训练 + MTP + DualPipe 工程极致化]
        ↓
DeepSeek-V3 (2024 年 12 月)
  671B 总参数 / 37B 激活,278 万 GPU 小时训练完成
  → 以约 1/20 的成本对标 GPT-4o,开源权重
        ↓
  [纯 RL 激发推理,GRPO 替代 PPO]
        ↓
DeepSeek-R1 (2025 年 1 月)
  "顿悟时刻",链式推理涌现,AIME / MATH 对标 o1
  → 开源推理模型,蒸馏到 1.5B~70B 系列

六、核心技术横向对比:DeepSeek vs GPT

6.1 注意力机制对比

机制 KV Cache 大小 注意力质量 代表模型
MHA(本项目) num_heads × d_k × 2 最高 GPT-3
GQA num_groups × d_k × 2 略低 GPT-4、LLaMA 2
MLA d_c(极小) 接近 MHA DeepSeek-V2/3/R1

本项目实现的是 MHA,对应 split_heads 函数将 d_model 等分为 num_heads 组。MLA 的创新相当于在此之前插入一个"压缩-解压"瓶颈,只缓存压缩向量。

6.2 MoE 设计对比

设计 代表模型 专家粒度 共享专家 负载均衡
传统 MoE GShard 粗粒度 辅助损失
Switch Transformer Switch 粗粒度,top-1 辅助损失
GPT-4 MoE(推测) GPT-4 中粒度 未知 未知
DeepSeekMoE V2/V3 细粒度 无辅助损失偏置

6.3 推理训练对比

方法 代表模型 核心机制 推理数据来源
RLHF + SFT InstructGPT、ChatGPT PPO + 人类偏好标注 人工编写
Process Reward OpenAI o1 过程监督奖励模型 人工标注每步
纯 RL(GRPO) DeepSeek-R1-Zero 可验证结果奖励 无需人工标注
冷启动 RL DeepSeek-R1 少量 CoT + GRPO 少量人工 + 自动生成

6.4 成本效率对比

模型 估计训练成本 推理激活参数 MMLU(参考)
GPT-4 > $1 亿(估计) 未知 ~86%
DeepSeek-V3 ~$600 万 37B ~88%
DeepSeek-R1 基于 V3 微调 37B ~90%(推理增强)

七、从本项目视角看 DeepSeek 的创新本质

本项目实现了一个标准的 Encoder-Decoder Transformer,包含以下核心模块:

# MultiHeadAttention.py
attn_scores = torch.matmul(Q, K.transpose(-1, -2)) / math.sqrt(self.d_k)

# PositionWiseFeedForward.py
return self.fc2(self.relu(self.fc1(x)))

# Transformer.py
nopeak_mask = (1 - torch.triu(torch.ones(1, seq_length, seq_length), diagonal=1)).bool()

DeepSeek 的所有创新都是在这个核心框架上的精细改造:

本项目组件 DeepSeek 改造 改造目的
W_k / W_v 投影 MLA 低秩压缩 W_DKV 压缩 KV Cache
PositionWiseFeedForward DeepSeekMoE 多专家 参数量↑,激活量不变
scaled_dot_product_attention 解耦 RoPE + 分块计算 长上下文 + 计算效率
nn.CrossEntropyLoss GRPO 可验证奖励 激发自主推理能力
nopeak_mask(训练技巧) Decoder-Only 结构约束 自回归生成的基础

Transformer 的核心单元——注意力 + FFN + 残差 + 归一化——在 DeepSeek 中从未改变。变化的是:如何在工程约束下,把这个极简结构发挥到极致。

这也是 Transformer 架构最深刻的特质:

极简的核心,极大的可塑性。

从本项目三层、256 维的玩具模型,到 DeepSeek-R1 的 671B MoE 推理模型,跑在同一套数学原理上,隔着的只是规模、工程和对训练目标更深的理解。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐