19 · DeepSeekMoE: Towards Ultimate Expert Specialization in Mixture-of-Experts Language Models

MoE DeepSeek 专家专业化 2024
Dai et al., DeepSeek (2024) · arXiv:2401.06066

上一代的问题:传统 MoE 两大瓶颈知识混杂(Knowledge Hybridity):同一个专家被迫学习不同类型的知识,因为专家数量太少,每个专家容量大但专注度不够;知识冗余(Knowledge Redundancy):多个专家各自学习相同的通用知识(语法、格式等基础模式),浪费参数容量。

这代改了什么:细粒度专家分割 — 把每个专家的 FFN 中间维度拆分为 1/m,专家总数增至 mN,激活数增至 mK(总计算量不变),路由组合空间从 C(16,2)=120 暴增至 C(64,8)≈4.4B;共享专家隔离 — Ks 个共享专家所有 token 均激活,专门吸收通用知识,路由专家专注于差异化的知识。

效果:DeepSeekMoE 145B(仅激活 ≈28B 参数)以 28.5% 的计算量达到 DeepSeek 67B 稠密模型的性能;DeepSeekMoE 16B 以 40% 计算量超越 LLaMA2 7B;DeepSeekMoE 2B 逼近理论上限(对应稠密模型)。该架构被 DeepSeek V2/V3 和 Qwen2 MoE 全面采用。

一、核心背景:传统 MoE 的隐性瓶颈

混合专家模型(Mixture-of-Experts, MoE)是现代大语言模型实现"万亿参数级容量 + 每次推理只激活一小部分"的核心范式。在 DeepSeekMoE 之前,主流 MoE 架构(GShard, Switch Transformer)遵循一个约定俗成的设计:从 N 个专家中选取 Top-K 激活(通常 N=8 或 16,K=1 或 2)。

每个 token 经过门控网络计算与所有专家的匹配分数,取最高的 K 个进行加权求和:

y = Σi=1N gi(x) · Ei(x),   gi(x) = TopK(Softmax(x · Wg), K)
传统 MoE 路由公式:从 N 个专家中选 K 个激活,其余被归零

这个设计在 2017–2021 年间取得了巨大成功——Switch-C 达到 1.6T 参数,GLaM 达到 1.2T。但随着模型规模增长,两个深层问题开始暴露:

1.1 知识混杂(Knowledge Hybridity)

每个专家的 FFN 中间维度通常为 2048–4096,参数容量巨大。理想情况下,一个专家应该专注于某一类知识(如语法分析、实体识别、情感判断)。但实际上,因为专家总数很少(8 或 16 个),而训练数据中的知识类型非常多样,每个专家被迫同时学习多种不同类型的知识。

举个例子:同一个专家可能在参数空间的不同区域分别编码了"主谓一致"和"数值推理"两种完全不同的能力。这种"混杂"不仅降低每个专家的效率,也使路由变得更加困难——门控网络很难为一句话"挑对专家",因为每个专家都像是一个"杂货铺"而非"专卖店"。

更形式化地分析:设专家 i 的 FFN 的前向计算为 a = ReLU(xWi + bi),再投影 aVi。当中间维度很大时(如 2048),这个空间的不同子区域可以独立地编码完全不相关的知识模式。Sankaranarayanan et al.(2022)的实验发现,同一专家 FFN 的激活模式在不同类型的输入上差异很大,这印证了知识混杂的存在。

1.2 知识冗余(Knowledge Redundancy)

所有专家都需要学习基础语言能力——词法、句法、格式、常见搭配等。在没有专门机制的情况下,多个专家各自独立地学习同样的通用知识。想象一下:如果所有数学老师都要先自学一遍"加减乘除"才能教微积分,那就是大量的重复劳动。

论文通过实验量化了这个问题:分析路由专家的输出后发现,不同专家在底层表示上存在高度重叠——即使它们对应的路由模式完全不同。这说明传统 MoE 把"通用知识"和"专精知识"混在了同一个专家参数中,导致参数利用率低下。

知识冗余的另一个后果是路由退化:因为所有专家都掌握了通用知识,在通用知识主导的 token 上,门控网络可以"随便选"任何一个专家,导致专家的区分度不足,训练后期难以收敛到稳定的路由策略。

1.3 为什么传统 MoE 无法解决

增加专家数量(N 从 8 升到 64+)看似可以缓解,但传统架构中每个专家的容量是固定的。盲目增加 N 会同时增加激活量 K(因为要保持计算量不变),路由组合空间仍然受限于"少数专家选少数"的模式。更本质地说:传统 MoE 缺乏"专业化"的架构诱导——没有激励机制让不同专家学习不同的知识。

