从DeepSeek发布的4篇论文来看DeepSeek的发展过程

在这里插入图片描述

这篇按顺序梳理DeepseekMoE、Deepseek-V2、Deepseek-V3到Deepseek R1这4篇论文。Deepseek的模型都采用了MoE架构的,因此开始具体论文分析之前,先分析一下MoE架构稀疏型模型和传统的密集型模型区别。

MoE网络

先说说什么是一个混合专家模型 (MoE) 。作为一种基于 Transformer 架构的模型,混合专家模型主要由两个关键部分组成:

  • 稀疏 MoE 层:这些层代替了传统 Transformer 模型中的前馈网络(FFN) 层。MoE 层包含若干“专家”(例如 8 个),每个专家本身是一个独立的神经网络。在实际应用中,这些专家通常是前馈网络 (FFN),但它们也可以是更复杂的网络结构,甚至可以是 MoE 层本身,从而形成层级式的 MoE 结构
  • 门控网络或路由:这个部分用于决定哪些token 被发送到哪个专家。例如,在下图中,“More”这个token 可能被发送到第二个专家,而“Parameters”这个token 被发送到第一个专家。有时,一个token 甚至可以被发送到多个专家。token 的路由方式是 MoE 使用中的一个关键点,因为路由器由学习的参数组成,并且与网络的其他部分一同进行预训练
    -在这里插入图片描述

在MoE(Mixture of Experts)网络中,门控网络(Router)的公式通常用于决定输入的分配,同常采用softmax。假设有N个专家,路由的输出是一个概率分布,表示输入应分配给每个专家的概率。公式如下:

P ( e i ∣ x ) = exp ⁡ ( W i ⋅ x + b i ) ∑ j = 1 N exp ⁡ ( W j ⋅ x + b j ) P(e_i | x) = \frac{\exp(W_i \cdot x + b_i)}{\sum_{j=1}^{N} \exp(W_j \cdot x + b_j)} P(eix)=j=1Nexp(Wjx+bj)exp(Wix+bi)

  • x是输入向量
  • W i W_i Wi b i b_i bi是第 i i i个专家的权重和偏置
  • P ( e i ∣ x ) P(e_i | x) P(eix)是输入x分配给第$i
    $个专家的概率

**所以router是一个自定义的大小的神经网络,它的输出是一个专家大小的概率分布,决定每个token该如何选择专家。**MoE模型的核心思想是在模型内部设计多个“专家”,通过一个门控机制在每个输入或每个token上仅激活其中一部分专家进行计算,这样做有两点显著变化:

  1. 大规模参数扩展:可以在参数规模上大幅增加模型容量,而实际参与计算的参数只有一小部分。因此你会看到Deepseek-V2有236B总参数,但计算时只有21B的参数参与了实际计算,Deepseek-V3有671B总参数,在实际执行时只有37B参数被激活。这样做的缺点就是需要大量显存,因为所有专家系统都需要加载到内存中,而传统做法是用37B的稠密模型
  2. 计算效率:因为在推理时只有部分专家被激活,因此与具有相同参数数量的模型相比,MoE在前向传播的计算过程中大大减少了计算量,所以模型的推理速度就会比密集型模型更快

MoE 把 Transformer 中的全连接 FNN 前馈神经网络全部换成 MoE Layers,在运行时判断哪些token需要哪些 expert参与计算,用符合的 expert 去计算对于的token;而Dense Model所有参数都会被激活并参与计算。

MoE 模型可以让不同的专家专注于不同领域或不同任务的细粒度知识,因此在特定领域内表现较好;通用大模型需要处理更加广泛的语言现象和知识,专家间的分工可能不如在垂直领域内那么明显,MoE 模型相对于 dense 模型的优势可能会减弱。由于训练和微调时涉及的稀疏激活机制,MoE 模型在微调时往往不如 dense 模型那样直接有效,需要更复杂的调参和策略。

以上观点都是Deepseek爆火之前,2022年到2024年的传统MoE观点。

DeepSeekMoE

