10. 什么是 MoE?它的优缺点是什么?Router 怎么训练?

整理 MoE 的基本原理、优缺点与 Router 训练方式。

简单回答

MoE(Mixture of Experts,混合专家)是一种稀疏激活架构:模型拥有多个 FFN "专家",但每次推理只激活其中一小部分(如 8 选 2)。好处是在不成比例增加推理计算量的前提下大幅扩大模型参数量,坏处是显存占用大、负载均衡难、训练不稳定。Router 通常是一个简单的线性层 + softmax,通过 top-k gating 选专家,训练时用辅助 loss 来防止专家坍塌。

详细解释

MoE 的核心思想

在标准 Transformer 里,每一层的 FFN 只有一个——所有 token 共用同一个 FFN 做变换。MoE 的思想是把这个单一的 FFN 替换为 N 个并行的"专家"FFN(Expert),然后用一个 Router(也叫 Gate)网络来决定每个 token 走哪些专家。

最终输出是被选中专家的输出的加权和:

其中 是 Router 给出的概率分布, 是第 i 个专家的输出。只有 Top-K 个专家被激活计算,其余专家不参与。

以 Mixtral 8x7B 为例:有 8 个专家,每个专家大小约 7B 参数级别的 FFN,每个 token 选 top-2 专家。总参数量约 47B,但每个 token 实际激活的参数只有约 13B(2 个专家加上 Attention 等共享层)。

MoE 不是新概念

MoE 的思想可以追溯到 1991 年(Jacobs et al.),2017 年 Shazeer et al. 首次把它成功应用到了大规模 LSTM 语言模型。2022-2023 年随着 Mixtral 的发布和 DeepSeek-MoE 的改进,MoE 在 Transformer 大模型中真正变得主流。

MoE 的优点

参数量大但计算量可控。 这是 MoE 的核心价值。模型的"容量"(能存储的知识量)与参数量正相关,但推理成本与激活参数量正相关。MoE 允许模型拥有巨大的参数量(大容量),但每次推理只用一小部分参数(低计算成本)。

训练效率高。 相比同等计算量的 dense 模型,MoE 通常可以达到更好的效果(因为参数量大,容量大)。或者反过来说,达到同等效果,MoE 需要的训练计算量更少。

天然的条件计算(Conditional Computation)。 不同的 token 可能走不同的专家,理论上模型可以学会把不同类型的输入交给"专精"的专家处理。

MoE 的缺点

显存占用大。 虽然只激活 2 个专家,但所有 8 个专家的参数都要加载到显存。Mixtral 8x7B 的 47B 参数都得在显存里,不能只放 13B。这使得 MoE 模型对显存的要求远高于同等激活参数量的 dense 模型。

负载不均衡(Load Imbalance)和专家坍塌(Expert Collapse)。 Router 的训练信号来自主任务的 loss,如果不加约束,Router 很容易学成只往少数几个专家路由,导致"热门专家"过载,"冷门专家"几乎不被使用。极端情况下,所有 token 都被路由到 1-2 个专家,其余专家参数完全浪费,等价于一个小的 dense 模型——这就是专家坍塌。

训练不稳定。 Top-K 选择是离散操作,梯度不能直接传过去。虽然对被选中的专家可以正常反向传播(门控权重 是 softmax 输出的连续值),但 Router 的训练信号会比较嘈杂。训练过程中可能出现路由分布突然变化、loss 波动等问题。

分布式训练的通信开销。 MoE 的专家通常分布在不同的 GPU 上(Expert Parallelism)。每个 token 要根据 Router 的决策被发送到持有目标专家的 GPU 上,计算完再发回来。这需要 All-to-All 通信,对 GPU 之间的网络带宽要求很高。如果通信慢,就会成为训练瓶颈。

推理时 batch 效率低。 不同 token 走不同专家,batch 中的 token 被打散到各个专家,每个专家实际处理的 batch 可能很小,GPU 利用率不高。这是 MoE 推理的一个工程难题。

