考察点
DeepSeek 带火 MoE 之后这题出镜率极高。面试官想看你是否理解 MoE 的核心交换:用更大的总参数量换更低的单 token 计算量,以及这个交换在训练和推理两侧分别意味着什么。只会说「门控选专家」是不够的,要能讲清楚负载均衡、专家并行、显存不降反升这些工程现实。追问常往路由坍缩、aux loss、MoE 微调和部署痛点上走。
参考答案
MoE 的基本原理
把 Transformer 每个 block 里的 FFN 换成 N 个并行的「专家」FFN,加一个可学习的路由器(gate)。每个 token 经过时,路由器对所有专家打分,只选 Top-K 个(通常 K=2 到 8)激活,输出是这几个专家输出的加权和。注意力部分一般保持不变。
关键数字:DeepSeek-V3 总参数 671B,每 token 激活约 37B;Mixtral 8x7B 总参数约 47B,激活约 13B。也就是说模型「知道的」很多(总参数),但每算一个 token 只动用一小部分(激活参数)。
收益:解耦参数量与计算量
Dense 模型里,参数量 = 计算量,想让模型更聪明只能付出成比例的算力。MoE 把这两者解耦了:总参数决定模型容量的上限,激活参数决定每 token 的实际 FLOPs。这带来两个直接收益:
- 训练效率:同等训练算力下,MoE 能吃到 4-8 倍参数量的容量。反过来说,达到同等效果的训练成本更低——DeepSeek 系列的成本优势很大程度上来自这里。
- 推理 FLOPs 低:单 token 只算 37B 激活参数的矩阵乘,相比同总参数的 Dense 模型(671B 全激活),计算量低一个数量级。
还有一个常被忽略的收益:专家分化带来一定的模块化可解释性,实践中会观察到某些专家偏向代码、某些偏向特定语言(虽然这种分化并不绝对)。
代价:这才是面试的分水岭
显存占用不降反升。推理时所有专家的权重都得驻留显存——你可以只激活 37B,但那 671B 一个都不能少地躺在卡上。MoE 省的是计算,不是显存。部署 DeepSeek-V3 需要按总参数量备卡,这是很多人第一次碰 MoE 时的认知反转。
路由稳定性与负载均衡。训练时路由器容易「赢家通吃」:少数专家被反复选中、越训越强,其余专家饿死(routing collapse)。对策是负载均衡辅助损失(aux loss),惩罚不均匀的分配,以及在训练时用 capacity factor 限制每个专家每步最多处理的 token 数、加噪声扰动路由打分。DeepSeek-V3 用了无辅助损失的偏置调节方案。这些是 MoE 训练的核心 trick。
通信开销。专家太多单卡放不下,必须专家并行(expert parallelism)——不同专家放不同卡,每个 token 按路由结果跨卡搬运。All-to-All 通信成为新的瓶颈,MoE 训练和推理的吞吐高度依赖互联带宽(NVLink/InfiniBand)。这也是 MoE 在小集群上性价比差的原因。
微调和下游适配更难。稀疏激活的模型在小数据上微调更容易过拟合,路由器的存在让 LoRA 这类参数高效方法的作用点变复杂;量化也比 Dense 麻烦——专家权重的分布差异大,低比特量化掉点更明显。
推理延迟的隐性成本。虽然 FLOPs 低,但路由选择、跨卡搬运、专家负载不均导致的「最慢专家拖全局」,都让 MoE 的实际延迟不像纸面 FLOPs 那么美。
一句话总结
MoE 是拿显存、通信和工程复杂度,换训练效率和推理 FLOPs。它适合有足够算力基建、追求极致成本效益的大厂自研路线;对应用方来说,理解它的部署特性(显存按总参数算、吞吐看通信)比纠结结构本身更实用。
可能的追问
- MoE 推理时显存怎么算? 按总参数量算,不是激活参数。671B fp8 也要约 671GB,加 KV cache,需要多卡张量并行 + 专家并行。
- 为什么专家放在 FFN 而不是注意力上? FFN 占 Transformer 约 2/3 的参数量,且 token 间无交互、天然适合按 token 独立路由;注意力有跨 token 依赖,拆开路由会破坏信息交互。
- Dense 模型会被 MoE 完全取代吗? 端侧和小模型场景 Dense 仍是主流(部署简单、显存友好);云端大模型 MoE 占优。两条路线会长期共存。