DeepSeekMoE主要做了更新,第一是细粒度专家分割(fine-grained expert segmentation)。在保持专家总参数数量不变的情况下,通过将N个FFN中间隐藏维度缩小为原来的 1 m \frac{1}{m} m1,即每个专家FFN分割成m个更小的专家,即总共得到mN个细粒度专家。由于每个专家变小,为保持计算成本不变,激活的专家数量增加到m倍,变为mK个。细粒度分割后,不同知识可被更精确地分解到不同细化后的专家中学习,每个专家能保持更高专业化水平。从组合角度看,显著提升了激活专家的组合灵活性。

在这里插入图片描述

第二是共享专家隔离(shared expert isolation)。在传统路由策略下,不同专家可能会学习相同的通用知识,造成参数冗余。共享专家专门用于捕捉和整合不同上下文的通用知识,这样能减轻其他路由专家在获取通用知识时的冗余,使路由专家能更专注于独特知识的学习,提高模型参数效率。

具体做法是从众多专家中隔离出 K s K_s Ks个专家作为共享专家,无论路由模块如何分配,每个token都会被确定性地分配到这些共享专家进行计算。为维持计算成本恒定,会相应减少其他路由专家中被激活的数量。这样也提升了MoE模型通用能力不足的问题。但实际中还会存在一些问题:

  • 路由崩溃(Route Collapse):如我们的输入序列包含 10 个token,可能会有五个token被路由到同一个专家,而剩下的五个token 分别被路由到不同的专家。这导致了专家分配重叠,其他专家无法得到充分训练,资源利用效率不高等问题。这个问题被称为
  • 计算瓶颈加剧:当专家分布在多个设备上时,负载不平衡会加剧计算瓶颈,降低计算资源的利用效率

为了解决以上问题,通常的做法是采用两个损失函数来限制路由崩溃与缓解计算瓶颈:

  • expert level balance loss(专家级别平衡损失):控制对专家负载平衡的约束程度,尽量让每个专家都能得到足够的训练机会,避免路由崩溃route collapse;计算基于每个专家被选中的频率和每个专家的平均样本数,通过调整超参数(专家级别平衡因子),可以控制对专家负载平衡的约束程度

L ExpBal  = α 1 ∑ i = 1 N ′ f i P i , f i = N ′ K ′ T ∑ t = 1 T 1 (  Token  t  selects Expert  i ) , P i = 1 T ∑ t = 1 T s i , t \begin{aligned} \mathcal{L}_{\text {ExpBal }} & =\alpha_{1} \sum_{i=1}^{N^{\prime}} f_{i} P_{i}, \\ f_{i} & =\frac{N^{\prime}}{K^{\prime} T} \sum_{t=1}^{T} \mathbb{1}(\text { Token } t \text { selects Expert } i), \\ P_{i} & =\frac{1}{T} \sum_{t=1}^{T} s_{i, t}\end{aligned} LExpBal fiPi=α1i=1NfiPi,=KTNt=1T1( Token t selects Expert i),=T1t=1Tsi,t

  • device level Balance Loss(设备平衡损失):将所有路由专家划分为D个组,并将每个组部署在单个设备上。计算基于设备上所有专家的平均被选中频率和设备上所有专家处理的平均样本数的值。通过超参数(设备级别平衡因子)来控制设备间的负载平衡,以确保设备间的计算负载相对均衡,避免出现计算瓶颈

L DevBal  = α 2 ∑ i = 1 D f i ′ P i ′ f i ′ = 1 ∣ E i ∣ ∑ j ∈ E i f j , P i ′ = ∑ j ∈ E i P j \begin{aligned} \mathcal{L}_{\text {DevBal }} & =\alpha_{2} \sum_{i=1}^{D} f_{i}^{\prime} P_{i}^{\prime} \\ f_{i}^{\prime} & =\frac{1}{\left|\mathcal{E}_{i}\right|} \sum_{j \in \mathcal{E}_{i}} f_{j}, \\ P_{i}^{\prime} & =\sum_{j \in \mathcal{E}_{i}} P_{j}\end{aligned} LDevBal fiPi=α2i=1DfiPi=Ei1jEifj,=jEiPj

传统MoE,无共享专家

这两个都属于传统MoE就有的辅助损失的专家平衡策略,在Deepseek V3中会被无辅助损失的负载均衡策略替代。 因为这种额外损失项约束负载均衡需要超参数调优,需要额外进行计算,会增加训练开销。

