MoE技术演进

Adaptive Mixtures of Local Experts

MoE在1991年的一篇名为Adaptive Mixtures of Local Experts的论文中提出。模型架构包含三个核心组件:

  • 专家网络(Experts):由多个独立的子网络构成,每个专家负责学习输入空间中的局部区域或特定子任务。训练时每个专家仅根据其权值对应的样本更新参数,专注于局部任务。
  • 门控网络(Gating Network):接收与专家相同的输入 $x$,输出归一化的权重 $p_i(x)$,表示输入 $x$ 应由第 $i$ 个专家处理的概率。门控网络的输出通过Softmax函数计算,其中 $g_i(x)$ 是门控网络的第 $i$ 个未归一化得分。训练时通过最大化正确专家的权重,强化“赢者通吃”机制。若某专家在样本 $x$ 上的误差低于其他专家,其权重 $p_i(x)$ 将被提升。门控网络实现了样本到专家的稀疏分配,减少计算冗余。
    $$
    p_i(x) = \frac{\exp(g_i(x))}{\sum_j \exp(g_j(x))}
    $$
  • 选择器(Selector):根据专家权重来做专家选择的策略。可以选择权重最高的TopK专家来融合得到最终的结果。

GShard

谷歌的GShard: Scaling Giant Models with Conditional Computation and Automatic Sharding框架针对MoE架构进行了系统性改进,通过条件计算自动分片技术,显著提升了超大规模模型的训练效率与扩展性。

1. 稀疏门控机制与负载均衡:MoE层的核心在于门控函数动态分配输入样本至专家网络。GShard采用Top-2门控策略,每个样本激活最多两名专家,并通过以下机制优化负载均衡:

  • 专家容量约束:设定专家容量上限 $C = O(N/E)$,其中 $N$ 为批次样本数,$E$ 为专家总数。若某专家容量超限,溢出样本直接通过残差连接传递。
  • 本地分组调度:将批次样本划分为 $G$ 组并行处理,每组独立分配样本至专家,避免全局竞争。每组容量为 $2N/(G \cdot E)$,确保负载均衡。
  • 辅助损失函数:引入辅助损失项 $\ell_{aux}$,近似最小化专家负载的方差,防止专家利用不均。其中 $c_e$ 为专家负载计数,$g_{s,e}$ 为样本 $s$ 对专家 $e$ 的权重。
    $$
    \ell_{aux} = \sum_{e=1}^{E} m_e \cdot \left(\frac{c_e}{S}\right), \quad m_e = \frac{1}{S} \sum_{s=1}^{S} g_{s,e}
    $$

2. 高效并行与通信优化:基于SPMD(单程序多数据)分区,通过编译器扩展实现自动分片,核心优化包括:

  • 分片API设计:提供splitreplicate等轻量级注解API,支持沿批次(数据并行)、专家(模型并行)等维度分片。例如,MoE层专家权重按专家维度分片,非MoE层权重全复制。
  • 通信原语优化:使用AllToAll实现跨设备数据重排(Resharding),AllReduce聚合部分结果,CollectivePermute处理空间分区中的Halo交换。AllToAll通信成本随设备数 $D$ 呈 $ O(\sqrt{D})$ 增长,确保扩展性。
  • 编译器自动推断:基于数据流分析自动传播分片策略,减少手动标注负担。如Einsum操作的分片策略由其输入分片维度动态推导。

3. 模型架构与计算复杂度

  • MoE-Transformer集成:将Transformer的每两个前馈层替换为MoE层,专家网络结构与标准前馈层一致,然后输出 $y_s$ 为Top-2专家的加权和:
    $$
    FFN_e(x_s) = w_{o,e} \cdot ReLU(w_{i,e} \cdot x_s)
    $$
    $$ y_s = \sum_{e=1}^{E} \mathcal{G}_{s,e} \cdot FFN_e(x_s)$$
  • 亚线性计算扩展:通过条件计算,每设备计算量 $FLOPS/D = O(1)$,总计算量仅随设备数亚线性增长。

