DeepSeekMoE: Towards Ultimate Expert Specialization in Mixture-of-Experts Language Models翻译
⚠️ 在开始阅读之前,如果你对 实时 Agent / 数字人 / 多模态系统 / LiveKit 架构 感兴趣,
欢迎先到 GitHub 给项目点一个 ⭐ Star,这是对开源作者最大的支持。
🚀 AlphaAvatar 项目地址(强烈建议先收藏,该项目正在持续更新维护):
👉 https://github.com/AlphaAvatar/AlphaAvatar
🚀 AIPapers 项目地址(具有更全的有关LLM/Agent/Speech/Visual/Omni论文分类):
👉 https://github.com/AlphaAvatar/AIPaperNotes
摘要
在大语言模型时代,混合专家(MoE)架构在模型参数扩展时,是一种管理计算成本的有效方法。然而,传统的混合专家架构(例如 GShard)从 NNN 个专家中激活排名 top−Ktop-Ktop−K 的专家,在确保专家专业化方面面临挑战,即每个专家获取的知识不重叠且具有针对性。为此,我们提出了 DeepSeekMoE 架构,旨在实现极致的专家专业化。该架构包含两个主要策略:(1)将专家精细划分为 mNmNmN 个专家,并从中激活 mKmKmK 个专家,从而实现更灵活的专家组合;(2)将 KKK 个专家隔离为共享专家,旨在捕获共同知识并减少路由专家中的冗余。从参数量较小的 2B 参数开始,我们证明了 DeepSeekMoE-2B 的性能与参数量和计算量均为其 1.5 倍的 GShard 2.9B 相当。此外,DeepSeekMoE-2B 的性能几乎与参数量相同的密集模型相当,后者设定了 MoE 模型性能的上限。随后,我们将 DeepSeekMoE 的参数量扩展到 16B 参数,并证明其性能与 LLaMA2 7B 相当,而计算量仅为后者的约 40%。此外,我们初步尝试将 DeepSeekMoE 的参数量扩展到 145B 参数,结果始终验证了其相对于 GShard 架构的显著优势,并表明其性能与 DeepSeek 67B 相当,而计算量仅为后者的 28.5%(甚至可能低至 18.2%)。
1.介绍