Deepseek V2

2024年5月,Deepseek发布Deepseek V2,是基于DeepseekMoE和Multi-head Latent Attention (MLA) 进行开发的。

MLA是一种改进的注意力机制,其核心思想是通过潜在向量(latent vector)对传统的Key-Value (KV) 缓存进行压缩,从而减少推理时的内存占用和计算开销。在标准Transformer中,多头注意力机制需要为每个注意力头单独存储历史生成的Key和Value向量(即KV缓存)。随着序列长度增加,KV缓存的存储需求呈线性增长,导致内存占用急剧上升,尤其是在长文本生成任务中。

在这里插入图片描述

为了解决这一问题,MLA机制应运而生。MLA的核心思想是将多个注意力头的Key和Value投影到一个低维的共享潜在向量空间中,从而取代了传统的逐头存储方式。具体来说,MLA通过以下方式实现高效内存利用:

  1. 低维潜在空间映射:MLA将每个注意力头的Key和Value通过线性变换映射到一个低维的共享潜在向量空间中。这一过程可以看作是对KV信息的一种“有损压缩”,但通过训练,模型能够学习如何在低维空间中保留关键信息,从而在后续的注意力计算中仍然能够有效地恢复出每个头的Key和Value,恢复的过程也是通过线性变换将向量从低维映射到
  2. 动态更新潜在向量:MLA的潜在向量并非静态不变,而是随着生成过程动态更新。在每次生成新的token时,模型仅需更新潜在向量,而无需存储所有历史KV缓存。这种动态更新机制极大地减少了内存占用,使得模型能够更高效地处理长文本生成任务
  3. 避免重复计算:在传统多头注意力机制中,每次生成新token时,都需要重新计算所有历史token的注意力分数。而MLA通过潜在向量隐式地编码了历史信息,只需维护和更新潜在向量,从而避免了重复计算。而且不同注意力头共享潜在空间,进一步减少了参数数量,提高了计算效率

DeepSeek-V3

DeepSeek V3在继承了DeepSeek V2的MoE(Mixture of Experts)和MLA(Memory-efficient Low-rank Attention)架构的基础上,引入了两项重要的新特色:无辅助损失的负载均衡策略(Auxiliary-Loss-Free Load Balencing)和多token 预测训练目标(Multi-Token Prediction)。这些创新特性进一步提升了模型的性能和效率,使其在处理复杂任务时更加高效和强大。

为确保负载均衡的鲁棒性,DeepSeek-V3 主要采用了无辅助损失主策略,通过动态偏差调整实现均衡,无需额外损失函数干预。

  • 动态专家偏差调整机制:在传统的Top-k路由基础上,模型会根据每个专家的近期负载动态调整其路由分数偏差。对低负载专家增加偏差值,提升被选中的概率,以快速平衡负载;对高负载专家降低偏差值,减少其被选择的频率,避免过载。此策略通过无梯度干扰的偏差调整实现负载均衡,无需依赖辅助损失函数,从而避免了传统方法中因辅助损失导致的优化冲突问题。
  • 为防止单个序列内出现极端的不平衡情况,还采用了补充序列级平衡损失,模型在训练中引入轻量级辅助损失,仅在必要时激活,进一步强化负载分布的稳定性。

为降低分布式训练中的通信成本,DeepSeek-V3 采用了节点限制路由机制(Node-Limited Routing):

  • token级路由限制:每个token仅被路由至最多M个节点,大幅减少跨节点通信量
  • 计算与通信并行化:通过限制节点数量,通信过程可与计算任务高度重叠,显著提升训练吞吐量

DeepSeek-V3 在训练和推理阶段均实现了无token丢弃(No Token-Dropping):

  • 训练阶段:得益于高效的负载均衡策略,模型在训练过程中不需通过丢弃token缓解负载压力,可确保数据完整性
  • 推理阶段:结合动态部署策略(如自动扩缩容),模型在实时推理中同样保持负载均衡,避免性能波动

DeepSeek-V3另外一大创新点就是多token预测(Multi-Token Prediction)通过扩展预测范围来提升模型性能和数据效率。通过结合当前输入token的表示和后续token的嵌入信息,MTP模块能预测多个后续token,增强模型对长序列的理解和处理能力,提升训练效果。

