DeepSeek-R1模型架构解析:从上下文长度到多令牌预测
📖阅读时长:19分钟
🕙发布时间:2025-02-17
近日热文:全网最全的神经网络数学原理(代码和公式)直观解释
欢迎关注知乎和公众号的专栏内容
LLM架构专栏
知乎LLM专栏
知乎【柏企】
公众号【柏企科技说】【柏企阅文】
📝1. 输入上下文长度
DeepSeek-R1的输入上下文长度为128K。它从其基础模型DeepSeek-V3-Base继承了这一128K的上下文长度。最初,DeepSeek-V3使用4K上下文长度进行预训练。随后,借助YaRN技术,通过两阶段的上下文长度扩展,先将其提升到32K,再进一步提升到128K。
YaRN(Yet another RoPE extensioN method)是一种用于有效扩展使用旋转位置嵌入(RoPE)的大型语言模型(LLM)上下文窗口的技术。RoPE利用旋转矩阵对位置信息进行编码,而YaRN则对这些旋转频率的缩放方式进行了修改。它并非简单地推断频率(这种方式往往会导致性能下降),而是通过平滑地插值和调整频率,使得模型能够更好地泛化到更长的上下文。这种技术在计算上高效,并且无需大量重新训练即可扩展模型的上下文长度。
🏛2. 总层数
DeepSeek-R1由一个嵌入层、61个Transformer层以及输出阶段的多个预测头构成。
DeepSeek-R1在所有Transformer层中采用多头潜在注意力(MLA)层,而非标准的多头注意力。前三个Transformer层与其余层有所不同,使用标准的前馈网络(FFN)层。从第4层到第61层,则由专家混合(MoE)层取代了FFN层。后续部分将深入探讨MLA和MoE的详细信息。
DeepSeek-V3运用多标记预测(MTP)技术,通过其最后两个预测头来预测接下来的2个标记。第二个预测Token的接受率在85%到90%之间,这表明在各种生成主题中该模型都具有较高的可靠性。DeepSeek-R1(DeepSeek-V3)总共包含6710亿个参数,其中每个令牌激活了370亿个。
🔬3. 前3个DeepSeek-R1层
前3层由多头潜在注意力(MLA)和一个标准FFN层组成。由于FFN层未被相对稀疏的MoE层取代,这些层通常被称为“密集LLM层”。
🧩4. DeepSeek-R1的第4层到第61层
这些层由MLA和MoE层构成。在后续部分,我们将深入了解MLA和MoE层的原理及其工作方式。
🧠5. 多头潜在注意力(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是如何通过减少KV缓存来加快推理速度的呢?“MLA的核心在于对注意力键和值进行低秩联合压缩,以减少推理过程中的键值(KV)缓存。”——DeepSeek-V2
下面让我们逐步解析这个图表:
- 第1步:Q、K和V的下投影
MLA层的输入是$h_t$ 。为便于理解,假设$h_t$ 的形状为 (input_sequence_length×2000)。在传统的Transformer层中,权重矩阵用于将$h_t$ 投影到查询(Q)、键(K)和值(V)表示形式中,且Q、K、V通常与输入保持相同的隐藏维度,即形状为 (input_sequence_length×2000)。
然而,在具有多头潜在注意力(MLA)的Transformer层中,权重矩阵生成的Q、K和V的维度相较于输入要小得多。例如,如果输入$h_t$ 的形状为 (sequence length × 2000),那么生成的Q、K和V的形状可能为 (sequence length × 100)。
在实际实现过程中,为了在GPU上提高计算和内存效率,Q、K和V的权重矩阵通常会被融合。在MLA中,K和V的生成遵循这一原则,具体来说,会使用一个表示为$W_{DKV}$的单个权重矩阵,其中的“D”代表向下投影权重矩阵,体现了其在降低维度以实现高效注意力计算方面的作用。
此投影的输出是一个包含K和V的串联表示,通过简单的切片机制就能轻松提取。最终输出的形状为 (sequence length × 200),其中前 (sequence length × 100) 对应K,其余 (sequence length × 100) 对应V。压缩后的K和V输出在推理时会被缓存,大大减少了KV缓存的内存占用。类似地,Q在MLA中也会被压缩,结果形状为 (序列长度 × 100)。
- 第2步:Q、K和V的上投影
压缩后的Q、K和V会被上投影回更大的尺寸,以便进行注意力计算。这个更大的尺寸可以与原始输入$h_t$ 一致,也可以基于注意力头的配置来确定结构。
例如,向上投影的形状可以是:(sequence length×2000),与输入大小匹配;或者(sequence length×3200),其中3200源自64×50(有64个关注头,每个头50个维度) 。
Q、K和V的上投影通过专用权重矩阵来实现:用$W_{UK}$进行K的上投影;用$W_{UV}$进行V的上投影;用$W_{UQ}$进行Q的上投影 。这里的“U”代表向上投影,意味着将压缩后的表示扩展回更大的维度空间,用于注意力计算。
需要注意的是,每个注意力头的输入维度会进行调整,以适配旋转位置嵌入(RoPE),这一点在后续部分会更加明晰。
- 第3步:在Q和K中嵌入RoPE以编码位置信息
这一步用于计算RoPE嵌入,从而对位置信息进行编码。
为了融入位置信息,DeepSeek-V2(DeepSeek-V3和DeepSeek-R1也沿用了此方法)采用了解耦的RoPE方式。这需要创建专门用于携带位置信息的额外查询(Q)和键(K)向量,然后将这些RoPE增强的Q和K向量与上投影的Q和K向量连接起来。
这在MLA中是较为复杂的部分,下面以从DeepSeek技术报告中理解的方式来解释:在传统的Transformer层中,RoPE操作直接应用于Q和K,它不会改变Q和K的维度,但会改变其中的语义表示(Q和K中的数值),以此对位置信息进行编码,所以最终的Q和K同时包含语义和位置信息。
而在具有MLA的Transformer层中,RoPE被应用于单独新生成的查询(Q)和键(K)嵌入,并与上投影的Q和K连接。
- 步骤3.1:为Q生成RoPE嵌入
传统上,RoPE(Rotary Positional Embeddings)会根据查询(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嵌入
类似地,在为K生成RoPE嵌入时,不是将RoPE应用于上投影的K,而是生成新的K嵌入并应用RoPE。但与RoPE嵌入式$q_{t}^{R}$有两个关键区别:新的K嵌入是从$h_t$(输入嵌入)生成,而非向下投影的K($c_{t}^{K}$);相同的RoPE嵌入K(键)会连接到每个注意力头的输入,而对于Q(查询),则是计算单独的RoPE嵌入并连接到每个注意力头。(从公式来看,这种说法似乎正确,但还需进一步验证。)
为什么不从$k_{t}^{C}$(上投影的K)生成呢?DeepSeek-V2报告中的解释是:“如果我们对键$k_{C}$应用RoPE,$W_{UK}$将与位置敏感的RoPE矩阵耦合。这样一来,在推理过程中,$W_{UK}$就无法再被吸收到$W_Q$中,因为与当前生成的标记相关的RoPE矩阵会位于$W_Q$和$W_{UK}$之间,而矩阵乘法不满足交换律。”
因此,为了提高推理效率,位置嵌入的K(键)嵌入是从输入嵌入$h_t$生成的。
在MLA中引入额外的权重矩阵,会不会导致内存和计算效率低下呢?为解决这些问题,DeepSeek-V2报告中提到:“此外,在推理过程中,由于$W_{UK}$可以被吸收到$W_Q$中,$W_{UV}$也可以被$W_O$吸收,我们甚至无需计算用于注意力的键和值。”
为进一步降低内存消耗,报告还指出:“而且,为了减少训练时的激活内存,我们还对查询进行低秩压缩,即使这无法减少KV缓存。”
- 第4步:计算Attention输出
串联过程会增加Q和K向量的维数。为处理这一增加的维度,模型有两种选择:
- 增加Attention Head的数量:这样可以保持原始的每个头的维度,但需要更多的计算资源。
- 调整每个头的维度:保持头数不变,增加每个头的维数以适应串联后的向量。
注意力输出通过以下标准注意力方程计算:$O_{t}^{i}$是注意力分数,$u_t$是注意力输出,$W_o$表示输出投影权重矩阵。输出会被投影回与输入相同的维度(例如,在我们的例子中,形状将为input_sequence_length x 2000)。
🎭6. 专家混合(MoE)
为了深入理解MoE,首先让我们明确它在Transformer中的具体应用位置以及其简要架构。在标准Transformer层中,FFN被MoE所取代。
MoE的核心遵循标准Transformer设计,但对前馈层进行了修改,引入多个并行的专家网络(FFN),而非单个密集的FFN。其工作原理如下:
- 多个FFN而非一个FFN:MoE使用多个并行训练的FFN层(专家),而非单个共享的FFN。
- 输入处理和令牌路由:每个token像往常一样经过Transformer自注意力层,之后不是由单个FFN处理,而是被发送到一个路由器,由路由器决定由哪些专家来处理它。
- 通过路由器选择专家:一个小型的可训练路由器负责确定处理每个token的专家子集(FFN)。通常,为保证效率,每个token仅选择1或2个专家(例如,采用top-1或top-2门控)。DeepSeek-V3(DeepSeek-R1)使用9个专家,其中1个是共享专家,另外8个是路由专家。选择过程通常基于softmax评分机制,路由器为每个专家分配概率。特别地,在DeepSeek-V3(DeepSeek-R1)中,使用Sigmoid替代softmax。
- 专家的稀疏计算:只有选定的专家处理token,其他专家保持不活动状态。专家输出通过加权求和进行组合,然后传递到下一个Transformer层。在DeepSeek-V3/R1中,权重是标准化的sigmoid输出。这种稀疏激活确保在任何时刻仅使用模型的一小部分,使计算易于管理 。
为什么要用MoE替代单个FFN呢?
- 可扩展性:MoE允许模型在不线性增加计算量的情况下,通过增加更多参数进行扩展。
- 高效学习:专家们专注于数据的不同方面,从而提升模型的泛化能力。
- 节省计算资源:由于每个token仅使用部分专家,与相同规模的密集模型相比,MoE模型的运行成本更低。DeepSeek-V3/R1总共有6710亿个参数,每个Token仅激活370亿个。
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}$值的前K个专家会被激活进行处理。在sigmoid输出中添加一个偏置项,以实现无辅助损失的MoE负载均衡。输出值会使用选定的前K个值进行归一化。
- 专家计算:$u_t$是MoE层的输入。公式中的第二项表示输入与共享专家相乘,在DeepSeek-R1中仅有1个共享专家,因此$N_s = 1$。第三项表示输入与活跃的单个专家相乘,在DeepSeek-R1中共有256个单个专家,但每个token仅激活8个,所以$N_r = 8$。每个活跃的单个专家都有与之相关的$g_{i,t}$,用于计算第三项。
- 输出计算:$h_t$代表MoE层的输出。$u_t$是MoE层的输入,专家计算结果与输入$u_t$相加,得到MoE层的输出。
🔢7. 多令牌预测(MTP)
多令牌预测是语言建模中的一种先进方法。在这种方法里,模型不是一次只预测序列中的下一个单词,而是能够同时预测多个未来的令牌。通过让模型并行预测几个后续单词,该方法提高了学习效率,加速了文本生成。
Meta推出了一种多令牌预测架构,用于训练语言模型同时预测多个未来令牌,这提升了采样效率,加快了推理速度。基于这一概念,DeepSeek-V3融入了多令牌预测(MTP)目标,使模型能够一次性预测多个令牌。这种方法强化了训练信号,有助于更好地预先规划令牌表示,从而在复杂基准测试中提升性能。
DeepSeek-V3/R1与Meta的多令牌预测存在两个关键差异:“与Gloeckle等人(2024)[Meta Research]不同,他们使用独立的输出头并行预测D个额外的令牌,而我们则按顺序预测额外的令牌,并在每个预测深度保持完整的因果链。”——DeepSeek-V3
Meta的模型预测4个令牌,而DeepSeek-V3预测2个令牌。Meta模型的预测头相互独立,而DeepSeek-V3的预测头则是顺序连接的。
MTP在DeepSeek-R1中是如何工作的呢?让我们逐步解析相关图表:
在训练过程中,输入令牌(位于左下角)先经过嵌入层,然后传播通过所有的Transformer块/层。
第一个预测头(包含输出头)直接连接到主模型的最后一个Transformer层。输出头通常是一个前馈网络(FFN),其输出维度与模型的词汇表大小相匹配,负责预测序列中的下一个令牌。给定输入令牌t₁、t₂、t₃、t₄,它会预测t₂、t₃、t₄、t₅。不过在推理时,仅计算最后一个令牌t₅。
第二个预测头通过添加额外的可学习层扩展了这种方法。它获取主模型最后一个Transformer层的输出,应用RMSNorm进行归一化,并将其与输入嵌入连接起来。这些输入嵌入与主模型中使用的嵌入层相同。与第一个预测头不同,这个头从t₂而不是t₁开始处理输入令牌。然后,连接后的输出通过线性投影层投影到合适的嵌入大小,接着经过一个可学习的Transformer块/层进行进一步处理。在训练期间,这个头预测t₃到t₆,但在推理时,仅计算t₆ 。
类似地,第三个预测头从第二个预测头的Transformer块/层获取输入,并结合相应的输入嵌入(现在从t₃到t₆)。它遵循与前面预测头相同的结构,在训练期间预测t₄到t₇,但在推理时仅计算t₇。
每个预测头使用交叉熵计算损失。然后,这些损失会乘以一个因子λ进行加权,取它们的平均值作为最终损失值。
## 推荐阅读
1. DeepSeek-R1的顿悟时刻是如何出现的? 背后的数学原理
2. 微调 DeepSeek LLM:使用监督微调(SFT)与 Hugging Face 数据
3. 使用 DeepSeek-R1 等推理模型将 RAG 转换为 RAT
4. DeepSeek R1:了解GRPO和多阶段训练
5. 深度探索:DeepSeek-R1 如何从零开始训练
6. DeepSeek 发布 Janus Pro 7B 多模态模型,免费又强大!
本文由mdnice多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。