(本博客为Datawhale的HappyLLM(动手搭建大模型)和baseLLM两个开源学习项目的学习笔记,在HappyLLM基础上补充了baseLLM的内容)
像Llama2、GPT-3这样的模型,通常被称为稠密模型。这意味着,对于每一个输入的Token,模型中所有的参数(从第一层到最后一层)都会参与计算。
但是,随着模型规模向万亿级别迈进,全量参数计算带来的算力成本变得不可承受。这就引出了本节的主角--混合专家模型(Mixture of Experts, MoE)。MoE技术通过一种"稀疏激活"的机制,兼具了大规模参数的知识容量与极低的推理成本。Mistral 8x7B等模型的出现,更是证明了MoE在开源大模型领域的巨大潜力,使其成为当前最受关注的技术方向之一。
一、MoE的前世今生
1.自适应局部专家混合
最早的MoE思想可以追溯到1991年Michael Jordan 和 Geoffrey Hinton 发表的经典论文《Adaptive Mixture of Local Experts》。这篇论文不仅提出了分治的架构,更重要的是从理论层面解决了神经网络在多任务学习中的根本性难题。
1.1 干扰效应与分治思想
在传统的单体神经网络中,如果我们尝试让一个网络同时学习多个截然不同的子任务,往往会出现"强干扰效应"。这是因为网络的所有权重都参与了所有任务的计算,当网络调整参数以适应任务A时,可能会破坏它在任务B上已经学到的特征表示。从而导致学习速度变慢,泛化能力变差。
为了解决这个问题,论文提出了一种基于"分治"策略的系统架构:
**专家网络:**系统包含多个独立的神经网络(可以是简单的前馈网络)。每个专家不再需要处理全局任务,只需专注于输入空间中的一个局部区域或一类特定的子任务。
**门控网络:**充当协调者的角色。它接收与专家相同的输入x,并输出一组混合比例pi,即选择每个专家的概率。它就像一个软性的随机开关,决定当前的输入案例应该由哪位专家。
1.2 损失函数设计
该论文最重要的贡献在于设计了特定的机制来鼓励专家之间的竞争,而非合作。如果仅仅将所有专家的输出简单线性相加来逼近目标y,即预测值
,并在最终输出上计算误差,专家们会倾向于"合作"。

在这种合作模式中,为了减小总误差,每个专家都会试图弥补其他专家的残差。继而导致每个案例都牵动所有专家的权重,依然无法解决"干扰效应"。为了实现解耦,作者提出将系统视为一个随机生成器,并采用负对数似然作为目标函数:

