Mixture of Experts (MoE)
专家混合模型 (MoE) 会将每个 token 路由至少数专家子网络,因此模型的总参数量增长速度远快于每个 token 的计算量。
专家混合 (MoE) 是一种神经网络架构,它将模型的一部分拆分为许多并行子网络,称为专家,并使用一个小型学习路由器,将每个输入发送给其中少数几个专家。由于每个token或图像块只经过一部分专家,参数总量的增长速度可以远远超过每个输入所需的计算量。Mixtral 8x7B拥有 470 亿个参数,但每个 token 只使用 130 亿个;DeepSeek-V3则在其 6710 亿个参数中激活 370 亿个。如今大型语言模型 (LLM)使用的路由门控稀疏 MoE 层,建立在 Google 2017 年提出的稀疏门控 MoE 层之上;该层在堆叠的 LSTM层之间实现了 1370 亿个参数。
MoE 层的工作原理#
在 Transformer中,MoE 层通常会替换每个自注意力模块之后的前馈网络 (FFN)。该层包含 N 个形状相同的专家 FFN,以及一个路由器;路由器是一个对每个 token 的所有专家进行评分的单层线性网络。token 会发送给得分最高的 k 个专家;这些专家的输出会根据路由器的归一化分数加权求和,其余专家不处理该 token。Mixtral 在每一层选用 8 个专家中的 2 个,而 DeepSeek-V3 会选用 256 个较小路由专家中的 8 个,并将每个 token 也发送给一个共享专家。由于每一层都会独立进行路由,同一个 token 在不同深度可以使用不同专家,同一句子中的两个 token 也可以在同一层走不同路径:
Mixtral 中的专家并未按主题进行专门分工。作者没有发现专家明确对应生物学或哲学等主题;路由实际遵循的是语法,因此 Python 代码中的 self 等 token 和缩进 token 往往会进入同一批专家。
负载均衡与专家容量#
刚初始化的路由器往往偏向少数几个专家;这些专家随后训练得更快,并吸引更多 token,而其余专家则处于闲置状态。下面的六 token 示例通过一个有 8 个专家的 top-2 层进行路由,并统计每个专家收到的 token 数量:
import torch
torch.manual_seed(0)
dim, num_experts, top_k = 32, 8, 2
experts = torch.nn.ModuleList(
torch.nn.Sequential(torch.nn.Linear(dim, 4 * dim), torch.nn.GELU(), torch.nn.Linear(4 * dim, dim))
for _ in range(num_experts)
)
router = torch.nn.Linear(dim, num_experts, bias=False)
tokens = torch.randn(6, dim)
# 路由器保留每个 token 得分最高的 2 个专家,并通过 softmax 将分数转换为混合权重
scores, chosen = router(tokens).topk(top_k, dim=-1)
weights = scores.softmax(dim=-1)
out = torch.zeros_like(tokens)
for e, expert in enumerate(experts):
token_idx, slot = (chosen == e).nonzero(as_tuple=True) # 选择专家 e 的 token
out[token_idx] += weights[token_idx, slot, None] * expert(tokens[token_idx])
print("Experts per token:", chosen.tolist())
print("Tokens per expert:", torch.bincount(chosen.flatten(), minlength=num_experts).tolist())它会输出专家配对 [[3, 6], [7, 6], [0, 7], [3, 1], [6, 1], [2, 3]] 和各专家的计数 [1, 2, 1, 3, 0, 0, 3, 2]:专家 3 和 6 各处理 3 个 token,而专家 4 和 5 没有收到任何 token;每个 token 只经过 8 个专家网络中的 2 个。Switch Transformer将每个 token 路由给单个专家,并扩展到 1.6 万亿个参数;它添加了一个辅助损失项,当 token 和路由器概率均匀分布到各专家时,该损失最小。许多后续 MoE 模型也采用了类似的损失项。DeepSeek-V3 不使用辅助损失,而是在训练过程中上调或下调各专家路由分数中的偏置。训练系统还会限制每个专家在一个批次中可接收的 token 数量,即专家容量;超过上限的 token 会跳过该层的专家,并通过残差连接继续向前传递。
MoE 与相关概念的区别#
- 模型集成:多个完整模型分别处理每个输入,再对预测结果求平均或投票,因此每增加一个模型,计算量都会增加。MoE 是一个端到端训练的网络,由路由器为每个 token 选择不同路径。
- 模型路由:路由器为每个请求选择一个完整模型,例如简单问题使用小模型,难题使用大模型。MoE 路由则是在单个模型的每个 MoE 层内部按 token 进行。
- 深度混合 (MoD):路由器允许部分 token 跳过整个模块,因此每个 token 的计算量不同。MoD 通常与 MoE 结合使用。
- 智能体混合 (MoA):多个独立的 LLM 回答提示,随后由更后面的 LLM 层完善这些答案的组合结果。这是一种提示流程,不共享权重。
MoE 在语言和视觉模型中的应用#
许多规模最大的开放权重 LLM 都使用了 MoE 层,包括 DeepSeek-V3、Llama 4、Qwen3 的 MoE 版本,以及 OpenAI 的 gpt-oss。在计算机视觉领域,视觉 MoE (V-MoE)将视觉 Transformer (ViT)的部分 FFN 层替换为专家,并对单个图像块进行路由;它在推理计算量仅为一半的情况下仍达到最先进的准确率,其 150 亿参数版本在 ImageNet上取得了 90.35% 的 top-1 准确率。
内存与服务#
MoE 节省的是计算量,而不是内存:即使每个 token 只用到少数专家,仍需加载所有专家。因此,Mixtral 所需的内存相当于一个 470 亿参数模型,但每个 token 的计算量相当于一个 130 亿参数模型。大型 MoE 模型因此会通过专家并行分布到多块 GPU上,每块 GPU 存放一部分专家,并通过全对全交换,将每个 token 发送到存放其所选专家的设备,再取回结果。DeepSpeed-MoE等框架会在训练时将专家并行与数据并行和张量并行结合使用。边缘视觉模型采用的是稠密路线:YOLO26会在每张图像上运行每一层,因此其内存占用和单张图像的计算量对所有输入都相同。










