本文深入解析 DeepSeek-R1 模型架构的核心设计。从输入到输出完整追踪 DeepSeek-R1 的计算流程,揭示其架构中的创新机制与关键组件。DeepSeek-R1 基于 DeepSeek-V3-Base 构建,本文将全面覆盖其设计的所有重要方面。
📝 1. 输入上下文长度
DeepSeek-R1 支持 128K 的输入上下文长度。
DeepSeek-R1 从基础模型 DeepSeek-V3-Base 继承了 128K 上下文窗口能力。最初,DeepSeek-V3 使用 4K 上下文进行预训练,随后借助 YaRN 技术实现两阶段扩展:先扩展至 32K,再进一步扩展至 128K。
YaRN(Yet another RoPE extensioN method)是一种专为扩展大型语言模型上下文窗口而设计的技术,适用于采用旋转位置嵌入(RoPE)的模型。RoPE 通过旋转矩阵编码位置信息,而 YaRN 则优化了旋转频率的缩放方式。它不是简单地外推频率(这通常导致性能下降),而是平滑地插值和调整频率,从而在更长上下文中保持良好的泛化能力。该方法计算高效,无需大量重新训练即可实现上下文扩展。
🏛 2. 总体层数结构
DeepSeek-R1 由一个嵌入层、61 个 Transformer 层以及输出阶段的多个预测头组成。
所有 Transformer 层均采用多头潜在注意力(MLA)层,而非标准多头注意力机制。前三个 Transformer 层使用标准前馈网络(FFN)层,而从第 4 层到第 61 层,则采用混合专家(MoE)层替代 FFN。MLA 和 MoE 的详细机制将在后续章节深入探讨。

完整模型架构及维度描述:

DeepSeek-V3 采用多标记预测(MTP)技术,利用最后两个预测头预测接下来的 2 个标记。第二个预测标记的接受率在 85% 至 90% 之间,显示出跨主题的高可靠性。 DeepSeek-R1(DeepSeek-V3)总参数量达 671B,其中每个标记激活 37B 参数。
🔬 3. 前 3 层架构设计
前 3 层由多头潜在注意力(MLA)和标准 FFN 层组成,通常被称为"密集层",因为 FFN 未被 MoE 替代,相比之下 MoE 层具有更稀疏的激活模式。

DeepSeek-R1 中的前 3 个 Transformer 层
🧩 4. 第 4 层至第 61 层
这些层由 MLA 层和 MoE 层组成。接下来的章节将详细介绍 MLA 层和 MoE 层的工作原理。

MoE Transformer 层结构
🧠 5. 多头潜在注意力(MLA)
现在深入了解 MLA 机制。
MLA 首次在 DeepSeek-V2 中引入,并延续应用于 DeepSeek-V3 和 DeepSeek-R1。
为什么需要 MLA?
以下是 DeepSeek-V2 技术报告中的阐述,清晰说明了 MLA 的开发动机:
"传统 Transformer 模型通常采用多头注意力(MHA)机制,但在生成过程中,庞大的键值(KV)缓存成为限制推理效率的瓶颈。为减少 KV 缓存,业界提出了多查询注意力(MQA)和分组查询注意力(GQA)。它们所需的 KV 缓存量较小,但性能不如 MHA。
针对 DeepSeek-V2,我们设计了创新的注意力机制——多头潜在注意力(MLA)。MLA 配备低秩键值联合压缩,性能优于 MHA,但所需 KV 缓存量大幅减少。"

MLA 与 MHA、GQA、MQA 的对比(来自 DeepSeek-V2)
MLA 如何减少 KV 缓存以加速推理?
"MLA 的核心是对注意力键和值进行低秩联合压缩,以减少推理过程中的键值(KV)缓存。" — DeepSeek-V2

逐步理解该图:
步骤 1:Q、K 和 V 的下投影
MLA 层的输入为 [h_t]。为便于理解,假设 [h_t] 的形状为(序列长度 × 2000)。
在传统 Transformer 层中,权重矩阵将 [h_t] 投影到查询(Q)、键(K)和值(V)表示,这些表示通常保留与输入相同的隐藏维度,即 Q、K、V 的形状为(序列长度 × 2000)。
然而在 MLA 层中,权重矩阵生成的 Q、K、V 维度显著小于输入。例如,如果输入 [h_t] 形状为(序列长度 × 2000),则生成的 Q、K、V 形状可能为(序列长度 × 100)。
在实现中,为提高 GPU 计算和内存效率,通常融合 Q、K、V 的权重矩阵。MLA 中,K 和 V 的生成遵循此原则,使用单个权重矩阵 [W^{DKV}] 表示。这里"D"代表下投影权重矩阵,反映其降维作用。

