· LLM 理论精读 · 第 2 / 3 讲

C · MoE 混合专家架构

稠密模型的计算瓶颈,如何通过路由机制 (Router) 激活少量专家实现「总参数量大但计算量不变」,以及 DeepSeek 等模型的改进。

C · MoE 混合专家架构

稠密模型(Dense)激活所有参数来处理每个 token。MoE 把 FFN 层替换为若干个「专家」,每个 token 只路由给其中少数几个,实现「参数量大但计算量不变」的效果。


一、动机:扩大模型但不增加计算

Scaling Law 告诉我们更多参数 = 更强能力,但参数量翻倍意味着推理计算量也翻倍。

MoE 的思路:模型有 NN 个专家,但每次前向传播每个 token 只激活其中 kk 个(通常 k=2k=2)。

典型例子:Mixtral 8×7B 总参数 46.7B,但每个 token 只激活约 13B,推理速度接近 7B 模型,能力接近 70B 模型。


二、架构:把 FFN 换成专家层

标准 Transformer Block:

输入 → Attention → LayerNorm → FFN → 输出

MoE Transformer Block:

输入 → Attention → LayerNorm → Router → [Expert 1, ..., Expert N] → 加权求和 → 输出

其中每个 Expert 就是一个独立的 FFN(两层线性 + 激活),Router 是一个小型线性层,决定每个 token 去哪些专家。


三、路由机制(Router)

3.1 Top-k 路由

对每个 token xx,Router 计算对所有 NN 个专家的得分:

G(x)=Softmax(TopK(xWg, k))G(x) = \text{Softmax}(\text{TopK}(x \cdot W_g,\ k))

其中 WgRd×NW_g \in \mathbb{R}^{d \times N} 是路由权重矩阵,TopK\text{TopK} 保留最高的 kk 个分数,其余置为 -\infty(softmax 后为 0)。

最终输出是被选中的 kk 个专家输出的加权和:

y=iTop-kG(x)iEi(x)y = \sum_{i \in \text{Top-k}} G(x)_i \cdot E_i(x)

3.2 负载均衡问题

朴素的 Top-k 路由有严重的折叠问题(Collapse):Router 倾向于总是选择同几个专家,其他专家得不到训练,逐渐退化。

辅助损失(Auxiliary Loss):给训练目标加一个均衡项,惩罚专家负载不均:

Laux=αNi=1NfiPi\mathcal{L}_{\text{aux}} = \alpha \cdot N \cdot \sum_{i=1}^{N} f_i \cdot P_i

其中:

fiPif_i \cdot P_i 最小化 → 每个专家得到的 token 数量尽可能均等。

3.3 专家容量(Expert Capacity)

为了并行计算,每个专家最多处理固定数量的 token(Expert Capacity):

C=tokens per batchN×capacity_factorC = \frac{\text{tokens per batch}}{N} \times \text{capacity\_factor}

超出容量的 token 被丢弃(或走残差路径)。Capacity Factor 通常设为 1.0~1.5。


四、DeepSeek MoE 的改进

DeepSeek-V2/V3 对标准 MoE 做了重要改进:

4.1 细粒度专家(Fine-grained Experts)

把每个专家拆成更小的专家(Expert Splitting),同时增大 kk

优势:更细粒度的组合,每个 token 能激活更多样化的「能力片段」,同时专家的平均负载更均衡。

4.2 共享专家(Shared Experts)

除了若干路由专家(Routed Experts)外,另设若干共享专家,每个 token 必选:

y=isharedEi(x)+iTop-k(routed)G(x)iEi(x)y = \sum_{i \in \text{shared}} E_i(x) + \sum_{i \in \text{Top-k(routed)}} G(x)_i \cdot E_i(x)

共享专家处理通用能力(语法、基础语义),路由专家处理专业能力(领域知识、推理类型)。减少了路由专家之间的冗余。


五、推理时的工程挑战

问题原因解决方案
专家分散在不同 GPU大 MoE 模型无法放入单 GPU专家并行(Expert Parallelism)
All-to-All 通信开销不同 token 要去不同专家Token 分组、通信与计算重叠
负载不均衡某些专家被选中次数更多动态负载均衡、容量限制
冷启动未被选中的专家参数不更新辅助损失 + 探索机制

六、与稠密模型的对比

维度稠密模型MoE 模型
总参数PPN×PexpertN \times P_{\text{expert}}(大得多)
激活参数PPk×Pexpertk \times P_{\text{expert}}(相当)
推理 FLOPs低(约等于激活参数的稠密模型)
训练稳定性需要辅助损失维持均衡
部署复杂度高(需要专家并行)