解决这个问题需要从架构层面做两件事:1)让每个专家的容量变小,迫使它专注(而不是依赖优化器去"发现"专业化);2)把通用知识从路由专家的优化目标中剥离,让路由专家只需要关心差异化。

关键洞察:DeepSeekMoE 的两个创新分别对应上述两个问题——细粒度专家分割解决知识混杂(让每个专家容量变小,自然更专注),共享专家隔离解决知识冗余(把通用知识集中到共享专家,路由专家不必重复学习)。两者是正交的,可以同时使用。

二、创新 1:细粒度专家分割(Fine-Grained Expert Segmentation)

2.1 核心思路:从"大而少"到"小而多"

关键想法非常直接:把每个专家的 FFN 中间隐藏维度(intermediate dimension)压缩到原来的 1/m。这意味着:

但路由组合的灵活度发生了质变。原来从 16 个专家中选 2 个的组合数是 C(16,2)=120 种可能性;现在从 64 个专家中选 8 个的组合数是 C(64,8) ≈ 4.4B(44 亿种)。路由的选择空间从"几乎确定"变成了"几乎无限"——网络可以对每个 token 拼凑一个更加精确的"专家组合"。

2.2 形式化定义

设第 l 层有 mN 个细粒度专家,对于第 t 个 token 的隐藏状态 utl

htl = Σi=1mN gi,t · FFNi(utl) + utl
公式 1:细粒度专家的输出,对所有 mN 个专家加权求和

其中门控权重由 TopK 路由确定:

gi,t = Softmaxi(TopK({sj,t}, mK))   where   si,t = (utl)T · eil
公式 2:从 mN 个专家中取 mK 个最高分数,再 Softmax

eil 是第 i 个专家的可学习路由中心(centroid)向量,si,t 是 token 与专家之间的相似度分数。TopK 将非 top-mK 的分数设为 −∞,Softmax 后这些专家权重为 0。

2.3 为什么有效

容量降低带来专业化。 每个专家的中间维度降到 1/m,其参数容量大幅缩减。一个"小容量"的专家无法同时学习太多不同类型的知识,被迫聚焦于某几个特定的模式。这类似于:一个大教室必须同时教数学、物理、化学;但分成小教室后,每个教室只能教一门课,自然就专业化了。

组合爆炸提升表达能力。 路由选择的本质是"在当前 token 需要哪些知识"的离散选择。组合数从 C(N,K) 增长到 C(mN,mK),门控网络可以精细地组合多个小专家来满足 token 的复杂需求——既需要语法分析,又需要领域知识,还需要特定格式——这在传统 MoE 中是难以做到的。

直觉比喻:传统 MoE 像是一支只有 16 人的乐队只能选 2 个乐手演奏——无论如何只能出二重奏;细粒度专家分割把乐队扩充到 64 人(每个人的乐器更单一),可以选 8 人演奏——虽然总演奏人数的人时不变,但可以编排出更丰富的和声。

2.4 参数选择

在 DeepSeekMoE 的实践中,论文选择了精细的分割比例。以 16B 模型为例:

重要的一点是,m 的取值需要平衡——过大的 m 会让每个专家过于碎片化,无法学到有意义的模式。论文的实验表明 m=8 是一个较好的折中点,在这个取值下专家既有足够的"容量窗口"来学习可识别的模式,又足够小来迫使专业化。

2.5 与其他方法的对比

细粒度专家分割与"增加专家数量但不改变容量"(即单纯增加 N 和 K)不同。若保持每个专家容量不变而增加 N 和 K,总计算量线性增加,不符合稀疏激活的初衷。细粒度分割的关键在于保持计算量不变的前提下提升组合灵活性。这是 MoE 架构中第一个在"不增加 FLOPs"的前提下提升表达能力的系统设计。

三、创新 2:共享专家隔离(Shared Expert Isolation)

3.1 问题:通用知识为什么要重复学?

在传统 MoE 中,"is" 和 "are" 的主谓一致规则,每个专家都要学一遍。这导致参数量浪费。更糟糕的是,它干扰了专家的专业化——路由专家的一部分容量被通用知识占据,留给真正专精知识的空间被压缩。

论文提出一个优雅的解决方案:设置 Ks 个共享专家(Shared Experts),对每一个 token 无条件激活。这些共享专家专门负责捕获所有 token 共享的通用知识——句法规则、格式规范、常见搭配、基础语义等。