潜在 K 和 V 嵌入
此投影的输出是包含 K 和 V 的连接表示,可通过简单切片机制提取。结果输出形状为(序列长度 × 200),其中前(序列长度 × 100)对应 K,其余对应 V。
压缩后的 K 和 V 在推理期间被缓存,显著减少了 KV 缓存的内存占用。
类似地,Q 也在 MLA 中被压缩,结果形状为(序列长度 × 100)。
步骤 2:Q、K 和 V 的上投影

压缩后,Q、K、V 被上投影回更大维度以进行注意力计算。这个维度可以匹配原始输入 [h_t],也可以遵循基于注意力头配置的结构。
例如,上投影的形状可以是:
- (序列长度 × 2000),与输入大小匹配
- (序列长度 × 3200),其中 3200 来自 64 × 50(64 个注意力头,每个头 50 维)

K 和 V 上投影

Q 上投影
Q、K、V 的上投影使用专用权重矩阵执行:
- [W_{UK}] 用于 K 上投影
- [W_{UV}] 用于 V 上投影
- [W_{UQ}] 用于 Q 上投影
这里"U"代表上投影,表示将压缩表示扩展回更大维度空间。
注意:每个注意力头的输入维度将调整以适配旋转位置嵌入(RoPE),这将在后续部分详细说明。
步骤 3:Q 和 K 中的 RoPE 嵌入用于编码位置信息

此步骤计算 RoPE 嵌入来编码位置信息。
旋转位置嵌入(RoPE)的整合:
- 解耦 RoPE 策略:为整合位置信息,DeepSeek-V2(以及后续的 DeepSeek-V3 和 DeepSeek-R1)采用解耦 RoPE 方法,创建专门用于携带位置信息的额外查询(Q)和键(K)向量。
- 连接:这些 RoPE 增强的 Q 和 K 向量与上投影的 Q 和 K 向量连接。
这是 MLA 中较为复杂的部分。
在传统 Transformer 层中,RoPE 直接作用于 Q 和 K,不改变维度,而是改变数值来编码位置信息。因此,得到的 Q 和 K 同时具有语义和位置信息。
但在 MLA 的 Transformer 层中,RoPE 应用于分离新生成的查询(Q)和键(K)嵌入,并将其连接到上投影的 Q 和 K。

步骤 3.1:为 Q 生成 RoPE 嵌入
传统上,RoPE 根据查询(Q)和键(K)向量在序列中的位置对其应用旋转矩阵,直接在 Q 和 K 中编码相对位置信息。
但在 MLA 中,不是将 RoPE 应用于上投影的 Q([q_t^C]),而是从 [c_t^Q] 生成新的 Q 嵌入([q_t^R])并对其应用 RoPE。

通过将 [c_t^Q] 与权重矩阵 [W^{QR}] 相乘,生成完全独立的查询嵌入。这些新的独立查询嵌入经过 RoPE 转换,得到位置编码查询嵌入([q_t^R])。

[q_t^R] 的生成方式使其可以连接到每个注意力头的输入查询嵌入,从而为每个注意力头提供位置信息。
步骤 3.2:为 K 生成 RoPE 嵌入
类似地,不是将 RoPE 应用于上投影的 K,而是生成新的 K 嵌入并对其应用 RoPE。

但与 [q_t^R] 的 RoPE 嵌入有两个关键区别:
- 新的 K 嵌入是从 [h_t](输入嵌入)而非下投影的 K([c_t^K])生成的。
- 相同的 RoPE 嵌入 K 连接到每个注意力头的输入,但单独的 RoPE 嵌入 Q 被计算并连接到每个注意力头。
为什么不从上投影的 K 即 [k_t^C] 生成?
DeepSeek-V2 报告中的推理:
"如果我们将 RoPE 应用于键 [kC],[W{UK}] 将与位置敏感的 RoPE 矩阵耦合。这样,[W_{UK}] 在推理过程中就不能再被吸收到 [W_Q] 中,因为与当前生成 token 相关的 RoPE 矩阵将位于 [WQ] 和 [W{UK}] 之间,而矩阵乘法不遵循交换律。"
以下解释截图可以更好地理解这一点:

K 的 RoPE 嵌入:第 1 部分

K 的 RoPE 嵌入:第 2 部分