这一部分的优化也是很符合直觉的。直接看下图,他们提出在训练中可以多预测几步,具体做法就是,多创建几个 MTP 模块,MTP模块包含共享FFN层(一个token的h维到4h维),然后经过Transformer层(下图head),再过一个FFN层(不共享),最后通过softmax,预测每个词的概率分布。

在这里插入图片描述

在训练阶段,模型不再仅仅基于前一个时刻的隐藏状态来预测下一个单一token,而是学习根据上下文信息一次性预测多个后续token。在处理一个句子时,模型可以根据前文同时预测出下一个短语甚至下一个小句中的多个关键token。这种方式能更有效地利用训练数据,因为一次预测多个token 相当于在相同的数据量下增加了训练的信息量,从而加速模型的收敛和性能提升。

DeepSeek-V3的多token预测损失函数基于交叉熵损失,并在多个预测深度上进行计算和优化。对于每个预测深度k,模型会计算一个交叉熵损失 L M T P k L_{MTP}^k LMTPk,用于衡量模型在预测第k个未来token时的误差。模型会同时对多个未来token进行预测(例如,预测深度为1到D),并将所有深度的交叉熵损失进行平均,得到总体的MTP损失$ L_{MTP} $。公式表示为:

L M T P = − 1 D ∑ k = 1 D log ⁡ L M T P k L_{MTP} =- \frac{1}{D} \sum_{k=1}^{D} \log L_{MTP}^k LMTP=D1k=1DlogLMTPk

同时,在DeepSeek-V3的训练中采用了FP8 混合精度训练技术,应该是是第一个(至少在开源社区内)成功使用FP8混合精度训练得到的大号MoE模型

在这里插入图片描述

在推理阶段,有两种方法,第一是直接把MTP模块丢弃,主模型独立运行,这个就跟正常LLM模型推理一样,没有加速效果;第二种方法是保留MTP Model 做self-speculative decoding,这样充分使用多Head预测能力,提升推理加速性能。推理具体有三个过程:

在这里插入图片描述

  • Predect模型预测:利用k个Head一次生成k个token,每个Head生成一个token
  • Verify自监督验证:将原始的序列和生成的k个token拼接,组成Pair<sequence_input, label>,如上图Verify阶段,黑框里是sequence_input,箭头指向的是要验证的 label。将组装的k个Pair<sequence_input, label>组成一个Batch,发给 H e a d 1 Head_1 Head1校验 H e a d 1 Head_1 Head1生成的token是否跟 label 一致(利用Transformer架构的并行计算特性,一次性完成所有Pair对的验证计算。每个验证对在注意力机制中通过masking保持序列独立性,实现真正的并行校验。就是验证多token的输出和one token的输出是否一致)
  • accept模型接受:选择预估结果与label一致的最长的 k个token,作为可接受的结果

在这里插入图片描述

接下来我们看下相比于token-by-token的生成,上述流程推理阶段加速效果怎么样?

假设:我们要生成的序列长度为: m,并行Head数为:k。我们只考虑最优情况下:所有辅助Head预测结果跟 H e a d 1 Head_1 Head1完全一样,即Verify阶段全部token都一次性被接受。

  • 原生成方法:token-by-token生成,需要m步执行
  • 多token预测的方法:每k个token执行一次上述三阶段过程,predict阶段执行1步产出多个Head的输出,verify阶段并行执行1步,accept阶段不耗时。所以最终需要 2m/k步执行
  • 推理加速效果需要2m/k步,当k=4的时候,推理可提速1倍

DeepSeekR1

2024年12月26日,DeepSeek-V3通用模型开源,其总参数量671B,生成token时的激活参数为37B。R1-ZeRO是在V3的基础上进行优化的,仅使用了RL,无SFT。R1在ZeRO的基础上先进行冷启动,再进行RL,最后SFT。R1-Distill系列模型使用R1的数据,对qwen和llama等模型进行蒸馏。

在这里插入图片描述

亮点详细解析请看上篇:DeepSeek-R1-ZeRO、DeepSeek-R1、DeepSeek-Distill演进解析

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值