Appearance
Mixture of Experts,混合专家 —— 把一个大 FFN 拆成 256 个小网络,每个 token 只激活 6 个,用"宽度换深度"实现超大参数量但低计算量。
为什么需要 MoE
增大模型参数能提升能力,但每次推理都算遍所有参数的话,计算量随参数线性增长。284B 参数的模型在消费级硬件上无法实时推理。
MoE 的思路:参数可以多,但每次只用一小部分。就像一个公司有 256 个专家,每次只派 6 个相关领域的专家处理任务。
核心原理
输入 token 向量 x
│
↓ Router: x × W_router → 256 个分数 → √softplus → 选 Top-6
│
├→ 专家 17 (权重 0.3): SwiGLU(x) → out₁₇
├→ 专家 42 (权重 0.25): SwiGLU(x) → out₄₂
├→ 专家 89 (权重 0.2): SwiGLU(x) → out₈₉
├→ 专家 134 (权重 0.1): SwiGLU(x) → out₁₃₄
├→ 专家 201 (权重 0.08): SwiGLU(x) → out₂₀₁
├→ 专家 248 (权重 0.07): SwiGLU(x) → out₂₄₈
└→ 共享专家: SwiGLU(x) → out_shared (所有 token 必经)
│
↓ output = Σ(权重ᵢ × outᵢ) + out_shared关键数字:
- 256 个路由专家 + 1 个共享专家
- 每次激活 6/256 ≈ 2.3% 的路由专家
- 43 层 × 6 = 258 次专家调用,通过残差连接逐步积累知识
在 ds4.c 中的实现
c
// Router 打分(ds4.c 约 5023 行)
matvec_any(logits, model, layer->ffn_gate_inp, x); // x × W → 256 分数
// 路由激活(ds4.c 约 5035 行)
for (int i = 0; i < DS4_N_EXPERT; i++)
probs[i] = sqrtf(softplus_stable(logits[i]));
// Top-K 选择(ds4.c 约 5065 行)
topk_desc(selection, DS4_N_EXPERT, DS4_N_EXPERT_USED, selected); // 256 选 6两种路由策略:
| 层 | 策略 | 原理 |
|---|---|---|
| 前 3 层 | Hash 路由 | token ID → 查找表 → 固定专家,零计算开销 |
| 第 4-42 层 | Top-K 路由 | 线性层算分数 → 选最高的 6 个 |
非对称量化:路由专家用 IQ2_XXS/Q2_K(~2 bit),共享专家用 Q8_0(8 bit),因为共享专家每个 token 都用,需要更高精度。
PRO 模型的 MoE
DeepSeek V4 PRO 是更大的模型变体(DS4_VARIANT_PRO),MoE 规模远大于 Flash:
- 384 个路由专家(vs Flash 的 256),每个 token 仍激活 6 个
- 路由专家全部使用 Q4_K 量化(~4.5 bit),比 Flash 的 IQ2_XXS 精度更高
- 61 层(vs Flash 的 43 层),FFN 中间维度 3072
- 需要通过 分布式推理 跨多台机器运行
相关概念
- softmax — Router 用 sqrt(softplus(x)) 归一化分数(非标准 softmax)
- kv-cache — MoE 层和注意力层在单层前向中串联执行
- gguf — 不同专家的权重使用不同量化级别存储在 GGUF 中
- ssd-streaming — 利用 MoE 稀疏激活,只缓存热专家到 RAM,冷专家从 SSD 按需加载
详见 Part 3 — MoE 混合专家 和 LLM 核心架构概念 的 MoE 章节。