一个模型可以有数千亿总参数,却在处理每个token时只激活其中数百亿。没有参与这一次计算的参数去了哪里?模型是不是先叫来几个不同的机器人,再把他们的答案合并?
本章沿着一个token的隐藏表示,走过路由、专家和合并,再算一次参数与存储。读完以后,你应该能分清总容量与单次运算,知道MoE省下了哪部分工作,以及这些节省为什么不会自动变成同样比例的提速。先修只需要第6章的前馈网络和第9章的Transformer结构。
1.改动发生在模型内部的哪一段
回想Transformer中的两种重要计算:注意力让当前位置读取可见的其他位置;前馈网络把每个位置的表示再作变换。常见稀疏MoE把某些层原本统一使用的前馈网络,换成一组可以选择的前馈网络,称为专家。
这里的“专家”是一些权重矩阵及相应运算。输入是隐藏向量,输出也是隐藏向量。它没有独立对话历史,不会自己检索资料,也不先写一篇意见交给主持人。MoE属于模型内部的结构设计;多个完整模型相互交流,是另一种系统组织方式。
关键变化是条件计算:不同输入只使用部分网络。一个可学习的路由网络,根据当前隐藏表示给专家打分,再决定送到哪些专家。早期稀疏门控MoE研究已经把这一点说清楚:扩大可用参数容量,不必让每个输入都执行全部专家的运算。稀疏门控MoE原论文
这也说明“稠密”与“稀疏”的分界不在参数有没有很多零。这里的稀疏主要指参与的路径少:对当前token,许多专家的前馈计算被跳过。那些专家的参数仍存在,下一个token可能就会选择它们。
专家输出能相加,还因为它们遵循兼容的向量形状。如果这一层接收四维表示,专家可以先扩展成更宽的中间表示,再变回四维;不同专家的输出才能按位置合并。它们是在同一模型里共同训练的计算模块,不能随意找两个不同模型的内部向量就直接相加。
层号也很重要。第十层的E1与第二十层的E1通常是两套不同权重,编号只用于区分各层内部的专家。没有特别说明时,不应把一张简化示意图理解成全模型只存在四个专家,也不能把某一层的专家数当成整模型专家模块总数。
2.路由怎样从分数变成一条计算路径
设这一层有E1、E2、E3、E4四个路由专家,规定每个token只选分数最高的两个,这叫top-2。更一般的top-k,就是选k个。k是结构和训练设置的一部分,并非用户临时把它改小,就一定能保持原能力。
路由读取的是当前层、当前token的隐藏表示,而不是只查这个token的文字编号。同一个词在不同上下文里的表示可能不同,进入更深层后也不同,因此选择可以变化。不能画成“整篇法律文本一直交给同一位法律专家”。
选出专家后,还要决定怎样合并输出。我们采用一种便于手算的教学规则:将选中专家的非负分数,除以它们的分数总和,得到合计为1的权重;每个专家输出向量乘以对应权重,最后逐项相加。
记住这个结构比背公式更重要:先选路径,再算所选专家,最后加权合并。真实实现对打分、选择和缩放有不同规定,不能假定所有模型都使用同一套softmax或归一化顺序。路由权重表达内部组合比例,也不代表这个专家提供了多少“事实正确概率”。
部分模型另设共享专家,每个token都经过它;其输出与路由专家的结果一起组合。这样设计希望让公共模式获得共同计算路径,减少路由专家重复承担通用部分。这是一种训练意图,不保证共享专家里能找到人类可读的“常识清单”。DeepSeekMoE共享专家设计
3.四个token,亲手追踪谁参与了运算
现在用四个抽象token位置T1到T4演练,不给它们贴法律或医学标签。下面按E1、E2、E3、E4的顺序列出教学分数:
- T1:0.60、0.30、0.08、0.02,选择E1和E2
- T2:0.10、0.60、0.20、0.10,选择E2和E3
- T3:0.05、0.05、0.45、0.45,选择E3和E4
- T4:0.20、0.10、0.10、0.60,选择E1和E4
以T1为例,选中分数之和是0.90,因此权重分别为0.60÷0.90=2/3和0.30÷0.90=1/3。假设E1对这个输入的输出是[2,0],E2输出是[0,3],加权合并为:
(2/3)×[2,0]+(1/3)×[0,3]=[4/3,1]
E3和E4不对T1执行专家前馈计算,没有两份隐藏的聊天答案等着投票。如果共享专家S对T1输出[1,1],再相加得到[7/3,2]。这只是MoE前馈分支的教学输出,完整Transformer层还要按自身结构接回残差等运算。
再核对其他位置的组合权重:T2给E2和E3的是3/4、1/4;T3给E3和E4的是1/2、1/2;T4给E1和E4的是1/4、3/4。专家对不同输入通常会产生不同向量,不能把T1的[2,0]直接当成E1对所有token的固定答案。

