Files
note_sync/大模型/MoE 混合专家架构.md

290 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# MoE 混合专家架构
> Mixture of Experts — 用稀疏激活实现"参数量 vs 计算量"的解耦,是 DeepSeek V4、GPT-4、Mixtral 等旗舰模型的核心架构
---
## 一、为什么要 MoE?
### 密集模型的困境
传统 Transformer 中,每个 Token 流经**所有** FFN [^FFN] 参数:
```
Token → FFN(全部参数参与计算)→ 输出
```
参数量越大 → 每次推理计算量越大 → 训练和推理成本线性增长。
### MoE 的核心思想
> **"参数多,但每次只用一小部分"**
```
Token → 路由器 → 选择最相关的几个专家 → 只激活它们 → 输出
↑
其他专家保持休眠
```
| | 密集模型 | MoE 模型 |
|---|---|---|
| **总参数量** | 100B | 可以到 1.6T(16倍) |
| **每次推理计算量** | 100B | 仅约 36B |
| **训练效率** | 基准 | 更高(同算力下能训练更大模型) |
| **推理延迟** | 基准 | 需要加载更多权重到显存 |
---
## 二、MoE 层的工作原理
### 数学公式
$$
\text{MoE}(x) = \sum_{i \in \text{TopK}(G(x), k)} G(x)_i \cdot E_i(x)
$$
其中:
| 符号 | 含义 |
|---|---|
| `G(x)` | 路由器/门控网络,输出每个专家的"置信度分数" |
| `TopK(G, k)` | 选择分数最高的 k 个专家(通常 k=2~8) |
| `E_i(x)` | 第 i 个专家(一个 FFN [^FFN] 子网络) |
| `G(x)_i` | Softmax 归一化后的专家权重 |
### 一句话总结
> 输入 Token → 路由器打分 → 选 Top-K 专家 → 加权合成输出
### 结构图解
```
输入 Token x
│
▼
┌───────────┐
│ 路由器 G │ ← 一个小型线性层,输出 N 个分数
│ (Gate) │ (N = 专家总数)
└─────┬─────┘
│ Softmax 归一化
│ 选出分数最高的 k 个
▼
┌─────────────────────────────────────┐
│ N 个专家(Expert) │
│ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐│
│ │ E₁ │ │ E₂ │ │ E₃ │... │ Eɴ ││
│ │💤 │ │🔥 │ │💤 │ │🔥 ││
│ └─────┘ └──┬──┘ └─────┘ └──┬──┘│
│ │ │ │
│ 只激活 k=2 个专家! │ │
└─────────────┼─────────────────┼─────┘
│ │
└─── 加权求和 ────┘
│
▼
输出 MoE(x)
```
---
## 三、MoE 层 vs 标准 FFN 层
```
标准 Transformer 块: 使用 MoE 的 Transformer 块:
注意力层 [^Attn] 注意力层 [^Attn]
↓ ↓
FFN(全部参数) 路由器 → 选择专家
↓ ↓
注意力层 [^Attn] 被选中的专家(稀疏激活)
↓ ↓
FFN(全部参数) 注意力层 [^Attn]
↓
路由器 → 选择专家
↓
被选中的专家(稀疏激活)
```
> **只在 FFN 层引入 MoE**,注意力层保持不变(注意力机制本身就负责 Token 间信息交互,无需稀疏化)。
---
## 四、关键设计维度
### 1. 专家粒度
| 类型 | 说明 | 示例 |
|---|---|---|
| **粗粒度** | 少量大专家(如 8 个,每个完整 FFN 大小) | 早期 MoE、Mixtral 8×7B |
| **细粒度** | 大量小专家(如 384 个微专家,每个很小) | DeepSeek-V3/V4(64 个微专家/层,激活 6 个) |
细粒度的优势:
- 路由组合更灵活:从 N 选 k 变为 mN 选 mk,组合数暴增
- DeepSeek V4 每层约 **3630 万种**可能的专家组合
- 同等总参数下,每个专家更小,训练/推理更灵活
### 2. 共享专家 vs 路由专家
| 类型 | 说明 |
|---|---|
| **共享专家** | 始终激活,捕捉通用模式(语法、基础常识) |
| **路由专家** | 按 Token 动态选择,负责特定领域(数学、代码、翻译...) |
DeepSeekMoE 采用两层设计:
- 2 个共享专家(always on)
- 62 个路由专家(每个 Token 激活 6 个)
共享专家提升训练稳定性,但可能降低专家专门化程度。
### 3. 路由器设计
```
简单线性路由器(当前主流):
router_logits = W_g · x ← 一个小矩阵,N × d_model
topk_experts = TopK(softmax(router_logits), k)
```
实际推理时的路由模式:
- 每个 Token **独立**路由(不考虑上下文)
- 序列中相邻 Token 可能路由到不同专家
---
## 五、负载均衡 — MoE 的核心挑战
### 问题
> 如果路由器"偷懒",总是选固定的几个专家 → 其他专家闲置 → 退化为密集模型
### 传统方案:辅助损失(Auxiliary Loss)
$$
L_{total} = L_{主任务} + \alpha \cdot L_{负载均衡}
$$
强制惩罚专家使用不均匀的情况。**问题**:梯度冲突,可能导致训练不稳定。
### 2025 前沿:无梯度负载均衡
```python
# 动态偏置调整 — 不干扰主损失梯度
logits_i(t+1) = W_g · x + b_i(t) - γ · (f_i(t)/f̄(t) - 1)
```
其中:
- `f_i(t)`:当前被路由到专家 i 的 Token 比例
- `f̄(t)`:理想平均比例 = 1/N
- 效果:专家使用率的变异系数 < 0.1,无梯度冲突
---
## 六、2025 年前沿进展
### 1. DAG-MoE [^DAG](ICML 2026)
> 不是简单加权平均专家输出,而是把选中的专家排列成**有向无环图(DAG, Directed Acyclic Graph)**,实现结构化的专家聚合(DAG 聚合)
```
传统 MoE: E₁↘
E₂ → 加权平均 → 输出
E₃↗
DAG-MoE: E₁ → E₃ ↘
E₂ → E₄ → E₆ → 输出(信息流经多个专家)
```
- 允许**单层内多步推理**
- 模型学习最优的专家聚合结构(每个输入不同)
- 同等 FLOPs 下更强的表达能力
### 2. MoLE:查找表专家(ICML 2025 Oral)
> 将训练好的 FFN 专家**重新参数化**为查找表(LUT),专家计算变为查表操作
- 推理速度接近密集模型
- 大幅降低显存占用
- 使 MoE 在内存受限设备上部署成为可能
### 3. MoE + MLA(Multi-head Latent Attention,多头潜在注意力) [^MLA]
正交瓶颈联合优化:
| 瓶颈 | 方案 |
|---|---|
| FFN 计算量大 | MoE 稀疏激活 |
| 注意力 KV 缓存大 | MLA 低秩压缩 |
- ρ = 1/2 时:KV 缓存减少 **68%**,推理加速 **3.2×**
- 困惑度仅下降 0.8%
- DeepSeek V4 使用此组合
### 4. MoE-X:可解释 MoE(ICML 2025)
- 将 MoE 层理解为等效的大型稀疏 MLP
- 强制专家内部也做稀疏激活
- 可解释性超越 Sparse Autoencoder(SAE)方法
---
## 七、主流 MoE 模型对比
| 模型 | 总参数 | 激活参数 | 专家数 | 激活数 | 特点 |
|---|---|---|---|---|---|
| **Mixtral 8×7B** | 46.7B | 12.9B | 8 | 2 | 经典粗粒度 MoE |
| **DeepSeek-V3** | 671B | 37B | 256 | 8 | 细粒度 + 共享专家 |
| **DeepSeek-V4 Pro** | 1600B | 36B | 384/层 | 6 | 细粒度 + MLA + DSpark |
| **DeepSeek-V4 Flash** | 284B | 13B | 精简 | 精简 | Pro 的轻量版 |
| **GPT-4**(传闻) | 1.8T | ~280B | 16(推测) | 2 | 早批大规模 MoE |
> 趋势:专家数量越来越多,每个专家越来越小(细粒度),激活参数占比越来越低。
---
## 八、MoE 的代价
| 代价 | 说明 |
|---|---|
| **显存占用** | 所有专家都在 VRAM 里,即使大部分不激活 → 需要更多 GPU |
| **通信开销** | 多 GPU 部署时,Token 需要跨 GPU 路由到专家 |
| **训练不稳定** | 负载均衡损失与主损失可能冲突 |
| **微调困难** | 稀疏激活 → 梯度更稀疏 → 微调更难收敛 |
| **批次大小** | 每个专家实际收到的 Token 少 → 需要较大 batch size |
---
## 九、总结
```
MoE = 用路由器在大量专家中选择少数激活,实现"参数膨胀但计算可控"
关键取舍:
优势:同等算力下更大的模型容量、更好的性能/成本比
代价:更高显存、更复杂的工程、训练和微调挑战
2025 年趋势:
细粒度 → DAG 聚合 → 可解释 → 查找表推理 → 与 MLA 协同
```
---
## 相关链接
- [[Transformer 架构详解]]
- [[大模型架构基础]]
- [[DeepSeek V4 系列]]
---
---
## 脚注
[^FFN]: **FFN(Feed-Forward Network,前馈神经网络)**:Transformer 中每个位置的独立全连接子网络。结构为两层 MLP:`W₂ · Act(W₁ · x + b₁) + b₂`,参数量约占整个 Transformer 块的 2/3,是模型"知识存储"的主要位置。现代模型多使用 SwiGLU 激活的变体。详见 [[FFN 前馈网络详解]]。
[^Attn]: **注意力层(Attention Layer)**:Transformer 的核心机制,负责 Token 之间的信息交互。通过 Q(Query)、K(Key)、V(Value)三个投影矩阵,让每个 Token "看到"并加权所有其他 Token,从而捕获上下文依赖关系。多头注意力(Multi-Head Attention)并行运行多组 Q/K/V,每组关注不同的语义模式。
[^MLA]: **MLA(Multi-head Latent Attention,多头潜在注意力)**:DeepSeek 提出的注意力压缩技术。核心思路是将 K 和 V 首先投影到一个低维潜在空间(`d_latent << d_model`),再从中展开供注意力计算使用。这大幅减少了 KV 缓存的显存占用——在 ρ = 1/2 时可缩减 68%,且对模型质量影响极小(困惑度仅降 0.8%)。MLA 与 MoE 是正交优化:MoE 省 FFN 计算,MLA 省注意力显存,两者叠加效果倍增。
[^DAG]: **DAG 聚合(DAG Aggregation)**:将选中的专家按有向无环图(DAG)的结构进行串联/并联组合,而非传统的简单加权平均。每个输入路由到一组专家后,模型学习这些专家之间最优的信息流动路径——例如 E₁ 的输出作为 E₃ 的输入,E₂ 的输出则直接进入最后阶段。这允许在单层 MoE 内完成**多步推理**,表达能力强于传统加权求和,同等 FLOPs 下能取得更好性能。DAG-MoE 发表于 ICML 2026。