本文用多张架构图来带你了解 DeepSeek 使用的 混合专家 (MoE) 架构。
什么是专家混合(MoE / Mixture of Experts)?
混合专家 (MoE) 是一种使用许多不同 子模型(或「专家」) 来提高 LLM 质量的技术。
两个主要组件定义了 MoE:
-
• 专家:每个 FFNN 层现在都有一组“专家”,可以从中选择一个子集。这些“专家”通常本身就是 FFNN。 -
• 路由器或门网络:确定哪些令牌被发送给哪些专家。
在具有 MoE 的 LLM 的每个层级中,我们都会找到(某种程度上专业的)专家。
FFNN
FFNN 层指的是大型语言模型(LLM)中的 前馈神经网络(Feedforward Neural Network, FFNN) 层。
-
1. 前馈神经网络(FFNN):这是一种基本的神经网络结构,数据在网络中只向前流动,从输入层到输出层,而没有循环或反馈连接。每一层的神经元与下一层的所有神经元相连。 -
2. FFNN 层的作用:在 LLM 中,FFNN 层通常用于处理输入数据,将其转换为更高层次的表示。它通过加权和激活函数,将输入特征转换为输出特征。 -
3. 激活函数:在 FFNN 中,每个神经元会应用一个激活函数,以引入非线性,使模型能够学习复杂的模式。常见的激活函数有 ReLU(线性整流单元)、Sigmoid 和 Tanh。 -
4. 在 LLM 中的角色:虽然 LLM 的核心是自注意力机制,但 FFNN 层通常作为注意力层之后的一个处理步骤,用于进一步处理和转换信息。
MoE 概述
注意,我们这里提到的 专家 并不是专攻「心理学」或「数据」等特定领域的专家。它最多只是在单词层面学习句法信息。
更技术地说,专家的专长是在特定环境中处理特定的标记。
路由器(门网络)选择最适合给定输入的专家:
每个专家都只是 LLM 架构的一个子模型部分。
密集层
传统 Transformer 中的 FFNN 被称为密集模型,因为所有参数(其权重和偏差)均已激活。没有留下任何内容,所有内容都用于计算输出。
我们看一下标准的仅解码器的 Transformer 架构在层规范化之后应用了 FFNN 的情况:
解码器的主要功能是生成输出序列, 整个解码器的结构是通过层归一化、 掩码自注意力和前馈神经网络的组合来处理输入,并通过残差连接来稳定训练过程。
-
1. Layer Norm(层归一化):层归一化是一种正则化技术,用于加速训练并提高模型的稳定性。它在每一层的输入上进行归一化处理。 -
2. Masked Self-Attention(掩码自注意力):这是解码器中的一个关键组件。掩码自注意力机制确保在生成当前位置的输出时,模型只能访问到当前位置及其之前的输入,而不能访问到未来的输入。这防止了模型在生成过程中作弊。 -
3. FFNN(前馈神经网络):这是一个简单的前馈神经网络,通常由两个线性变换和一个激活函数组成。它用于对输入进行非线性变换,从而捕捉更复杂的特征。 -
4. +(残差连接):残差连接(Residual Connection),用于将输入直接添加到输出上,帮助缓解梯度消失问题,并使训练更加稳定。
密集连接(Dense)神经网络模型的的特点是每一层的每个神经元都与下一层的每个神经元相连。
Dense Model 的主要结构如下:
-
1. 输入层:输入层表示接收输入数据。 -
2. 隐藏层:中间部分有多个圆形,表示隐藏层。每个圆形代表一个神经元。图中显示有512个神经元(512 values),这些神经元通过权重连接到下一层的神经元。 -
3. 连接数:从隐藏层到输出层的连接数为2048,表示每个隐藏层神经元与输出层神经元之间的连接数。 -
4. 层数:图中显示了多层结构,具体层数可以通过连接线的数量和神经元的数量来推断。
密集连接神经网络模型通过多层神经元和大量的连接来处理和学习输入数据,从而实现复杂的模式识别和预测任务。
稀疏层
我们仔细观察 dense 模型,请注意 input 如何在某种程度上激活所有参数:
相比之下,稀疏模型仅激活其总参数的一部分,并且与 Mix of Expert 密切相关。
为了说明这,我们可以将密集模型切成多个块(所谓的「专家」),重新训练它,并且只在给定时间激活子集:
比如这样:
专家架构
由于大多数 LLM 都有多个解码器块,因此给定的文本在生成文本之前将经过多个专家:
所选的专家可能因输出 Token 不同而不同(并不是一次完整的输入输出只有一个路径):
路由器
现在我们有了一组专家,模型如何知道要使用哪些专家呢?
就在 expert 之前,添加了一个路由器(也称为门网络),该路由器经过训练,可以选择为给定令牌选择哪个专家。
路由器(或门网络)也是一个 FFNN,用于根据特定输入选择专家。它输出用于选择最佳匹配专家的概率:
专家层返回选定专家的输出乘以选择概率(门值),然后将结果加到路由器的输出上。
MoE 层有又有两种大小,一种是稀疏的专家混合,一种是密集的专家混合。
稀疏专家模型(Sparse Expert Models)在每次前向传播中, 仅激活一部分专家(子模型)进行计算。这种方式能够显著减少计算量和内存占用。 并且均有很好的扩展性,能够增加更多的专家而不显著增加计算成本。
密集专家模型(Dense Expert Models)则是在每次前向传播中激活所有专家进行计算。 这种方式通常会导致较高的计算和内存开销,但是能够更全面地捕捉数据的特征。 实现相对简单,不需要复杂的激活机制。
由于密集专家模型通常会激活所有专家,计算量大,不适合处理大量数据。 因此,在实际的应用中我们看到的 MoE 模型,通常是稀疏的专家模型。
专家选择
在稀疏专家模型中,路由器会选择最优的专家,然后将其输出加到路由器的输出上。
激活函数
在路由器的实现中,激活函数可能用于确定哪个专家被激活,尤其是在计算专家的权重时。 激活函数一般都有非线性适应,路由器的选择机制可以通过激活函数来增强, 使得模型在选择激活的专家时能够适应输入数据的特征。
专家选择过程
其最基本的计算形式中,我们将输入乘以路由器权重矩阵,获得输出:
然后,我们在输出上应用激活函数 SoftMax 来为每个专家创建概率分布:
路由器使用此概率分布为给定的输入选择最佳匹配的专家:
最后,我们将每个路由器的输出与每个选定的专家相乘,并对结果求和,得到最终的输出:
最后,我们把整个过程连在一起来看一下输入如何经过路由器和专家:
最后
至此我们已经了解了专家混合(MoE)架构的基本原理。 当然现实肯定比这个更复杂,比如怎么防止过拟合,如何进行负载均衡, 以及多模态怎么进行MoE等。下面为大家罗列一些相关的论文供大家查看。
-
• 《联合 MoE 缩放定律:专家混合可节省内存》[1] -
• 《DeepSeekMoE:迈向混合专家语言模型的终极专家专业化》[2] -
• 《预门控 MoE:一种用于快速且可扩展的混合专家推理的算法系统协同设计》[3] -
• 《专家权重平均:视觉变换器的新通用训练方案》[4] -
• 《稀疏升级:从密集检查点训练混合专家》[5] -
• 《FastMoE:一种快速混合专家训练系统》[6]
引用链接
[1] 《联合 MoE 缩放定律:专家混合可节省内存》:https://arxiv.org/abs/2502.05172[2]《DeepSeekMoE:迈向混合专家语言模型的终极专家专业化》:https://arxiv.org/abs/2401.06066[3]《预门控 MoE:一种用于快速且可扩展的混合专家推理的算法系统协同设计》:https://arxiv.org/abs/2308.12066[4]《专家权重平均:视觉变换器的新通用训练方案》:https://arxiv.org/abs/2308.06093[5]《稀疏升级:从密集检查点训练混合专家》:https://arxiv.org/abs/2212.05055[6]《FastMoE:一种快速混合专家训练系统》: https://arxiv.org/abs/2103.13262
--- END ---