K 的 RoPE 嵌入:第 3 部分
因此,为提高推理效率,位置嵌入的 K 嵌入从输入嵌入 [h_t] 生成。
在 MLA 中引入额外权重矩阵不会导致内存和计算效率低下吗?
为解决这些开销,DeepSeek-V2 报告指出:
"此外,在推理过程中,由于 [W_{UK}] 可以被吸收到 [WQ] 中,而 [W{UV}] 可以被吸收到 [W_O] 中,我们甚至不需要计算键和值来引起注意。"
为进一步减少内存消耗:
"此外,为减少训练期间的激活内存,我们还对查询执行低秩压缩,即使它不能减少 KV 缓存。"
步骤 4:计算注意力输出

连接过程会增加 Q 和 K 向量的维数。为管理这种增加的维数,模型可以采取以下任一方式:
- 增加注意力头的数量:保持原始的每头维度,但需要更多计算资源
- 调整每头维数:保持头数量不变,但增加每头维数以适应连接的向量
注意力输出使用标准注意力方程计算:

[O_{t,i}] 是注意力得分,[u_t] 是注意力输出。[W_o] 表示输出投影权重矩阵。输出被投影回与输入相同的维度(在我们的例子中:形状为 序列长度 × 2000)。
🎭 6. 混合专家(MoE)
什么是混合专家(MoE)?
为清楚理解 MoE,首先看看它在 Transformer 中的具体用途及架构简介。标准 Transformer 层中的 FFN 被 MoE 取代。

从本质上讲,MoE 遵循标准 Transformer 设计,但通过引入多个并行专家网络(FFN)而非单个密集 FFN 来修改前馈层。其工作原理如下:
1. 多个 FFN(而非一个)
MoE 不使用单个共享 FFN,而是使用多个并行训练的 FFN 层(专家)。
2. 输入处理和 token 路由
- 每个 token 像往常一样经过 Transformer 自注意力层
- 它不是由单个 FFN 处理,而是被发送到路由器,由路由器决定哪些专家应该处理它
3. 通过路由器选择专家
- 一个小型可训练的路由器决定哪个专家子集(FFN)应该处理每个 token
- 通常每个 token 仅选择 1 或 2 个专家以保持效率(例如 top-1 或 top-2 门控)。DeepSeek-V3(DeepSeek-R1)使用 9 个专家,其中 1 个是共享专家,其他 8 个是路由专家
- 选择通常基于 softmax 评分机制,其中路由器为每个专家分配概率。具体来说,在 DeepSeek-V3(DeepSeek-R1)中使用 Sigmoid 而非 softmax
4. 专家稀疏计算
- 只有选定的专家才能处理 token,其他专家保持不活动状态
- 专家输出使用加权求和进行组合,并传递到下一个 Transformer 层。在 DeepSeek-V3/R1 中,权重是归一化的 Sigmoid 输出
- 这种稀疏激活确保任何时候仅使用模型的一小部分,从而保持计算可管理
为什么用 MoE 取代单一 FFN?
- 可扩展性 — MoE 允许模型使用更多参数进行扩展,而无需线性增加计算量
- 高效学习 — 专家专注于数据的不同方面,从而提高泛化能力
- 计算节省 — 由于每个 token 仅使用专家子集,因此与相同大小的密集模型相比,MoE 模型运行成本更低。DeepSeek-V3/R1 共有 671B 参数,其中每个 token 激活 37B 参数
MoE 在 DeepSeek-R1 中如何工作?

以下来自 DeepSeek-V3 技术报告的公式展示了每个 MoE 层中的计算。在 DeepSeek 系列模型中,MoE 架构首次在 DeepSeekMoE 模型中引入,并在 DeepSeek-V2、DeepSeek-V3 和 DeepSeek-R1 中使用。
路由器计算:
在 DeepSeek-V3、DeepSeek-R1 和其他一些现代混合专家(MoE)模型中,[e_i] 表示学习到的质心,有助于将输入路由到正确的专家。与传统 MoE 架构中基于 FFN 的路由器计算门控分数不同,此方法预定义了一组可学习向量 [e_i],每个向量对应一位专家。
关键思想:
- 每个专家 i 都有一个相关的质心向量 [e_i]
- 我们不是将输入 [u_t] 传递给 FFN 来获取专家概率,而是通过点积来计算 [u_t] 和每个 [e_i] 之间的相似度:

- 该分数决定了专家与给定输入的相关程度
- 仅激活具有最高 [s_{i,t}] 值的 Top-K 专家进行处理

