在本文中,我们将讨论 Mixture-of-Experts 模型如何从少量专家发展到每层近 900 个专家,以及使这种稀疏设计既可训练又经济的压缩和稳定性机制。
开放权重的 Mixture-of-Experts 模型以惊人的速度扩张:Mixtral 约有 470 亿总参数,DeepSeek-V3 达到 6710 亿,而 Kimi K3 进入万亿级别。令人惊讶的不仅是这些模型变得如此巨大,而是每个模型实际处理单个 token 的参数量极少。
Kimi K3 拥有 2.8 万亿参数,但对任何单个 token 仅使用约 1040 亿。在几乎每一层,一个小型路由器从 896 个专门的前馈网络中挑选 16 个,这些网络被称为 experts,而两个共享的 experts 负责处理每个 token。
本文聚焦于该宽度方向的设计:模型如何在不对每个 token 使用全部容量的前提下提供大规模处理能力。这与 sequence memory 不同,后者关注模型如何存储和检索早期 token 的信息。
为了了解 K3 如何得到此设计,我们将通过四种架构追溯 Mixture of Experts (MoE) 的演变。
Mixtral 是基本模式的清晰开放权重示例:将每个 token 路由到少数全尺寸专家。DeepSeekMoE 将此工作细分到更细粒度和共享的专家中。LatentMoE 随后压缩了路由路径,使这些专家能够在更小的空间内工作。最后,K3 将其采纳为 Stable LatentMoE,增加了数值稳定性机制以及在每层 896 个专家之间实现平衡路由的机制。
在此过程中,你将学会如何解读 MoE 模型的专家数量和激活参数数目,以及它们对计算和数据移动的含义。
仅激活少量专家正是 MoE 具吸引力的地方,但这也带来了新的瓶颈。例如,被选中的专家权重仍需从 GPU 内存读取,而 token 表示可能需要在 GPU 之间传输。下面的架构可以理解为一系列管理这些成本的尝试。
这是一篇概念性文章,因此无需安装或运行任何内容。
有帮助:熟悉神经网络以及 Transformer 层的一般结构:注意力后跟前馈网络。
非必需:无需事先了解 Kimi K3、Mixture-of-Experts 路由或分布式训练。每个概念都会在此介绍。
无需代码或工具。
Transformer 层执行两种不同类型的工作。
注意力机制让词元之间交换信息:一个词元(大致对应一个词或词的一部分)的表示可以融入序列中其他位置的信息。
前馈网络(FFN)随后独立地变换每个词元。当词元到达 FFN 时,相关上下文已经折叠进其当前的数值表示中。
在稠密 Transformer 中,每个词元都经过同一个 FFN。FFN 通常包含若干大型矩阵,占据了模型参数和计算量的相当大一部分。将其加宽能给模型带来更多容量,但额外的工作会落在每个词元上,因为每个词元都要完整地穿过这个 FFN。
专家混合(MoE)改变了这种安排。该层不再只有一个 FFN,而是包含多个具有不同学习权重的 FFN。一个小型路由器检查词元的当前表示,对可用专家进行评分,并选出得分最高的几个。只有被选中的专家处理该词元,它们的输出被组合成该层的结果。
最终输出是仅被选中的专家输出的加权和,其中每个被选中的专家按路由器权重成比例地贡献。未被选中的专家不会对该词元执行 FFN 计算。
这种路由在每个 MoE 层中独立发生。专家可以(而且常常确实)实现专业化,路由器会学习哪种组合最适合当前上下文中的词元。但这些角色是在训练过程中涌现的:它们可能重叠,并不保证与“Python”“历史”这类清晰的标签一一对应。因此,同一个词在不同上下文中可能走不同路线,同一个词元在不同深度可能选择不同专家。每一层还有各自的专家池,所以某一层的专家 7 与另一层的专家 7 毫无关系。
一个广为人知的开源权重示例是 Mixtral 8x7B。Mixtral 的每一层包含 8 个 FFN 专家,其路由器为每个词元选择其中两个。被选中的专家组合可以随词元不同和层不同而变化。
名称 8x7B 容易被误读。Mixtral 是一个 Transformer,而不是八个完整的 70亿参数模型。它的注意力、嵌入、归一化层以及其他共享组件只存在一次。
每层内部重复八次的是 FFN:每个专家拥有自己的权重,并且具有与 Mistral 7B 中普通 FFN 相同的 4,096 -> 14,336 -> 4,096 维度。路由器在每个 token 上仅运行这八个 FFN 中的两个。因此,Mixtral 总共约有 470亿 参数,而非 560亿,而大约有 130亿 参数在单个 token 上是活跃的。该活跃计数包括每层被选中的两个专家以及模型的共享参数。
精确地说明这一点很重要。每层中,一个 token 仍会经过两个完整大小的 FFN,因此 Mixtral 执行的 FFN 计算大约是 Mistral 7B 单个 FFN 的两倍,但仅为运行全部八个专家所需计算的四分之一。其优势并非在于专家更小或必然比原始密集模型的计算量更少。而是能够访问远大于的参数池,而无需为每个 token 运行整个参数池。
图 1(上方):密集层将每个 token 通过一个 FFN(左侧)。混合专家层保留许多专家 FFN,但每个 token 仅激活少数几个(右侧)。Mixtral 使用 8 中的 2 个。总参数量增加,而每个 token 的工作量保持远小于。
Mixtral 的八个专家因此是八个 标准宽度 FFN,而不是单个 FFN 的八个较小切片。选择更多的专家将使 token 能够结合更多学习到的变换,但每个额外的 Mixtral 规模专家将增加大量计算。DeepSeekMoE 询问是否可以将相同的计算预算划分给更多、更小的专家。
FFN 通常将 token 向量扩展到更宽的内部层,在那里进行变换,然后将其降回到 token 向量的原始大小。
例如,一个 2,000 维的 token 向量可能会被扩展到 8,000 维的内部表示,然后再投射回 2,000 维。它必须返回到 2,000 维,以便其结果能够继续通过模型的其余部分。
DeepSeek 通过缩小该 internal 层来使专家变得更小。如果用四个更窄的专家取代一个大型专家的容量,路由器可以在保持专家计算量大致不变的情况下,选择大约四倍数量的专家。因此,令牌不再只来自一两个大型 FFN,而是获得若干更小的 FFN 的贡献。这并不能保证每个专家都学会一个清晰的专长,但它为训练提供了一套更细致的构建块。
DeepSeekMoE 增加了第二个想法:共享专家。路由专家仅处理被选中的 token,而共享专家处理每一个 token。
可以把共享专家想象为公共库代码。如果多个路由专家都需要相同的通用变换,让每个专家各自学习一份副本会浪费参数。共享专家只需学习一次这种可复用的工作,然后将其贡献给每个 token,这样路由专家就能有更多空间去处理因上下文而异的变换。
DeepSeek 称此为捕获 通用知识。设计者不会为其分配诸如语法或编程之类的具体技能。可复用的工作是什么,由训练过程决定。
图 2(上方):DeepSeekMoE 的两项改动的概念示意图:用更多、更小的路由 FFN 替换少数大型路由 FFN,并添加一个始终激活的共享 FFN。这些框仅用于示意,并非 DeepSeek-V3 的实际专家数量。DeepSeek-V3 在每个 MoE 层中使用一个共享专家和 256 个路由专家,每个 token 选择八个路由专家。
DeepSeek-V3 将此模式进一步放大:其大多数层使用一个共享专家和 256 个路由专家,每个 token 选择八个路由专家。更多的专家带来更大的可用容量,但同时也增加了模型在物理执行上的难度。
接下来的故事中有两项成本尤为重要。
第一项成本出现在 GPU 内部。专家学习到的权重是存储在 GPU 高带宽内存(HBM)中的矩阵。在 GPU 能够应用某个专家之前,这些矩阵必须由执行乘法的硬件读取。
当许多 token 同时使用同一个专家时,GPU 可以在众多 token 的计算中复用该专家权重的块。当只有少数 token 到达某个专家时,它需要为相对较少的算术运算移动大量权重数据,因此其计算单元可能会花费大量时间等待这些字节。
瓶颈不在于GPU乘数的速度有多快,而在于它将权重传递到计算单元的速度有多快。这种传递速率被称为内存带宽,它决定了低延迟MoE服务的速度。
第二个开销出现在GPU之间。拥有数百个专家的模型通常无法在每个GPU上保留所有专家,因此专家池会被分布在这些GPU上。
假设一个标记由7,168个数字的向量表示,如DeepSeek-V3所示。如果其路由器选择存储在其他GPU上的专家,系统会将完整的7,168个数字的向量发送到每个选定专家的GPU。每个专家返回同样长度的另一个向量,这些结果被合并。这种在许多GPU之间交换标记向量的过程称为全对全通信。
这揭示了细粒度能解决什么、不能解决什么。内部层的变窄使得每个单个专家变小,但DeepSeek会按比例激活更多的专家,以保持总的专家计算量大致不变。
发送给每个选定专家的标记向量长度也保持不变。因此,选择更多的专家可能意味着在GPU之间发送更多完整的副本,尽管每个专家内部更小。细粒度创建了一组更灵活的构建块。它不会压缩进入和离开它们的路径。
这一区别促使了LatentMoE:如果模型在将标记向量发送到路由专家之前先进行压缩(before),在更小的空间中执行专家工作,仅在结果返回后再将其展开,会怎样?
LatentMoE 由 NVIDIA 研究团队提出,并在 Nemotron 3 模型系列中得到采用。Kimi K3 并未发明底层架构。相反,它采用了 LatentMoE,并添加了下一节讨论的稳定性改动。
核心做法很简单。在将标记分派给路由专家之前,LatentMoE 将其完整表示投射到一个更小的 latent space。路由专家完全在该更小的空间内运行。它们的输出在此合并,随后再投射回模型的完整宽度。在这里,latent 指的是路由专家的压缩工作空间。
路由器仍然检查原始的全宽标记表示。共享专家也保持全宽。只有通过路由专家的路径被压缩。

