论文精读 · MIXTURE-OF-EXPERTS · LOAD BALANCING

MoE 负载均衡的数学
为什么均匀分布是最小值

稀疏 MoE 的路由天然想"抱团"——少数专家被挤爆、多数专家闲置。负载均衡损失就是把这种倾向按住的数学约束。本文逐符号拆开 L_{aux}=\alpha N\sum_i f_i P_i,用三种独立方法严格证明它在专家负载均匀时取到全局最小,再讲清 z-loss、专家容量、Top-k 与 DeepSeek 无辅助损失偏置法,最后给出实际调参。

主线依据:Switch Transformer(Fedus et al., 2021)· GShard(Lepikhin et al., 2020)· DeepSeek Loss-Free Balancing(arXiv:2408.15664)
先记住五句话
动机

01路由为什么会塌缩

先把问题讲成一句大白话:稀疏 MoE 里,一个 token 只被送进 N 个专家中的少数几个,选谁由一个可训练的路由器(router)决定。麻烦在于——路由器和专家是一起训练的。

训练早期,某几个专家碰巧初始化得好、被多分到几个 token,于是它们学得更快、变得更"好用";路由器发现送给它们收益高,就更爱送给它们;它们又因此学得更快……这是一个正反馈。数学上叫赢者通吃(winner-take-all):

某专家偶然被多选它训练得更充分路由器更偏好它它被选得更多

最终少数专家承担几乎所有 token(过载 + 超出容量被丢弃),多数专家几乎不被激活(dead experts,梯度稀少、参数浪费)。后果有三:

模型质量塌
名义上有 N 个专家的容量,实际只有几个在工作,等效参数量远低于设计值。
吞吐塌
专家分布在不同设备上,热门专家排长队、冷门设备空转,all-to-all 通信被最慢的那张卡拖住。
token 被丢
每个专家有容量上限,超出的 token 直接跳过 FFN(只走残差),信息损失。

所以我们需要一个数学手段,在训练目标里加一项,让"把 token 均匀摊到所有专家"变成对模型有利的事。这就是负载均衡损失(load balancing / auxiliary loss)。

前置

02Top-k 路由与门控

要写出均衡损失,先把路由的记号钉死。设一层 MoE 有 N 个专家,一个 batch 有 T 个 token。

第 1 步 · 路由器打分

路由器是一个线性层 W_r\in\mathbb R^{d\times N},对 token 表示 x_t 打出 N 个 logit,再过 softmax 得到该 token 分给每个专家的概率:

第 2 步 · 选 Top-k 个专家

只保留概率最大的 k 个专家(Switch 用 k=1,GShard/Mixtral/DeepSeek 常用 k=2 或更多),其余置零,选中的再归一化做加权:

Switch Transformer 编码器块:router 对 token 打分、softmax、选中概率最高的专家
原论文 Figure 2(Switch Transformer, arXiv:2101.03961):稠密 FFN 被换成稀疏 Switch FFN。两个 token(x₁="More"、x₂="Parameters")各自经 router 打分 → softmax(对应上面第 1 步的公式 1)→ 送往概率最高的专家。这正是"公式 1"路由的可视化。
第 3 步 · 定义两个关键统计量

负载均衡只关心两个"每专家"的量,都在一个 batch 内对 token 求平均:

两者天差地别:f_i 数的是"硬"分派次数——含 argmax/TopK,对参数不可导P_i 是"软"概率的均值——处处可导。这个"一硬一软"的区别,是理解损失设计的全部关键,第 5 节会用到。

f_i
i 个专家实际接到的 token 占比。理想是 k/N(top-k 下每 token 选 k 个专家,总选择数 Tk 均摊到 N 个专家)。
P_i
路由器"想"给第 i 个专家的平均概率。理想是 1/N(softmax 输出对 N 个专家求和为 1,均摊即 1/N)。
💡 为什么要两个量而不是一个
只惩罚 f_i(硬计数)没法回传梯度;只惩罚 P_i(软概率)路由器可以"嘴上均匀、实际全塞给一个专家"(把概率调得都接近 1/N 但 argmax 仍集中)。把两者相乘才能既反映真实分派、又提供可用梯度——下一节展开。
核心公式