4. 实验结果与性能优势

  • 质量提升:600B参数的MoE模型在2048 TPU v3上训练4天,相比双语基线平均提升ΔBLEU达44.3,且高资源语言受益于容量扩展,低资源语言依赖跨任务迁移。
  • 训练效率:模型参数量从37.5B增至600B(16倍),计算成本仅增3.6倍,显著优于密集模型(如T(96L)需235.5 TPU年)。
  • 内存与运行时优化:每设备内存恒定,AllToAll通信占比随规模增长可控,支持万亿参数模型训练。

DeepSeekMoE

DeepSeekMoE: Towards Ultimate Expert Specialization in Mixture-of-Experts Language Models是一种改进的MoE架构,提升专家专业化并减少冗余:

1. 细粒度专家分割(Fine-Grained Expert Segmentation)

  • 核心思想:将每个专家分割为更小的子专家(如将 FFN 的中间隐藏维度减少为原来的 $1/m$),从而增加专家数量和组合灵活性。
  • 公式解读:总专家数从 $N$ 扩展为 $mN$,激活的专家数从 $K$ 增加到 $mK$。$g_{i,t}$ 表示专家选择的门控值(仅 Top-$mK$ 的专家被激活)。组合可能性显著提升(例如,从 $\binom{16}{2}$ 增至 $\binom{64}{8}$),支持更精准的知识分解。输出计算为:
    $$
    h_t^l = \sum_{i=1}^{mN} \left(g_{i,t} FFN_i(\mathbf{u}_t^l)\right) + \mathbf{u}_t^l
    $$

2. 共享专家隔离(Shared Expert Isolation)

  • 核心思想:固定部分专家 $K_s$ 个为共享专家,始终激活以捕获通用知识,减少路由专家的冗余。
  • 公式解读:每个 token 的输出由共享专家和路由专家共同计算,路由时,仅从剩余的 $mN-K_s$ 个专家中选择 $mK-K_s$ 个激活,确保总计算量不变。
    $$
    h_t^l = \sum_{i=1}^{K_s} FFN_i(u_t^l) + \sum_{i=K_s+1}^{mN} \left(g_{i,t} FFN_i(u_t^l)\right) + u_t^l
    $$

3. 负载平衡策略

  • 专家级平衡损失:防止某些专家被过度使用(路由崩溃),$f_i$ 是专家 $i$ 被选择的频率,$P_i$ 是平均门控值。
    $$
    L_{ExpBal} = \alpha_1 \sum_{i=1}^{N’} f_i P_i
    $$
  • 设备级平衡损失:确保专家在设备间均匀分布,通过调整 $\alpha_1$ 和 $\alpha_2$ 平衡性能与负载。
    $$
    L_{DevBal} = \alpha_2 \sum_{i=1}^D f_i’ P_i’
    $$

DeepSeek-V2

DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model在MoE架构中引入了多项创新技术,旨在提升专家专业化能力、优化训练效率并降低通信开销:

1. 细粒度专家分割(Fine-Grained Expert Segmentation)

  • 核心思想:将专家分割为更细粒度的单元,增加专家数量和多样性,以增强模型对复杂模式的捕捉能力。
  • 技术细节:每个 MoE 层包含 160 个路由专家(routed experts)2 个共享专家(shared experts),其中每个专家具备独立的参数空间。相较于传统 MoE(如 GShard),细粒度分割允许更精准的知识表达,减少专家间的冗余。
  • 优势:在相同激活参数量下,通过增加专家数量提升模型容量,同时促进专家专业化。

2. 共享专家隔离(Shared Expert Isolation)

  • 核心思想:通过隔离部分共享专家,使其在所有输入中均被激活,避免路由专家之间的知识冗余。
  • 技术细节:共享专家独立于路由机制,始终参与计算,负责捕捉跨任务的通用特征;路由专家则专注于特定模式。
  • 优势:缓解路由专家因稀疏激活导致的局部优化问题,同时提升模型泛化性。

