引入辅助loss,其计算方法如下 $$l_{aux} = \sum_{e=1}^E{c_e/s*m_e} $$ 。其中 $$c_e/s $$ 表示路由给每个专家的分数。最小化 $$c_e/s $$ 的平方。但 $$c_e $$ 由于来自top-2操作,不可微,使用每位专家 $$m_e $$ 的均值门作为可微近似值,并将 $$(c_e/s)^2 $$ 替换为 ...
辅助负载均衡损失 (Auxiliary Loss),形式通常如下: \mathcal{L}_{\text{aux}} \ \sum_{e=1}^E f_e P_e 其中$f_e$ 表示实际路由到专家 $e$ 的 token 比例,$P_e$ 是专家 $e$ 的平均 gating 概率。这个损失会“鼓励”各专家负载更加均衡。 本地分组 (Local Groups):不是所有 token 都在全...
GShard 引领了 top-2 gating 和容量约束;Switch Transformer 用 top-1 gating 打开了更大规模的可能性;GLaM 让我们见识了训练能耗可以大幅下降;DeepSpeed-MoE 则深入挖掘了训练和推理层面的负载平衡;ST-MoE 用 z-loss 改善了稳定性;Mixtral 看到了专家分配的时间局部性;等等……最后到一些更灵活的思路,如 DeepSe...
所以我们minimize 辅助loss的时候其实就是让网络学习时尽量避免溢出. MOE并行(gshard)# 1. EP+DP# 以2机16卡为例, 如果想使用4份数据并行(ep_dp_world_size), 每套专家可以被平均分为4份为例(ep_world_size), 这里其实就是e0+e1+e2+e3, 那么切分结构如下图: 在切分的时候, 主要需要遵循几个原则: 在...
这种干扰效应的原因在于,当网络试图同时学习多个子任务时,不同任务的学习过程可能会相互干扰。例如,学习一个子任务时对权重的调整可能会影响其他子任务的学习效果,因为这些权重变化会改变其他子任务的loss。这种相互影响使得网络在处理每个子任务时都试图最小化所有其他子任务的loss。
有了这些记号,我们就可以写出Aux Loss为: Laux=F⋅P=∑i=1nFiPi 一般文献定义Aux Loss会多乘一个n,即它们的Aux Loss等于这里的nLaux。此外,有些大型MoE可能会按设备来算Aux Loss,以达到设备内的均衡,减少设备间的通信,这些就各自发挥了。但也有较新的实验显示,强行局部均衡极有可能影响模型最终效果。
\mathcal{l}_{aux} = \frac{1} {E} \sum_{e=1}^E(\frac {c_{e}}{S}) \times m_{e} \tag6公式(6) 就是我们经常看到的负载均衡loss形式。这里也要注意,对于专家级的负载均衡的loss是加到每个MoE层的,每层都有一个 l_{aux} 辅助损失。 上面对MoE有了基本的认识,我们接下来看看DeepSeek在...
调用门控网络(self.gate),对输入 hidden_states 计算得到 top‑k 专家索引(topk_idx)、对应权重(topk_weight)以及辅助损失(aux_loss,推理时不参与梯度计算)。 2、数据重排 将输入 hidden_states 展平为二维张量(形状 [B * T, d]),并将 topk_idx 也展平。
.sum(dim=1)y=y.view(*orig_shape)y=AddAuxiliaryLoss.apply(y,aux_loss)else:y=self.moe_infer(hidden_states,flat_topk_idx,topk_weight.view(-1,1)).view(*orig_shape)ifself.config.n_shared_expertsisnotNone:y=y+self.shared_experts(identity)returny...