同一个模型、同一份参数预算,只是把专家的排布方式换一下,预训练损失就能再降一截——这是新论文 Foil 交出的答案。它把两条省参数路线——循环 Transformer 和稀疏 MoE——焊在一起,回答了一个没人系统回答过的问题:MoE 到底该怎么循环。
两条路线为什么天然互补
循环 Transformer 把一个层块重复使用多次:多花计算、不加参数,把固定规模模型的潜力压榨彻底。稀疏 MoE 则存很多专家、每个 token 只激活少数几个,按需分配计算。
组合起来有个天然好处:每次循环都是一次新的路由决策,token 在不同 pass 里能夠到不同专家组合,专家参数一个不用加。但问题随之而来——参数量和计算量固定下,专家该怎么分布在层和 pass 之间?哪些组件该跨 pass 共享?论文用「压扁 + 解绑」两步作答。
Foil 的两步手术
第一步是拍扁(flatten):专家参数总量与单 token 专家计算量不变,层数减半、每层专家数与循环次数翻倍——从 8 专家 × 8 层 × 2 次循环,变成 64 专家 × 1 层 × 16 次循环,每次路由都从更大的池子里挑。
第二步是解绑(untie):每次循环配一套独立注意力参数,专家和路由器全局共享。不增加任何计算,却让每个 pass 学到不同的注意力模式。
数字说话
20B token 时所有 Foil 配置损失都低于未压扁基线;100B token 时损失随压扁程度单调改善,最扁配置在等参数等计算下比基线低 0.012 nat,下游准确率持平或更好。全扁形状上解绑注意力再降 0.049 nat,三个代表性下游任务平均准确率提升 3.3 分——零额外计算换来的。
复现门槛与工程细节
代码以 Apache-2.0 开源在 GitHub(SR-A-W/how-to-loop-moe),模型权重同步上架 Hugging Face(ShourenWSR/how-to-loop-moe)。训练数据用 FineWeb-Edu 的 sample-100BT 子集(140 个 parquet 分片,约 286GB),分词器用 SmolLM2(词表 49,152)。100B token 的长跑是从 20B run 的 step-45,000 checkpoint 接力续训,而不是从零重来。工程细节:训练和评测必须分环境,torch 分别钉死 2.12.0 和 2.13.0,互不兼容。
论文附了完整 run 对照表:tied 组 S1–S4 与 untied 组 U1–U4 形状一一对应,消融直接可比;模型代码移植自 arXiv:2605.09165 的释出实现,仓库代号 LoopMoE 与 Chen et al.(arXiv:2606.04438)的同名方法无关,后续会改名为 Foil。
消融里最值得记住的两条
一是负载均衡不够看。论文发现路由置信度(routing confidence)比负载均衡更能反映专家使用是否健康,其逐 pass 峰值可能是再循环收益递减的信号。二是循环和专家宽度互相放大:每层专家越多,多循环越有用;循环越多,加专家也越有用。合起来就是设计指南:每层专家数和循环次数都往多里堆。
对小模型和边缘部署团队,启发很直接:参数预算不动,重新排布专家层间分布、给每次循环松绑注意力,也能白拿收益。下一步值得盯这套拓扑向更大参数量和产品级模型的迁移——毕竟 0.012 nat 是研究级尺度上量出来的。循环不是免费午餐,但 Foil 至少把菜单排清楚了。
参考:arXiv:2609.35751 · github.com/SR-A-W/how-to-loop-moe