怎么用修改损失函数解决 MoE 负载均衡?

一句话结论

在原任务损失上加入辅助均衡损失,度量各专家负载偏离均匀分布的程度,再用系数控制均衡与专家专业化之间的权衡。

先这样答

可以在原来的任务损失上加入辅助均衡损失,让路由器减少专家之间的负载差异。具体做法是统计各专家的负载,再计算它们偏离均匀分布的程度。负载可以看路由概率,也可以看实际分配到每个专家的 token 数量。偏离程度可以用 CV 平方表示,也可以使用开关损失。

把这个均衡项乘一个系数,再加到总损失里。系数控制均衡约束的强弱。系数太小,均衡项影响有限,专家之间仍可能负载不均。系数太大,模型会被迫把负载推得过于平均,专家原本应该形成的专业化能力会受损。这种为了均衡付出的代价,可以称为 load balancing tax。

训练时还要关注均衡项带来的稳定性。一个常见做法是对均衡项做 warmup,让它逐步参与训练。也可以加入 router z-loss,帮助训练过程保持稳定。面试中我会先说明损失怎么定义,再说明系数如何影响均衡和专业化,最后补充训练阶段的处理。

面试官会怎么追问

  • 「你说的专家负载,应该统计路由概率还是实际 token 分配?」 两种都可以作为均衡损失的输入。路由概率反映路由器的倾向,实际 token 分配反映最终落到专家上的负载。回答时要先说明自己选用哪一种,再说明它衡量的是哪一层含义。

  • 「均衡损失的系数是不是越大越好?」 不是。系数太小,负载不均的问题可能得不到处理。系数太大,模型会被迫平均使用专家,专家专业化会受损。这个权衡就是 load balancing tax。

  • 「训练一开始就把均衡损失设得很大,可以吗?」 不建议直接这样做。均衡项过强可能影响训练稳定性,也可能过早压制专家分工。可以使用均衡项 warmup,让它逐步发挥作用,也可以加入 router z-loss 稳定训练。

回答的坑

  • 只说“给每个专家平均分 token”,却没有说明均衡损失如何度量偏离程度。
  • 只强调负载均衡,却不提系数过大可能损害专家专业化。
—— 本题完 ——