将 note 笔记库同步到 note_sync,AI_compiler 作为 submodule

This commit is contained in:
ylhan
2026-08-20 17:42:14 +08:00
commit 8a4210f380
44 changed files with 5080 additions and 0 deletions
+289
View File
@@ -0,0 +1,289 @@
# 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。