当前位置: 首页 > news >正文

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 路由的标准流程,平衡了计算效率和模型容量。

http://www.gsyq.cn/news/1586981.html

相关文章:

  • CVE-2012-1823漏洞复现:PHP-CGI参数注入原理与防御实践
  • 90% 新手部署 OpenClaw 踩的坑,看完直接一次装好【含安装包】
  • 从动物免疫到噬菌体展示:纳米抗体文库搭建要点
  • 抖音无水印视频批量下载终极指南:3分钟掌握免费神器
  • 热门 AI 大模型横评:ChatGPT 搭载 GPT-4o 全功能实测,2026 开发者选型参考
  • 网络安全实战:从近源渗透到应急响应的攻防一体化演练
  • 【VibeCoding系列教程18】IDE插件
  • 给毕业合影加一段语音旁白——鸿蒙3D有声照片让照片不只是看还能听
  • 汽车RKE系统低功耗设计:MPC5516与MC33696的架构对比与优化实践
  • 2026年热门晋江AI获客公司口碑情况大揭秘
  • Converseen:免费开源的图像批量处理神器,摄影师设计师的效率倍增器!
  • BilldDesk:打破远程桌面付费壁垒的开源跨平台解决方案
  • Python 协程池性能调优实践
  • clean-code-javascript-es:西班牙语版的代码整洁之道
  • 遗传算法进阶实战:破解早熟、收敛与适应度设计陷阱
  • Ice:解决macOS菜单栏管理难题的专业级解决方案
  • anki-vocab:一个命令行工具,让背单词变成一件很酷的事
  • AI伦理落地实战:从数据层识别与修复算法偏见
  • Mixtral 8x7B:开源稀疏MoE模型实战指南
  • 导师严选!盘点2026年最强的AI论文网站
  • NUC980与ESP32的SPI-WiFi联调实战:从驱动编译到网络连通
  • 5个简单步骤让Windows任务栏变透明:TranslucentTB终极美化指南
  • 德克萨斯大学奥斯汀分校让问答机器人知道自己“几斤几两“
  • Dism++深度解析:为什么说它是Windows系统维护的“瑞士军刀“?
  • FanControl终极指南:5步实现Windows风扇精准控制
  • 标题:大学生专属:如何零基础搭建一个酷炫的个人博客网页?
  • AWVS实战:从自动化扫描到手动验证的Web漏洞评估闭环
  • 腾讯AI应用开发一面,我懵了!!!
  • Kinovea运动分析软件:从入门到精通的完整指南
  • 在普通CPU上跑通Vicuna大模型的实战指南