03辅助损失逐符号拆解

这是 Switch Transformer / Mixtral 用的经典负载均衡损失,也是本文要讲透的主角:

加到语言模型主损失上:\mathcal L_{total}=\mathcal L_{LM}+\mathcal L_{aux}。下面把每个符号是什么、为什么在那里,逐个讲清。

逐符号解释

\sum_i f_i P_i
主体。它是分派频率向量 \mathbf f=(f_1,\dots,f_N) 与平均概率向量 \mathbf P=(P_1,\dots,P_N)内积 \langle\mathbf f,\mathbf P\rangle。两个向量的"质量"越是同时堆在同一批专家上,内积越大;越分散,内积越小。
N
归一化常数。乘上专家数后,均衡时损失值 =N\cdot\tfrac1N\cdot\tfrac1N\cdot\dots 得到一个与 N 无关的干净下界(见第 4 节:k=1 时恰为 1)。没有它,损失值会随专家数缩小,\alpha 就得跟着专家数重调。
\alpha
强度权重(典型 10^{-2})。它平衡"均衡"和"语言建模"两个目标:太小压不住塌缩,太大逼路由器忽略语义、纯粹追求平均,损害质量。

为什么是"频率 × 概率"这个乘法形式

关键在于 f_iP_i 分工不同:

f_i 提供"真相"
它是真实的硬分派比例,如实反映哪个专家过载。但它含 TopK/argmax,对路由器参数梯度为零(几乎处处),不能直接优化。
P_i 提供"梯度"
它是 softmax 概率的均值,处处可导。反向传播时,梯度全部经由它流回路由器 W_r

把两者相乘 f_i P_i,等于用不可导的 f_i 当作一个常数权重(stop-gradient)去加权可导的 P_i:哪个专家实际过载(f_i 大),就给它的概率 P_i 施加更大的下压梯度。于是损失"知道"该压谁,梯度又"能够"压下去。这一步的梯度推导见第 5 节。

💡 直觉:内积就是"对齐度"
\mathbf f\mathbf P 都看成概率分布(各自求和为定值)。内积 \langle\mathbf f,\mathbf P\rangle 度量两个分布"峰对峰"的重合程度。塌缩时两者都在同几个专家上冲高、内积巨大;均匀时两者摊平、内积最小。所以最小化这个内积 = 逼迫两个分布都摊平

GShard 的等价写法

GShard(更早)写成 mean-importance 与 mean-load 的乘积和,本质一致——把上面的 P_i 叫 importance、f_i 叫 load:

两篇论文的形式相同,只是命名与个别归一化系数差异。下面的最优性证明对二者都成立。

核心证明

04均匀分布取最小值:三种证明

这是全文的数学核心,也是你的问题所在。我们要严格证明:在约束下,\sum_i f_i P_i 在负载完全均匀时取到全局最小值。三种方法各自独立成立,从三个角度看清同一件事。

先把要证的命题写严格
两个向量各自有"和固定"的约束:\sum_i P_i=1(softmax 概率对所有专家求和为 1),\sum_i f_i=k(每 token 选 k 个专家,比例之和为 k;k=1 时为 1)。且 f_i,P_i\ge 0。要最小化的是内积 S=\sum_{i=1}^N f_i P_i结论:当 f_i=k/NP_i=1/N(对所有 i)时,S 取全局最小 S_{\min}=k/N,对应 \mathcal L_{aux}=\alpha N\cdot k/N=\alpha k

证法一 · 拉格朗日乘子(找驻点)

为了把两个向量的耦合讲透,先看一个更干净的对称情形:路由器若把软概率与硬分派对齐(训练收敛时 f_i\propto P_i),问题退化为最小化 \sum_i P_i^2(下面证法二会严格处理一般情形)。这里先对 \sum_i P_i^2 在约束 \sum_i P_i=1 下求最小。