- 在 Sigmoid 输出中添加了一个偏差项,以创建无辅助损失的 MoE 负载平衡
DeepSeek-V3 论文中的这段描述进一步阐明了它的用途以及它在训练过程中的计算方式:


专家计算:

[u_t] 是 MoE 层的输入。等式中的第二项表示输入与共享专家相乘。每个专家由 FFN(前馈网络)组成,因此用"FFN"表示。在 DeepSeek-R1 中,只有 1 个共享专家,因此 [N_s=1]。同样,等式中的第三项表示输入与活跃的个人专家相乘。在 DeepSeek-R1 中,总共有 256 个个人专家,但每个 token 只有 8 个活跃,因此 [Nr=8]。每个活跃的个人专家都将具有与等式 13 中关联的 [g{i,t}],它用于计算第三项。
输出

[h_t] 表示 MoE 层的输出。[u_t] 是 MoE 层的输入。专家计算结果添加到输入 [u_t] 中,得到 MoE 层的输出。
🔢 7. 多标记预测(MTP)
什么是多标记预测?
多标记预测是语言建模中的一种高级方法,其中模型不是一次预测一个序列中的下一个单词,而是同时预测多个未来 token。此方法使模型能够并行预测多个即将到来的单词,从而提高学习效率并加速文本生成。


Meta 引入了一种多标记预测架构,可训练语言模型同时预测多个未来 token,从而提高采样效率并加快推理速度。在此概念的基础上,DeepSeek-V3 整合了多标记预测(MTP)目标,使模型能够同时预测多个 token。这种方法使训练信号密集化,并能够更好地预先规划 token 表示,从而提高复杂基准测试的性能。
DeepSeek-V3/R1 和 Meta 的多 token 预测有两个关键区别:
"与 Gloeckle 等人(2024 年)[Meta Research] 使用独立输出头并行预测 D 个额外 token 不同,我们按顺序预测其他 token,并在每个预测深度保留完整的因果链。" — DeepSeek-V3
- Meta 的模型预测了 4 个 token,而 DeepSeek-V3 预测了 2 个 token
- Meta 模型中的预测头是独立的,而 DeepSeek-V3 的预测头是顺序连接的
MTP 在 DeepSeek-R1 中如何工作?

让我们逐步分析该图表。
在训练期间,输入 token(位于左下角)穿过嵌入层,然后传播到所有 Transformer 块/层。
第一个预测头(包括输出头)直接连接到主模型的最终 Transformer 层。输出头通常是前馈网络(FFN),其输出维度与模型的词汇量相匹配。该头负责按顺序预测下一个 token。给定输入 token t₁、t₂、t₃、t₄,它会预测 t₂、t₃、t₄、t₅。但是在推理过程中,只计算最终 token t₅。
第二个预测头通过添加额外的可学习层扩展了这种方法。它从主模型的最终 Transformer 层获取输出,应用 RMSNorm 进行归一化,然后将其与输入嵌入连接。这些输入嵌入是从主模型中使用的相同嵌入层获得的。与第一个预测头不同,这个头从 t₂ 而非 t₁ 开始处理输入 token。然后使用线性投影层将连接的输出投影到合适的嵌入大小,再使用可学习的 Transformer 块/层进行进一步处理。在训练期间,这个头将 t₃ 预测为 t₆,但在推理中只计算 t₆。
类似地,第三个预测头从第二个预测头的 Transformer 块/层获取输入以及相应的输入嵌入,现在从 t₃ 开始到 t₆。它遵循与前几个头相同的结构,在训练期间预测 t₄ 到 t₇,但在推理期间仅计算 t₇。
每个预测头使用交叉熵计算损失。然后这些损失用因子 λ 加权,取其平均值作为最终损失值。

单独预测头损失

最终损失
在 DeepSeek-V3 和 R1 中,MTP 仅在训练期间使用,而不在推理期间使用:
"推理中的 MTP:我们的 MTP 策略主要是为了提高主模型的性能,因此在推理过程中,我们可以直接丢弃 MTP 模块,主模型可以独立正常运行。" — DeepSeek-V3
参考资料
如果你对人工智能领域的前沿技术感兴趣,想深入了解更多大模型架构设计与优化技巧,欢迎探索更多相关资源。对于希望掌握深度学习模型训练与推理优化的开发者,理解 MLA 和 MoE 等创新机制将为你的技术栈带来显著提升。
转自 CSDN 作者 致Great