图1|T1的同一个隐藏向量h既送路由评分,也进入所选专家。路由只决定选择与混合权重,E1、E2实际加工h;E3、E4不运行。共享S是独立旁路,最后加到路由混合结果上。
在纸上画四个专家格子,把各token名字填入:E1收到T1、T4;E2收到T1、T2;E3收到T2、T3;E4收到T3、T4。总共有4×2=8次路由专家调用,每位恰好两次。共享专家另外处理四次。这种整齐分配是我们特意安排的,真实路由未必均匀。
注意“每token只选两个”不等于“这个批次总共只用两个”。本例四个token加在一起,四位路由专家全部参与。后续层还会重新选择,长回答也可能陆续使用许多不同专家。
再问一步:这些分工是谁教出来的?路由与专家都是模型的一部分,会在训练中随损失调整。被选中的专家从经过自己的token得到相应训练信号,路由的可学习打分也会受到训练目标影响。某专家没被T1选中,不妨碍它从同批T3获得学习机会。不同方法怎样处理离散选择和梯度有具体差别,不能把路由理解成人预先写好的一张职业分配表。
把三个对象分开,会更容易理解“可学习”:选中集合是离散决定;集合固定时的混合权重可以连续变化;专家内部参数决定每条支路输出什么。对当前选中集合,损失能经过加权和传到专家与连续权重;“排名第三突然挤进前二”的边界,却不能当作处处光滑的普通运算。均衡信号还会单独影响路由。不同方法采用不同近似、噪声或额外目标,不应画一支无条件穿过top-k的普通导数箭头。原始稀疏门控研究的门控与均衡讨论
做纸笔实验时,可以用两种颜色分别标出“这个token走过的路径”和“整个批次走过的路径”。先只看T1,再叠上T2到T4,就会看到单token稀疏与批次覆盖广泛可以同时成立。这也解释了为什么训练一个MoE,通常不能只维护一次激活的那小部分参数。
4.为什么必须操心负载均衡
把实验改一下:四个token都选择E1和E2。总调用数仍是八次,但分布变成4、4、0、0。若专家分散在不同设备上,部分设备排队,另一些设备空闲;一轮计算可能要等最拥挤的部分完成。
偏载还可能妨碍学习。频繁被选择的专家得到更多训练机会,冷门专家难以发挥作用;这种失衡如果持续扩大,名义上的大容量就没有被充分利用。因此,MoE训练不仅要把语言预测做好,也要让计算分配保持可用。
一种常见办法是加入负载均衡损失:除了预测目标,再对过度集中的分配增加约束。它不要求每个短句都平均派单,而是希望在适当统计范围内避免长期偏载。约束太弱可能堵车,太强也可能干扰本来有用的分工。Switch Transformer研究
还要区分专家的容量限制与参数容量。有的实现给每个批次能送入某专家的token数设上限,超额时需要特殊处理;“超过就丢弃”不是所有MoE的共同规定。读报告应检查具体策略,不能把一个早期实现的限制推广为定义。
这给了我们一个容易忽略的判断:一张均匀的路由统计图,不足以证明质量好;一张不完全均匀的图,也不一定说明训练失败。需要同时看效果、拥堵程度、统计范围和系统如何处理高峰。

图2|上方按token列出被选专家,连到每位专家收到的原token索引;均匀例的次数为2、2、2、2,偏载例为4、4、0、0,总数同为8。下方示意返回后按T1、T4等原索引归位,避免把专家批次顺序误当原序列顺序。
5.总参数、激活参数与显存是三笔账
再构造一个假设玩具模型:公共部分共6M参数,已包含共享专家、路由及其他总是参与的模块;四个路由专家各10M。M表示一百万。这里只为记账,不对应任何真实架构配置。
总参数是6M+4×10M=46M;每个token选择两个路由专家,激活参数是6M+2×10M=26M,约占总数的56.5%。这个比例表达一条路径涉及多少参数,不直接表达整机耗时比例;不同模块的读写和计算性质并不相同。
假设所有权重每个参数用2字节保存,原始权重容量是46M×2=92MB,这里MB按十进制百万字节计。不能只拿26M计算模型下载大小,因为另外两个专家下一次可能要用。也不能把92MB写成运行显存要求,因为还没算缓存、激活、通信缓冲和运行时开销,训练还会有梯度与优化器状态。