其中:
y是我们希望模型输出的真实目标。
Ei是第i个专家的输出。
pi是门控网络分配给第i个专家的权重(概率)。
在这个目标函数中,系统倾向于"赢家通吃"。当某个专家Ei的输出非常接近目标y时(即误差项
很小),指数项
会变得很大。为了最小化总Loss,门控网络会倾向于显著增加这个"表现好"的专家的权重pi,而忽略其他专家。
这一机制实现了权重的解耦。误差反向传播时,只有被选中的"胜出者"和门控网络的权重会被更新,其他专家几乎不受影响。有效缓解了任务间的干扰,实现了"让专业的人干专业的事"。
2.深度神经网络中的MoE
2013年,llya Sutskever等人发表了论文《Learning Factored Representations in a Deep Mixture of Experts》,将MoE与深度学习进行了开创性的结合。
2.1 从浅层到深层的变革
在此之前,MoE通常作为一种独立的浅层模型存在。llya等人的工作打破了这一局限,它们提出了Deep Mixture of Experts(DMoE),将MoE结构"模块化"并嵌入到深度神经网络的多个层级中。
意味着MoE不再是一个孤立的架构,而成为了一种可插拔的层。我们可以在一个深层网络的不同位置(例如第1层和第2层)分别插入MoE模块,每一层都有自己独立的门控网络和专家集合。
**层级化的门控:**输入x首先经过第一层的门控,被路由到第一层的专家。第一层的输出接着作为第二层门控的输入,再次被路由到第二层的专家。
**指数级增长的组合路径:**通过这种堆叠,网络能够表达的有效"专家组合"数量呈指数级增长。如果第一层有N个专家,第二层有M个专家,那么网络潜在的组合路径就高达N X M种。每个输入样本都会根据其特性,动态地选择一条最适合的处理路径。
2.2 学习分解的特征表示
论文的标题强调了"Factored Representations"。通过在不同层级引入混合专家,模型能够自发地在不同层级学习到数据的不同维度的特征。论文在"Jittered MNIST"(带随即平移的手写数字)数据集上观察到了有趣的现象:
第一层专家 倾向于根据数字的**位置(Location)**进行分工,成为了"Where Experts"。
第二层专家 倾向于根据数字的**类别(Class)**进行分工,成为了"What Experts"。
这种自动的特征解耦证明了深度MoE能够有效地利用其深层结构,将复杂任务分解为多个正交地子问题进行推理,为后来MoE在Transformer中的广泛应用奠定了重要的理论基础。
3.稀疏门控MoE
Google Brain团队(包括Geoffrey Hinton和Jeff Dean等)于2017年发表了论文《Outrageously Large Neural Network: The Sparsely-Gated Mixture-of-Experts Layer》,正式将MoE带入了超大规模模型(百亿参数级)的时代。
3.1 条件计算
当时,深度学习面临一个两难困境。模型容量(参数量)越大,预测准确率通常越高,但计算成本和训练时间也会呈平方级增长。传统的LSTM等网络受限于梯度消失和计算资源,很难无限制地加深或加宽。这就引出了条件计算(Conditional Computation)的概念,我们能否在不增加计算量的前提下,大幅增加模型的参数量?
这篇论文给出了肯定的答案。他们设计了一种稀疏门控混合专家层(Sparsely-Gated MoE Layer),可以在每个样本处理过程中只激活网络的一小部分。
**1000倍的模型容量:**通过引入多达1370亿个参数的MoE层(包含数千个专家),该模型在语言建模和机器翻译任务上取得了显著优于SOTA的结果,而其计算效率仅有微小的损失。
**LSTM + MoE架构:**如下图所示,研究者将MoE层嵌入到堆叠的LSTM层之间。左侧展示了该层被卷积式地应用于每个时间步;右侧细节显示,MoE层接收前一层的输入,通过门控网络(绿色框)计算稀疏权重,仅激活少数专家(灰色框)参与计算,其余专家(白色框)保持闲置。各专家的输出经加权求和后,传递给下一层。对于输入序列中的每一个位置(Token),MoE都会动态选择不同的专家组合进行处理。

3.2 稀疏性与负载均衡
为了让这一个构想落地,论文重点解决了"如何稀疏选择"以及"如何防止专家崩塌"这两个关键挑战。
**引入噪声的稀疏门控:**传统的Softmax门控通常会给所有专家分配非零的权重,意味着所有专家都要参与计算,无法节省算力。为此,论文引入了一种带噪声的门控机制:在门控输入中加入可训练的高斯噪声,计算后仅保留权重最大的k个专家(例如k=4),将其余所有专家的权重强制置为负无穷(即概率为0)。如下图所示,这种稀疏性带来了巨大的收益。在保持计算预算(每步约800万次运算)基本不变的情况下,随着专家数量从4个增加到4096个(横轴),模型参数量剧增,但测试集困惑度(纵轴)明显下降。说明条件计算可以在不增加推理成本的前提下,利用海量参数大幅提升性能。

**避免"赢家通吃"的负载均衡:**稀疏选择机制很容易引发"马太效应"。在训练初期,某些专家可能仅仅因为初始化权重的随即差异而"运气好"被选中。被选中意味着得到了梯度更新,它们变得"更聪明",从而更有可能在下一次被再次选中。反之,其他落选的专家因得不到训练而持续"愚钝",最终导致大部分专家"饿死",模型退化为只有少数活跃专家的稠密模型。
为了解决这个问题,作者在总损失函数中加入了额外的辅助损失(Auxiliary Loss),包含Importance Loss 和 Load Loss。这些损失函数并不直接服务于预测准确率,而是专门用来惩罚"分配不均"的现象,强制门控网络"雨露均沾",确保所有专家都能接收到大致相等的样本量,从而得到充分训练。
二、大模型时代的MoE
进入Transformer时代后,MoE技术成为了突破模型规模瓶颈的关键。Google在这一领域进行了密集的探索,通过GShard、Switch Transformer和GLaM等一系列工作,确立了现代大规模MoE的技术范式。
1.GShard迈向六千亿参数
2020年,Google提出了GShard,旨在将Transformer模型扩展到6000亿(600B)参数级别。GShard不仅仅是一个模型,更是一套支持超大规模稀疏模型并行的训练框架。它通过数据并行与模型并行的优雅结合,解决了超大模型无法装入单卡显存、通信开销过大等训练难题。
1.1 MoE层的构建与门控机制
在GSard中,MoE层的应用变得更加标准化。它并没有将所有的层都转换为MoE层,而是采用了"隔层替换"的策略:
**保留Attention:**Transformer的Self-Attention层保持不变,因为其参数量相对较小且计算关键。
**替换FFN:**将Transformer Block中的前馈神经网络替换为MoE层。
**隔层设置:**通常采用"隔层替换"的策略(例如第1、3、5层使用MoE,第2、4、6层保留标准FFN),在增加容量和保持稳定性之间取得平衡。
对于MoE层的计算,GShard明确了输入Token x的输出y是由门控网络选择的专家输出的加权和:

其中:
pi(x)是门控网络(Router)计算出的第i个专家的权重(通常是Softmax后的top-k概率,其余为0)。
Ei(x)是第i个专家网络(Expert FFN)对输入x的处理结果。
每个专家Ei内部通常就是一个标准的双层全连接网络:

在此基础上,GShard提出了Top-2 Gating(Top-2 门控)策略。此前的研究通常使用Top-k(如k=4)或更复杂的门控,但GShard发现,每个Token只路由给2个专家(Top-2)就足够了:
**第一专家:**选择权重最高的专家,保证主要任务的处理。
**第二专家:**根据权重概率随机选择或直接选择第二高权重的专家,引入辅助处理和一定的随机性,有助于负载均衡。
这种Top-2策略成为了后来(包括Mistral)的标准配置。
1.2 分布式并行策略
单张GPU/TPU显然无妨装下6000亿参数。GShard创造性地结合了数据并行与模型并行,解决了长达模型的存储与通信难题。
**非MoE层(如Attention):**采用复制策略。所有设备持有相同的副本,进行标准的数据并行训练。
**MoE层:**采用分片策略。专家网络被切分并分布在不同设备上(例如2048个专家分布在2048个TPU核上)。
当一个Token需要被路由到不在当前设备的专家时,系统会通过高效的All-to-All通信原语,将该Token发送到目标设备。计算完成后,再将结果传回。
下图展示了从标准Transformer到分布式MoE的演进。(a)标准Transformer编码器堆叠了Self-Attention和FFN层;(b)MoE Transformer将每隔一个FFN层替换为MoE层;(c)在跨设备扩展时,Attention层(黄色)在所有设备间复制,而MoE层(红色)则被分片存储。这种"复制与分片"结合的策略,既保证了非MoE层的高效计算,又通过分片突破了单设备的显存限制。

通过这种设计,GShard实现了亚线性(Sub-linear)的计算成本增长。模型参数量增加16倍(从37.5B到600B),训练算力成本仅增加了不到4倍。
2.Switch Transformer
虽然GShard验证了规模化路径,但大规模MoE的训练仍面临复杂性高、通信成本大和训练不稳定等挑战。2021年Google推出的Switch Transformer通过简化路由算法和改进训练技术,成功将参数量推向了1.6万亿级别,同时实现了4倍于T5-XXL的训练速度提升。通过下表可以看出,在相同的算力预算下,Switch Transformer无论是在质量(负对数困惑度)还是在速度上,都全面超越了传统的T5模型以及早期的MoE模型。

2.1 简化稀疏路由
Switch Transformer的主要创新在于提出了Switch Layer。如下图所示,它用稀疏的Switch FFN层(浅蓝色区域)替换了标准Transformer中的稠密FFN层。在该层中,对于输入序列的每个Token,路由器(Router)会计算路由概率,并将其分发给唯一的一个专家(实线箭头)进行处理。
这种Top-1 Routing(单专家路由)机制是Switch Transformer与传统MoE(通常路由给Top-k个专家,k>1)最大的区别。它带来了以下优势:
**减少路由计算:**路由决策更简单。
**降低通信成本:**每个Token只需发送到一个目的地。
**减小专家批量:**每个专家需要处理的Token数量(Expert Capacity)至少减半。
虽然直觉上k=1可能限制了专家的协作,但实验证明这种简化不仅保持了模型质量,还显著提高了计算效率。

2.2 高效稀疏路由与负载均衡
为了在硬件(如TPU)上高效运行,Switch Transformer必须解决动态路由带来的负载不均问题。由于硬件通常要求静态的Tensor形状,模型必须预设每个专家能处理的最大Token数量,即专家容量(Expert Capacity):

**Capacity Factor(容量因子):**通常设置为大于1.0(如1.0或1.25),这一机制的作用如下图所示。图中每个方块代表专家的处理槽位,Capacity Factor > 1.0为专家提供了额外的缓冲空间(图中白色空槽位),以应对Token分配不均的情况。
**Token Dropping(丢弃机制):**当路由到某个专家的Token数量超过其容量上限(即公式计算出的Capacity)时(图中红色虚线所示的溢出部分),就会触发丢弃机制。这些多余的Token将不会被该专家处理,而是直接通过残差连接传递到下一层。这虽然保证了并行计算的静态形状要求,但也可能导致信息损失,所以合理的容量设置至关重要。

