Introduction

MoE (Mixture of Experts) 的思想在 DeepSeek-V2 (https://arxiv.org/pdf/2405.04434) 中被首次 apply 到百 B 模型的语言模型架构中。

在 Dense FFN 中,模型的 forward path 是 y=E(x)y = E(x), 而在 Sparse MoE 中, 模型会通过一个 moe router 路由激活不同的专家 y=∑i∈S(x)Ei(x)y = \sum_{i \in S(x)} E_i (x), Ei(x)E_i(x) 的参数量和 EE 的参数量相同,MoE 本质上是一种只增加参数量,不增加计算量(稀疏度提升) 的方式。

为什么 MoE 模型具备更高的性能,在实际的 pre-training 中,稀疏的 MoE 模型展现了如下的优势:

  • Same Flops,more params perform better (专家数 up) (https://arxiv.org/pdf/2101.03961)
  • Faster to train MoEs
  • 硬件上天生更容易并行化,更容易 scale up (EP)

MoE 和 Dense 模型相比,在训练 loss 和下游评测基准上均有显著提升,同时 MoE 本身也是一个很值得被讨论的 topic

deepseek_moe.png

但与此同时,MoE 训练会带来更多工程难题和训练不稳定的问题。

Expert Selections && Expert Weights

在 MoE 架构中,我们要第一个解决的问题是:

  • MoE Selection: 针对一个给定的 token,如何选择合适的专家进行激活?
  • Experts Weights: 给定激活专家后,如何 aggregate 不同模型的网络输出?

MoE Selections

基本的 MoE 的专家激活 router 都依赖于 Top-K 算法,其中 xtx_t 就是单个 token 传入 FFN Layer 的 hidden-dim 维度是 dd, 最终输出的是不同专家的激活值 NN.

st=Wrxt∈RN s_t = W_r x_t \in \mathbb{R}^{N}

对输出的 expert-logits 做 softmax:

pi=exp⁡(si)∑j=13exp⁡(sj) p_i=\frac{\exp(s_i)}{\sum_{j=1}^3\exp(s_j)}

专家的激活选择往往依赖 Top-K 方法:

St=TopK(st,K) S_t = \text{TopK}(s_t, K)

MoE Expert Weights

最终 FFN 前馈网络的输出是多个专家网络的输出加权和,每一个被激活专家的加权值被定义为 gt,ig_{t,i}

yt=∑i∈Stgt,iEi(x) y_t = \sum_{i \in S_t} g_{t,i} E_i(x)

在这里存在两种加权方式:

  • topk 后不 normalize: 直接利用 softmax 的值作为加权值
  • topk 后 normalize:在 softmax 后对选中的 topk 重新归一化 scale 比例,使得最终加权的概率总和为 1,从数学上这个和“先选择 top-k,再对 top-k 做 softmax 等价
    • softmax⁡(s)i∑j∈Etsoftmax⁡(s)j=exp⁡(si)∑j∈Etexp⁡(sj) \frac{\operatorname{softmax}(s)_i} {\sum_{j\in\mathcal E_t}\operatorname{softmax}(s)_j} = \frac{\exp(s_i)} {\sum_{j\in\mathcal E_t}\exp(s_j)}

Swi Transformer 没有做 normalize,保留 Softmax Probability 作为 Gate Weight(因为每次只激活一个专家),防止 top-1-trap(当某个专家的 weight 超过 0.5 后,模型的输出会被退化为 dense-FFN 的输出形式),导致模型梯度消失。

在更前沿的 MoE router 设计中,更多的数学结构被提出 (e.g. DeepSeek-V3 使用 sigmoid 函数进行 router top-k 计算和加权)

Routing Methods

给定 Expert Logits sis_i 如何选择激活的专家?

  • TopK routing (k = 1,2,4,7...)
  • Hashing (baseline, 随机选择)
  • RL learning (like a Bandit Problem)
  • Solving a matching problem

Expert Sizes

一个系统架构上设计很经典的问题是:设计多少个专家?(总参数量),每次前向计算激活多少专家?(稀疏度,激活参数量)

假设有 mm 个专家(激活 mam_a 个专家),每个专家的参数量是 EE, FFN 的总参数量就是 m×Em \times E.

此时,我们可以选择提升专家的数量,减少每个专家的激活参数,此时,专家总数和激活专家数量变成 sms m 和 smas m_a, 每个专家的参数量是 E/mE/m,模型的总参数和稀疏度都不变!实验验证提升专家数量可以在不提升稀疏度和参数的情况下提升 MoE 的性能,但是切分过细的专家也会对 router 负载均衡和训练稳定性提出更高的要求,且切分过细的专家也会损失表征能力。

这种技术被叫做 fine-grained expert segmentations, 在 DeepSeek MoE 的技术报告中被提及:

From a combinatorial perspective, the fine-grained expert segmentation strategy substantially enhances the combinatorial flexibility of activated expert. (提升专家的表征能力)

moe.png

一些比较前沿和经典的 MoE 参数配置:

模型总量 / 激活参数比Routed / K / Shared专家比
Qwen-series
Qwen3-30B-A3B30 / 3B10.0×128 / 8 / 016×
Qwen3-235B-A22B235 / 22B10.7×128 / 8 / 016×
Qwen3-Coder-480B-A35B480 / 35B13.7×160 / 8 / 020×
Qwen3-Next-80B-A3B80 / 3B26.7×512 / 10 / 151.2×
Qwen3.5-35B-A3B35 / 3B11.7×256 / 8 / 132×
Qwen3.5-122B-A10B122 / 10B12.2×256 / 8 / 132×
Qwen3.5-397B-A17B397 / 17B23.4×512 / 10 / 151.2×
Qwen3.8-2.4T-A95B2400 / 95B25.3×512 / 10 / 151.2×
Qwen3.8-Flash-Next-176B125 / 6B20.8x512 / 10 / 151.2x
GLM-series
GLM-4.5-Air106 / 12B8.8×128 / 8 / 116×
GLM-4.5355 / 32B11.1×160 / 8 / 120×
GLM-4.7≈358 / 32B≈11.2×160 / 8 / 120×
GLM-4.7-Flash30 / 3B10.0×64 / 4 / 116×
GLM-5 / 5.1 / 5.2744 / 40B18.6×256 / 8 / 132×
GLM-5.3≈744 / 40B≈18.6×256 / 8 / 132×
GLM-5.3-Flash320 / 18B17.8×288 / 8 / 136×
Kimi
Kimi-K2≈1000 / 32B≈31.3×384 / 8 / 148×
Kimi-K2.5 / K2.6≈1000 / 32B≈31.3×384 / 8 / 148×
Kimi-K32800 / 104B26.9×896 / 16 / 256×
MiniMax
MiniMax-M2230 / 10B23.0×256 / 8 / 032×
MiniMax-M2.5230 / 10B23.0×256 / 8 / 032×
MiniMax-M3428 / 23B18.6×128 / 4 / 132×
DeepSeek
DeepSeek-V3671 / 37B18.1×256 / 8 / 132×
DeepSeek-R1671 / 37B18.1×256 / 8 / 132×
DeepSeek-R1-0528671 / 37B18.1×256 / 8 / 132×
DeepSeek-V3.2671 / 37B18.1×256 / 8 / 132×
DeepSeek-V4-Flash284 / 13B21.8×256 / 6 / 142.7×
DeepSeek-V4-Pro1.6 / 49B32.7×384 / 6 / 164×
Other
Hunyuan-A13B80 / 13B6.2×64 / 8 / 18×
Tencent Hy3295 / 21B14.0×192 / 8 / 124×
Xiaomi MiMo-V2-Flash309 / 15B20.6×256 / 8 / 032×
Step3.5-Flash196 / 11B17.8×288 / 8 / 136×
OpenAI gpt-oss-120b117 / 5.1B22.9×128 / 4 / 032×
OpenAI gpt-oss-20b21 / 3.6B5.8×32 / 4 / 08×
  • 从专家激活数量上,现代大模型的稀疏度都在不断上升 (专家数量稀疏度)

MoE Trainings

在 MoE 训练中,Training Objective:

L=LLM+λbalLbalance+λzLz \mathcal{L} = \mathcal{L}_{\text{LM}} + \lambda_{\text{bal}} \mathcal{L}_{\text{balance}} + \lambda_{\text{z}} \mathcal{L}_{\text{z}}
  • 第一项是语言建模的二进制交叉熵损失
  • 第二项是专家激活的负载均衡
  • 第三项是针对 output logits ss 的数值约束,保证 logits 的输出是一个比较温和的值

LM Loss

在前向计算是, 计算流程图是: sj→gi→y→LLMs_j \to {g_i} \to y \to \mathcal{L}_{\text{LM}}

因此,计算反向传播,定义: δ=∇yLLM\delta=\nabla_y\mathcal L_{\mathrm{LM}}:

∂y∂sj=gj(Ej(x)−y) \frac{\partial y}{\partial s_j} = g_j(E_j(x)-y)

∂LLM∂sj=∑r=1d∂LLM∂yr∂yr∂sj=δ⊤∂y∂sj=gjδ⊤(Ej(x)−y) \frac{\partial\mathcal L_{\mathrm{LM}}}{\partial s_j} = \sum_{r=1}^{d} \frac{\partial\mathcal L_{\mathrm{LM}}}{\partial y_r} \frac{\partial y_r}{\partial s_j} = \delta^\top\frac{\partial y}{\partial s_j} = g_j\delta^\top(E_j(x)-y)
  • δ=∇yLLM\delta=\nabla_y\mathcal L_{\mathrm{LM}} 代表 loss 变化最快的方向
  • Ej(x)−yE_j(x)-y 代表当前激活专家和最终输出的偏移

因此,从反向传播的角度分析,若每个专家的激活值可以更好的帮助 loss 下降,这个专家的 router 就会在梯度下降上体现 increase

Load Balancing

第二项 MoE 训练的 Loss,是 load balancing,也是 MoE 训练中最关键的问题:

Lbal=N∑i=1NfiPi \mathcal L_{\mathrm{bal}} = N\sum_{i=1}^{N}f_iP_i
  • fif_i: 实际分配比例 每个专家分配到的 token 数量占比
  • PiP_i: Router 分配给 Expert ii 的平均概率
Tokenp1p_1p2p_2p3p_3p4p_4Selected Experts
10.600.250.100.051,2{1,2}
20.500.100.350.051,3{1,3}
30.400.200.350.051,3{1,3}
40.100.450.200.252,4{2,4}

T = 4, N = 4 and K = 2

  • 对应的 PiP_i 就看每一个专家对应 route 到 token 的概率
  • fif_i 是一个统计量

在实际反向传播中,针对 PiP_i 进行反向传播, ∂Lbal∂Pi=Nfi\frac{\partial\mathcal L_{\mathrm{bal}}}{\partial P_i} =Nf_i. 当此时某个专家已经具备了很高的负载 ff 值时,进一步增加概率(对应增加未来负载)会导致负载 loss 进一步增大。反而,转向一些被闲置的 expert 可以保证 loss 下降。

最小化的理想条件: fi,Pif_i, P_i 均为 1N\frac1N (柯西不等式可以证明)

Logits Stability

st=Wrxt∈RN s_t = W_r x_t \in \mathbb{R}^{N}

对输出的 expert-logits 做 softmax:

pi=exp⁡(si)∑j=13exp⁡(sj) p_i=\frac{\exp(s_i)}{\sum_{j=1}^3\exp(s_j)}

我们可以证明,ss 进行同加减,对应的 pp 值不变, Define Z=∑j=1Nexp⁡(sj)Z = \sum_{j=1}^N\exp(s_j):

log⁡pi=si−log⁡∑j=1Nexp⁡(sj)=si−log⁡Z=si−z \log p_i = s_i - \log \sum_{j=1}^N\exp(s_j) = s_i - \log Z = s_i - z

因此:

si=log⁡pi+z s_i = \log p_i + z

我们希望 logits 输出侧就保证数值稳定性,而不依赖对应的 stable-softmax 等数值优化手段,因此,我们的优化目标定义为 zz 的最小化,或者说,我们希望数值稳定性可以直接保证 si=log⁡pis_i = \log p_i。

因此,我们定义针对 zz 项的损失:

Lz=1T∑t=1Tzt2 \mathcal{L}_{\text{z}} = \frac{1}{T} \sum_{t=1}^{T} z_t^2

注意, logits stability 和 load balancing 是两个完全正交的优化维度,logits stability 可以被优化到 loss=0,但是不等于一定负载均衡。

More About Load Balancing

Stochastic Approximations

在实际模型的 pre-training 中,MoE 的稀疏性使得模型的反向传播不可导,且前向计算每次有可能激活不同的 experts 导致训练不稳定。

类似于 RL 中的 ϵ−greedy\epsilon-\text{greedy}, 在 MoE routing 中引入随机扰动:

G(x)−softmax(KeepTopK(H(x),k)) G(x) - \text{softmax}(\text{KeepTopK}(H(x), k))

H(x)i=(x⋅Wg)i+StandardNormal()⋅SoftPlus((x⋅Wnoise)i) H(x)_i = (x \cdot W_g)_i + \text{StandardNormal}() \cdot \text{SoftPlus}((x \cdot W_{\text{noise}})_i)

这可以在专家激活时引入随机性,一方面保证在训练过程中尽可能负载均衡更多的专家,另一方面,梯度进行反向传播,也更有利于 router 的训练。

Heuristic balancing losses

在原始的 loss 上做 MoE Training,会导致不同专家负载不均衡,更强势的专家获得更好的梯度反馈,被优化的更好,同时 router 也会提升选择当前专家的概率。

因此,现在普遍被采纳的方式是通过 启发式设计的方式在 loss 中引入平衡项,保证 MoE 训练负载均衡。

DeepSeek V2: Per-Expert/Device Balancing

在上文的一般形式中,我们推导了 expert-load-balancing 的基本形式:

Lbal=N∑i=1NfiPi \mathcal L_{\mathrm{bal}} = N\sum_{i=1}^{N}f_iP_i

DeepSeek-MoE/DeepSeek-V2 采用了两种不同粒度的负载均衡损失:

  • Per-Expert Balancing(专家级负载均衡):希望不同 Expert 接收到的 token 数量尽量均衡。
LExpBal=α1∑i=1N′fiPi\mathcal L_{\mathrm{ExpBal}}=\alpha_1\sum_{i=1}^{N'}f_iP_i

- fif_i 代表实际进入不同专家的 token 数量 - PiP_i 代表 router 对 token 平均而言,router 对当前专家的激活概率输出

因为 TopK 不是一个可以微分的算子,因此损失项没有引入 topk 等相关算符操作

  • Per-Device Balancing(设备级负载均衡):希望不同 GPU 上的计算负载尽量均衡。
LDevBal=α2∑i=1Dfi′Pi′ \mathcal L_{\mathrm{DevBal}}=\alpha_2\sum_{i=1}^{D}f_i'P_i'
  • fi′f_i ' 代表实际进入不同设备的 token 数量(device-level 的专家负载)
  • Pi′P_i' 代表Router 分配给设备 ii 上所有专家的总概率质量

两者的数学关系是:

  • fi′=1∣Ei∣∑j∈Eifjf'_i=\frac{1}{|\mathcal E_i|}\sum_{j\in\mathcal E_i}f_j
  • Pi′=∑j∈EiPjP_i'=\sum_{j \in \mathcal E_i} P_j

在 DeepSeek V2 中,对 MoE 模型的训练还额外引入了 device-limited routing mechanism,因为 MoE 专家的数量被切割的非常多,因此 Expert Parallelism 的通信成本会非常大。

For DeepSeek-V2, beyond the naive top-K selection of routed experts, we additionally ensure that the target experts of each token will be distributed on at most 𝑀 devices. To be specific, for each token, we first select 𝑀 devices that have experts with the highest affinity scores in them. Then, we perform top-K selection among experts on these 𝑀 devices. In practice, we find that when MM ⩾ 3, the device-limited routing can achieve a good performance roughly aligned with the unrestricted top-K routing.

与此同时,DeepSeek-V2 的 MoE 训练引入了 Communication Balance Loss:

LCommBal=α3∑i=1Dfi′′Pi′′ \mathcal L_{\mathrm{CommBal}} =\alpha_3\sum_{i=1}^{D}f_i''P_i''
  • fi′′f_i^{''} 代表设备 ii 对应的通信负载 fi′′=DMT∑t=1T1(Token t is sent to Device i)f_i''=\frac{D}{MT} \sum_{t=1}^{T} \mathbf1(\text{Token }t\text{ is sent to Device }i)
    • 每一个 token 若存在对当前设备 ii 的通信,则会被计入通信负载中,然后除以通信负载的最大设备限制 MM
    • 在负载均衡的情况下,每一个设备的通信负载约等于 1

DeepSeek V3: Auxiliary-Loss-Free Load Balancing

Training MoEs, System Side