聊到模型效率,混合专家模型(MoE)架构几乎是绕不开的话题。它与传统的密集模型不同,MoE把网络拆成若干专家子网络,让每一条输入只经由其中一小部分专家处理。这不仅把计算量压下来,还能在同样的算力预算下把参数量做大,这在实践中确实带来了很明显的收益。不过MoE也不是简简单单多放几个前馈网络就能跑得稳,路由怎么设计、专家怎么分工、负载怎么均衡、训练怎么稳定,每一步都有不少细节。这篇内容从专家本质和路由机制讲起,一直拆到负载均衡和训练避坑,适合正在调研MoE架构、打算在大模型训练或推理方案里引入稀疏激活的开发者参考,也适合刚接触这类架构但不想只看论文结论的读者。
1. 先把专家拆明白:MoE到底在解决什么问题
1.1 稀疏激活的思想:从全量计算到按需分配
传统的Transformer模型,每一层都会对输入的每个token做一次完整的计算,尤其是前馈网络(FFN)这一段,参数量和计算量都占了大头。MoE做的事情很简单:把这一层里的单个FFN,换成多个并行的FFN,也就是“专家”,然后由一个路由器来决定每个token应该调用哪几个专家。
我拿生活中的场景类比一下。一个综合医院里有内科、外科、骨科、儿科,但并不是每个病人挂号之后都要把全院的医生叫过来会诊。分诊台根据你的症状,把你分配到对应的科室,只有需要跨科室的时候,才多叫几个科室一同处理。MoE里的路由器就是那个分诊台,每个token就是病人,专家就是各科医生。传统密集模型的区别在于,不管什么病,所有医生都必须全程参与,资源利用率自然不高。
这种处理方式叫稀疏激活。稀疏的意思,是每一份输入都只触发模型的一部分参数,而不是全部参数都参与正向和反向的计算。它的直接收益是:模型的总参数可以做得非常大,但实际运行时的计算量只和激活的那部分专家有关,所以同样数量级的FLOPs预算下,MoE能够承载更高的模型容量。
1.2 关键指标是激活参数量,而不是总参数量
很多人第一次接触MoE的时候,很容易拿“某模型有1万亿参数”这种数字说事。但如果只看总参数量,其实容易产生误解。MoE的价值核心在于激活参数量,也就是每一个token真正经过的专家参数总和。同样1000亿参数规模的MoE模型,如果每次只激活2个专家,实际参与计算的参数可能只有几十亿到百亿级别,这个水平和同等计算开销的密集模型基本相当。
这也解释了为什么MoE在某些场景下能把“参数量做得大”和“训练成本压得低”这两件事同时兼顾。知识容量由总参数量决定,单次计算成本由激活参数量决定,两者解耦之后,设计空间就大很多。
但这种解耦不是没有代价的。专家数量一多,每个专家的利用率就变得很关键。如果某些专家几乎没有token被路由过去,那么它们不只是白白占据显存,还会让整个模型的有效容量下降。这就涉及到一个贯穿MoE架构的核心问题:负载均衡。接下来我从路由机制开始,逐步拆开负载均衡这层外衣。
2. 路由机制:门控网络如何决定“谁来处理这个Token”
2.1 Top-K取法的工作细节:打分层到稀疏门控
MoE里的路由器,本质上是一个线性层,输入是当前token的隐层表示,输出是一个长度等于专家数量的分数向量。这个分数经过softmax归一化之后,对应的是每个专家对这个token的“适合程度”。然后模型取分数最高的K个专家,让这个token只在这K个专家里执行计算,其余专家的输出直接置零。
这个过程用PyTorch风格的代码来看非常直观:
import torch import torch.nn.functional as F def route(router_logits: torch.Tensor, top_k: int): # router_logits: [batch_size, seq_len, num_experts] probs = F.softmax(router_logits, dim=-1) top_probs, top_indices = torch.topk(probs, top_k, dim=-1) # 构造稀疏门控矩阵 gates = torch.zeros_like(probs) gates.scatter_(-1, top_indices, top_probs) return gates, top_indices这里的Top-K直接决定稀疏程度。K=1的时候,每个token只进一个专家,路由开销最小,但token之间的语义共享也会少很多;K=2或更高的时候,token可以同时获得多个专家的特征,表达能力强一些,但计算量和通信量都会上涨。我实测下来,K值并不是越大越好,它其实是在语义多样性和计算开销之间找一个平衡点,通常先从K=1或2开始,然后再根据任务效果和吞吐量综合判断。
还有一个容易忽略的点:路由器打分之后到底用概率值还是用排序后的序号去加权专家输出。很多实现里会把softmax后的top_probs作为专家输出的加权系数,这样做的好处是让路由器的输出可微,梯度能通过概率回传到路由器。不过权重的尺度也会反向影响更新速率,所以现在的不少实现会对门控值做额外归一化,避免某些专家长期处于高权重而其他专家被冷落。
2.2 专家粒度和共享专家:分工不是越细越好
专家粒度是影响负载均衡的另一个隐含变量。如果专家数量很多但每个专家都很小,叫作细粒度专家;相反,专家数量少而每个专家很大,则是粗粒度专家。细粒度专家理论上能给路由器更灵活的分流空间,知识划分更细,但由于每个专家的参数量有限,单个专家的表达能力也受到限制。粗粒度专家的好处在于每个专家都能学到更完整的特征,但路由器的选择压力也更大,一旦Top-K选得不准,模型效果波动会比较明显。
这里就引出共享专家的概念。早