08 MoE:容量、路由、梯度、均衡和系统实现
课程锚点:Lecture07(文件名仍是Lecture05_MoE)Slides8–57;Tutorial07 Cells26–48;Lab6 Cells51–64。主课件中路由和均衡公式不少在图片里,需要按图理解。
8.1 为什么不一直加宽一个 Dense FFN
Dense模型所有token调用同一套FFN;扩大参数通常增加每token计算。MoE把FFN改成多个专家加router,让每token只用少量专家,从而提高总容量而不同比例增加活跃计算。它不是自动拥有人工定义的“数学专家/历史专家”,专长是训练形成的统计规律,未必可直观命名。
设路由专家E个,每个SwiGLU参数约3DF;共享专家S个同尺寸;其余常驻参数P0。总参数约P0+(E+S)3DF+DE;每token活跃参数约P0+(K+S)3DF+DE。router仍要对E个专家打分,选择与通信也有额外开销,所以“增加E完全不影响计算”只是忽略router和系统成本的近似。
总参数影响权重存储;活跃参数影响主要计算路径。MoE的“80B-A3B”不能据A3B只准备3B权重显存,除非使用具体分布式/offload策略并承担相应代价。
8.2 标准 token-choice Top-K
每个token x:s=xWr得到E个logits→TopK得到索引集T→计算门权重→只把该token送到选中专家→加权求和→恢复token原顺序。
两种门权重不要混:
A 全E项softmax后截断,不再归一化:p=softmax(s),选中g=p,其余0,选中权重和通常<1。
B 选中logits后softmax:g_e=exp(s_e)/Σ_(j∈T)exp(s_j),选中权重和1。这等价于先全softmax、截断后再归一化;Tutorial07采用B。
课件Slide34例全概率[.50,.30,.15,.05]、Top2:[.50,.30,0,0]属于A;Tutorial07对应[.625,.375,0,0]属于B。**它们输出尺度和梯度不同,不是两份材料一定有一份算错。**模型特定实现可能另有sigmoid gating、缩放系数、group-limited routing等,不能用同一公式概括全部模型。
8.3 Top-K不光滑,为什么router仍能训练
选中的整数索引本身不可微,不能通过索引跳变直接backprop;但固定当前选中集合时,连续权重g仍可对logits求导,并把loss传到router。专家输出也可对输入和专家参数求导。
Tutorial07 B方案K=1时,单项softmax恒为1,导数0;router不能从这条“归一化门权重→输出”路径学习。K≥2时,若专家输出不同、上游梯度非退化,通常能有非零梯度,但不保证每个参数每次都非零。
A方案K=1仍保留全softmax概率p_selected,它依赖所有logits,因而可能有router梯度。辅助均衡loss、随机扰动、估计离散决策的其他算法也可能提供学习信号。不能把“某个教学代码K=1梯度为0”泛化为“所有Top1 MoE都无法训练”。
8.4 Token choice、expert choice 与全局路由
token choice:每token固定选K专家,专家负载不固定;易有过载/闲置。
expert choice:每专家在一批token中选固定容量的若干token,专家侧负载易控制;每token被选次数可能不同,甚至未选。序列/因果任务还需考虑跨token选择是否引入不希望的依赖。
全局优化分配:把路由看成约束匹配问题,同时考虑分数与容量,但求解复杂、通信和调度成本更高。hash routing用固定哈希做分配是基线,降低路由学习成本,也牺牲适应能力。早期RL routing对离散选择可用REINFORCE,但方差/复杂度使其不必然优于常用方案。
8.5 负载坍塌与辅助loss
某些专家早期被选得多→得到更多训练→表现更好→更常被选;其他专家饿死。系统上热点专家拖慢同步step,质量上容量未被有效使用。
以Switch风格Top1为例,一批有效token数T,E专家:
f是实际硬分配比例,求导时常视常数;P是平均软概率。若均匀,f=P=1/E,loss=α;若全坍塌且概率也集中,约αE。它不是要求loss降到0。
∂L_bal/∂p_(t,e)=α E f_e/T:过载专家f大,对其概率施加更大惩罚,经softmax logits耦合后推动分配调整。并非直接给离散argmax求普通导数。TopK版本f的分母可能用TK或有额外E/K因子,抄公式前确认规范。
例E=2、f=[.75,.25]、P=[.6,.4]、α=.01:L=.011。这里“均衡”是全批/全设备等指定范围统计,不代表每个单独token都应均匀走所有专家。
capacity常近似ceil(c*T*K/E),c为capacity factor。热点超容量后可能drop、改路由或使用dropless稀疏kernel,具体选择影响质量/效率。padding token不应污染负载统计。
8.6 Noisy routing、z-loss 与bias均衡不同
噪声路由示意:H_e=xWg_e+ε_e softplus(xWnoise_e),ε为标准正态;KeepTopK后softmax。噪声有助探索、防早期过度确定,但会增加随机性、未必改善最终最佳loss。
router z-loss常惩罚(log Σ_e exp(s_e))²的batch均值,控制router logit的数值尺度。它不等于交叉熵,不直接等同负载均衡。router用FP32可以改善低精度下的数值稳定性;其他专家部分仍可低精度。
DeepSeek-V3风格辅助损失较少的均衡:在选择专家时用s_e+b_e,过载专家降低bias、欠载增加,bias通过负载控制规则更新;聚合权重可仍基于原始亲和分数。不能把选择分数与最终乘权强制视作同一个量。课件Slide46明确仍有互补的sequence-wise辅助loss,故“auxiliary-loss-free”不能解释为整个训练没有任何辅助损失。技术报告相应部分。
8.7 Fine-grained 与 shared experts
把一个大专家拆成多个更窄专家、同时增加选择数量,可在近似相同活跃参数预算下形成更灵活组合。要比较的是每专家宽度×活跃个数,而不只是专家个数。
shared expert对所有token执行,承担共同模式;routed experts分担差异化模式。Tutorial07:y=shared(x)+routed(x),shared不乘路由权重,也不占TopK路由名额。共享专家不是与别的专家共享同一套参数,而是所有token都会经过的独立专家。
课件Slide36显示某些DeepSeek消融中共享有帮助,Slide37的OLMoE消融却未见同样收益。正确结论是依配置与数据而定,不能说共享专家在所有MoE上必然更好。
8.8 真正稀疏实现的流程
x:[B,T,D]→flatten [BT,D]→router [BT,E]→selected [BT,K]→按expert聚集token→专家matmul→乘对应权重→scatter/index_add回原token→reshape [B,T,D]。
Tutorial07的torch.where(selected==expert_id)返回token编号与TopK槽位编号,二者配对取权重;同一token可能出现K次,因此需要累加,不能简单覆盖。没有token的专家跳过。
如果先对所有token运行所有专家再用mask乘0,输出可以等价,但并未省主要FFN计算。反过来,Python逐专家循环虽逻辑稀疏,可能小矩阵/launch开销太多而比dense慢;生产实现通常采用grouped/batched GEMM等。
8.9 并行、通信、微调、upcycling
expert parallelism把不同专家放不同设备,需all-to-all分发token,再合并输出。总时长可能由最忙专家和跨设备通信决定;带宽不足时活跃FLOPs下降也未必更快。device-level balancing关注设备聚合负载,区别于仅均衡每个专家。
微调数据少可能使router分布漂移、专家过拟合或闲置;可调整路由/专家学习率、冻结部分参数、保持均衡机制并监控负载。不能从“预训练时平衡”推出微调自动平衡。
upcycling从预训练dense模型复制/拆分FFN初始化多个专家,再训练router及专家,利用已有知识,避免全部从头训练。开始专家相同不代表永远相同,路由数据与梯度会打破对称;若长期路由/数据完全对称也可能缺乏分工。
闭卷检验:E从8增到16而K=2、每专家F固定时,总参数、专家活跃计算、router成本、部署权重、通信可能分别怎样变?回答“都不变”或“都翻倍”都不充分。