Figure 3 (above): LatentMoE 仅压缩路由路径。在 Kimi K3 中,一个共享的下投影在到达选定专家之前,将路由表示从 7,168 维降至 3,584 维。它们的加权输出被合并并归一次,随后一个共享的上投影将维度恢复为 7,168。路由器和两个共享专家继续使用原始的 7,168 维表示。
这种更短的路由接口一次性降低了两方面的成本。首先,每个路由专家的输入和输出矩阵连接到 3,584 维,而不是 7,168 维,因此它们包含的权重更少,在专家运行时需要读取的权重数据也更少。
其次,当专家分布在多个 GPU 上时,系统向每个选中的专家发送一个 3,584 维的向量,而不是原来的 7,168 维向量。选中的专家返回同样长度的较短向量,这些结果被合并并再次投射回 7,168 维。在 K3 的半宽设计中,每条路由消息因此只携带原来的一半数值。
LatentMoE 可以用这些节省下来的资源做两件事:保持活跃专家数量不变并降低推理成本;或者同时增加可用专家数量以及每个 token 被选中的专家数量,而不让权重移动和跨 GPU 通信像在原始宽度下那样增长。
这与 DeepSeek 的细粒度做法不同,后者只收窄每个 FFN 的中间部分,而入口和出口保持不变。两种思路是兼容的,因为它们作用于不同的维度。
压缩仍有其限制。如果潜在表示过短,其下投影可能会丢弃专家所需的信息,而共享的下投影和上投影还会额外增加计算开销。
因此,潜在宽度是需要权衡的点,而不仅仅是要尽量减小的数字:Kimi K3 选择了 3,584 维,正好是其 7,168 维模型宽度的一半。这使得路由路径足够廉价,从而能够大幅扩大专家池,随之而来的下一个问题是:在训练过程中保持如此众多专家的稳定性。
Kimi K3 共有 93 层骨干网络。第一层使用密集 FFN,其余 92 层使用 Stable LatentMoE。这 92 层中的每一层都有自己的路由器和自己的 896 个路由专家池。因此,‘16 of 896’ 这一说法描述的是每个 MoE 层独立的路由决策,而不是整个模型共享的全局专家池。
对于到达这些层之一的 token:
路由器对所有 896 个路由专家进行评分并选择 16 个。
两个全宽共享专家无论该选择如何都会处理 token。
路由路径将 token 从 7,168 维投射到 3,584 维。
被选中的 16 个潜在专家处理该较小的表示。
它们的加权输出被合并、归一化,然后投射回完整宽度。
路由结果与共享结果相加。
这种布局使 K3 能够在模型中放置 2.8 万亿参数,同时为单个 token 激活约 1040 亿参数。
但规模也会放大三个训练问题。Stable LatentMoE 为每个问题添加了一种有针对性的机制。
图 4(上图):Stable LatentMoE 解决了三个独立的问题:RMSNorm 稳定了路由分支的规模,SiTU-GLU 限制了异常大的激活,而 Quantile Balancing 将选择偏差设定为即使全局负载也不会改变所选专家的贡献权重。
不同的 token 会选择不同的专家组合,并且路由权重也不同,因此在到达上投射之前,合并的路由表示的整体幅度可能会变化。
K3 在选定专家输出合并之后、将其从 3,584 维投射回 7,168 维之前插入 RMSNorm。RMSNorm 不会让专家变得相同,也不会抹去它们的计算结果。它会重新缩放它们的合并结果,使上投射获得一个整体幅度更一致的输入。
LatentMoE 首先使用共享投射将 token 从 7,168 维压缩到 3,584 维。在每个选中的专家内部,两个无偏的学习线性投射产生 3,072 维的预激活 g(门控)和 v(值)。SiTU-GLU 将门控转换为 4 tanh(g/4) sigmoid(g),将值转换为 25 tanh(v/25),然后逐元素相乘。得到的 3,072 维乘积经过第三个无偏线性投射,输出一个 3,584 维的专家结果用于聚合。
这三个投射、非线性变换以及乘法共同构成一个门控专家 FFN。