3. 设备限制路由(Device-Limited Routing)

  • 核心思想:在分布式训练中限制每个token的专家选择范围,减少跨设备通信开销。
  • 技术细节
    • 路由策略:对每个token,首先选择 M 个设备(如 M=3),仅在该设备组内的专家中进行 Top-K 选择(如 K=6)。
    • 负载均衡:引入设备级平衡损失和通信平衡损失,确保专家在设备间均匀分布,避免局部过载。
  • 优势:将通信频率降低至与设备数线性相关(而非专家数),显著提升训练效率。

4. 多级负载均衡优化(Multi-Level Load Balancing)

  • 辅助损失函数
    • 专家级平衡损失($\mathcal{L}_{\text{ExpBal}}$):鼓励每个专家被均匀选择。
    • 设备级平衡损失($\mathcal{L}_{\text{DevBal}}$):确保不同设备上的计算负载均衡。
    • 通信平衡损失($\mathcal{L}_{\text{CommunBal}}$):优化设备间的输入/输出token分布。
  • 效果:通过联合优化三级损失,避免路由崩溃(routing collapse),提升硬件利用率。

5. 动态token丢弃策略(Token-Dropping Strategy)

  • 核心思想:在训练中动态丢弃低亲和力token,减少冗余计算。
  • 技术细节
    • 对每个设备,按专家亲和力分数排序,仅保留前 90% 的token,其余丢弃。
    • 保留 10% 的完整序列,确保训练与推理的一致性。
  • 优势:在保持模型性能的前提下,显著降低训练计算量。

6. 工程优化

  • 定制化计算内核:针对 MoE 的稀疏特性,优化 CUDA 内核以加速专家间的通信与计算融合。
  • 流水线并行:采用零气泡流水线并行(Zero-Bubble Pipeline Parallelism),结合专家并行(Expert Parallelism),提升分布式训练效率。

DeepSeek-V3

DeepSeek-V3 Technical Report对 MoE 的改进如下:

1. 无辅助损失的动态负载均衡策略(Auxiliary-Loss-Free Load Balancing):传统 MoE 模型通过引入辅助损失函数强制均衡专家负载,但过强的约束可能损害模型性能。DeepSeek-V3 提出了一种动态偏置调整机制:

  • 动态路由偏置:为每个路由专家引入偏置项,在训练过程中实时监控专家负载。若某一专家过载,则减少其偏置项;若欠载,则增加其偏置项。$s_{i,t}$为token与专家的亲和度(Affinity Score),$b_i$根据负载动态更新(如步长 $\gamma = 0.001$)。调整公式为:
    $$
    g’{i,t} = \begin{cases}
    s
    {i,t} + b_i, & if \space s_{i,t} + b_i \in TopK(s_{j,t} + b_j) \
    0, & otherwise
    \end{cases}
    $$
  • 优势:避免辅助损失对模型性能的干扰,同时通过动态调整实现全局负载均衡,提升计算效率。

2. 细粒度专家架构(DeepSeekMoE)

  • 共享专家与路由专家分离:每个 MoE 层包含 1 个共享专家(处理通用特征)和 256 个路由专家(处理特定特征),每个token激活 8 个路由专家。共享专家始终参与计算,增强模型对通用模式的捕捉能力。
  • 低秩压缩与参数共享:通过低秩投影(如 $\mathbf{c}_t^{KV}$ 压缩)减少 Key-Value 缓存,结合共享参数设计(如嵌入层与输出头共享),降低内存占用。

3. 节点限制路由(Node-Limited Routing)

  • 通信优化:限制每个token最多分配到 4 个节点,优先利用 NVLink(160 GB/s)进行节点内通信,减少跨节点 InfiniBand(50 GB/s)的流量。通过动态调整路由策略,实现计算与通信的完全重叠,降低训练延迟。
  • 冗余专家部署:在推理阶段,通过统计高频负载专家并冗余部署,动态平衡 GPU 间的计算负载,提升推理吞吐量。

