简介:混合专家模型通常以Token为最小单位选择专家,而不是按整个句子分配。本文从定义、路由机制、表达能力、训练稳定性和工程实现等角度,系统解释Token级路由成为主流选择的原因,并说明它与句子级路由的关键区别及适用边界。
混合专家模型,即Mixture of Experts,通常简称为MoE,是一种通过组合多个专家网络来提升模型容量的架构。一个经常被问到的问题是:为什么MoE几乎总是以Token为基本单位来选择专家,而不是把一个完整句子直接分配给一个专家?
要回答这个问题,先要明确“Token级路由”的定义。
在自然语言处理中,一个句子会被切分成若干Token。Token并不是严格意义上的“单词”,而是经过分词之后的最小语义单元。比如“我喜欢学习大模型”可能被切分为“我”“喜欢”“学习”“大”“模型”等多个Token。
Token级路由指的是:模型每处理一个Token,就根据该Token的表示动态计算它与各个专家的匹配度,然后为这个Token选择最合适的一个或多个专家进行计算。不同Token可以选择完全不同的专家组合。
句子级路由则是指:以整个句子或序列为单位,先为整个句子选择一个专家组合,然后句子里的所有Token都使用这个固定组合完成计算。
当前主流MoE实现,包括行业常见的大规模稀疏模型方案,普遍采用Token级路由。这并非偶然,而是由路由机制、表达能力、训练效率等多方面因素共同决定的。
MoE的核心思想并不复杂:模型包含多个专家网络,但每次只激活其中一部分,从而在参数规模大幅增加的同时,控制实际计算量不至于等比上升。
这种做法解决了一个关键矛盾:模型能力通常随参数量增加而提升,但推理成本也随参数量增加而增加。如果每个Token都要经过全部参数计算,模型规模就会受到算力与延迟的严格限制。
专家路由的作用,就是为每个Token找到最适合处理它的专家。路由决策质量越高,模型越能用更少的激活参数达到更好的效果。
因此,路由粒度本质上是在问:我们应当在多细的语义单元上做“分工”。
Token级路由带来的最直接优势是组合表达能力的指数级提升。
假设一个MoE模型有256个路由专家,每个Token激活其中8个。对于单个Token,可选专家组合数为:
C(256, 8) ≈ 4.2 × 10^13
如果采用句子级路由,整个句子固定使用一个组合,那么一个句子无论包含多少Token,整体表达空间就只有这4.2×10^13种可能。
但如果采用Token级路由,情况会发生根本变化。假设一个序列包含2048个Token,理论上不同Token可以独立选择专家组合,那么整个序列的专家组合空间为:
(4.2 × 10^13)^2048
这个数字远超直观理解范围,甚至明显超过可观测宇宙中的原子总数。当然,实际模型并不会真正穷举这个空间,但这个对比说明了一个重要结论:Token级路由让模型有能力在不同语义片段上调用不同专家能力,而不必在整句范围内做折中。
一个自然语言句子通常混合了多种语义功能。比如“请帮我查询一下明天的天气并设置提醒”,其中“查询天气”和“设置提醒”是两个不同的语义动作,涉及不同的知识类型和推理方式。
如果按句子级路由,整个句子会被强制分配给一个固定的专家组合。这个组合可能擅长处理“查询”,但未必擅长处理“提醒设置”。模型只能让同一个专家组同时应对多种语义需求,这会造成专家能力被平均化。
Token级路由则允许“查询”相关的Token激活擅长信息检索的专家,而“提醒”相关Token激活擅长任务规划的专家。这种细粒度分工更符合语言本身的结构特征。
MoE模型在训练过程中,专家会逐渐形成功能分化。有的专家可能更擅长处理数值推理,有的更擅长处理长距离指代,有的更擅长处理特定领域术语。
这种功能分化只有在足够细的路由粒度下才能充分实现。如果以整个句子为单位分配专家,单个句子内的语义差异会被抹平,专家接收到的训练信号会变得更加混杂,不利于形成清晰的功能边界。
Token级路由让每个专家看到更单纯的语义模式,从而更容易被训练成具备明确特长的子网络。
从工程角度看,Token级路由也更有利于专家负载均衡。
句子长度差异非常大,短句可能只有几个Token,长句可能有几千个Token。如果按句子级路由,一个长句被分配给某个专家组后,该专家组需要连续处理大量Token,容易造成计算负载不均衡。
Token级路由可以更均匀地分配计算压力。每一时刻,系统面对的都是固定粒度的计算单元,负载调度更灵活,也更适合并行计算与硬件加速。
句子级路由并非完全没有道理。它的实现更简单,通信开销更低,因为一旦为句子选定专家组合,后续Token可以直接沿用,不需要反复计算路由分数。
在一些特定场景中,句子级路由可能具有工程优势。例如对延迟极其敏感、且输入句子较短的任务中,减少路由计算频率可以带来一定收益。又比如某些任务中,整个句子的语义高度一致,内部差异很小,此时Token级路由的收益也会被压缩。
但从大规模语言模型的训练与推理实践看,Token级路由带来的表达能力提升通常远高于额外引入的路由计算成本。因此,行业主流方案普遍选择Token级路由。
Token级路由的运行流程大致如下:
整个过程对每个Token独立执行,因此不同Token可以激活不同专家组合。
既然Token级路由更有优势,那进一步缩小粒度是否更好?比如以子词内部片段,或者以向量维度作为路由单元?
从理论上看,更细的粒度可能带来更大的组合空间,但也会带来两个明显问题。
第一是计算与通信开销。每做一次路由决策都需要额外的分数计算与专家调度。粒度越细,单位计算量中的路由开销占比越高。
第二是语义完整性。Token通常对应一个相对完整的语义单元,而更细的片段可能缺乏稳定的语义含义。如果路由粒度过小,专家接收到的信息可能过于碎片化,反而不利于学习。
Token级路由在当前技术条件下处于一个较好的平衡点:既保留了足够细的语义分工能力,又不会引入过高的路由成本。
稠密模型不包含专家路由机制,每个Token都会经过全部参数计算。MoE通过引入稀疏激活机制,在扩大参数规模的同时控制计算量。Token级路由是这种稀疏激活得以实现的关键。
MoE中的多个专家彼此独立,不同专家拥有独立参数。Token级路由决定了每个Token使用哪些专家参数。与之相对,参数共享机制让多个网络层共享同一组参数,不会根据Token动态选择不同参数模块。
注意力机制中的多头机制可以理解为让不同注意力头关注不同语义关系。它与MoE路由的区别在于,多头注意力通常不使用稀疏选择,所有头都会参与计算;而MoE路由则通过稀疏选择只激活部分专家。
在设计与训练使用Token级路由的MoE模型时,有几个问题需要重点关注。
路由退化问题。 训练初期,模型可能倾向于只把Token分配给少数几个专家,导致其他专家得不到足够训练。通常需要引入负载均衡损失或噪声机制,促使路由更均匀。
专家容量限制。 某个专家的输入Token过多时,需要设置容量上限,超出的Token可能被丢弃或转给其他专家。这会影响模型效果,需要在训练与推理阶段针对性处理。
通信开销。 大规模分布式训练中,Token级路由意味着每个Token可能被发送到不同专家所在的设备上,通信模式比稠密模型复杂得多。需要合理设计专家放置策略和通信调度。
推理延迟。 虽然MoE减少了每个Token的激活参数量,但路由计算与专家调度本身也会带来延迟。在低延迟场景中,需要针对路由网络做轻量化设计。
MoE选择Token级路由而非句子级路由,根本原因在于Token级路由能够显著提升模型的组合表达能力,更贴合语言内部语义结构,更有利于专家功能分化,同时具备更好的负载均衡特性。
句子级路由虽然实现更简单,但会让同一句子内的不同语义被迫共享同一专家组合,导致模型上限受到明显限制。在当前大规模稀疏模型的实践中,Token级路由已经成为事实上的标准选择。
理解这一点,有助于在设计与选型MoE架构时做出更合理的判断,也有助于理解为什么行业主流的大规模稀疏模型普遍采用这一机制。