Router 怎么训练?

Router 本身结构非常简单:

,N 是专家数量。输出是每个专家的概率,取 Top-K 个专家。

关键在于辅助损失(Auxiliary Loss / Load Balancing Loss)的设计,用来防止专家坍塌。

Switch Transformer 的方案:定义每个专家被分配到的 token 比例 和 Router 给该专家的平均概率 ,辅助损失是两者乘积的 N 倍总和:

直觉是:如果某个专家分到太多 token( 大)而且 Router 给它的概率也高( 大),就惩罚。鼓励 都接近 (均匀分配)。α 是辅助损失的权重,通常取 0.01 这个量级。

DeepSeek-MoE 的改进:DeepSeek 在 MoE 上有几个重要创新。

第一是细粒度专家。不是用 8 个大专家,而是用 64 甚至 256 个小专家,选更多(如 top-6)。每个专家更小,路由更精细,理论上可以更好地"分工"。

第二是共享专家(Shared Experts)。除了路由专家外,设置几个"共享专家",所有 token 都会经过这些共享专家。共享专家负责学习通用知识和基础能力,路由专家负责学习特定领域的知识。这样即使路由不完美,模型也不会完全丢失基础能力。

第三是 DeepSeek-V3 的无辅助损失负载均衡。传统的辅助损失是加在训练 loss 上的,它和主任务 loss 存在权衡——辅助损失权重太大会伤害主任务性能,太小又控制不住负载不均衡。DeepSeek-V3 提出了一种不加辅助损失的负载均衡策略,而是通过动态调整每个专家的 bias term 来引导均衡,具体来说为每个专家维护一个偏置项,如果某个专家处理的 token 过多就降低偏置,过少就增大偏置。这种方法的好处是不干扰主任务的梯度优化。

MoE 的推理部署

MoE 模型在推理部署上有额外的工程挑战。除了显存大以外,Expert Parallelism 需要跨 GPU 通信。在 serving 端,vLLM 等框架对 MoE 的支持在不断完善,但效率仍不如同激活参数量的 dense 模型。端侧/本地部署 MoE 模型也比较困难,因为所有专家参数都得加载。

一种缓解方案是 Expert Offloading——把不活跃的专家 offload 到 CPU 内存或 NVMe 存储,只把当前需要的专家加载到 GPU。这会增加延迟但能大幅降低显存需求。

面试时可以这样答

MoE,Mixture of Experts,核心思想是把 FFN 层从一个单一模块扩展为多个并行的专家,用 Router 决定每个 token 走哪几个专家。比如 Mixtral 是 8 个专家选 2 个,总参数 47B 但激活参数只有 13B,推理速度接近 13B 的 dense 模型但效果更好。

优点很直接——在不成比例增加推理成本的前提下大幅扩大了模型容量。但挑战也不少。显存占用按总参数算,不是激活参数。负载均衡是核心难题,如果不加约束 Router 会学成只用少数专家,发生专家坍塌。分布式训练需要 All-to-All 通信,对带宽要求高。推理时不同 token 走不同专家,batch 效率不高。

Router 结构本身很简单,就是线性层加 softmax,关键在辅助损失的设计。Switch Transformer 用的是让每个专家分到的 token 数和概率尽量均匀。DeepSeek-V3 走了一步更远,用动态 bias 替代辅助损失做负载均衡,不干扰主任务的梯度。

DeepSeek-MoE 还有两个值得关注的设计:一是用大量细粒度小专家替代少量大专家,路由更精细;二是引入共享专家,让所有 token 都经过一些通用专家,保证基础能力不丢失。

常见追问

  1. MoE 的专家真的在学习不同的"专业领域"吗?有没有可视化或分析来证明?
  2. DeepSeek-MoE 的共享专家和路由专家分别学到了什么?
  3. MoE 模型在推理部署上有哪些额外挑战?Expert Offloading 是怎么做的?