第 1 步 · 写拉格朗日函数
第 2 步 · 对每个 Pᵢ 求偏导并置零

逐分量求导,二次项导数是 2P_i,约束项导数是 \lambda

关键:右边 \lambda/2 与下标 i 无关——所以所有 P_i 必须相等。这一步已经逼出"均匀"。

第 3 步 · 代回约束解出这个公共值

P_i=\lambda/2 代入 \sum_i P_i=1N\cdot\tfrac\lambda2=1,于是 \tfrac\lambda2=\tfrac1N

第 4 步 · 验证是极小而非极大

目标 \sum_i P_i^2 的 Hessian 是 2I(正定),函数严格凸,约束是线性的——凸函数在凸集上的驻点必是全局最小。所以 P_i=1/N 是全局最小点,最小值 \sum_i(1/N)^2=1/N

证法二 · 柯西-施瓦茨(一步给下界,最一般)

这个方法不需要假设 f=P,直接对内积给下界,是最干净的证明。对任意非负向量 \mathbf f,\mathbf P

第 1 步 · 对 P 单独用柯西-施瓦茨

取全 1 向量 \mathbf 1=(1,\dots,1),柯西-施瓦茨给出:

左边 \big(\sum P_i\big)^2=1^2=1(用约束),所以:

第 2 步 · 等号条件就是均匀

柯西-施瓦茨取等号当且仅当两向量成比例,即 P_i\propto 1——所有 P_i 相等,结合 \sum P_i=1P_i=1/N。这就从下界的角度证明了:任何偏离均匀的分布,\sum P_i^2 都严格大于 1/N

💡 内积 S 的一般下界
训练的作用是让 fP 正相关(路由器给谁高概率,谁就被多选)。此时最小化内积 \sum f_iP_i 与最小化 \sum P_i^2\sum f_i^2 同向——把任一个分布推向均匀,另一个也被拉平,内积随之被压到下界 k/N。反之若 f,P 反相关,内积可以更小,但那种"嘴上偏好 A、实际全给 B"的配置在联合优化里不稳定、会被主损失和这一项共同淘汰。

证法三 · 与均匀分布的距离(几何直觉)

\sum_i P_i^2 按"到均匀分布的偏差"展开,最直观。令 \bar P=1/N 为均匀值,写 P_i=\bar P+\delta_i,其中 \sum_i\delta_i=0(因为两者和都为 1):

展开平方和

交叉项因 \sum_i\delta_i=0 消失,只剩 \tfrac1N(常数)加上 \sum_i\delta_i^2\ge 0(偏差平方和,恒非负)。所以:

这行公式把话说死了:损失 = 一个固定基线 + 一个"离均匀多远"的平方惩罚。惩罚项当且仅当所有 \delta_i=0(即完全均匀)时为零。均匀分布是唯一的全局最小,任何不均衡都被平方放大地惩罚。这也解释了为何它对付赢者通吃格外有效——越集中,\delta_i 越大,惩罚二次增长。

方法核心一步给出什么
拉格朗日2P_i-\lambda=0\Rightarrow P_i 与 i 无关驻点位置 = 均匀;凸性保证是最小
柯西-施瓦茨(\sum P_i)^2\le N\sum P_i^2下界 1/N + 等号条件 = 均匀(最一般)
偏差展开\sum P_i^2=\tfrac1N+\sum\delta_i^2损失 = 基线 + 偏离的平方惩罚(最直观)
机制

05为什么这样设计梯度

证明说清了"最小值在哪",但没说"优化器怎么走到那"。这一节把梯度算出来,看清损失到底在推路由器做什么。

反向传播时 f_i 是常数(含 argmax,梯度视为 0),梯度只经 P_i