图 5(上图):橙色投影属于共享的 LatentMoE 包装器,蓝色投影属于一个被选中的专家。该专家在临时的 3,072 维工作空间中执行其门控计算,并返回一个 3,584 维的结果,这是专家聚合所需的通用形状。
无论是门控分支还是数值分支,信号都会恰好经过 四次学习得到的矩阵乘法:共享的 LatentMoE 下投影、该分支的专家输入投影、专家输出投影以及共享的 LatentMoE 上投影。
K3 论文将此称为“近似四次连续矩阵乘法”,因为计算并不是一条不间断的线性链:门控和数值投影并行运行,通过 SiTU 和逐元素相乘汇合,随后选中的专家输出在最终投影之前进行聚合和归一化。因此,这四个矩阵运算无法合并为一次矩阵乘法。
K3 作者将这种组合结构描述为病态条件,并在其模型规模时报告内部激活爆炸。在低精度下,一个极大的离群值可能导致溢出,或迫使共享的量化尺度牺牲普通值的精度。
SwiGLU 内部的乘法是导致这种无界增长的一个来源。其数值分支产生候选值,而门控分支使用 Swish 来调节每个值通过的强度。Swish 门控内部的线性因子以及数值分支都可以无界增长,因此两个大的元素相乘可能产生远大的乘积。
因此,K3 用 SiTU-GLU(Sigmoid Tanh Unit GLU)替换了 SwiGLU。SiTU 将门控的线性因子平滑地限制在幅度 4,将数值分支限制在幅度 25,同时保留 sigmoid 门控并在零附近与 SwiGLU 匹配。因此,它们的逐元素乘积在专家输出投影之前的幅度被限制为 4 x 25 = 100。此后的投影仍可改变尺度,但专家内部的乘法不再是无界的。
图 6(上图):一个说明性的一维切片,其中两个分支输入均等于同一标量 x。SiTU-GLU 在原点附近遵循 SwiGLU,但趋于幅度限制 100,而 SwiGLU 持续增长。在实际专家中,单独学习的投影生成两个分支向量,并按元素逐个相乘合并。
路由器为每个专家对每个 token 计算亲和度得分,然后选择得分最高的 16 个专家。由于路由器是可学习的,某些专家可能会吸引远多于其他专家的 token。这些专家会成为硬件瓶颈,而很少被选中的专家则得不到足够的训练,难以发挥作用。
常见的做法是在模型的训练目标中加入平衡损失,但这会导致优化器在预测质量和专家使用均衡之间进行权衡。
DeepSeek-V3 则将其主要的全局平衡方法设为 auxiliary-loss-free。它为每个专家维护一个独立的选择偏置:在一次训练步骤后,使用不足的专家的偏置会增加一个固定值,而负载过高的专家的偏置则会减少同样的值。
该方法有效,但更新幅度需要谨慎选择。幅度过小会导致反应迟缓,而过大则可能使负载出现振荡。(DeepSeek-V3 还保留了一个较小的序列级平衡损失,以防止单个序列内出现极端失衡。)
K3 保留了专家特定的选择偏置,但用 Quantile Balancing 替代了固定调整。它会检查每个专家的得分在全局训练步骤中的分布情况,并为每个专家计算不同的调整:当得分表明需要更大幅度的移动时,给出更大的校正;当专家已经接近其目标负载时,则给出更小的校正。之所以称为 quantile 平衡,是因为更新量是从该专家得分边际的目标百分位数中选取的,而不是对每个偏置都施加相同的预设值。
偏置的改变影响 哪些专家被选中,而不影响它们输出的贡献强度。K3 使用带偏置的得分对专家进行排名,但选中专家的贡献权重则来源于它们未加偏置的原始得分。新计算得到的偏置将在下一步训练时生效,而在推理阶段最终的偏置会被冻结。
Quantile Balancing 的目标是在全局训练步骤上实现整体负载均衡,而不是在每个句子或序列内部实现专家使用的绝对平均。其目的更为具体:防止训练机会和分布式计算过度集中在 896 个专家池中的一小部分。
密集 Transformer 会将每个 token 通过相同的前馈网络(FFN)。Mixtral 展示了基本的 MoE 替代方案:保留若干完整的 FFN,并将每个 token 仅路由到其中的几个。DeepSeekMoE 随后将这项工作细分为更多、更小的路由专家,并为跨多种上下文使用的变换添加了共享专家。
LatentMoE 在另一个维度上进行了改变。它不是将模型的完整 token 表示发送给每个被选中的专家,而是压缩路由接口,在更小的空间内执行专家计算,随后恢复原始宽度。这样既降低了路由专家的权重流量,也减少了 GPU 之间交换的 token 数据量。
Kimi K3 将此设计推至每个 MoE 层 896 个路由专家,每个 token 选择 16 个。在这种规模下,仅靠压缩不够。RMSNorm 调节合并路由结果的规模,SiTU-GLU 限制每个专家内部的乘法激活,而 Quantile Balancing 在分配训练任务时不对专家的贡献权重添加平衡偏差。
核心教训不仅仅是 MoE 激活的参数更少。提升稀疏容量会带来新的数值、路由和通信约束,架构必须共同应对这些问题。稳定的 LatentMoE 是 K3 在模型层面的回答。
延伸阅读: 若想深入了解 Kimi K3 在序列记忆方面的内容,请参阅 从 GPT-2 到 Kimi K3:语言模型如何学会管理记忆.
Jiang 等人 (2024)。混合专家。 arXiv:2401.04088
Dai 等人 (2024)。DeepSeekMoE:在混合专家语言模型中实现终极专家专业化。 arXiv:2401.06066
DeepSeek-AI 等人 (2024)。DeepSeek-V3 技术报告。 arXiv:2412.19437
Elango 等人 (2026)。LatentMoE:在混合专家中实现每 FLOP 和参数的最优准确度。 arXiv:2601.18089
Kimi 团队 (2026)。Kimi K3:开放前沿智能。 arXiv:2607.24653
Wang 等人 (2024)。无辅助损失的混合专家负载均衡策略。 arXiv:2408.15664
——
一个热爱技术的程序员,喜欢分享前沿AI知识和开发经验。