近期研究和实践已通过实证证明,在拥有充足训练数据的情况下,通过增加参数和计算资源来扩展语言模型,可以显著提升模型的性能。然而,必须承认,将模型扩展到极大规模也伴随着极高的计算成本。考虑到高昂的成本,混合专家(MoE)架构已成为一种流行的解决方案。它能够在保持计算成本适中的同时,实现参数扩展。MoE 架构在 Transformer 模型中的应用已成功实现了将语言模型扩展到相当规模的尝试,并取得了显著的性能提升。这些成果凸显了 MoE 语言模型的巨大潜力和前景。
尽管 MoE 架构展现出巨大的潜力,但现有的 MoE 架构可能存在知识混合性和知识冗余的问题,这限制了专家的专业化程度,即每个专家获取的知识不重叠且具有针对性。传统的 MoE 架构用 MoE 层替代 Transformer 中的前馈网络(FFN)。每个 MoE 层由多个专家组成,每个专家的结构与标准的 FFN 相同,每个 token 分配给一位或多位专家。这种架构存在两个潜在问题:(1)知识混合性:现有的 MoE 实践通常只使用有限数量的专家(例如 8 位或 16 位),因此分配给特定专家的 token 很可能涵盖多种不同的知识。因此,指定的专家会试图在其参数中整合各种不同类型的知识,而这些知识难以同时利用。 (2)知识冗余:分配给不同专家的 token 可能需要共同的知识。因此,多位专家在各自的参数方面可能会趋于一致地获取共享知识,从而导致专家参数冗余。这些问题共同阻碍了现有 MoE 实践中专家的专业化,使其无法达到 MoE 模型的理论上限性能。
针对上述问题,我们提出了 DeepSeekMoE,一种专为实现终极专家专业化而设计的创新型 MoE 架构。我们的架构包含两个主要策略:(1)细粒度专家分割:在保持参数数量不变的情况下,我们通过分割 FFN 中间隐藏维度,将专家分割成更细粒度的单元。相应地,在计算成本不变的情况下,我们激活更多细粒度的专家,从而实现更灵活、更具适应性的专家组合。细粒度专家分割能够将多样化的知识更精细地分解,并更精确地分配给不同的专家,每个专家都能保持更高的专业化水平。此外,激活专家组合方式的灵活性增强也有助于更准确、更有针对性地获取知识。(2)共享专家隔离:我们隔离某些专家作为始终激活的共享专家,旨在捕获和整合不同情境下的通用知识。通过将通用知识压缩到这些共享专家中,可以减少其他路由专家之间的冗余。这可以提高参数效率,并确保每个路由专家通过专注于独特的方面而保持专业性。DeepSeekMoE 中的这些架构创新为训练一个参数高效的 MoE 语言模型提供了机会,其中每个专家都高度专业化。
我们从参数量为 2B 的适中规模出发,验证了 DeepSeekMoE 架构的优势。我们在涵盖多种任务的 12 个零样本或少样本基准测试集上进行了评估。实证结果表明,DeepSeekMoE 2B 的性能显著优于 GShard 2B,甚至与 GShard 2.9B 的性能相当——GShard 2.9B 是一个规模更大的 MoE 模型,拥有 1.5 倍的专家参数和计算量。值得注意的是,我们发现 DeepSeekMoE 2B 的性能几乎与参数量相同的密集模型相当,这为 MoE 语言模型设定了严格的上限。为了获得更深入的见解,我们对 DeepSeekMoE 的专家专业化进行了精细的消融研究和分析。这些研究验证了细粒度专家分割和共享专家隔离的有效性,并提供了实证证据,支持 DeepSeekMoE 可以实现高水平的专家专业化。
利用我们开发的架构,我们将模型参数扩展到 16B,并在包含 2T token 的大规模语料库上训练了 DeepSeekMoE 16B。评估结果表明,DeepSeekMoE 16B 仅需约 40% 的计算量,即可达到与 DeepSeek 7B 相当的性能,后者是在相同的 2T token 语料库上训练的密集模型。我们还将 DeepSeekMoE 与开源模型进行了比较,评估结果表明,DeepSeekMoE 16B 始终大幅优于具有相似激活参数数量的模型,并且与激活参数数量约为其 2.5 倍的 LLaMA2 7B 的性能相当。图 1 展示了在 Open LLM 排行榜上的评估结果。此外,我们还进行了有监督微调 (SFT) 以进行对齐,从而将模型转换为 chat 模型。评估结果表明,在聊天场景下,DeepSeekMoE Chat 16B 的性能与 DeepSeek Chat 7B 和 LLaMA2 SFT 7B 相当。受此结果的鼓舞,我们进一步开展了将 DeepSeekMoE 扩展到 145B 的初步尝试。实验结果依然验证了其相对于 GShard 架构的显著优势。此外,它还展现出与 DeepSeek 67B 相当的性能,而计算量仅为后者的 28.5%(甚至可能低至 18.2%)。
我们的贡献总结如下:
- Architectural Innovation。我们推出了 DeepSeekMoE,这是一种创新的 MoE 架构,旨在实现终极专家专业化,它采用了细粒度专家分割和共享专家隔离两种主要策略。
- Empirical Validation。我们进行了大量实验,以实证验证 DeepSeekMoE 架构的有效性。实验结果验证了 DeepSeekMoE 2B 中专家专业化程度高,并表明 DeepSeekMoE 2B 的性能几乎可以达到 MoE 模型性能的上限。
- Scalability。我们将 DeepSeekMoE 扩展到训练一个 16B 模型,结果表明,仅需约 40% 的计算量,DeepSeekMoE 16B 即可达到与 DeepSeek 7B 和 LLaMA2 7B 相当的性能。我们还初步尝试将 DeepSeekMoE 扩展到 145B,突显了其相对于 GShard 架构的持续优势,并展示了其与 DeepSeek 67B 相当的性能。
- Alignment for MoE。我们成功地对 DeepSeekMoE 16B 进行了有监督微调,创建了一个对齐的聊天模型,展示了 DeepSeekMoE 16B 的适应性和多功能性。
- Public Release。秉持开放研究的精神,我们向公众发布了 DeepSeekMoE 16B 的模型 checkpoint。值得注意的是,该模型无需量化即可部署在配备 40GB 显存的单 GPU 上。
2.Preliminaries: Mixture-of-Experts for Transformers
我们首先介绍一种常用于 Transformer 语言模型的通用 MoE 架构。标准的 Transformer 语言模型由 LLL 层标准 Transformer 模块堆叠而成,其中每个模块可以表示如下:
u1:Tl=Self-Att(h1:Tl−1)+h1:Tl−1(1)\textbf u^l_{1:T}=\text{Self-Att}(\textbf h^{l-1}_{1:T})+\textbf h^{l-1}_{1:T}\tag{1}u1:Tl=Self-Att(h1:Tl−1)+h1:Tl−1(1)
htl=FFN(utl)+utl,(2)\textbf h^l_{t}=FFN(\textbf u^l_t)+\textbf u^l_t,\tag{2}htl=FFN(utl)+utl,(2)
其中,TTT 表示序列长度,Self-Att(⋅)\text{Self-Att}(·)Self-Att(⋅) 表示自注意力模块,FFN(⋅)FFN(·)FFN(⋅) 表示前馈网络 (FFN),u1:Tl∈RT×d\textbf u^l_{1:T}∈ \mathbb R^{T×d}u1:Tl∈RT×d 表示经过第 𝑙 个注意力模块后所有 token 的隐藏状态,htl∈Rd\textbf h^l_t ∈ \mathbb R^dhtl∈Rd 表示经过第 lll 个 Transformer 模块后第 ttt 个 token 的输出隐藏状态。为简洁起见,上述公式中省略了层归一化。
构建 MoE 语言模型的典型做法通常是在 Transformer 模型中,以指定的间隔用多专家层替换前馈神经网络(FFN)。一个多专家层由多个专家组成,每个专家在结构上与一个标准 FFN 相同。然后,每个 token 将被分配给一个或多个专家。如果第 lll 个 FFN 被替换为一个多专家层,则其输出隐藏状态 htl\textbf h^l_thtl 的计算可以表示为:
htl=∑i=1N(gi,tFFNi(utl))+utl,(3)\textbf h^l_t=\sum^N_{i=1}\left(g_{i,t}FFN_i(\textbf u^l_t)\right)+\textbf u^l_t,\tag{3}htl=i=1∑N(gi,tFFNi(utl))+utl,(3)
gi,t={si,t,si,t∈Topk({sj,t∣1≤j≤N},K),0,otherwise(4)g_{i,t}=\begin{cases} s_{i,t}, & s_{i,t}\in Topk(\{s_{j,t}|1\le j\le N\},K),\\ 0, & otherwise \end{cases}\tag{4}gi,t={si,t,0,si,t∈Topk({sj,t∣1≤j≤N},K),otherwise(4)
si,t=Softmax(utlTeil),(5)s_{i,t}=Softmax({\textbf u^l_t}^T\textbf e^l_i),\tag{5}si,t=Softmax(utlTeil),(5)
其中,NNN 表示专家总数,FFNi(⋅)FFN_i(·)FFNi(⋅) 表示第 iii 位专家的 FFN,gi,tg_{i,t}gi,t 表示第 iii 位专家的门控值,si,ts_{i,t}si,t 表示 token 到专家的亲和度,Topk(⋅,K)Topk(·, K)Topk(⋅,K) 表示包含第 ttt 个 token 与所有 NNN 位专家之间亲和度得分最高的 KKK 个元素的集合,eil\textbf e^l_ieil 表示第 iii 位专家在第 lll 层中的质心。注意,gi,tg_{i,t}gi,t 是稀疏的,表明在 NNN 个门控值中只有 KKK 个非零。这种稀疏性确保了 MoE 层内的计算效率,即每个 token 仅由 K 个专家进行分配和计算。此外,为了简洁起见,上述公式中省略了层归一化操作。
3.DeepSeekMoE Architecture

在第 2 节概述的通用 MoE 架构之上,我们引入了 DeepSeekMoE,它专门用于发挥专家专业化的潜力。如图 2 所示,我们的架构融合了两种主要策略:细粒度的专家分割和共享专家隔离。这两种策略旨在提升专家的专业化水平。
3.1 Fine-Grained Expert Segmentation
在专家数量有限的情况下,分配给特定专家的 token 更有可能涵盖多种类型的知识。因此,指定的专家需要学习的参数范围内的知识类型非常广泛,难以同时有效利用。然而,如果每个 token 可以分配给更多专家,那么不同的知识就有可能被分解并分别由不同的专家学习。在这种情况下,每位专家仍然可以保持高度的专业化水平,从而有助于实现更集中、更全面的知识分布。
为了实现目标,在保持专家总参数数量和计算成本不变的情况下,我们对专家进行更精细的分割。更精细的专家分割使得激活的专家组合更加灵活和适应性更强。具体来说,在图 2(a) 所示的典型 MoE 架构之上,我们将每个专家 FFN 分割成 mmm 个更小的专家,方法是将 FFN 的中间隐藏维度减小到其原始大小的 1m\frac{1}{m}m1 倍。由于每个专家都变小了,因此,为了保持相同的计算成本,我们也相应地将激活的专家数量增加到 mmm 倍,如图 2(b) 所示。通过这种精细的专家分割,MoE 层的输出可以表示为:
htl=∑i=1mN(gi,tFFNi(utl))+utl,(6)\textbf h^l_t=\sum^{mN}_{i=1}\left(g_{i,t}FFN_i(\textbf u^l_t)\right)+\textbf u^l_t,\tag{6}htl=i=1∑mN(gi,tFFNi(utl))+utl,(6)
gi,t={si,t,si,t∈Topk({sj,t∣1≤j≤mN},mK),0,otherwise,(7)g_{i,t}=\begin{cases} s_{i,t}, & s_{i,t}\in Topk(\{s_{j,t}|1\le j\le mN\},mK),\\ 0, & otherwise, \end{cases}\tag{7}gi,t={si,t,0,si,t∈Topk({sj,t∣1≤j≤mN},mK),otherwise,(7)
si,t=Softmaxi(utlTetl),(8)s_{i,t}=Softmax_i({\textbf u^l_t}^T\textbf e^l_t),\tag{8}si,t=Softmaxi(utlTetl),(8)
其中,专家总参数等于标准前馈神经网络(FFN)中参数数量的 NNN 倍,而 mNmNmN 表示细粒度专家的总数。采用细粒度专家分割策略后,非零门的数量也将增加到 mKmKmK。
从组合学的角度来看,细粒度的专家分割策略显著提升了激活专家的组合灵活性。例如,我们考虑 N=16N = 16N=16 的情况。典型的 top-2 路由策略可以产生 (162)=120\binom{16}{2} = 120(216)=120 种可能的组合。相比之下,如果将每个专家分割成 444 个更小的专家,细粒度的路由策略可以产生 (648)=4,426,165,368\binom{64}{8} = 4,426,165,368(864)=4,426,165,368 种潜在组合。组合灵活性的显著提升了实现更精准、更有针对性的知识获取的可能性。
3.2 Shared Expert Isolation
采用传统的路由策略,分配给不同专家的 token 可能需要一些共同的知识或信息。因此,多位专家可能会在其各自的参数中获取共享知识,从而导致专家参数冗余。然而,如果存在专门负责在不同情境下捕获和整合通用知识的共享专家,则可以缓解其他已路由专家之间的参数冗余。这种冗余的缓解将有助于构建一个参数效率更高、专家更专业的模型。
为了实现这一目标,除了细粒度的专家分割策略外,我们还进一步隔离了 KsK_sKs 位专家作为共享专家。无论路由模块如何,每个 token 都将被确定性地分配给这些共享专家。为了保持计算成本恒定,其他路由专家中激活的专家数量将减少 KsK_sKs 位,如图 2© 所示。集成共享专家隔离策略后,完整的 DeepSeekMoE 架构中的 MoE 层结构如下:
htl=∑i=1KsFFNi(utl)+∑i=Ks+1mN(gi,tFFNi(utl))+utl,(9)\textbf h^l_t=\sum^{K_s}_{i=1}FFN_i(\textbf u^l_t)+\sum^{mN}_{i=K_s+1}(g_{i,t}FFN_i(\textbf u^l_t))+\textbf u^l_t,\tag{9}htl=i=1∑KsFFNi(utl)+i=Ks+1∑mN(gi,tFFNi(utl))+utl,(9)
gi,t={si,t,si,t∈Topk({sj,t∣Ks+1≤j≤mN},mK−Ks),0,otherwise(10)g_{i,t}=\begin{cases} s_{i,t}, & s_{i,t}\in Topk(\{s_{j,t}|K_s+1\le j\le mN\},mK-K_s),\\ 0, & otherwise \end{cases}\tag{10}gi,t={si,t,0,si,t∈Topk({sj,t∣Ks+1≤j≤mN},mK−Ks),otherwise(10)
si,t=Softmaxi(utlTeil).(11)s_{i,t}=Softmax_i({\textbf u^l_t}^T\textbf e^l_i).\tag{11}si,t=Softmaxi(utlTeil).(11)
最后,在 DeepSeekMoE 中,共享专家的数量为 KsK_sKs,路由专家的总数为 mN−KsmN − K_smN−Ks,非零门的数量为 mK−KsmK − K_smK−Ks。
3.3 Load Balance Consideration
自动学习的路由策略可能会遇到负载不均衡的问题,这会导致两个显著的缺陷。首先,存在路由崩溃的风险,即模型总是只选择少数专家,导致其他专家无法得到充分的训练。其次,如果专家分布在多个设备上,负载不均衡会加剧计算瓶颈。
Expert-Level Balance Loss。为了降低路由崩溃的风险,我们还采用了专家级平衡损失机制。平衡损失的计算方法如下:
LExpBal=α1∑i=1N′fiPi,(12)\mathcal L_{ExpBal}=\alpha_1\sum^{N'}_{i=1}f_iP_i,\tag{12}LExpBal=α1i=1∑N′fiPi,(12)
fi=N′K′T∑t=1TI(Token t selects Expert i),(13)f_i=\frac{N'}{K'T}\sum^T_{t=1}\mathbb I(\text{Token t selects Expert i}),\tag{13}fi=K′TN′t=1∑TI(Token t selects Expert i),(13)
Pi=1T∑t=1Tsi,t,(14)P_i=\frac{1}{T}\sum^T_{t=1}s_{i,t},\tag{14}Pi=T1t=1∑Tsi,t,(14)
其中,α1\alpha_1α1 是一个称为专家级平衡因子的超参数,为简便起见,N′N'N′ 等于 (mN−Ks)(mN − K_s)(mN−Ks),K′K'K′ 等于 (mK−Ks)(mK − K_s)(mK−Ks)。I(⋅)\mathcal I(·)I(⋅) 表示指示函数。
Device-Level Balance Loss。除了专家级平衡损失之外,我们引入了设备级平衡损失。当目标是缓解计算瓶颈时,在专家级别施加严格的平衡约束变得没有必要,因为对负载均衡的过度约束会损害模型性能。相反,我们的主要目标是确保设备之间的计算是均衡的。若将所有被路由的专家划分为 DDD 个组 {E1,E2,…,ED}\{\mathcal{E}_1, \mathcal{E}_2, \ldots, \mathcal{E}_D\}{E1,E2,…,ED},并将每个组部署在单个设备上,则设备级平衡损失定义如下:
LDevBal=α2∑i=1Dfi′Pi′,(15)\mathcal{L}_{\text{DevBal}} = \alpha_2 \sum_{i=1}^{D} f'_i P'_i,\tag{15}LDevBal=α2i=1∑Dfi′Pi′,(15)
fi′=1∣Ei∣∑j∈Eifj,(16)f'_i = \frac{1}{|\mathcal{E}_i|} \sum_{j \in \mathcal{E}_i} f_j,\tag{16}fi′=∣Ei∣1j∈Ei∑fj,(16)
Pi′=∑j∈EiPj,(17)P'_i = \sum_{j \in \mathcal{E}_i} P_j,\tag{17}Pi′=j∈Ei∑Pj,(17)
其中,α2\alpha_2α2 是一个称为设备级平衡因子的超参数。在实际中,我们设置一个较小的专家级平衡因子以降低路由坍塌(routing collapse)的风险,同时设置一个较大的设备级平衡因子以促进设备之间的计算均衡。
4.Validation Experiments
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)