4. 序列级辅助损失补充(Complementary Sequence-Wise Loss)
为防止单序列内的极端负载不均衡,引入极小权重($\alpha = 0.0001$)的序列级平衡损失,$f_i$ 为专家负载频率,$P_i$ 为序列内专家选择的概率分布。该损失仅作为补充约束,不影响全局负载均衡。
$$
\mathcal{L}{\text{Bal}} = \alpha \sum{i=1}^{N_r} f_i P_i,
$$

5. 无token丢弃(No Token-Dropping)

  • 传统 MoE 在负载不均衡时需丢弃部分token,导致信息损失。DeepSeek-V3 通过动态负载均衡策略,在训练和推理中均无需丢弃token,确保模型完整性。

相关面试题

Q1: Dense Transformer 和 MoE 的核心区别是什么?何时应选择MoE而非Dense架构?
A:

  • Dense Transformer:所有token经过相同的全连接层处理,参数完全共享,计算量随模型规模线性增长。
  • MoE (Mixture of Experts):引入稀疏性,也即稀疏激活,每个输入token由门控网络动态分配仅激活部分专家(如1-2个),计算量仅随激活的专家数增长,模型总参数量可大幅增加但计算成本可控。适用于需极大规模模型(如千亿参数以上)但计算资源有限。任务需要异构计算(如不同子任务需要不同专家)。不适用于小规模模型(MoE收益不足以抵消通信开销)。对推理延迟敏感的场景(路由引入额外开销)。

Q2: DeepSeek MoE都有哪些改进?
A: 这里贴下知乎大佬的图,总结的非常好!

Q3: 如何解决MoE训练中的专家负载不均衡问题?
A: 专家负载不均衡是MoE(Mixture of Experts)模型训练中的核心挑战之一,表现为某些专家被过度激活(过载),而其他专家未被充分利用(欠载)。
1. 辅助损失函数(Auxiliary Loss):通过引入额外的损失项,直接惩罚专家利用率的不均衡性,迫使门控网络均匀分配样本。

  • 专家利用率方差惩罚计算每个批次中专家被选中的概率的方差,并将其作为正则项加入总损失函数。$p_i^c$ 是第 $i$ 个专家对样本 $c$ 的责任权重,$B$ 为批次大小,$\lambda$ 为平衡系数。
    $$
    \mathcal{L}{\text{balance}} = \lambda \cdot \text{Var}\left(\frac{1}{B} \sum{c=1}^B p_i^c\right)
    $$
  • 熵最大化:最大化门控输出的熵,鼓励权重分布更均匀。其中 $\bar{p}i$ 为专家 $i$ 的平均责任权重。
    $$
    \mathcal{L}
    {\text{entropy}} = -\lambda \cdot \sum_{i=1}^N \bar{p}_i \log \bar{p}_i
    $$
    $$\bar{p}i = \frac{1}{B} \sum{c=1}^B p_i^c$$

2. 硬性约束(Hard Constraints):强制限制每个专家处理的样本数量,确保最低利用率。

  • 截断式路由(GShard):在Top-k选择时,动态调整阈值,确保每个专家分配的样本数不低于预设值。
  • 负载感知重采样:若某专家负载过低,在反向传播时对其梯度进行加权放大,或在下一批次中增加其被选中的概率。

3. 动态路由策略(Dynamic Routing):根据实时负载动态调整专家选择策略,优先激活欠载专家。

  • 负载感知Top-k:在选择Top-k专家时,结合当前负载信息。例如,定义专家 $i$ 的优先级分数$s_i$,其中 $u_i$ 是专家 $i$ 的历史利用率,$\alpha$ 为负载平衡系数。
    $$
    s_i = g_i(x) + \alpha \cdot (1 - u_i)
    $$
  • 在线调整门控分布:根据专家利用率动态调整Softmax温度参数,欠载专家的温度升高以增加选择概率。

4. 初始化与预热策略(Warm-up Initialization):在训练初期强制均匀分配样本,避免冷启动问题。

  • 均匀门控预热:在训练前 $T$ 步固定门控输出为均匀分布 $p_i = 1/N$,$N$ 为专家数,之后再放开学习。
  • 渐进式释放:逐步增加路由的选择自由度,例如从均匀分布逐步过渡到动态门控。