同时,Switch Transformer还引入了一个辅助损失函数来尽量减少Token的丢弃,鼓励Token均匀分布到所有专家:

其中:
fi是实际分发给专家i的Token比例(实际上有多少人去了专家i那里)。
Pi是预期路由给专家i的概率总和(门控网络觉得专家i应该接收多少人)。
这个公式希望"实际去的"和"计划去的"向量的点积最小。只有当两者都均匀分布(即所有专家的负载都相等)时,这个Loss才会达到最小值。
2.3 改进的训练与微调技术
大规模稀疏模型训练极易不稳定,Switch Transformer提出了一系列改进方案:
**Router z-loss:**为了提高训练稳定性,Switch Transformer引入了z-loss来惩罚门控网络中过大的logit值。这有助于减少数值溢出问题,使训练过程更加平稳。
**选择性精度(Selective Precision):**在混合精度训练(通常用bfloat16)中,路由器的Softmax计算容易导致数值不稳定。Switch Transformer创新地在局部路由计算部分使用float32,而在其他部分保持bfloat16。这既保证了稳定性,又没有增加昂贵地float32通信成本。
**更小的初始化方差:**将权重初始化地高斯分布标准差缩减为原来的1/10(例如s = 0.1而非1.0),显著提升了训练初期的稳定性。
**专家正则化(Expert Regularization):**在微调阶段,为了防止过拟合(特别是专家层参数量巨大),模型对专家层内部采用了更高的Dropout比率(如0.4),而非专家层保持较低比率(如0.1)。
3. GLaM高能效通用语言模型
GLaM是Google在2021年推出的通用大语言模型。与Switch Transformer采用的Encoder-Decoder架构不同,GLaM采用了与GPT-3相同的Decoder-only架构,这使其更适合于Few-shot和Zero-shot生成任务。
GLaM将参数规模推向了1.2万亿,是GPT-3(175B)的7倍。不过,得益于稀疏MoE架构,它在保证超大规模参数容量的同时,实现了比GPT-3更高的训练和推理效率。
3.1 架构特点
GLaM展示了如何将MoE层有效地应用于Decoder-only的语言模型。如下图所示,它采用了隔层替换策略,即在标准的Transformer堆叠中,每隔一个层(upper block)将其中的FFN替换为MoE层(bottom block)。
在MoE层中,Gating模块会根据输入Token(例如"roses")的特性,从64个专家中动态选择出最相关的2个专家(蓝色网格所示)。随后,这两个专家的输出经过加权平均后,传递给下一层的Transformer模块。这种机制确保了模型在拥有巨大参数量的同时,每次推理仅需激活极少部分的参数。

**隔层稀疏:**类似于GShard,GLaM采用隔层替换策略,将每隔一个Transformer层中的前馈网络(FNN)替换为MoE层。
**Top-2路由:**每个MoE层包含64个专家,对于每个输入Token,门控网络会选择权重最高的2个专家进行处理。
**活跃参数:**尽管总参数量高达1.2T,但对于每个Token,仅激活966亿(96.6B)参数(约占总量的8%)。这意味着在推理时,GLaM的计算量(FLOPs)仅为GPT-3(175B全激活)的约一半。
此外,GLaM的研究团队发现,高质量的数据对于大模型的性能很重要。它们开发了一套高质量的文本质量分类器,对原始网页数据进行了严格的过滤。实验表明,使用过滤后的高质量数据训练的模型,在各项任务上的表现均优于使用未过滤海量数据的模型。
3.2 性能与能效对比
GLaM的主要贡献在于证明了稀疏模型可以在减少计算资源消耗的同时,超越同等规模甚至更大规模的稠密模型。
如下图所示,GLaM(绿色)在Zero-shot(a)、One-shot(b)和Few-shot(c)设置下,绝大多数任务上都全面优于GPT-3(橙色)。特别是在图(d)的成本对比中,GLaM的推理计算量仅为GPT-3的一半,训练总能耗更是大幅下降至1/3。

下面的表格进一步列出了具体的数值对比,直观地证明了MoE架构在实现高性能的同时,显著降低了算力成本。

