news 2026/6/25 13:10:55

06. MoE Router代码笔记

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
06. MoE Router代码笔记

背景

TopKRouter混合专家模型(Mixture of Experts, MoE)中的门控路由器。它接收一个批次中所有 Token 的隐藏状态,为每个 Token 选出最合适的K 个专家,并计算对应的权重。路由包含三个关键步骤:

  1. 用线性层产生每个专家的 logits;
  2. 对 logits 做 softmax 得到概率分布;
  3. 选取概率最大的 K 个专家,并重归一化这些权重。

三个 TODO 分别对应第 2、3 步以及重归一化。


TODO 1:对全量 Logits 进行 Softmax 获取所有专家的概率分布

routing_probs=F.softmax(router_logits.float(),dim=-1)

作用:将门控层输出的原始分数router_logits(形状[total_tokens, num_experts])转换为概率分布,使每个 Token 在所有专家上的权重和为 1。

细节与必要性

  • .float():强制将router_logits转换为float32再进行 softmax。在混合精度训练(如bfloat16float16)中,logits 可能数值范围大,直接 softmax 容易溢出或损失精度。提升到 FP32 能保证数值稳定性。
  • F.softmax(..., dim=-1):在最后一个维度(专家维度)上计算 softmax。结果routing_probs的每一行是概率向量,表示该 Token 与各专家的匹配程度。
  • 这一步是路由的基础,为后续 Top-K 选择提供标准的概率分布。

TODO 2:从概率分布中截取 Top-K 最大的概率及其索引

routing_weights,selected_experts=torch.topk(routing_probs,self.top_k,dim=-1)

作用:对于每个 Token,从routing_probs中选出概率最大的self.top_k个专家,得到它们的权重专家索引

细节

  • torch.topk(routing_probs, self.top_k, dim=-1)返回两个张量:
    • routing_weights:形状[total_tokens, top_k],每个 Token 选出的 K 个最高的概率值。
    • selected_experts:形状[total_tokens, top_k],这些概率对应的专家索引(long类型)。
  • 这一步体现了 MoE 的“稀疏性”:每个 Token 只激活 K 个专家,其余专家不参与计算。大大节省了计算量。
  • 选取后的routing_weights不再是一个完整的概率分布(因为舍弃了其余专家),需要下一步的处理。

TODO 3:对截取后的 routing_weights 进行重归一化(Re-normalize)

routing_weights=routing_weights/routing_weights.sum(dim=-1,keepdim=True)

作用:让选出的 K 个专家的权重按比例放大,使其总和为 1,变成一个合法的概率分布(仅在这 K 个专家上)。

为何需要重归一化

  • Top-K 截取后,被选中的 K 个概率之和通常小于 1(除非这 K 个恰好就是概率最大的全部且剩余概率为 0)。
  • 后续在SparseMoEBlock中,每个选中的专家输出将乘以routing_weights再累加到最终结果。如果直接使用截取后的概率,累加的总贡献会变小(相当于多了一个衰减因子),这不符合“这 K 个专家完全负责该 Token”的预期,会改变梯度的尺度。
  • 重归一化保证了“被激活的这 K 个专家共同解释该 Token 的全部输出”,使得输出幅值稳定。
  • 计算方式:routing_weights / routing_weights.sum(dim=-1, keepdim=True),对每个 Token 在top_k维度上除以各自的和。

最后,代码通过routing_weights = routing_weights.to(hidden_states.dtype)将权重转回输入的精度(如bfloat16),以便与后续计算保持一致。


额外说明:SparseMoEBlock 如何使用这些结果

虽然这不是 TODO,但理解上下文有助于理解路由的目的:

SparseMoEBlock.forward中,对每个专家使用torch.where(selected_experts == expert_idx)找到所有选中该专家的 Token,分别计算专家输出,然后乘以对应的重归一化权重routing_weights[token_idx, kth_expert],累加到最终输出中。这体现了 MoE 的“稀疏加权汇聚”:每个 Token 只被自己选中的 K 个专家处理,最后按权重合并。路由器返回的routing_weightsselected_experts正是驱动这一过程的核心数据结构。


总结

  • TODO 1用 FP32 执行 softmax,得到每个 Token 对所有专家的完整概率分布。
  • TODO 2通过torch.topk从中选出 K 个最大的概率和对应的专家索引,实现稀疏选择。
  • TODO 3对这 K 个权重进行重归一化,使它们和为 1,保证激活专家的输出幅值稳定。

这三步共同构成了 MoE 路由的标准流程,平衡了计算效率和模型容量。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/25 13:10:00

【控制】基于反步法的无人机四旋翼滑模控制附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。🍎个人主页:Matlab科研工作室🍊个人信条:格物致知。更多Matlab完整代码及仿真定制内容点…

作者头像 李华
网站建设 2026/6/25 13:03:38

VMware虚拟机启动报“Failed to start virtual machine”?资深架构师手把手复现+定位+修复(含12个真实客户案例脱敏分析)

更多请点击: https://intelliparadigm.com 第一章:VMware虚拟机启动失败的典型现象与影响面全景扫描 VMware虚拟机启动失败是企业虚拟化环境中高频发生的运维事件,其表象多样且根因分散,直接影响业务连续性、开发测试效率及灾备体…

作者头像 李华
网站建设 2026/6/25 13:01:35

Windows X-Lite 26H1 V3 第三方精简系统说明与完整安装实操指南

重要前置风险提示 Windows X-Lite 属于第三方非官方修改封装的 Win11 镜像,并非微软官方发行系统,存在多重安全、稳定、合规隐患: 系统更新机制被移除,无法自动获取微软官方安全漏洞补丁,长期使用易遭受网络攻击&…

作者头像 李华
网站建设 2026/6/25 13:01:13

延迟启动工具

链接:https://pan.quark.cn/s/e45992999256在日常使用电脑的过程中,我们经常会遇到开机启动项过多导致电脑启动缓慢的问题。为了帮助用户更好地管理和优化开机启动项,本文将介绍一款名为“延迟启动工具”(Delayed Startup Tool&am…

作者头像 李华
网站建设 2026/6/25 12:59:46

告别低效写作:高效论文写作全流程一键生成论文工具推荐(2026 最新)

论文写作全流程可拆解为文献调研→选题/开题→大纲/初稿→文献综述→降重/去AI味→润色/格式→查重/投稿七大环节,2026年一键生成论文工具按环节精准匹配,兼顾中文适配、降重能力、去AI痕迹、学术合规四大核心需求,覆盖免费/付费、通用/垂直场…

作者头像 李华
网站建设 2026/6/25 12:58:07

SysTools SQL Backup Recovery(数据库备份恢复工具

链接:https://pan.quark.cn/s/a1c7cf177bd0SysTools SQL Backup Recovery(数据库备份恢复工具)是一款专门帮助用户备份和还原数据库资料的开发工具,我们可以通过这款软件来对自己数据库里的资料全部进行备份保存。当数据库资料出现丢失的问题时&#xff…

作者头像 李华