一句话定义:路由 z 损失(Router Z-Loss)是训练混合专家模型(Mixture of Experts, MoE)时加在路由网络(router)上的一项正则项,专门惩罚路由打分(logits)的整体幅度,让 softmax 输出的专家权重别太尖锐。
它是怎么起作用的
MoE 里,每个 token 先由路由器给所有专家各打一个分,再用 softmax 把这些分换算成“分给每个专家的比例”。问题在于 softmax 对分差极其敏感:分数只差一点点,比例就可能天差地别;分数一旦飙到很大,比例会变成“一个专家接近 1、其余接近 0”,同时数值上还容易溢出。
z-loss 的写法是:对每个 token 先算 log-sum-exp,即 log Σ exp(z_j)(z_j 是各专家的打分),再平方,然后对所有 token 取平均。它的特点是:所有分数都在 0 附近时,这项≈log(专家数),是个小的常数;只要有一个分数被拉得特别大,log-sum-exp 就线性上涨,平方之后惩罚更重。于是优化器会倾向于把路由打分压在较小的范围里。
打个比方:部门主管给十几个下属派活,打的分直接换算成“活分给谁”。如果有人被打到极高、其余极低,活全压一个人身上,别人闲着,还容易因为“一家独大”出岔子。z-loss 就像一条规矩——给分差距拉得太开,就要扣主管的钱。于是主管习惯把分数控制在一小段区间里,分配自然平缓,也不会冒出天文数字。
容易混淆的几个东西
| 机制 | 惩罚/约束的对象 | 主要目的 |
|---|---|---|
| 路由 z 损失 | 路由打分 logits 的绝对幅度 | 数值稳定,抑制极端尖锐的分配 |
| 负载均衡损失(load balancing loss) | 一个 batch 内专家被选中的频率/概率分布 | 让专家使用更均匀,防止闲死一批 |
| 路由噪声、容量因子(capacity factor) | 打分扰动、每专家可处理的 token 上限 | 探索与算力控制,不是损失项 |
关键区别:负载均衡损失看的是“统计上用得均不均”,z-loss 看的是“分数本身大不大”。前者管分配结果,后者管打分的尺度。顺带一提,类似 log-sum-exp 平方惩罚在非 MoE 的 softmax 稳定实现里也出现过,MoE 只是把它挂到了路由上。
对从业者和普通读者意味着什么
训 MoE 的人多半踩过这些坑:loss 突然尖峰、低精度下数值溢出、路由逐渐塌缩到少数专家。z-loss 的代价很低——每个 token 多算一次 log-sum-exp(本身要用数值稳定的实现),通常前面还要乘一个很小的系数,常见做法是千分之几到百分之一的量级,具体取值以各自框架的官方说明为准。它能明显改善稳定性,但不是万能药,一般要和负载均衡损失、合适的精度与梯度策略配套使用。
对不训模型的读者,这件事的意义在于:MoE 用“多个专家、每次只激活少数”的办法,把模型容量做大而推理成本可控;而这类“给打分加一条惩罚”的小设计,正是它能稳定跑完训练、最终落到产品里的原因之一。
