理解 MoE:总参数很大,为何还能跑

MoE(Mixture of Experts,混合专家)是一种把模型拆成多组「专家」网络、再由路由器(router)决定每次叫醒谁的结构。

你会在模型卡上看到矛盾的数字:总参数动辄上千亿,本地或云端却还能推理。稠密模型(dense model)若同样体量,显存与算力往往扛不住。资料里又是稀疏激活、Top-k、负载均衡,读完仍常不清楚「大」到底大在哪、「省」到底省在哪。

下面用尽量直白的方式,说明 MoE 在优化什么,以及它不解决什么。

稠密模型与 MoE 稀疏激活对比

一、先说一个具体麻烦

假设两家模型都宣传「参数量很大」。

第一家是稠密模型:几乎每一层、每一个参数,在生成每个 token 时都可能参与计算。参数翻倍,算力和显存往往跟着涨。

第二家也写着很大的总参数,但官方又说「每次只激活其中一部分」。你下载或调用时发现:它确实比「同等总参数的稠密模型」更容易跑起来,却又比「同等激活参数的小模型」更吃存储。

麻烦在于:人们习惯用一个数字——总参数——判断「能不能跑」。MoE 把「装进硬盘/显存的参数总量」和「每次真正参与计算的参数量」拆开了。混谈这两个数,就会又惊喜又踩坑。

二、核心思路:多请顾问,每次只问少数几个

简单说,MoE 像一家咨询公司:墙上挂着很多专家的名字,但每个问题不会把所有人叫进会议室。

前台(路由器)看一眼问题,挑两三位相关专家发言,再把意见汇总。公司花名册可以很长(总参数大),单次会议成本却由「到场人数」决定(激活参数小)。

映射回神经网络,常见做法是:

(1)把某些层里原来的大块前馈网络(FFN),换成一组并行的专家 FFN
(2)每个 token 经过路由器,得到对各专家的分数
(3)只选分数最高的 k 个专家真正计算(Top-k)
(4)按权重把这 k 个专家的输出合并,继续往后传

所谓「稀疏激活」(sparse activation),指的就是:大量专家参数存在,但这一步多数处于休眠,不算进本次前向开销。

路由器挑选少数专家参与计算

三、一次推理大致怎么走

把单个 token 在 MoE 层里的路径摊开,通常是:

(A)token 的隐状态进入路由器
(B)路由器打分,选出 Top-k 专家
(C)被选中的专家各自做一次前馈计算
(D)按门控权重加权合并
(E)结果进入后续层(注意力等仍可能是稠密的)

MoE 层内从路由到合并的流程

不难看出:省的是「专家计算」那一块的算力;不是把整个 Transformer 都变成免费的。注意力、嵌入、非 MoE 层,该算还是算。

四、两个必须分开的数字

讨论 MoE 时,我建议永远并列写出下面两项。

4.1 总参数(total parameters)

所有专家加起来的参数量,再加上共享部分(注意力、嵌入、未替换成 MoE 的层等)。

它主要影响:

(1)权重文件有多大
(2)要不要把全部专家装进显存,还是靠 CPU 卸载 / 磁盘分页
(3)训练与部署的工程复杂度

4.2 激活参数(active parameters)

生成某个 token、经过某层时,真正参与计算的那一部分。

它更接近:

(1)单次前向的计算量量级
(2)在「专家都已在加速器上」的理想情况下,推理速度与能耗的直觉标尺

举例来说(数字仅作数量级示意,不是某款模型的官方规格):总参数 100B,每次激活 10B。对算力来说,更像在跑一个「活跃部分约 10B」的网络;对磁盘来说,你仍可能要准备接近 100B 量级的权重。

下面用伪代码表达 Top-2 路由的直觉(不是可运行的训练框架代码)。

# 伪代码:每个 token 只叫醒 2 个专家
scores = router(x)                 # 对 N 个专家打分
top_idx, top_w = topk(scores, k=2) # 选出最高的 2 个及权重
y = 0
for i, w in zip(top_idx, top_w):
    y += w * experts[i](x)         # 只有被选中的专家参与计算

上面代码中,experts 可以有很多个,但循环只跑 k 次。总参数随 N 涨;单次计算量大致随 k 与单个专家大小涨,而不是随 N 线性涨到尽头。

五、为何「总参数很大还能跑」

把原因收束成几条。

(1)计算稀疏:多数专家本步不计算,FLOPs 更接近激活规模。
(2)容量与成本解耦:想提高模型「知识容量」,可以加专家个数;想控制单次延迟,可以维持较小的 k 与专家宽度。
(3)工程可以继续抠:专家并行、按需加载、量化、缓存常用专家等,都能在「总参数大」的前提下把实际部署压到可接受范围。不同产品差很多,不能默认每家都做了同一套优化。

同时要说清楚边界:

(1)若你的机器必须把全部权重常驻显存,总参数大仍然直接卡显存。
(2)路由、通信、负载不均会引入额外开销;稀疏不等于「一定更快」。
(3)训练阶段还有负载均衡等约束,实现复杂度高于同等激活规模的稠密模型。

六、和稠密模型比,你在买什么

可以把它想成两种扩容策略。

稠密扩容:把同一张网加宽加深,几乎每次全员上班。能力上来,账单与硬件也跟着上。

MoE 扩容:花名册变长,会议室座位有限。你买到的是更大的参数库容,以及相对克制的单次计算;代价是路由是否靠谱、专家是否被充分用上、部署是否更麻烦。

对使用者,实用含义是:

(1)看评测与演示时,问清对比的是总参数还是激活参数
(2)看本地能否跑,先问权重体积与显存策略,再问激活规模
(3)看 API 定价,不要默认「参数越大越贵」成简单正比;计费常按 token,间接反映的是激活与服务成本,不是花名册长度本身

七、常见误区

(1)把总参数当成每次计算量
MoE 的卖点之一,正是这两件事可以分开。

(2)以为稀疏激活等于不占存储
不计算的专家,权重通常仍在某处。不占本次算力,不等于不占磁盘或显存规划。

(3)以为 k 越大一定越好
k 增大,更接近稠密,算力上升;k 过小,表达能力与稳定性可能变差。这是权衡,不是越大越强。

(4)忽略「专家崩塌」
若路由器总爱点名同一批专家,其余专家形同虚设,总参数的「容量」就浪费了。训练时常用负载均衡等手段缓解;推理侧你主要感知为质量与效率是否达预期。

(5)用 MoE 解释一切「大模型变便宜」
量化、蒸馏、更好的推理引擎、更短的上下文,都会让模型更好跑。MoE 只是其中一条结构路线。

八、小结

MoE 用路由器在多个专家之间做选择,让总参数可以很大,而单次推理只激活其中少数。

它限制或放开的,是「容量」与「单次计算」的关系:花名册可以很长,会议室不必每次坐满。
它不自动取消显存、带宽、工程复杂度,也不保证一定比同档稠密模型更聪明。

以后再看到「千亿参数还能跑」,可以先问两句:总参数多少?每次激活多少?两句都有答案,数字才不容易骗人。

(完)