Skip to content

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 章节。