5. 正则化与相似性惩罚(Regularization):通过约束专家之间的相似性,间接促进负载均衡。

  • 专家多样性损失:惩罚不同专家输出之间的相关性,例如最小化专家输出的余弦相似性:
    $$
    \mathcal{L}{\text{diversity}} = \lambda \cdot \sum{i \neq j} \cos(o_i, o_j)
    $$
  • 参数正交化:强制专家网络的权重矩阵正交化,减少冗余性。

Q4: 为什么MoE模型更难收敛?如何缓解?
A:
原因

  1. 路由决策的离散性与梯度不稳定性 :门控网络的输出通常是基于Top-k选择的离散决策(如选择前2个专家),导致路由函数的梯度不可导(或近似梯度噪声大)。
  2. 专家初始化与冷启动问题 :若某些专家在训练初期未被激活(责任权重接近零),其参数无法更新,形成“死专家”。
  3. 门控网络与专家的耦合优化 :门控网络和专家的参数需同步优化,但两者的目标可能冲突(例如门控需快速切换专家,而专家需稳定学习局部特征)。导致训练过程震荡,收敛路径复杂。

解决方案

  1. 改进路由机制的连续性
    • 软性门控(Soft Gating):用连续概率分布替代硬性Top-k选择,通过调节温度参数 $\tau$ 控制选择的软硬程度(高温更均匀,低温更尖锐)。
      $$
      \text{Top-k with Softmax Temperature:} \quad p_i = \frac{\exp(g_i / \tau)}{\sum_j \exp(g_j / \tau)}$$
    • Gumbel-Softmax松弛:引入Gumbel噪声对离散选择进行连续近似,使路由可导,训练初期使用高温$\tau \to 1$,逐渐降温以逼近离散决策。
      $$
      p_i = \text{Softmax}\left((g_i + \epsilon)/\tau\right), \quad \epsilon \sim \text{Gumbel}(0,1)$$
  2. 专家初始化与预热策略
    • 均匀初始化阶段:训练初期(如前1万步)固定门控网络输出为均匀分布$p_i = 1/N$,强制所有专家均被激活。
    • 渐进式路由释放:逐步增加路由的选择自由度,例如从均匀分布过渡到动态门控,避免冷启动问题。
  3. 负载均衡与专家利用率约束
    • 负载均衡损失(Load Balancing Loss):在总损失中加入专家利用率的正则项,其中 $\bar{p}i$ 为批次内专家 $i$ 的平均责任权重,最小化其熵以鼓励均匀分配。
      $$
      \mathcal{L}
      {\text{balance}} = \lambda \cdot \sum_{i=1}^N \left(\bar{p}_i \log \bar{p}_i\right), \quad \bar{p}i = \frac{1}{B}\sum{c=1}^B p_i^c$$
    • 硬性负载约束:限制单个专家处理的样本比例不超过阈值(如2倍平均负载),超出部分强制重分配到其他专家。
  4. 专家参数的正则化与共享
    • 专家间参数共享:部分专家共享底层参数(如前几层),减少冗余并降低优化难度。
    • DropExpert正则化:随机丢弃部分专家(类似Dropout),迫使模型依赖多样化路径。
    • 专家多样性损失:惩罚专家输出之间的相似性,例如最小化余弦相似性:
      $$
      \mathcal{L}{\text{diversity}} = \lambda \cdot \sum{i \neq j} \cos(o_i, o_j)
      $$
  5. 分阶段训练与课程学习
    • 专家预训练:先独立训练各专家(固定门控),再联合优化门控网络。
    • 渐进式任务难度:从简单任务(如粗粒度分类)逐步过渡到复杂任务,帮助路由网络学习合理的分工策略。
  6. 动态路由策略优化
    • 重要性加权采样:对低频样本或任务增加路由权重,确保相关专家被激活。
    • 专家协作机制:允许专家间传递中间特征(如交叉注意力),缓解路由错误导致的性能损失。

参考