3.2 形式化定义

结合共享专家和细粒度路由专家后,完整的前向传播公式为:

htl = Σi=1Ks FFNishared(utl) + Σi=1mN gi,t · FFNirouted(utl) + utl
公式 3:完整 DeepSeekMoE 输出 = 共享专家 + 路由专家 + 残差

第一项:Ks 个共享专家的输出(无条件,所有 token 都经过这些专家)。
第二项:mN 个路由专家中选 mK 个的输出(条件性激活)。
第三项:残差连接。

由于共享专家已经提供了通用知识,路由专家的激活数量可以相应减少。实际上,论文在共享专家的设置下适当减少了 mK 的值,使得总计算量(激活参数量)不变甚至略有下降。以 DeepSeekMoE 16B 为例,配置为 Ks=2, mN=128, mK=16,与传统 MoE 的计算量持平。

3.3 设计选择

在 DeepSeekMoE 16B 中,Ks = 2,即 2 个共享专家。每个共享专家的中间维度与路由专家相同(256)。共享专家不参与路由决策——它们始终在前向传播路径上。

训练过程中,共享专家收到所有 token 的梯度,因此它们学习的是整个数据分布中最稳定、最通用的特征。路由专家则因为只收到部分 token 的梯度(那些选中它的 token),更倾向于学习特定子集的特征。这种数据流量的差异自然导致了功能的分化:共享专家的参数在大量 token 上被更新,走向通用的表示;路由专家的参数只在小部分 token 上更新,走向专用的表示。

关键洞察:共享专家的设计在本质上是"把专家的两个功能解耦"——"通用编码"功能分配给共享专家,"专精编码"功能分配给路由专家。这种分离不仅减少了冗余,还让路由专家的梯度信号更加聚焦(因为它只需处理"为什么选中某个 token 的特定特征",而非"为什么选中这个 token"的全部特征)。

3.4 消除一个常见误解

共享专家与"所有专家都被选中的全选模式"不同。在全选模式中,所有专家参与但没有分工——每个专家仍然在学习通用+专精混合的知识。共享专家的关键在于 功能隔离:一部分参数专门学习通用知识(共享专家),另一部分专门学习差异化知识(路由专家),两者优化目标不同。

一个类比是操作系统中的"内核态 vs 用户态":共享专家像是操作系统内核,提供每个程序(token)都需要的核心服务;路由专家像是用户态进程,按需加载。这种分离是现代复杂系统的核心组织原则。

3.5 共享专家数量的影响

论文实验显示,Ks 从 0 增加到 2 时收益递增明显,从 2 到 4 时收益变缓。这意味着 2 个共享专家已经足够捕获大部分跨 token 共享的通用知识。过多的共享专家会导致参数量浪费(因为它们每个 token 都激活,计算成本直接增加)。这是 DeepSeekMoE 选择 Ks=2 的依据。

四、负载均衡:双层设计(Expert & Device Balance)

4.1 为什么需要负载均衡

MoE 训练中最棘手的工程问题之一是路由塌陷(Routing Collapse):门控网络倾向于把几乎所有 token 路由到少数几个"强"专家,而其他专家几乎不被训练,形成负反馈循环。在细粒度场景下(128+ 个专家),这个问题更严重——专家越多,路由塌陷的诱导因素越强。

同时,在大规模分布式训练中,专家分布在不同的 GPU/设备上。即使全局 token 到专家的分配是均匀的,每台设备上的计算负载也可能不均匀——因为 all-to-all 通信要求在设备间传输专家输入和输出,负载不均会导致某些设备成为瓶颈,拖慢整体训练速度。

4.2 专家级平衡损失(Expert-Level Balance Loss)

Lexp = α1 · Σi=1mN fi · Pi
公式 4:专家级负载均衡损失,鼓励各专家被均匀选中

其中:

fi 衡量实际路由分布,Pi 衡量门控的倾向性。最小化两者的乘积等价于鼓励 fi 和 Pi 都趋于均匀——即每个专家接收相近数量的 token,且门控对各专家给出相近的平均概率。这个损失的设计继承自 Switch Transformer 的可微辅助损失,但对细粒度专家做了一处关键调整:fi 的计算包含所有路由专家,而非仅被激活的专家。

4.3 设备级平衡损失(Device-Level Balance Loss)

Ldev = α2 · Σd=1D fd · Pd
公式 5:设备级负载均衡损失,防止设备间计算压力不均

