聊到模型效率混合专家模型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直接决定稀疏程度。K1的时候每个token只进一个专家路由开销最小但token之间的语义共享也会少很多K2或更高的时候token可以同时获得多个专家的特征表达能力强一些但计算量和通信量都会上涨。我实测下来K值并不是越大越好它其实是在语义多样性和计算开销之间找一个平衡点通常先从K1或2开始然后再根据任务效果和吞吐量综合判断。还有一个容易忽略的点路由器打分之后到底用概率值还是用排序后的序号去加权专家输出。很多实现里会把softmax后的top_probs作为专家输出的加权系数这样做的好处是让路由器的输出可微梯度能通过概率回传到路由器。不过权重的尺度也会反向影响更新速率所以现在的不少实现会对门控值做额外归一化避免某些专家长期处于高权重而其他专家被冷落。2.2 专家粒度和共享专家分工不是越细越好专家粒度是影响负载均衡的另一个隐含变量。如果专家数量很多但每个专家都很小叫作细粒度专家相反专家数量少而每个专家很大则是粗粒度专家。细粒度专家理论上能给路由器更灵活的分流空间知识划分更细但由于每个专家的参数量有限单个专家的表达能力也受到限制。粗粒度专家的好处在于每个专家都能学到更完整的特征但路由器的选择压力也更大一旦Top-K选得不准模型效果波动会比较明显。这里就引出共享专家的概念。早