你大概听过这种说法:混合专家模型(MoE)里面有一个数学专家、一个诗歌专家、一个医学专家,还有一位负责人,把你交给懂你那个领域的人。这个解释很好听,但它是错的。
在上一篇文章里,我用厨房解释了什么是 MoE:厨师长,也就是路由器,把每个词交给几位厨师,也就是专家。这篇是有趣的部分:关于 MoE 的六种说法,一测就站不住脚。每一条都附上了研究者往里看之后的发现。
误解一:“每个专家精通一个话题”
Mixtral 的作者恰好问过这个问题:有没有专管数学的、专管生物的、专管哲学的专家?他们把各个话题的文本送进模型,统计每个词交给了哪些专家。结果几乎一模一样:科学论文、医学摘要和哲学文本用到的专家和比例都一样。只有一组人工合成的数学题稍微有点不同。
他们真正发现的东西更傻,也更有意思:专家分的是文本片段。Python 里的 self 几乎总是交给同一个专家;英语里的 “Question” 也是。代码的缩进,也就是行首的空格,也有固定的专家。
OpenMoE 是一组最大 340 亿参数的研究用模型,它的发现更进一步:分配主要取决于是哪个词片段,和上下文关系很小。片段 “ed” 不管是在 “preferred” 还是 “led” 里,都交给同样几个专家,尽管这两个词毫无关系。
有一个例外,反而印证了这条规律:语言。在 OpenMoE 里,简体中文和繁体中文偏爱同样两个专家,日语和韩语共用另一个。但这不是因为某个专家“懂中文”,而是因为中文文本的片段和英文完全不同。
我还以为自己有个讲笑话的专家。结果只有一个管逗号的。
误解二:“Mixtral 8x7B 是八个 7B 模型拼起来的”
这个名字很容易让人这么想:八个 70 亿参数的模型拼在一起,再由负责人挑两个。如果真是这样,参数应该有 8 × 70 亿 = 560 亿(精确算是 580 亿,因为 Mistral 7B 实际有 72 亿)。**实际只有 470 亿。**差别在哪里?
Mixtral 脱胎于 Mistral 7B,而这类模型的参数分成两种:
- 公共部分,约 16 亿:每一层的注意力(负责看上下文的部分),加上词表,也就是把词变成数字、再把数字变回词的那张表。
- 厨房,约 56 亿:每一层里单独处理每个词的那个网络。
Mixtral 并没有把整个模型复制八份,只复制了厨房。公共部分只有一份,账一算就清楚了:
| 公共部分 | 厨房 | 合计 | |
|---|---|---|---|
| 八个 7B 模型拼起来 | 8 × 16 亿 | 8 × 56 亿 | 580 亿 |
| Mixtral 8x7B | 16 亿 | 8 × 56 亿 | 470 亿 |
| 每个词实际用到的 | 16 亿 | 2 × 56 亿 | 130 亿 |
最后一行算是彩蛋:上一篇说的 130 亿“激活参数”,并不是 2 × 70 亿,而是公共部分加上两个厨房。
还有一个容易混淆的细节:并不是有 8 个大专家,而是每层 8 个。32 层下来一共 256 个小厨房,第 1 层的 3 号厨房和第 2 层的 3 号厨房毫无关系。“3 号专家”只是一个工位编号,不是一个贯穿整个模型的角色。
误解三:“路由器会为你的问题挑一个专家”
很多人想象的是:负责人读了你的问题,判断“这是编程问题”,然后整个交给一位专家。实际不是这样。路由器是对每个词、在每一层都做一次决定:第一层从 8 个里选 2 个,第二层再选 2 个,一直到第 32 层。
从 8 个专家里选 2 个,有 28 种选法。32 层下来,一个词在模型里可以走 28³² 条不同的路径:约 2×10⁴⁶ 条,也就是 2 后面跟 46 个零。
确实存在的现象是:相邻的词倾向于沿用同一个专家。在 Mixtral 的第 15 层,下一个词沿用上一个词首选专家的比例在 23.6% 到 28.4% 之间,取决于文本类型。随机的话只有 12.5%。所以既不是“一个问题一个专家”,也不是完全随机。
误解四:“专家们会自己把活分匀”
放任不管,负责人就会像很多厨房一样:总是找同几个人。2017 年 Shazeer 等人(作者中包括杰弗里·辛顿)就发现了:路由器最后会把权重都给少数几个专家,而且问题会自我强化,因为受宠的专家训练得更多、变得更好,于是被选得更多。
所以每个 MoE 都带着某种分担负载的机制。经典做法是训练时加一项惩罚,分配一失衡就扣分。DeepSeek-V3 用的是另一种:给每个专家加一个偏置,闲着就调高,忙不过来就调低,而且只用于挑选。
这有一个实际后果。很多 MoE 给每个专家设了名额,名额满了,这个词在这一层就没人处理。OpenMoE 发现,长对话末尾的词更容易遇到这种情况。DeepSeek-V3 则表示,靠它的均衡机制,一个词都没有丢。
误解五:“用不到某个话题,就删掉它的专家”
既然专家不按话题分,就不存在可以删掉的“医学专家”。那专家能不能剪掉一些呢?可以,但要小心。Lu 等人(2024)用通用文本挑选,从 Mixtral 的每一层删掉了 8 个专家中的 2 个:
| 删掉什么 | 参数量 | 8 项测试的平均分(原为 67.58) |
|---|---|---|
| 每层删 2 个专家(共 8 个) | 少 24% | 低 2.9 分 |
| 每层删 4 个专家(共 8 个) | — | 低 7.1 分 |
看起来代价不大,但有个坑:同样的剪枝之后,数学题(GSM8K)的成绩从 58.61 跌到了 41.02。对通用文本来说多余的部分,恰恰是数学需要的。要剪出一个数学模型,他们只能用数学数据来挑专家,而两种挑法在 32 层里只有 4 层是一致的。
规则是:用你自己的数据测量后再剪,绝不按名字剪。
误解六:“厨师长在整个训练过程中不断优化分配”
听起来很合理:模型要学好几个月,路由器的分配也应该一直在改进。但在 OpenMoE 里并非如此:每个词片段交给谁,在训练初期就定下来了,之后几乎没变。每个片段一直交给同样的专家,直到训练结束。
这也是为什么最终的分配,看起来更像一个按文本片段归档的柜子,而不是一支专家团队。
总结一下:我的厨师不是专做哪道菜,而是专管某几样食材。而且分工在第一天就定好了。
是误解还是事实?
总结
| 误解 | 实际测到的 |
|---|---|
| 每个专家精通一个话题 | 分的是文本片段(self、缩进、“ed”)。语言是例外,因为语言不同,片段就不同 |
| 8x7B 是八个 7B 模型 | 只复制了厨房,公共部分只有一份:470 亿,不是 580 亿 |
| 一个问题一个专家 | 每个词、每一层都从 8 个中选 2 个:约 2×10⁴⁶ 条路径 |
| 专家会自己把活分匀 | 没有均衡机制,少数专家会包揽一切,而且越来越严重 |
| 删掉用不到的专家 | 可以剪,但要靠测量:通用文本里多余的,正是数学需要的 |
| 分配在整个训练中不断改进 | 在 OpenMoE 里很早就定下来,之后几乎没变 |
还有上一篇里的两个误解:MoE 并不是小模型放得下的地方就放得下,也不总是更快。详见混合专家模型(MoE):超大语言模型的省力窍门。
参考资料
查阅于 2026 年 10 月 5 日,均来自各论文的 PDF。
- Mixtral:Jiang 等人,arXiv:2401.04088。表 1(32 层、8 个专家、激活 2 个),第 5 节(不按话题分工;
self、“Question” 和缩进),表 5(相邻词沿用同一专家的比例)。 - OpenMoE:Xue 等人,arXiv:2402.01739,第 4 节:按词片段分配、语言偏好、分配很早固定、序列末尾的词被丢弃。
- 自我强化的失衡:Shazeer 等人,arXiv:1701.06538,第 4 节。
- 基于偏置的均衡、不丢弃任何词:DeepSeek-AI,DeepSeek-V3,arXiv:2412.19437,第 2.1.2 节。
- Mixtral 的参数拆分:我根据其表 1 和公开的配置文件自己算的,结果是总共 467 亿、激活 129 亿,与官方数字一致。
- 专家剪枝:Lu 等人,arXiv:2402.14800:第 3 节和图 4(数学),表 2(8 项测试平均分)。
- 细粒度专家与共享专家带来的专门化(DeepSeekMoE 的目标):Dai 等人,arXiv:2401.06066。
**本文是怎么写的:**根据我的笔记,由 Claude 协助调研和撰写。约 2×10⁴⁶ 条路径是我根据 Mixtral 表 1 自己算的。插图都是原创的。中文版由 Claude 从西班牙语翻译。