定义与专家级类似,但聚合在设备层面。假设有 D 台设备,每台设备承载 mN/D 个专家。fd 是路由到设备 d 上所有专家的 token 比例,Pd 是设备 d 上门控概率的均值。这个损失确保 all-to-all 通信阶段没有设备成为瓶颈。

双层设计的原因是:单靠专家级损失可以保证全局专家间负载均匀,但在分布式场景下,如果某台设备上的所有专家恰好收到少量 token 但是高概率、另一台设备上的专家收到大量 token 但是低概率,计算和通信负载仍然不均衡。设备级损失直接针对这个问题。

4.4 整体训练损失

L = LLM + Lexp + Ldev
公式 6:总训练损失 = 语言建模损失 + 专家均衡 + 设备均衡

论文中 α1 = 0.01(专家级)、α2 = 0.001(设备级)。设备级的系数更小,因为它已经隐含了一部分专家级均衡的效果,只需要做微调来调整设备间的细粒度不平衡。

工程洞察:细粒度专家的负载均衡比传统 MoE 更难。当专家数量从 16 增长到 128+,路由塌陷的"自由度"更大——少数专家被过度选中的概率更高。双层设计的价值在于:专家级损失保证了模型的训练质量(防止塌陷),设备级损失保证了分布式训练的效率(防止通信瓶颈)。缺一不可。

五、实验结果

5.1 缩放实验:三个规模

论文在三个不同规模上验证了 DeepSeekMoE 架构的效果,每个规模都与对应的稠密模型或传统 MoE 基线进行对比:

模型总参数激活参数对标模型计算量比例效果
DeepSeekMoE 2B≈2B≈2BDense 2B≈100%逼近理论上限(密集模型下限)
DeepSeekMoE 16B16.3B≈2BLLaMA2 7B≈40%超越 LLaMA2 7B 性能
DeepSeekMoE 145B145B≈28.5BDeepSeek 67B≈28.5%持平 DeepSeek 67B 稠密

这三个规模分别对应不同的科学目的:

5.2 消融实验

论文对两个创新点分别做了系统性的消融分析,以确认每个组件的独立贡献:

细粒度专家分割消融:

共享专家隔离消融:

5.3 训练效率

DeepSeekMoE 的训练吞吐量(training throughput)是同等参数规模稠密模型的 3–4 倍。这意味着在相同的训练时间和硬件预算下,可以训练更大规模的模型,或者用更少的时间达到相同的 loss。

更重要的是,训练吞吐量与专家总数的关系几乎是线性增长的——得益于细粒度专家的并行化潜力:更多的小专家可以更均匀地分布在更多设备上,all-to-all 通信的瓶颈被设备级平衡损失进一步缓解。在 145B 模型的训练中,模型 FLOPs 利用率(MFU)达到了令人满意的水平。

5.4 Chat 模型效果

论文还训练了基于 DeepSeekMoE 的 Chat 模型(DeepSeekMoE Chat),使用 SFT(Supervised Fine-Tuning)微调。在多个对话基准(包括 MT-Bench、AlpacaEval)上,DeepSeekMoE Chat 在同等总参数量下显著优于传统 MoE 的 Chat 版本,进一步验证了该架构对下游任务(包括对话、指令遵循、生成)的通用适用性。

值得注意的是,Chat 模型的评估结果还揭示了一个"良性效应":因为共享专家已经提供了流畅的语言表达能力,路由专家可以专注于学习与任务相关的知识,因此在 SFT 阶段,针对路由专家做 LoRA 微调的效果比全参数微调的效果更可控。

六、上下游关联

6.1 前驱工作

GShard(Lepikhin et al., 2020)—首个在 Transformer 中大规模应用 MoE 的工作,提出了 Top-2 路由、专家分片到 TPU、辅助损失等基础方案。DeepSeekMoE 继承其框架,但通过细粒度+共享专家解决了其"专家混杂"的问题。

Switch Transformer(Fedus et al., 2021)—将路由简化到 Top-1,实现了首个万亿参数 Transformer。其可微辅助损失的设计也被 DeepSeekMoE 借鉴。但 Switch Transformer 的 K=1 路由使每个 token 只能接触一个专家,表达能力天然受限——细粒度专家分割通过激活 mK 个专家弥补了这个缺陷。

6.2 后继发展