MoE架构为实现"更大、更强、更环保"的模型提供了一条极具潜力的技术路径。这打破了以往"性能提升必须依靠堆砌更多算力"的固有认知。
三、MoE架构的创新与实践
随着开源社区的活跃,MoE技术不再是科技巨头的专属。Mistral 8x7B和DeepSeek-R1的出现,分别在中等规模和超大规模上证明了开源MoE模型的强大实力,标志着MoE技术进入了全面普及和深度创新的新阶段。
1.Mistral 8x7B如何以小博大
1.1 架构与性能概览
Mistral 8x7B在开源大语言模型中成功实践了MoE架构,有力地证明了合理设计的稀疏模型即使不需要万亿参数,也能超越同量级的稠密模型。
**架构参数:**它拥有约470亿(47B)的总参数量,但对于每个Token,仅激活130亿(13B)参数。这使得它在推理时拥有13B模型的计算速度,却能发挥出47B模型的知识容量。需要注意,虽然计算量较小,但由于所有专家参数都需要加载到内存中,其显存占用(VRAM)依然是47B模型级别的。
**路由机制:**每一层包含8个专家,采用标准的Top-2 Routing策略。如下图所示,每个输入Token会被Router网络分配给8个专家中的2个,这两个专家的输出经过加权求和后作为该层的最终输出。这种机制巧妙地在增加模型容量的同时,保持了极低的推理成本。

**性能表现:**在GSM8K(数学)、MMLU(综合知识)、HumanEval(代码)等基准测试上,Mistral 8x7B以13B的活跃参数量超越了稠密的Llama2 70B(绿色柱状图),特别是在数学和代码生成任务上,其优势尤为显著。
**上下文能力:**Mistral 8x7B支持32k的上下文长度,并且在长文本信息检索任务中表现出了100%的召回率,证明了MoE架构在处理长序列时依然稳健。

1.2 路由机制分析
Mistral团队对Router选择专家的行为进行了深入分析,得到了一个令人惊讶的结论。专家并没有按预想的那样根据"学科领域"进行分工。
他们统计了不同领域数据(如arXiv,PubMed,Wikipedia等)在不同层(Layer0,15,31)的专家比例分配。如下图所示,同一行(即同一个专家)在不同列(不同数据集)上的颜色深浅非常接近。这说明,无论输入文本属于哪个领域,Router选择各专家的概率分布几乎是一样的。专家似乎更多地是根据语法和Token结构来分工,而非人类定义的知识领域。

2.DeepSeekMoE与DeepSeek-R1
如果说Mistral开启了开源MoE模型的大门,那么DeepSeek-R1(及其基座DeepSeek-V3)则将开源MoE模型的性能推向了与当时顶尖闭源模型(如OpenAI o1)比肩的高度。DeepSeek在MoE架构上进行了更深度的创新,提出了DeepSeekMoE架构,目标是解决传统Top-k路由中的"知识冗余"和"专业化不足"问题。
2.1 细粒度专家与共享专家
与Mistral采用的"粗粒度"专家不同,如下图所示,DeepSeekMoE引入了两个关键策略。

**细粒度专家分割(Fine-Grained Expert Segmentation):**DeepSeek将一个标准的大专家拆分为多个更小的专家。对比(a)和(b)可以看到,原本的专家1被进一步拆分为更小的专家1和2。为了保持总计算量不变,激活的专家数量K也相应倍增(从K=2变为K=4)。这种变化使组合的可能性呈指数级增加,让模型能更灵活地组合不同的"知识碎片"来应对复杂输入,从而实现了更高的专家专业化。
**共享专家隔离(Shared Expert Isolation):**这是DeepSeekMoE的核心创新。如(c)所示,专家1被指定为绿色的共享专家。它不再经过Router选择,而是通过一条独立的通路直接接收输入,对所有Token总是被激活。Router仅负责从剩余的路由专家中选择K=3个进行补充。
这种设计让共享专家负责捕获通用的、跨任务的知识(如语法),而路由专家则专注于特定的领域知识。通过这种"通用+专用"的分离,有效减少了路由专家中重复学习通用知识的冗余,显著提升了参数效率。
可以用公式统一表示为:

其中S代表共享专家集合(总是被激活),R代表路由专家集合(仅选择性激活)。这种双路径结构是其区别于传统MoE的关键。
2.2 性能里程碑
DeepSeek-R1不仅在常规任务上表现出色,更通过大规模强化学习具备了强大的逻辑推理能力。DeepSeek-R1在AIME 2024(数学竞赛)上准确率达到79.8%稍高于OpenAI-o1-1217;在MATH-500上达到了97.3%,与o1持平。在Codeforces变成竞赛中,其Elo等级分达到2029,超过了96.3%的人类参赛者。如下图所示。
