【LLMs篇】04:混合专家模型MoE
混合专家模型(MoE)是一种强大且具有潜力的模型架构,它通过“分而治之”和“专家协同”的思想,有效解决了模型规模与计算效率之间的矛盾。MoE 在自然语言处理、计算机视觉等领域取得了显著的成果,尤其是在构建超大规模模型方面展现出巨大优势。尽管 MoE 的训练、调参和理论分析仍面临挑战,但随着研究的不断深入,相信 MoE 将在未来的人工智能领域扮演更重要的角色。
文章目录
在深度学习领域,模型规模的扩张是提升性能的常用手段,但这也带来了计算资源、训练效率和过拟合等问题。混合专家模型(Mixture of Experts,MoE)提供了一种优雅的解决方案:它将一个大型任务分解为多个子任务,由不同的“专家”网络分别处理,并通过一个“门控”网络来协调这些专家,实现“分而治之”和“专家协同”。
1. 核心思想与数学表述:专家分工,门控调度
MoE 模型的核心思想可以用一个类比来解释:一个复杂的项目,不是由一个全能的团队完成,而是由多个专业小组(专家)协作完成。项目经理(门控网络)根据任务需求,决定每个小组的参与程度。
从数学角度来看,MoE 模型包含以下几个关键组成部分:
-
专家网络(Experts): MoE 包含 n 个专家网络,每个专家网络 Ei(x; θi) 可以是任意类型的神经网络(前馈网络、卷积网络、循环网络等),其中 x 是输入,θi 是第 i 个专家的参数。每个专家负责学习输入空间的不同区域或特征模式。
-
门控网络(Gating Network): 门控网络 G(x; θg) 也是一个神经网络,其输入同样是 x,参数为 θg。它的输出是一个 n 维向量,每个维度对应一个专家的权重。通常,门控网络的输出会经过一个 softmax 函数,以确保所有专家的权重之和为 1:
gi(x) = softmax(G(x; θg))i = exp(G(x; θg)i) / Σj=1n exp(G(x; θg)j)
这里,gi(x) 表示第 i 个专家的权重,它是一个介于 0 和 1 之间的概率值,表示该专家对当前输入 x 的适用程度。
-
加权组合(Weighted Sum): MoE 模型的最终输出 Y(x) 是所有专家网络输出的加权和:
Y(x) = Σi=1n gi(x) * Ei(x; θi)
2. 深入理解 MoE 的优势:容量、稀疏性与专业化
MoE 模型之所以有效,主要得益于以下几个方面:
- 模型容量(Model Capacity):
- 理论分析: 理论上,增加专家数量可以显著增加模型的参数量,从而提升模型容量。但与直接扩大单个网络不同,MoE 的计算量增长通常是 sub-linear 的(亚线性),因为并非所有专家在每次前向传播时都被激活。
- 与参数共享的区别: 传统参数共享(如卷积)在不同位置共享相同参数,而MoE是在不同样本上"共享"(选择性激活)不同专家。
- 稀疏性(Sparsity):
- 门控机制: 门控网络的设计(如 Top-k 门控)天然地促进了稀疏性。这意味着对于给定的输入,只有少数专家会被赋予较高的权重,其余专家的权重接近于零。
- 计算效率: 稀疏性直接带来了计算效率的提升,因为大部分专家的计算可以被跳过。
- 正则化效果: 稀疏性也有助于防止过拟合,类似于一种隐式的正则化。
- 专业化(Specialization):
- 数据划分: 门控网络实际上是在隐式地将输入空间划分为不同的区域,每个专家负责学习一个特定区域的特征。
- 任务分解: 如果将整个任务视为一个复杂函数,MoE 可以看作是将这个复杂函数分解为多个子函数(由专家网络表示),每个子函数负责一部分任务。
- 梯度信号: 不同的专家接收到的梯度信号也不同,因此即使采用相同的网络结构,专家们也会倾向于学习到不同的功能。
3. MoE 的训练:梯度、平衡与正则化
MoE 模型的训练通常采用端到端(end-to-end)的方式,使用反向传播算法和梯度下降优化器来更新专家网络和门控网络的参数。训练过程中的关键问题包括:
- 梯度计算:
- 专家网络梯度: 专家网络的梯度计算相对直接,类似于标准神经网络的梯度计算。
- 门控网络梯度: 门控网络的梯度需要通过链式法则计算,它不仅取决于最终损失,还取决于专家网络的输出。关键在于*gi(x)对G(x; θg)*求导。
- 负载均衡(Load Balancing):
- 问题描述: 如果某些专家总是被高权重选中,而另一些专家总是被低权重选中,就会导致“赢者通吃”的局面,使得部分专家无法得到有效训练。
- 解决方案:
- 辅助损失(Auxiliary Loss): 在总损失函数中添加一个辅助损失项,用于惩罚专家权重的极端不平衡。常见的辅助损失包括:
- 重要性损失(Importance Loss): 鼓励所有专家在整个训练批次上具有相似的平均重要性(权重)。
- 方差损失(Variance Loss): 最小化专家权重的方差。
- 噪声注入(Noise Injection): 在门控网络的输入或输出中添加噪声,可以打破权重的对称性,促进更均匀的专家选择。 例如,在softmax之前加入高斯噪声。
- 专家丢弃(Expert Dropout): 类似于 Dropout,随机丢弃一些专家,迫使门控网络依赖于更多的专家。
- 批量优先路由(Batch Prioritized Routing):优先让mini-batch中的样本路由到未充分利用的专家。
- 辅助损失(Auxiliary Loss): 在总损失函数中添加一个辅助损失项,用于惩罚专家权重的极端不平衡。常见的辅助损失包括:
- 正则化(Regularization):
- 权重衰减(Weight Decay): 与标准神经网络类似,可以对专家网络和门控网络的参数进行 L2 正则化。
- Dropout: 可以在专家网络和门控网络中使用 Dropout。
4. MoE 的变体与应用:稀疏门控、Transformer 集成及更多
MoE 算法有多种变体,其中一些重要的变体包括:
- 稀疏门控 MoE(Sparsely-Gated MoE):
- Top-k 门控: 这是最常见的稀疏门控方法。门控网络只选择权重最高的 k 个专家(k 通常远小于专家总数 n),其余专家的权重设置为零。
- 优点: 进一步提高了计算效率,减少了内存占用。
- 实现: 通常在softmax之前,选择top-k的logits, 其余logits设为负无穷。
- Switch Transformers:
- Transformer 集成: 将 MoE 层集成到 Transformer 模型的 FFN(Feed-Forward Network)层中。
- 单专家选择: 每个 token 只选择一个专家(k=1)。
- 巨大成功: 在大规模语言模型中取得了显著成功,如 Switch Transformer C 模型。
- Soft MoE:
- 所有专家都参与计算,但权重可以很小。
- 可以缓解训练不平衡的问题。
- 其他变体
- 分层MoE(Hierarchical MoE): 采用多层MoE结构,每一层都有自己的专家和门控。
- 专家选择的路由算法:除了Top-k,还有其他更复杂的路由算法,例如基于哈希的路由。
MoE 算法的应用领域非常广泛:
- 自然语言处理(NLP): 构建超大规模语言模型(如 Switch Transformers、GLaM、LaMDA 2)是 MoE 最成功的应用之一。
- 计算机视觉(CV): 用于图像分类、目标检测、图像生成等任务。
- 推荐系统: 学习用户-物品交互的复杂模式,提高推荐准确性。
- 语音识别: 处理语音信号的时序特性和多样性。
- 多模态学习: 不同模态(文本,图像,语音)的信息可以由不同的专家处理。
5. 图解MoE
专家混合模型(MoE)是一种通过使用多个不同的子模型(或“专家”)来提升 LLM 质量的技术。
MoE 的两个主要组成部分为:
专家(Experts):每个前馈神经网络层(FFNN)现在都有一组可以选择的“专家”。这些“专家”通常本身也是前馈神经网络(FFNN)。
路由器或门控网络(Router 或 Gate Network):决定哪些 token 被发送到哪些专家。
在具有 MoE 的 LLM 的每一层中,我们可以发现一些(相对专业化的)专家:
这些“专家”并不像人类领域中的“心理学”或“生物学”专家那样在特定学科上表现出高度专业化。实际上,它们更多是从词汇层次上学习句法信息:
更具体地说,它们擅长于在特定上下文中处理特定的 tokens。
路由器(或门控网络)负责为每个输入选择最合适的专家:
每个专家并不是一个完整的 LLM,而是 LLM 架构中一个子模型部分。
专家
要理解专家的含义及其工作方式,首先需要了解 MoE 用来替代的内容:密集层(Dense Layers)。
密集层(Dense Layers)
专家混合模型(MoE)最初是从大型语言模型(LLMs)中相对基础的功能开始的,即前馈神经网络(Feedforward Neural Network, FFNN)。
FFNN 允许模型利用注意力机制生成的上下文信息,并进一步转化这些信息,从而捕捉数据中更复杂的关系。
然而,FFNN 的规模增长速度很快。为了学习这些复杂的关系,它通常需要对接收到的输入进行扩展:
稀疏层(Sparse Layers)
在传统的 Transformer 中,FFNN 被称为密集模型(Dense Model),因为它的所有参数(包括权重和偏置项)都会被激活。所有参数都被用于计算输出,没有任何部分被遗弃。
如果我们仔细观察密集模型,可以发现输入在某种程度上激活了所有参数:
相比之下,稀疏模型(Sparse Models)仅激活总参数中的一部分,这与专家混合模型(MoE)密切相关。
可以将密集模型分解为多个部分(称为专家),并重新训练它。随后,在某一时刻只激活部分专家:
其核心思想是,每个专家在训练过程中学习不同的信息。而在推理时,仅使用与当前任务最相关的特定专家。
当面对一个问题时,我们可以选择最适合该任务的专家:
专家学习了什么?
正如我们之前所见,专家学习的信息比整个领域的信息更加细粒度。因此,有时将它们称为“专家”可能会产生误导。
然而,在解码器模型中的专家似乎并没有表现出相同类型的专业化。这并不意味着所有专家都是等同的。
专家的架构
虽然将专家可视化为密集模型的隐藏层被切分成若干部分很有帮助,但实际上它们通常本身就是完整的 FFNN。
由于大多数 LLM 具有多个解码器块(Decoder Blocks),因此给定的文本会在生成之前通过多个专家:
不同 tokens 被选中的专家可能各不相同,这导致了不同的“路径”被选择:
如果我们更新解码器块的可视化,现在它将包含多个 FFNN(每个 FFNN 对应一个“专家”):
解码器块现在包含多个可以在推理时使用的 FFNN(即“专家”)。
路由机制(The Routing Mechanism)
现在我们有了一组专家,模型如何知道该使用哪些专家呢?
在专家之前会加入一个路由器(也称为门控网络),它会被训练来选择每个 token 应选择的专家。
路由器(The Router)
路由器(或门控网络)本身也是一个 FFNN,它根据特定的输入选择专家。路由器会输出概率值,并利用这些概率来选择最匹配的专家:
专家层返回被选定专家的输出,并乘以门控值(选择概率)。
路由器和专家(其中仅选择少部分)共同构成了 MoE 层:
给定的 MoE 层有两种类型:稀疏专家混合模型(Sparse Mixture of Experts)和密集专家混合模型(Dense Mixture of Experts)。
两者都使用路由器来选择专家,但稀疏 MoE 只选择少数几个专家,而密集 MoE 则选择全部专家,但可能会以不同的分布进行选择。
例如,面对一组 tokens,MoE 会将这些 tokens 分布到所有专家,而稀疏 MoE 则只会选择少数几个专家。
在目前的 LLM 中,当你看到“MoE”时,它通常指的是稀疏 MoE,因为稀疏 MoE 允许使用部分专家,从而减少计算开销,这对于 LLM 来说是一个重要的特性。
专家的选择
门控网络可以说是 MoE 中最重要的组件,因为它不仅决定了推理时要选择哪些专家,还决定了训练时的选择。
最基本的形式是,我们将输入(x)与路由器的权重矩阵(W)相乘:
然后,我们对输出应用 SoftMax 操作,为每个专家创建一个概率分布 G(x):
路由器利用这个概率分布来为给定的输入选择最匹配的专家。
最后,我们将每个路由器的输出与各自选择的专家输出相乘,并将结果相加:
让我们将所有内容整合起来,探索输入如何在路由器和专家中流动:
路由的复杂性
然而,这个简单的功能往往会导致路由器总是选择相同的专家,因为某些专家可能比其他专家学习得更快:
这不仅会导致专家选择的不均匀分布,还会导致某些专家几乎没有被训练过。这会在训练和推理过程中引发问题。
因此,我们希望在训练和推理期间,各个专家的使用具有同等的重要性,这就是所谓的负载平衡。某种程度上,这是为了防止模型在同一组专家上过拟合。
负载平衡与优化
为了平衡专家的重要性,我们需要重点关注路由器,因为它是决定某一时刻选择哪些专家的主要组件。
KeepTopK
一种对路由器进行负载平衡的方法是使用一个简单的扩展策略,称为 KeepTopK。通过引入可训练的(高斯)噪声,我们可以防止总是选择相同的专家:
然后,除希望激活的前 k 个专家(例如 2 个)以外的所有专家权重都将被设为 -∞:
将这些权重设为 -∞ 时,SoftMax 操作后的输出概率将变为 0:
尽管存在许多有前景的替代方案,许多 LLM 仍然使用 KeepTopK 策略。需要注意的是,KeepTopK 也可以不使用额外的噪声。
Token 选择策略
KeepTopK 策略会将每个 token 路由到若干选定的专家。这种方法被称为 Token 选择策略(Token Choice),它允许一个给定的 token 被路由到一个专家(top-1 路由):
或者被路由到多个专家(top-k 路由):
这种策略的主要优点在于,它可以对各个专家的贡献进行加权,并将其整合起来。
辅助损失(Auxiliary Loss)
为了在训练期间实现专家的均匀分布,网络的常规损失中加入了辅助损失(也称为负载平衡损失)。
辅助损失增加了一个约束,强制专家在训练过程中具有相同的重要性。
辅助损失的第一个组成部分是对整个批次中每个专家的路由值进行求和:
这为我们提供了每个专家的重要性得分,即在不考虑输入的情况下,给定专家被选中的概率。
我们可以使用这些重要性得分计算变异系数(Coefficient of Variation, CV),它表示各个专家的重要性得分之间的差异程度。
例如,如果重要性得分之间的差异较大,那么 CV 值就会较高:
相反,如果所有专家的得分都相似,则 CV 值较低(这是我们期望的情况):
通过使用这个 CV 得分,我们可以在训练过程中更新辅助损失,使其尽可能降低 CV 得分(从而使每个专家具有相同的重要性):
最后,辅助损失将作为一个独立的损失项,参与训练优化。
专家容量(Expert Capacity)
专家的不平衡不仅体现在被选中的专家上,还体现在分配给这些专家的 token 分布上。
例如,如果输入 token 被不成比例地分配到某些专家上,而不是平均分配,这可能导致某些专家的训练不足:
这里不仅要考虑使用了哪些专家,还需要关注这些专家被使用的频率。
解决这个问题的方法是限制每个专家能够处理的 token 数量,即专家容量(Expert Capacity)。当一个专家达到其容量时,多余的 token 将被分配到下一个专家:
如果两个专家都达到了其容量,token 将不会被任何专家处理,而是直接传递到下一层。这种情况被称为 token 溢出(token overflow)。
使用 Switch Transformer 简化 MoE
第一个解决 MoE 训练不稳定性问题(如负载平衡)的基于 Transformer 的 MoE 模型是 Switch Transformer。它通过简化架构和训练过程,提高了训练稳定性。
切换层(Switching Layer)
Switch Transformer 是一个 T5 模型(编码器-解码器结构),它将传统的 FFNN 层替换为切换层(Switching Layer)。切换层是一个稀疏的 MoE 层,它为每个 token 选择单个专家(top-1 路由)。
路由器在选择专家时并没有使用特殊的方法,只是对输入与专家权重相乘的结果取 softmax(与之前的方法相同)。
这种架构(top-1 路由)假设每个 token 只需要一个专家来学习如何进行路由。这与我们之前讨论的 top-k 路由(将 token 分配给多个专家)有所不同。
容量因子(Capacity Factor)
容量因子是一个重要参数,它决定了每个专家可以处理的 token 数量。Switch Transformer 通过引入直接影响专家容量的容量因子扩展了这一概念。
专家容量的组成部分非常简单:
如果我们增加容量因子,则每个专家能够处理更多的 token。
然而,如果容量因子过大,就会浪费计算资源。相反,如果容量因子过小,模型性能会因为 token 溢出而下降。
辅助损失(Auxiliary Loss)
为了进一步防止 token 被丢弃,Switch Transformer 引入了简化版的辅助损失。
在简化版的辅助损失中,不再计算变异系数,而是将分配的 token 数量与每个专家的路由概率进行加权比较:
由于目标是希望将 token 在 N 个专家中均匀分配,因此我们希望向量 P 和 f 的值为 1/N。
α 是一个超参数,用于在训练过程中微调此损失的重要性。值过高会影响主要损失函数,而值过低则无法有效进行负载平衡。
混合专家模型(MoE)是一种强大且具有潜力的模型架构,它通过“分而治之”和“专家协同”的思想,有效解决了模型规模与计算效率之间的矛盾。MoE 在自然语言处理、计算机视觉等领域取得了显著的成果,尤其是在构建超大规模模型方面展现出巨大优势。尽管 MoE 的训练、调参和理论分析仍面临挑战,但随着研究的不断深入,相信 MoE 将在未来的人工智能领域扮演更重要的角色。
6. DeepSeek MoE架构
上图展示了 DeepSeek 从传统 MoE 模型架构(a)的基础上,做的两部分改进(b)与(c):
(a)传统 MoE 模块: MoE 模块包含 N N N个前馈神经网络(Feed-Forward Network, FFN)专家,每个专家在处理特定类型的数据上具有独特的优势。MoE 模块通过路由机制,根据输入数据的特征动态选择最合适的 K K K个专家进行处理,而不是激活所有专家。所有专家的参数总和构成了整个 MoE 模块的参数量,在前向计算过程中,由于只激活了部分专家,实际参与计算的参数量被称为激活参数量。例如,Mixtral 8*7B 模型包含8个专家,每次选择其中的2个专家进行计算,模型的总参数量为46.7B,而激活参数量为12.9B。
(b)细粒度专家划分: 不同于传统 MoE ,DeepSeek 把 N N N个专家做更细粒度的划分,降低每一个专家的参数量,增大专家数量。如图(b),将 N N N个专家拆分为 m N mN mN个,每一个专家的隐层维度变为原来的 1 / m 1/m 1/m,相应地激活 m K mK mK个专家。如此 MoE 模块的参数量以及激活参数量均保持不变,同时还可以更加灵活地组合多个专家。
(c)共享专家分离: 把激活专家区分为共享专家(Shared Experts)和路由专家(Routed Experts)时,如图©所示,共享专家和路由专家在数据处理流程上有显著的区别。对于共享专家,输入数据无需经过路由模块的计算,所有数据都会直接通过共享专家进行处理。相反,对于路由专家,输入数据会先经过路由模块,该模块根据输入数据的特征选择最合适的专家进行计算。在这种架构中,路由模块通过计算输入数据与各个专家的匹配概率,选择概率最高的专家进行处理。最终,将路由专家和共享专家的计算结果相加,形成 MoE 模块的最终输出。通过这种方式,模型能够在处理不同输入数据时,既能捕捉到输入数据的共性,也能关注到输入数据的差异性。这种设计能够提高模型的泛化能力和适应性。
更进一步地,DeepSeek-V3 针对 MoE 中常见的负载不均衡问题,提出了一种新的负载均衡策略。在用于选择专家的 Gate 模块中引入了一个可学习的偏置项。在计算路由得分时,这个偏置项会被动态地加到每个路由专家的得分上。该方式的主要特点在于:
-
动态调整路由倾向: 通过学习偏置项,模型可以动态地调整对不同路由专家的偏好。如果某个专家的负载过重,其对应的偏置项可能会被学习为负值,从而降低其被选择的概率。反之,对于负载较轻的专家,其偏置项可能会被学习为正值,提高其被选择的概率。
-
无额外损耗: 该偏置项是直接通过模型的训练目标进行优化的,而不是通过一个独立的负载均衡损失函数。这意味着,模型在努力提高主要任务性能的同时,也会自然而然地学习到一种更均衡的路由策略,而不会因为额外的负载均衡损失而影响性能。
DeepSeek 通过这些 Moe 架构上的创新,直接促进了 V3 模型的整体效果提升。
下表是部分开源 MoE 模型的对比情况:

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)