无辅助损失 MoE:DeepSeek-V3 让专家负载均衡不再「伤主任务」
传统 MoE 用一个辅助损失(auxiliary loss)逼专家负载均衡,但这会干扰主任务、拉低最终质量。 DeepSeek-V3 提出无辅助损失的均衡方案:在路由打分上加一个动态 bias,bias 由负载统计更新而非梯度驱动。 这样均衡控制彻底脱离主损失,模型质量回升、训练更稳,是 MoE 工程化的重要一步。
一句话结论
DeepSeek-V3 抛弃了 MoE 训练里用了多年的「辅助损失均衡」,改用一个与梯度无关的动态 bias 项来调节专家路由——均衡照样达成,主任务不再被拉扯,模型最终质量明显提升。
背景问题
Mixture-of-Experts(MoE)让模型「参数多但激活少」:每个 token 只走少数几个专家,总参数量大但单次计算量小。这让大模型能在可控算力下扩张参数。
但 MoE 有个老毛病:负载不均衡。路由器(gate)很容易陷入「赢家通吃」——少数专家被疯狂选中,其他专家闲着、训不动。这会导致:
- 算力浪费:闲置专家占显存却不干活。
- 容量溢出:热门专家的 token buffer 撑爆,多余 token 被丢弃(drop)。
- 质量塌缩:模型实际只用了几个专家,等效参数量远小于设计值。
传统解法是加一个辅助损失(auxiliary loss),惩罚负载不均:
$$ \mathcal{L}{\text{aux}} = \alpha \cdot N \sum{i=1}^{N} f_i \cdot P_i $$
其中 $f_i$ 是专家 $i$ 实际接收的 token 比例,$P_i$ 是路由器给专家 $i$ 的平均概率。当所有专家均匀时这个值最小,不均时变大,于是梯度推着路由器走向均衡。
问题在于:这个 $\mathcal{L}{\text{aux}}$ 和主语言建模损失 $\mathcal{L}{\text{main}}$ 是加在一起反传的。它俩的目标经常打架——主任务想让最合适的专家接 token,辅助损失想让所有专家均匀接 token。$\alpha$ 调大均衡好但质量掉,调小质量好但均衡崩。这是一个长期存在、没人完全满意的折中。
核心思路
DeepSeek-V3 的思路直接:既然辅助损失是为了调节路由打分,那我直接在路由打分上加一个可调节的 bias,但让这个 bias 不参与梯度反传。
回顾 MoE 路由:对每个 token $t$,路由器算每个专家的分数 $s_i = \text{softmax}(e_i \cdot h_t)$,然后选 top-k 个专家。DeepSeek-V3 把它改成:
$$ s_i = \text{softmax}(e_i \cdot h_t + b_i) $$
其中 $b_i$ 是专家 $i$ 的偏置项。关键约束:$b_i$ 在反传时被 detach,梯度不流过它。
那 $b_i$ 怎么更新?用一个简单的、基于负载统计的规则:
- 如果专家 $i$ 当前负载偏轻(接收的 token 少),就把 $b_i$ 调大一点,让它更容易被选中;
- 如果专家 $i$ 负载偏重,就把 $b_i$ 调小,抑制它。
更新不依赖梯度,只依赖运行时的负载计数,类似一个控制器里的「积分项」。这样:
- 均衡目标被完全外移出主损失,$\mathcal{L}_{\text{main}}$ 和均衡不再互相拉扯。
- bias 只在推理路由时起作用,相当于动态调整专家的「吸引力」,不影响模型学到的表示。
- 训练全程没有一个需要调的 $\alpha$,少一个超参,工程更省心。
关键技术点
1. bias 更新是「无梯度控制回路」
把 bias 更新看成一个反馈控制问题:负载是观测值、bias 是控制量、目标是均衡。这种思路在系统调度里很常见,但放到深度学习里相对新鲜——大多数训练都默认「所有可学参数都靠梯度更新」。DeepSeek-V3 证明:不是所有该变的东西都必须靠梯度变。
2. 偏置只影响「选谁」,不影响「学什么」
注意 $b_i$ 是加在 softmax 输入上的。它改变 token 选哪些专家,但:
- 一旦专家选定,该 token 在该专家内部的计算、梯度都和没 bias 时一样。
- bias 不进入专家权重的梯度,专家学到的能力完全由数据驱动。
这是它比辅助损失干净的根本原因:辅助损失的梯度会渗进专家权重,把专家往「均衡友好」的方向推,扭曲了表示;bias 不会。
3. 配合「偏置-free 推理」
一个细节:推理时 bias 还要不要保留?DeepSeek-V3 在推理阶段保留 bias,因为它本质上反映的是「该专家被偏置到的状态」,删掉会破坏训练-推理一致性。但 bias 值在训练收敛后趋于稳定,不影响推理成本。
4. 与「共享专家」协同
DeepSeek-V2/V3 还用了「共享专家」设计:每个 token 除了走 top-k 路由专家,还必走几个共享专家。共享专家承担通用能力、路由专家承担专精能力。无辅助损失均衡让路由专家分工更干净——以前辅助损失会把本应专精的专家也往通用方向拉,现在不会了。
5. 序列级而非 token 级辅助损失(前身)
DeepSeek-V2 已经注意到辅助损失的副作用,提出过「序列级辅助损失」(在一个序列内做均衡约束,缓解 batch 内不均)。V3 的无辅助损失方案是这个思路的彻底化——干脆把均衡赶出损失函数。
效果与局限
效果:
- DeepSeek-V3 报告:在相同配置下,无辅助损失方案比传统辅助损失在最终 benchmark 上有稳定提升(论文给出了多个任务的对比),且训练全程没有负载崩塌。
- 训练更稳:去掉了 $\alpha$ 这个难调的超参,不需要在不同训练阶段动态调 $\alpha$。
- 专家利用率更均匀:监控显示各专家接收的 token 数方差显著小于辅助损失方案。
局限:
- bias 更新规则仍需调参。bias 的更新步长、判定「偏轻/偏重」的阈值都需调,只是从「调一个 loss 系数」换成「调控制器的几个参数」,并非完全免调。
- 强依赖高效 all-to-all 通信。负载统计要在多卡间汇总,通信开销在高专家数下不容忽视。
- 公开复现有限。DeepSeek 之外,社区对无辅助损失 MoE 的复现还在早期,泛化性结论需更多验证。
- 和 top-k 路由强绑定。bias 加在 softmax 上的设计针对 top-k 路由,对其他路由形式(如专家选择路由 Expert Choice)需重新设计。
谁该关心
- 做 MoE 训练的人:如果你被辅助损失的 $\alpha$ 折磨过、见过它把质量拉低,这是目前最干净的替代方案,值得严肃评估。
- 大模型架构设计者:无辅助损失代表了一种「把控制逻辑外移出梯度」的思路,这种思路对其他需要均衡/约束的场景(如多任务平衡、数据混合比例)也有启发。
- 复刻 DeepSeek-V3 的团队:这是 V3 的核心架构改动之一,跳过它复现质量会打折。
- 研究稀疏模型的人:它重新定义了「均衡」这件事该怎么做,是 MoE 工程化的一个分水岭。
一个判断:无辅助损失 MoE 不会立刻取代所有辅助损失方案——大量存量代码、教材、论文都基于辅助损失,迁移有成本。但它在「质量敏感、训练成本高」的场景下优势明显,很可能成为新一代大 MoE 模型的默认选择。