DeepSeek V2(2024)—在 DeepSeekMoE 基础上引入了 Multi-Head Latent Attention(MLA),进一步降低了 KV 缓存的参数量。DeepSeek V2 沿用了细粒度专家分割和共享专家隔离的设计,但将 FFN 中间维度做了进一步优化。DeepSeek V2 的最终激活参数量仅为总参数的 5% 左右,进一步压缩了推理成本。

DeepSeek V3(2025)—延续了 DeepSeekMoE 的架构路线,在更极致的规模(671B 总参数,37B 激活)下验证了细粒度设计在海量数据和超大规模训练中的稳定性。DeepSeek V3 的 MoE 部分几乎就是 DeepSeekMoE 架构的超大规模版本,证明了该设计在更大规模下的可扩展性。

6.3 行业采用

Qwen2 MoE(2024)—阿里通义千问团队发布的 MoE 模型。在 Qwen2 的技术报告中明确引用了 DeepSeekMoE 的"细粒度专家分割"设计思路,采用了类似的架构:更多、更小的路由专家 + 共享专家。这侧面验证了该架构在业界的通用性和实用性。

6.4 技术脉络定位

DeepSeekMoE 处于 MoE 架构演进的一个关键节点:

七、个人思考

7.1 设计哲学:专业化的自然演化

读这篇论文最强烈的感受是:"细粒度"不是一个发明,而是一个自然演化。让每个专家的容量变小、数量变多——这就像经济体从"全能家庭作坊"演化为"专业分工工厂"的过程。论文的洞察在于:传统 MoE 的专家数量(8–16 个)在相对维度上还是"太少",远远没有达到"分工"的临界点。一旦跨过这个临界点(mN=64–128 个),专业化的质变就发生了。

这个思路让我想到 Transformer 中注意力头数的演变:从 8 头增加到 32、64、128 头,每个头也变得更"小"、更"专注"。DeepSeekMoE 把这个思路从注意力层推广到了 FFN 层,本质上都是"参数越多越好,但每次激活越少越精"的哲学体现。

7.2 共享专家:显而易见的洞见

共享专家隔离可能是整篇论文中最让我惊叹的设计——不是因为复杂,而是因为太显而易见了,却没人想到。"基础语言知识让所有专家共享"——这个想法回头看起来像常识,但在 DeepSeekMoE 之前,所有 MoE 工作都把"通用知识"和"专精知识"的分离任务隐含地扔给了门控网络和专家本身。把这个问题显式化、架构化,是典型的"好论文不是解决难问题,而是把难问题变简单"。

7.3 组合爆炸直觉

路由组合从 120 种提升到 44 亿种,这个量级变化是理解 DeepSeekMoE 能力的关键。但更重要的是要认识到:网络并不需要真正"探索"所有组合,它只需要有足够的容量来"表达"对不同 token 的不同需求。组合爆炸的本质是"表达能力的自由度"——当门控网络想为一个 token 组合 8 个小专家时,它几乎总能找到合适的组合,因为空间足够大。

就像在你的键盘上打字:你不需要尝试每个键的每一种组合,但 104 个键的组合空间保证了你可以表达任何语言。细粒度专家的组合空间保证了你可以为任何 token 找到合适的"知识组合"。

7.4 对 Transformer 架构的启示

DeepSeekMoE 的成功暗示了一个更普遍的设计原则:在 Transformer 架构中,"单一化"往往是瓶颈,"专业化+组合"才是解药。注意力头从 8 头增加到 32–128 头也是类似的逻辑——更多、更专注的头组合出更丰富的表示。FFN 层的 MoE 化也是同样的道理。这个思路在后续研究中不断被验证:MLA 中的低秩共享 KV 缓存、Hyper-Connections 中的多分支残差,都可以看作"专业化+组合"原则的不同表现。

7.5 工程角度的启示

从工程实践看,DeepSeekMoE 证明了:好的架构设计可以大幅度压缩推理成本而不牺牲质量。145B 模型只需要 28.5% 的计算量就能达到 67B 稠密模型的水平——这意味着在相同的硬件上,推理速度可以快 3–4 倍,或者部署成本降低 3–4 倍。这对于实际应用(特别是大规模推理服务)具有巨大的商业价值。这也解释了为什么 DeepSeek 后续模型(V2/V3)坚定地持续迭代这个方向。

另外,细粒度专家的设计天然更适合分布式部署:128 个小专家可以灵活分配到多台 GPU 上,不像传统 MoE 中 16 个大专家难以均匀分片。这意味着 DeepSeekMoE 在工程上更容易扩展到大规模集群。