DEEPSEEK技术简单讲解
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=1∑Nfi⋅Pi
但辅助损失会与主任务目标相互干扰,损害模型性能。
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=1∑Gmin(πθold(oi∣q)πθ(oi∣q)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)ri−mean(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 推理模型,跑在同一套数学原理上,隔着的只是规模、工程和对训练目标更深的理解。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)