图3|同一比例尺下,总参数为公共6M加四个10M专家;T1路径只激活公共6M及E1、E2。总权重仍按46M×2字节=92MB计;未走的路径仍要存放,不能用26M推断下载大小或实际耗时。
没有足够快的存储时,可以把部分权重放在其他内存或磁盘,按需搬运,但代价可能是等待加载。把专家分布到多张设备上,则需要把token表示发送给对应设备,再收回结果、恢复顺序并合并。通常不是每处理一个token就把整份专家权重在设备间搬一遍。
分发后还不能丢掉token的位置。假如设备把E1收到的T1、T4连在一起处理,返回时必须知道每个输出属于哪个原位置,再与该token从另一位专家获得的结果合并。否则即使每次矩阵乘法都算对,整体回答也会错。路由系统因而还维护索引、缓冲和调度,这些工作并不体现在简单的激活参数比例里。
小批次时,专家可能只收到很少输入,矩阵运算难以充分利用硬件;大批次更有机会把发往同一专家的输入凑在一起,但等待、内存和延迟又会变化。所以激活参数少,是效率潜力的线索,不是速度承诺。
6.两份官方报告,展示两种具体选择
DeepSeek-V3公开报告列出671B总参数、每token激活37B;除最初三层的前馈网络外,其MoE层设1个共享专家和256个路由专家,每token选8个路由专家。这些数来自该公开版本,是代表案例,不表示目前最新模型都沿用它。DeepSeek-V3报告,模型配置
其主要均衡方法会根据负载调整影响专家选择的偏置,同时另保留很小的序列级均衡损失。因此,报告中的“辅助损失自由”不能读成训练完全没有任何辅助均衡损失。偏置用于选择,实际合并权重仍由原来的亲和分数得到。DeepSeek-V3报告,负载均衡
Qwen3-235B-A22B则公开为235B总参数、22B激活参数。其2025年Qwen3报告给出的MoE配置是128个专家、每token激活8个,并明确没有共享专家。它提醒我们,共享专家是一种设计选择,不能画成每个MoE都必有的组件。Qwen3官方发布、Qwen3技术报告,架构
两个模型都选8个专家,也不意味着专家同样大、层数相同或计算成本一样。更不能把37B激活直接等同于一个37B稠密模型:参数如何分布、注意力结构、通信和数据训练都不同,最终仍要在一致任务与条件下比较。
还有一个同名陷阱:生成文字时也可能使用top-k,表示从得分较高的候选token里选择下一个输出;MoE的top-k则是在内部选择专家。前者决定接下来写什么,后者决定当前隐藏表示经过哪些计算。两个位置、两个对象,即使数字都叫k,也不能混成同一个控制旋钮。
7.“专家”这个名字,哪些地方会误导
路由训练后可能出现某些偏好,但分工未必沿着人类学科边界。同一个领域可能调用多个专家,同一专家也可能参与多类文本。仅凭观察几个例子,就宣布“E7专门管法律”,会把统计现象误当成稳定职责。
MoE也不会自动修复错误知识、过时信息或不可靠推理。专家共享同一训练体系,可能共同受到数据偏差影响;加权合并向量不是独立核查事实。把专家数加倍,也需要适合的训练和系统支持,否则只是多了一批未充分利用的权重。
选择MoE通常是在容量、计算和部署复杂度之间取舍。对有高速设备互联、足够批量和成熟实现的系统,稀疏计算可能很值得;对内存紧张的小设备,全部专家的存储负担仍可能成为障碍。先问实际瓶颈在哪里,才知道这种结构是否合适。
本章练习
题目
问题1|算一次路由
T1的分数为0.60、0.30、0.08、0.02,选top-2;E1输出[2,0],E2输出[0,3],共享S输出[1,1]。求混合权重、路由输出及加上共享项后的输出。E3、E4是否也计算T1?
问题2|分开两种分母
按本章四个token的路由,四位专家各调用几次?公共6M、四专家各10M、每token选2个时,总参数、单token激活参数与2字节权重大小各多少?
问题3|检查系统边界
四个token全选E1、E2时,总调用数与负载如何变化?另回到第3节的原始路由:E1把T1、T4一起处理后返回,聚合器为什么还必须保留原token索引?
思考提示
提示1|对应问题1
先对选中分数重新归一化,再按向量分量混合;共享项单独相加。
提示2|对应问题2
单token经过的参数、整批专家调用次数、整模型存储不可混用。
提示3|对应问题3
先统计各专家的队列,再检查返回值应该与哪个token的另一条支路相加。
参考答案与解析
答案1|对应问题1
选E1、E2,权重2/3、1/3;路由输出[4/3,1];加S后为[7/3,2]。E3、E4跳过T1的专家前馈计算。共享S不占这两个路由名额;输出仍是隐藏向量,不是聊天答案。
答案2|对应问题2
E1收T1、T4;E2收T1、T2;E3收T2、T3;E4收T3、T4,各两次,总八次;共享S另处理四次。总参数46M,单token激活26M;全部权重按2字节保存为92MB,MB按十进制计。单token激活约56.5%,不能当成端到端耗时比例。
答案3|对应问题3
在四个token都选E1、E2的情形,总调用数仍为8,负载由2、2、2、2变成4、4、0、0,可能增加排队并降低利用率,不能保证同速。回到原始路由,聚合时必须把E1的T1结果与T1的另一位专家结果组合,把T4与T4组合;按专家返回次序直接拼接,可能串错位置。
下一章
内部容量与计算路径已经清楚,但基础模型仍可能只会续写,不能稳定按要求完成任务。下一章把一条“时间和地点提取”示范拆成输入、目标与计分范围,看看SFT究竟改变了什么。