再往里,P_i=\tfrac1T\sum_t p_{t,i},而 p_{t,i} 是 softmax,其对 logit z_{t,j}=x_t^\top W_{r,j} 的导数是标准 softmax 雅可比 \partial p_{t,i}/\partial z_{t,j}=p_{t,i}(\delta_{ij}-p_{t,j})。链式合起来,对某个 token 的 logit:

💡 这个梯度在说什么
括号里是"专家 j 的过载程度 f_j 减去 当前 token 眼中的平均过载 \sum_i f_i p_{t,i}"。若专家 j 比平均更过载(括号为正),梯度为正 → 优化器下调它的 logit → 少给它 token;若它欠载(括号为负)→ 上调 logit → 多给它 token。这是一个精确的负反馈:谁挤压谁,谁空补谁,最终把大家推向 f_j 全相等,即均匀。

注意梯度前面有 p_{t,j} 因子:路由器对某专家概率越高,这次修正越大。这让"当前正被偏爱的专家"承受最强的下压,正好对症赢者通吃。

配套项

06z-loss 与专家容量

光有均衡损失还不够稳。大规模训练里还有两个配套机制,一软一硬。

router z-loss:按住 logit 不爆炸

softmax 的输入 logit 若整体越来越大,会导致数值不稳定(fp16/bf16 溢出)和路由过度自信。Switch-XXL 引入 z-loss,惩罚 log-partition 的平方:

\log\sum_j e^{z_{t,j}} 是 logsumexp,正比于 logit 的整体量级。把它平方后惩罚,等于把路由 logit 往 0 附近拉、防止 softmax 饱和成 one-hot。总损失变成三项:

✓ 分工
aux loss 管"token 摊得均不均"(横向:专家之间);z-loss 管"路由器有多自信"(纵向:logit 幅度)。两者正交,通常一起用。

专家容量 capacity:硬性的溢出闸门

均衡损失是"软"约束——它降低不均衡的概率,但不保证某个 batch 里不会有专家被挤爆。所以工程上还有一道闸门:给每个专家设一个容量上限。

T\cdot k/N
完全均匀时每个专家应接到的 token 数(总分派 Tk 均摊到 N 个专家)。
capacity_factor
冗余系数,典型 1.0\!\sim\!2.0。设 1.25 就是允许每个专家比均值多接 25% 的 token,给不完美均衡留缓冲。

超过容量的 token 被丢弃(dropped)——不进该专家的 FFN,只走残差连接直通。容量因子越大越少丢 token,但每个专家要预留更大的缓冲显存、计算浪费越多。这是"丢 token 的信息损失"与"显存/算力浪费"之间的权衡。

Switch Transformer token 路由动态:容量因子决定每个专家的缓冲,超出容量的 token 被丢弃
原论文 Figure 3(Switch Transformer, arXiv:2101.03961):token 路由动态。每个专家有固定的 batch 容量(由 capacity factor 调节)。左侧容量因子低、专家溢出导致 token 被丢弃(虚线);右侧容量因子高、留有缓冲。直观展示了本节 \text{capacity}=\lceil\text{cf}\cdot Tk/N\rceil 的作用。
⚠ 训练与推理不对称
训练时常设 capacity_factor≈1.25 并容忍少量丢弃(均衡损失会逐渐减少溢出);推理时为了不丢 token,要么调大容量因子,要么用无丢弃(dropless)实现(如 MegaBlocks 的块稀疏 kernel)。DeepSeek 等推理侧更倾向下一节的 loss-free 方案,从根上把负载推平。
新范式

07DeepSeek 无辅助损失偏置法

辅助损失有个副作用:它往主损失里塞了一个"和语言建模无关"的梯度,多少会干扰模型质量(论文称 interference gradient)。DeepSeek 的 Loss-Free Balancing(arXiv:2408.15664)提出:不加损失、不动梯度,改用一个每专家的可调偏置直接调路由。

第 1 步 · 偏置只用于"选谁",不用于"权重"

给每个专家一个偏置 b_i。选 Top-k 时用加了偏置的分数,但真正的门控加权权重仍用原始分数 s_{t,i}

