大模型的参数规模一路狂奔,从七十亿到万亿级别,但一个尴尬的事实是:如果每个token都要经过全部参数的计算,那模型的容量和推理成本会被死死绑在一起。混合专家模型(Mixture of Experts,简称MoE)的核心思想就是解耦这两者——模型总参数量可以做得很大,但每个token实际只激活其中一小部分。这篇我们就聚焦两个代表性工作:Google的Switch Transformer和Mistral的Mixtral 8x7B,把它们的路由机制掰开揉碎讲清楚。

一、MoE的基本原理:路由器到底在做什么
要理解MoE,先要理解它和稠密模型的唯一结构性差异:前馈网络(FFN)被替换成了多个并行的“专家”FFN,外加一个门控网络(也叫路由器)。Transformer的自注意力部分通常保持不变,改动只发生在每个Transformer块的FFN位置。
路由器本质上是一个很小的线性层,输入是当前token的隐藏状态向量,输出是对每个专家的打分。以最简单的softmax路由为例,计算过程如下:
import torch
import torch.nn.functional as F
class Router(nn.Module):
def __init__(self, hidden_dim, num_experts):
super().__init__()
self.linear = nn.Linear(hidden_dim, num_experts)
def forward(self, x):
# x: [num_tokens, hidden_dim]
logits = self.linear(x) # [num_tokens, num_experts]
probs = F.softmax(logits, dim=-1)
# 选出概率最高的top-k个专家
topk_probs, topk_idx = torch.topk(probs, k=2, dim=-1)
return topk_probs, topk_idx
每个token会被送到被选中的那几个专家里做前馈计算,然后按路由概率加权求和得到输出。这样就形成了一个稀疏计算结构:假设有N个专家、每个token只激活k个,那么FFN部分的计算量大约只有同规模稠密模型的k/N。Mixtral 8x7B总参数约467亿,但每个token实际激活的参数只有约130亿,这就是“8x7B”这个略显迷惑的命名由来——它并不是56B模型,而是8个每层约7B规模的专家共享注意力层,实际激活量远小于总和。
二、Switch Transformer:激进的Top-1路由
Switch Transformer是MoE发展史上里程碑式的工作,它最大的贡献是证明了Top-1路由不仅可行,而且效果更好、计算更省。在此之前的经典做法(如GShard)使用Top-2路由,而Switch Transformer干脆每个token只发给一个专家,把简化做到了极致。
它的路由公式非常直接。给定输入token表示h,路由器输出为:
# Switch Transformer 的 Top-1 路由
def switch_routing(x, router, experts):
logits = router(x)
probs = F.softmax(logits, dim=-1)
expert_idx = probs.argmax(dim=-1) # 只选概率最大的1个专家
expert_prob = probs.max(dim=-1).values
# token只进入被选中的专家,输出乘以路由概率
out = experts[expert_idx](x) * expert_prob.unsqueeze(-1)
return out
这个设计带来几个好处。首先是计算量减半以上,相比Top-2路由,训练和推理的FFP计算直接省掉一半;其次是降低了路由实现的复杂度,减少了通信开销;实验还表明Top-1在相同计算预算下收敛质量不输Top-2,甚至更优。论文中Switch Transformer把T5-Base扩展到万亿参数规模,在相同训练时间下比稠密T5快了数倍的加速。
但Top-1路由有一个绕不开的工程问题:负载不均衡。如果路由器学偏了,大部分token都涌向少数几个专家,其他专家就白白浪费了。Switch Transformer引入了“容量因子”(capacity factor)的概念:每个专家有一个固定的token容量上限,计算方式为(tokens数 / 专家数)× 容量因子。超出的token直接丢弃,残差连接会让它们“跳过”这一层继续向前传递。丢弃本身也是一种信号,配合辅助负载均衡损失,鼓励路由器把token均匀分摊:
# 负载均衡辅助损失(简化示意)
def load_balancing_loss(probs, num_experts):
# f_i: 每个专家分到的token比例
f = torch.bincount(expert_assignments, minlength=num_experts).float()
f = f / f.sum()
# P_i: 路由器给每个专家的平均概率
P = probs.mean(dim=0)
# 最小时两者都接近均匀分布 1/N
return num_experts * torch.sum(f * P)
这个辅助损失的设计很巧妙:如果所有专家均匀接收token,损失达到最小值。配合适当的容量因子(论文中训练时用1.25到2.0之间),就能在吞吐和均衡之间取得平衡。另外Switch Transformer还把专家计算改成了选择性精度(用bf16训练专家部分,路由器保持fp32),解决了MoE训练不稳定的老问题。
三、Mixtral 8x7B:实用的Top-2路由设计
如果说Switch Transformer是学术上的激进探索,Mixtral 8x7B则是工程上的成熟落地。它在2023年底发布时以开放权重模型的身份直接对标LLaMA 2 70B,在多数基准上追平甚至超越,而推理成本只有后者的一个零头。
Mixtral每层有8个专家,每个token路由到其中2个。输出是两个专家输出的加权和,权重就是路由概率经softmax归一化后的值,并且保证权重和为1。官方给出的公式用softmax(top-2 logits)而不是先对全部专家softmax再取top-2,这个细节让未被选中的专家完全不参与归一化计算:
# Mixtral 风格的 Top-2 路由
def mixtral_routing(x, router, experts):
logits = router(x) # [T, 8]
top2_logits, top2_idx = torch.topk(logits, k=2, dim=-1)
weights = F.softmax(top2_logits, dim=-1) # 只对选中的2个做softmax
out = 0
for i in range(2):
out = out + weights[:, i].unsqueeze(-1) * experts[top2_idx[:, i]](x)
return out
Top-2相比Top-1有几个实际优势。第一,容错性更好:单个专家学坏了,另一个专家还能补救,梯度通路也更多样。第二,表达能力更强:两个专家的加权组合本质上是专家插值,让模型在专家边界处的过渡更平滑。第三,Mixtral选择不加容量因子限制、不丢弃token,所有token都能被完整处理,简化了实现也避免了训练信号损失,代价是需要动态处理专家间的token数量波动。
除了路由本身,Mixtral的底座架构也值得一提。它采用了分组查询注意力(GQA),用8个查询头共享1个键值头,大幅压缩了推理时的KV缓存;滑动窗口注意力让每层只关注最近4096个token,配合RoPE位置编码实现了8万token的上下文长度。这些稠密模型侧的优化和MoE的稀疏激活叠加起来,才造就了它的性价比。需要注意的是,Mixtral的共享参数(注意力层、embedding等)在各专家间是共用的,所以总参数约46.7B而不是简单相加的56B,激活参数约12.9B。
四、两种路由机制的对比与选型思考
把两者的关键差异整理成表格会更直观:
| 维度 | Switch Transformer | Mixtral 8x7B |
|---|---|---|
| 路由策略 | Top-1,每token选1个专家 | Top-2,每token选2个专家 |
| 专家数量 | 最多128个,可分层扩展 | 固定8个 |
| 容量因子 | 使用,超容token丢弃 | 不使用,不丢弃token |
| 负载均衡 | 强依赖辅助损失 | 训练中同样依赖均衡机制 |
| 参数规模 | 最高扩展至1.6万亿 | 46.7B总量,12.9B激活 |
从实践角度看,两者没有绝对优劣,而是不同约束下的产物。Switch Transformer面向超大规模分布式训练,专家数量多、分布在不同设备上,Top-1路由能最小化all-to-all通信量,容量因子则为静态显存分配提供了确定性;Mixtral面向实际部署,专家数量适中,Top-2带来的质量提升值得多花一倍FFN计算,不丢弃token换来更干净的训练信号。
落地MoE还有几个常见坑。一是训练不稳定,路由器的微小扰动会导致token分配剧烈变化,通常路由器参数要用更高精度保存,学习率也要单独调低;二是专家并行带来的通信瓶颈,专家分布在不同GPU时每次前向都要做all-to-all通信,对网络带宽要求很高;三是推理时的显存问题,虽然激活参数少,但所有专家都必须常驻显存,7B激活量的MoE需要按47B模型的显存来部署,这也是MoE“省算力不省显存”的说法来源;四是微调时容易发生路由崩塌(所有token塌缩到少数专家),小规模微调建议冻结路由器或降低辅助损失权重。
整体来看,Switch Transformer验证了极简路由在超大规模下的可行性,Mixtral则证明了精调过的Top-2设计在实际产品中的竞争力。理解这两个模型的路由细节,基本就掌握了MoE的核心脉络,后续看DeepSeek-MoE的细粒度专家、或更细的共享专家分离设计,都是在同一个框架下的持续演进。
混合专家模型Switch TransformerMixtral 8x7B修改时间:2026-09-15 03:14:40