|
| 1 | +--- |
| 2 | +title: "MOE 浅谈" |
| 3 | +description: "混合专家(Mixture of Experts, MoE)架构的简要介绍" |
| 4 | +tags: ["MoE", "AI"] |
| 5 | +--- |
| 6 | + |
| 7 | +# 混合专家(Mixture of Experts, MoE)架构 |
| 8 | + |
| 9 | +为了在不显著增加计算需求的情况下有效扩展模型参数规模,MoE 架构已经成为一种可行的解决方案。MoE 利用一组专门化的子模型和一个门控机制,动态地选择合适的“专家网络”来处理给定输入。这使得模型能够根据需求分配计算资源,这一概念被称为 **条件计算(conditional computation)**。 |
| 10 | + |
| 11 | +MoE 架构已经被广泛应用到大语言模型(LLMs)中,使这些模型能够在参数规模显著扩大的同时,获得相应的能力提升。 |
| 12 | +例如,Mixtral AI 提出的 **Mixtral-8x7B** 管实际激活的参数量仅有 130 亿,**在多个基准测试上表现优于或相当于 Llama-2-70B 和 GPT-3.5**。 |
| 13 | + |
| 14 | +--- |
| 15 | + |
| 16 | +## 传统 MoE 架构 |
| 17 | + |
| 18 | +自 MoE 最早被引入 Transformer 架构以来,MoE 主要作为 **前馈网络 (FFN)** 的替代模块使用。通常情况下,MoE 层中的每个专家都直接复制了其所替换的 FFN 结构。然后配备有一个 Router 来训练具体交给哪个专家处理。 |
| 19 | + |
| 20 | + |
| 21 | + |
| 22 | +MoE 主要应用于 FFN 层,而不是自注意力层,原因在于: |
| 23 | + |
| 24 | +- **注意力层**:稀疏性较低,更适用于全局交互。 |
| 25 | +- **FFN 层**:稀疏性较高,更具有领域特性。 |
| 26 | + 其中 DS-MoE 使用 Wikitext 作为任务时,发现:FFN 层的专家仅有 **20%** 被激活 |
| 27 | + 而注意力层激活率高达 **80%**。这种高利用率表明注意力层的核心通讯机制不适用于特异化的专家。反之具有稀疏特性的 FFN 层,具有完整多专家特异化的潜力。 |
| 28 | + |
| 29 | + |
| 30 | + |
| 31 | +--- |
| 32 | + |
| 33 | +## Routing 机制:Dense MoE 与 Sparse MoE |
| 34 | + |
| 35 | + |
| 36 | + |
| 37 | +- **Dense MoE** |
| 38 | + - gate 对于输入 token 使用 **softmax** 路由机制,传递给每个专家一定权重。 |
| 39 | + - 优点:训练稳定。 |
| 40 | + - 缺点:每次都要计算所有专家,计算成本高。 |
| 41 | + |
| 42 | +- **Sparse MoE** |
| 43 | + - 使用 **Top-K** 路由机制,仅激活前 K 个权重最大的专家。 |
| 44 | + - 优点:极大减少计算量,这是目前主流模型(如 GShard、Switch Transformer、Mixtral、DeepSeek-MoE)的策略。 |
| 45 | + - 缺点:Router 训练变复杂,容易出现「热门专家被频繁使用,冷门专家学不到东西」的问题 → **路由坍塌**。 |
| 46 | + - 解决办法:训练中需要引入额外的 **负载均衡损失**。 |
| 47 | + |
| 48 | +--- |
| 49 | + |
| 50 | +## 专家个数选择 |
| 51 | + |
| 52 | +**GLaM (Google, 2021)** 在实验中探索了不同专家数量与 gating 策略的组合: |
| 53 | +发现 **64 个专家(per layer)+ Top-2 gating** 在性能和计算效率之间达到了最佳平衡。 |
| 54 | +Top-2 gating 能显著提升效果,相比单一专家更稳定。并且 64 专家的配置在 **zero-shot、one-shot、few-shot** 场景下均表现优异。 所以后续的很多 MoE 工作(如 Mixtral, DBRX, DeepSeekMoE)也基本采用 ≤64 专家的规模,这个设计在实际应用中也具有参考价值。 |
| 55 | + |
| 56 | +--- |
| 57 | + |
| 58 | +## MoE 与 PEFT |
| 59 | + |
| 60 | +近期仍有不少工作专注于 PEFT(参数高效微调)。 |
| 61 | +论文 [_Pushing Mixture of Experts to the Limit: Extremely Parameter Efficient MoE for Instruction Tuning_](https://arxiv.org/abs/2309.05444) 首次提出将 **LoRA 类型的 PEFT 方法和 MoE 框架结合**。 |
| 62 | +其主要理念为,不直接在整个大模型上加 LoRA,而是专门在 MoE 的 expert 模块里应用 LoRA。因为 MoE 的每个专家就是 FFN(MLP),它们是知识写入的关键位置。这样每次只动一小部分 LoRA experts,并且大大增强了这种架构的易扩展性。 |
| 63 | + |
| 64 | + |
| 65 | + |
| 66 | +该方法的核心思想是利用 **低秩近似更新** 来避免高级算力的微调。 |
| 67 | + |
| 68 | +1. **输入 (Input → Embedding)** |
| 69 | + - 输入 token(字或子词)先经过 Embedding。 |
| 70 | + - 这部分和普通 Transformer 一样。 |
| 71 | + |
| 72 | +2. **Multi-Head Attention** |
| 73 | + - 输入 embedding 进入多头注意力模块。 |
| 74 | + - 在这里,Q、K、V 一切正常,完全没被 LoRAMoE 改动。 |
| 75 | + - 输出再走 **Add & Norm**,结果传给 FFN。 |
| 76 | + |
| 77 | +3. **FFN → MoE (Expert 路由)** |
| 78 | + - 普通 Transformer 的 FFN 被换成 **LoRA + MoE 专家网络**。 |
| 79 | + - Router 根据输入选择若干专家,每个专家是 **LoRA 化(低秩适配)的模块**,而不是全量可训练的 FFN。 |
| 80 | + - 冻结的部分(❄️)是预训练的大模型主干。 |
| 81 | + - 火花(🔥)表示 LoRA Adapter(可训练参数,低秩矩阵)。 |
| 82 | + - Router 输出的加权组合: |
| 83 | + |
| 84 | + $$ |
| 85 | + y = \sum_i \alpha_i \cdot Expert_i(x) |
| 86 | + $$ |
| 87 | + |
| 88 | + 其中 $\alpha_i$ 是 Router 根据输入算出来的权重。 |
| 89 | + |
| 90 | +4. **输出 (Add & Norm → Residual)** |
| 91 | + - Router 混合后的专家输出,和残差连接一起进入 Add & Norm,继续往后层传。 |
| 92 | + |
| 93 | +--- |
| 94 | + |
| 95 | +#### LoRA 拆解 |
| 96 | + |
| 97 | +LoRA(Low-Rank Adaptation)的核心思想: |
| 98 | + |
| 99 | +对一个大的线性层权重 $W \in \mathbb{R}^{d_{out} \times d_{in}}$,不去训练整个矩阵,而是加上一个低秩近似更新: |
| 100 | + |
| 101 | +$$ |
| 102 | +W' = W + \Delta W, \quad \Delta W = BA |
| 103 | +$$ |
| 104 | + |
| 105 | +- $A \in \mathbb{R}^{r \times d_{in}}, B \in \mathbb{R}^{d_{out} \times r}$ |
| 106 | +- 秩 $r \ll d_{in}, d_{out}$,通常只取个位数到几十 |
| 107 | +- $W$:冻结(❄️,预训练参数) |
| 108 | +- $A, B$:可训练(🔥,参数量大幅减少) |
| 109 | + |
| 110 | +这样,一个输入向量 $x$ 经过 LoRA 线性层时: |
| 111 | + |
| 112 | +$$ |
| 113 | +Wx + BAx |
| 114 | +$$ |
| 115 | + |
| 116 | +等于 **原始主干输出 + 一个小的低秩修正**。 |
| 117 | + |
| 118 | +回到该图,我们可以发现每个专家 $Expert_i$ 不是全新的大 FFN,而是 **一个 FFN 的 LoRA adapter 组合**: |
| 119 | + |
| 120 | +$$ |
| 121 | +Expert_i(x) = B_i A_i x |
| 122 | +$$ |
| 123 | + |
| 124 | +- Router 对输入 hidden state 计算一个分布 $\alpha$,然后加权组合: |
| 125 | + |
| 126 | +$$ |
| 127 | +y = \sum_i \alpha_i \cdot Expert_i(x) |
| 128 | +$$ |
| 129 | + |
| 130 | +- 最终结果再加上主干(冻结的 FFN 权重输出): |
| 131 | + |
| 132 | +$$ |
| 133 | +y_{final} = W_{FFN}x + \sum_i \alpha_i \cdot B_i A_i x |
| 134 | +$$ |
| 135 | + |
| 136 | +--- |
| 137 | + |
| 138 | +作者:**Yang Lewis** |
| 139 | +非商业转载请标明出处。 |
| 140 | +商业转载请联系作者:**840691168ly@gmail.com** |
0 commit comments