分而治之——MoE 的基本机制
上一章结尾留了一个悬念:DeepSeek-V3 总参数 671B、每个 token 只动用 37B;Kimi K3 总参数 2.8T、激活的只是几十分之一。"很大的模型,但只激活其中一小部分"——这就是 MoE(Mixture of Experts,混合专家),2026 年旗舰模型几乎无一例外的选择。这一章讲它的基本机制:为什么需要它、路由和专家怎么工作、以及那个纠缠了这个方向二十年的老大难——负载均衡。下一章再讲 DeepSeek 如何把它改造成今天的主流形态。
6.1 dense 的枷锁:每个参数都在全勤加班
先把问题立起来。我们目前讲的都是 dense(稠密)模型:处理每一个 token 时,全部参数都参与计算。这个设定太理所当然了,以至于很少有人把它当成一个"选择"来审视。但把它放到账本和账单的语言里,它的代价就显形了。
第一章讲过,模型的能力容量主要由参数量决定——参数越多,能装下的知识和模式越多。而生成一个 token 的计算量约为 $2\times$ 参数量。在 dense 架构下,这两个量被焊死在一起:想要 10 倍的容量,就得付 10 倍的计算——训练时每个 token 贵 10 倍,推理时每个 token 也贵 10 倍。scaling laws 说"更大就是更好",但 dense 的账单让"更大"贵得越来越离谱:GPT-3 级别(175B)的训练已经是千万美元量级,dense 地冲向万亿参数,账单直接不可负担。
可是回头想想,"每个参数为每个 token 全勤工作"真的必要吗?直觉上就很可疑。模型处理一段 Python 代码时,那些储存着法语诗歌韵律、有机化学命名法、宋代官制的参数在干什么?在陪跑——它们参与了每一次矩阵乘法,贡献的却几乎全是无关紧要的微小数值。第二章的"空间经济学"早就暗示过这一点:对某个具体 token,传送带上真正需要的加工只涉及少数子空间,大部分知识跟它无关。人脑也是这么干的:千亿神经元,任一时刻只有一小部分活跃;你算微积分时,管骑自行车的那部分皮层并不烧糖。
于是一个自然的设想浮出水面,学界称之为条件计算(conditional computation):让网络的哪一部分参与计算,取决于输入本身。把"容量"和"每 token 计算量"这对焊死的变量拆开——容量可以巨大,计算按需取用。这个思想上世纪 90 年代就有(Jacobs 与 Hinton 等人 1991 年就提出过 mixture of experts 的雏形),但真正把它做成现代形态的,是 2017 年——恰好与 Transformer 同年——Shazeer 等人的论文,标题起得毫不掩饰野心:《Outrageously Large Neural Networks》(离谱地大的神经网络)。
6.2 机制拆解:专家、路由器与 top-k
现代 MoE 的结构可以用一句话说完:把 FFN 复制成很多份(每份叫一个专家),再训练一个小小的路由器,为每个 token 挑选其中几份来计算。我们把这句话拆开讲清楚。
**为什么下刀处是 FFN?**回忆第一章的账本:dense 模型三分之二的参数住在 FFN 里,它是参数的绝对大头,砍它收益最大。更深一层,回忆第二章的分工:FFN 是"就地加工、存储知识"的部件,每个位置独立计算、互不通信——把它复制多份、不同 token 走不同份,不破坏任何跨位置的结构。而注意力是全局搬运工,所有 token 必须在同一张注意力图里交互,拆散它麻烦得多。所以标准 MoE 模型里,注意力层保持共享,只有 FFN 被"专家化":每一层原来的一个 FFN,变成 $E$ 个结构相同、参数各异的专家 FFN。
路由器(router,也叫 gate)是每层一个小得不起眼的线性层:输入 token 的隐藏向量($d$ 维),输出 $E$ 个分数——"这个 token 交给各专家处理的合适程度"。对分数做 softmax、取最高的 $k$ 个(top-k),token 就被派发给这 $k$ 个专家;各专家独立算出结果后,按路由分数加权求和,写回残差流:
$$ y = \sum_{i \in \text{top-}k} g_i \cdot \text{FFN}_i(x), \qquad g_i = \text{softmax}(W_r x)_i $$
关键在于 top-k 是硬选择:没被选中的 $E-k$ 个专家完全不计算、不产生任何开销。一个 $E=64$、$k=2$ 的 MoE 层,容量是普通 FFN 的 64 倍,每个 token 的计算量却只有 2 倍。**容量与计算,就此解耦。**这就是"总参数"和"激活参数"两个数字的由来:总参数是账本(决定装多少知识、占多少显存),激活参数是账单(决定每个 token 算多少)。
还有一个容易被忽略但很要紧的细节:路由是逐 token、逐层独立进行的。同一句话里,"函数"这个 token 和它旁边的"的"可以走完全不同的专家;同一个 token 在第 10 层和第 11 层选的专家也互不相干。所以不要把专家想象成"数学专家、法语专家"这种人类分工——实证研究发现专家的分化更多发生在语法、词形、主题的混合维度上,且往往难以命名。"专家"这个名字是历史遗留的浪漫化,真实的它们更像流水线上自发分化出的工位。
易错点
"8 个专家、top-2"不等于"模型是 8 个小模型的集成"。所有专家共享同一套注意力、同一条残差流,每层独立路由,token 的处理路径是几十层选择的组合——$64^{61}$ 量级的路径空间,而不是 8 条固定流水线。把 MoE 说成"几个模型投票"是圈外最常见的误解,你现在有资格纠正它了。
6.3 老大难:赢者通吃与负载均衡
机制看起来干净利落,但有一个魔鬼藏在训练动力学里,它纠缠了 MoE 二十年,直到今天仍是每篇 MoE 论文必答的考题:路由会自发塌缩。
推演一遍就明白。训练初期,专家的参数是随机的,路由器的偏好也是随机的。假设专家 3 纯属运气多接了一些 token——它见的数据多,学得就快,输出质量就好;路由器发现"派给专家 3 的结果 loss 更低",于是更倾向派给它;专家 3 于是学得更快……这是一个不折不扣的正反馈。放任不管,几步之内路由器就会把绝大多数 token 全派给两三个"明星专家",其余专家从此无人问津、参数停止更新——一个 64 专家的模型退化成 3 专家,账本上的容量成了幻影。这个现象有个形象的名字:赢者通吃(winner-take-all)塌缩。
经典解法是在损失函数里加一项负载均衡辅助损失(auxiliary load-balancing loss):统计一个 batch 里各专家实际接到的 token 份额,份额越不均匀,罚得越重。路由器于是被两股力拉扯——主损失拉着它"把 token 派给最合适的专家",辅助损失拉着它"雨露均沾"。这行得通,但代价内在于机制本身:辅助损失的梯度会干扰主目标,为了均衡,一些 token 被派给了并非最合适的专家——均衡是买来的,货币是模型质量。辅助损失的权重成了一个微妙的旋钮:拧太松,塌缩;拧太紧,路由变成了近似随机分配,专家化无从谈起。这个"均衡税"问题记住它,下一章 DeepSeek 的 aux-loss-free 方案正是冲着它来的。
工程侧还有一个配套约束叫专家容量(expert capacity):给每个专家设一个单批接客上限,超出上限的 token 被"溢出"——直接跳过这个 MoE 层(靠残差连接原样通过)。这是为了让计算图形状可预测、批处理高效,但溢出的 token 等于没被加工,是另一种隐性质量税。
6.4 从 LSTM 里的怪物到 Transformer 的标配
机制和难题都摆清了,快速过一遍它进入主流的三级跳,每一跳都留下了今天还在用的遗产。
Shazeer 2017:在 LSTM 时代造出 1370 亿参数的 MoE 语言模型(当时 dense 模型普遍不到 1B,"outrageously large"名副其实),确立了 noisy top-k 路由和辅助均衡损失这套基本盘。GShard(Google,2020):把 MoE 装进 Transformer——从此"隔层把 FFN 换成 MoE"成为模板;用 600B 参数的翻译模型证明了规模可行;确立了 top-2 路由和专家容量机制;最重要的遗产是专家并行(expert parallelism):专家太多,一张卡装不下,就把不同专家放到不同卡上,token 通过 all-to-all 通信被"快递"到自己专家所在的卡、算完再递回来。这个"参数不动、数据满天飞"的部署形态,从此定义了 MoE 的工程成本结构——它的瓶颈不在算力,在通信和显存。Switch Transformer(Google,2021):反方向的激进简化——top-1 路由(每个 token 只见一个专家)也能训好,配合一系列稳定性技巧把参数冲到 1.6T。它证明了 MoE 设计空间的宽容度,也留下一个信号:这个方向的关键矛盾不是"路由多精巧",而是"训练稳不稳、均衡贵不贵"。
然后是让 MoE 出圈的两个时刻。2023 年,多方报道与社区分析普遍认为 GPT-4 是一个 MoE 模型(OpenAI 从未证实,但这个判断在业内被广泛接受)——原来最强的那个模型,用的就是这套技术。2023 年 12 月,Mistral 开源 Mixtral 8×7B:46.7B 总参、12.9B 激活、8 专家 top-2,性能全面对标 Llama 2 70B 而推理便宜数倍——第一次让所有人可以亲手下载、拆解、微调一个能打的 MoE。开源社区的技术路线就此转向。
产业一瞥
MoE 的账单优势要说得诚实:它省的是计算(训练 FLOPs 和每 token 推理 FLOPs),不省显存——671B 总参数即使只激活 37B,那 671B 也得完整放在显存里待命,部署门槛反而更高(这正是专家并行、多机部署成为 MoE 标配的原因)。所以 MoE 的经济学本质是:用"更多显存、更复杂的部署"去换"更少的计算"。在算力比显存更稀缺、且推理量巨大的 2024–26 年,这笔交换极其划算——这是它统治旗舰模型的真正原因,也是它不太出现在端侧小模型上的真正原因。
6.5 悬而未决的问题
到 2023 年底,MoE 的地位是"已证明可行、但浑身是刺":辅助损失在收质量税;top-2 配 8 个大专家,粒度粗糙——每个专家仍是庞然大物,专家之间知识大量冗余(每个专家都得各自学一遍语法和常识这些"公共课");训练不稳定的旧名声仍在;微调容易过拟合。它像一台动力强劲但没调校好的引擎。
把这台引擎调校成 2026 年人人都开的量产车的,是 2024 年初 DeepSeek 的一篇论文和它后续的一系列模型——细粒度专家、共享专家、不收税的均衡术。这是下一章的故事,也是理解"为什么 2025 年之后人人都在抄 DeepSeek 作业"的钥匙。
本章要点
- dense 的枷锁:容量与每 token 计算量被焊死;条件计算的目标是把两者解耦——容量巨大,计算按需。
- MoE = 注意力共享 + FFN 复制成 $E$ 个专家 + 每层一个路由器做 top-k 硬选择;下刀 FFN 因为它占 2/3 参数且天然逐位置独立。
- 总参数 = 账本(容量与显存),激活参数 = 账单(每 token 计算)——读模型发布时最重要的一对数字。
- 路由逐 token 逐层独立;专家不是拟人化的学科专家,是自发分化的工位;MoE 不是模型集成。
- 赢者通吃塌缩源于正反馈;经典解法辅助均衡损失要收"质量税";专家容量与溢出是另一种隐性税。
- 三级跳遗产:Shazeer 2017(top-k + 辅助损失)、GShard 2020(进 Transformer、专家并行 all-to-all)、Switch 2021(top-1 极简);GPT-4(据信)与 Mixtral 让 MoE 出圈。
- MoE 省计算不省显存:用更多显存和部署复杂度换更少计算——2024–26 年算力稀缺格局下的最优交换。