关键:b_i 只影响"哪些专家入选"这个离散决策,不进入前向输出的加权,因此不产生梯度、不污染主损失。它是一个纯粹的路由调节旋钮。

第 2 步 · 用反馈控制更新偏置

每个 step 后统计各专家的负载 c_i,与平均负载 \bar c 比较,欠载就抬高偏置(下步更容易入选)、过载就压低:

e_i
误差信号:平均负载减去专家 i 的实际负载。正表示欠载、负表示过载。
u
偏置更新速率(bias update rate,典型 10^{-3})。类比控制系统里的积分增益。
\mathrm{sign}
只取方向、不看幅度——让偏置平滑爬升/下降,避免震荡。这本质是一个积分控制器(I-controller)。
✓ 为什么更优
它把负载均衡从"损失函数里的软约束"变成"路由环节的显式反馈控制"。梯度干净(主损失只剩语言建模)、负载又被 b_i 的负反馈稳稳推平。DeepSeek-V3 即采用此法,几乎无 token 丢弃、也没有 aux-loss 的质量折损。代价是多维护一组 b_i 状态和一个超参 u

辅助损失法(Switch/GShard)无损失偏置法(DeepSeek)
均衡手段往损失加 \alpha N\sum f_iP_i路由分数加偏置 b_i
是否动梯度是,产生干扰梯度否,梯度纯净
核心超参\alpha(损失权重)u(偏置更新率)
质量影响轻微负面(需调 \alpha 平衡)基本无损
实操

08实际参数怎么调

把上面的量落到训练配置里,四个旋钮加两条准则。

参数典型值调大 →调小 →
\alpha aux 权重10^{-2}更均衡,但路由忽略语义、质量降更贴语义,但易塌缩、dead experts
\beta z-loss 权重10^{-3}logit 更小更稳,可能欠自信logit 易爆、数值不稳
capacity_factor1.0\!\sim\!1.25(训)/ \ge2(推)少丢 token,费显存/算力省显存,丢 token 多
k Top-k1(Switch)/ 2(主流)质量↑、计算↑、更难均衡更省算力、更易塌缩
u 偏置更新率10^{-3}均衡收敛快、可能震荡平稳、收敛慢
准则一:先监控再调
训练时打点每层的 \max_i f_i / \min_i f_i(负载极差比)和 token drop 率。比值接近 1、drop 率趋 0 说明健康;比值持续 >3 就该加大 \alphau
准则二:α 不是越大越好
\alpha 过大会把路由逼成"无视输入的随机均分",等效退化成稠密模型甚至更差。目标是刚好压住塌缩的最小 \alpha,把更多优化预算留给语言建模。
💡 每层独立 vs 全局
aux loss 通常逐 MoE 层计算再求和——每层的路由器各自均衡。f_i,P_i 的 batch 统计维度也要想清:在数据并行下,理想是跨所有卡的全局 batch 统计(用 all-reduce 汇总计数),否则每张卡各自"均衡"可能与全局负载不一致。
出处

09资料来源

Switch Transformer — Fedus, Zoph, Shazeer. Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity. JMLR 2022. arXiv:2101.03961(负载均衡损失 \alpha N\sum f_iP_i、z-loss、容量因子的出处)

GShard — Lepikhin et al. GShard: Scaling Giant Models with Conditional Computation and Automatic Sharding. ICLR 2021. arXiv:2006.16668(mean-importance / mean-load 均衡项)

DeepSeek Loss-Free — Wang et al. Auxiliary-Loss-Free Load Balancing Strategy for Mixture-of-Experts. 2024. arXiv:2408.15664(偏置反馈法 b_i\leftarrow b_i+u\,\mathrm{sign}(e_i)

ST-MoE — Zoph et al. Designing Effective Sparse Expert Models. 2022. arXiv:2202.08906(router z-loss 的系统分析)

公式记号做了统一(N 专家数、T token 数、k top-k、f_i/P_i 频率/概率),与各原论文一一对应,未改变数学内容。