01 / 直觉
医院分诊,不是人人看全科
把一层 FFN 想成诊室大楼:
- 稠密层:每个病人都要走完所有诊室——费时间,但流程统一。
- MoE 层:先分诊,只去 2 个相关科室。楼很大,但每人占用的诊室很少。
- 路由器(Router):就是分诊台,给每个 token 打分,选 Top-k 专家。
专家 Expert
一份小前馈网络。不同专家擅长不同「模式」——有的偏代码,有的偏多语言(大意如此,不可字面理解)。
路由器 Router
对当前 token 算各专家得分,取最高几个。有时再加负载均衡,避免都挤去少数专家。
加权合并
选中的专家各算一份,按路由权重加权相加。像多科室会诊,而不是随机挑一个。
02 / 动手
点一个 token,看它被派给谁
路由表是教学示意。真实模型的专家「专长」没这么整齐,但机制类似。
句子:Write a Python function to retry HTTP 429 with backoff
当前 token
—
路由得分(越高越亮)
点上面的 token。
03 / 账本
省的是「算」,不一定省「存」
每次前向(算力)
稠密:整个 FFN 都要算。
MoE:只算 Top-k 个专家 + 路由器。
同等「总参数」下,MoE 的激活计算量可以小一个数量级。
权重存放(显存)
所有专家的参数仍要放进显存(或分片到多卡)。
所以 MoE 常常是:激活参数少、总参数大——推理要显存,训练要通信。
// 伪代码:MoE 一层
scores = router(x) // [n_experts]
idx, w = topk(scores, k=2) // 选专家 + 权重
y = Σ w[i] * Expert[idx[i]](x) // 只算选中的
读新闻时对一下:
「总参数 200B、激活 30B」这种写法,多半就是 MoE。
别只看总参数就觉得推理一定贵——要看激活。
04 / 计算器
激活参数 vs 总参数
拖专家数和 Top-k,看激活比例怎么变。
05 / 小结
四句话带走
- MoE = 多个专家 + 一个分诊台,每个 token 只走少数专家。
- 激活参数 ≪ 总参数——容量上去了,单次算力可以不涨那么多。
- 显存仍要装下所有专家,所以「省算力」不等于「随便一张卡就能跑」。
- 看到「总参 / 激活参」两个数,先问:哪个对应推理成本?通常看激活。