第16章 MoE:混合专家架构
本章目标
理解现代大模型为什么要用 MoE(Mixture of Experts):它到底怎么计算、为什么有效、为什么难训练、为什么需要负载均衡,以及为什么 DeepSeek、Mixtral 这样的模型能把 MoE 做得如此激进。
上一章我们看到,Qwen、Llama、DeepSeek 相比原始 Transformer 做了一系列改进:RoPE、RMSNorm、GQA、KV Cache、FlashAttention。这些改进大多是在优化 Attention。而本章要讲的 MoE,优化的是另一半——FFN。
MoE 是现代大模型(尤其是 DeepSeek 系列)最核心的架构创新之一。它回答了一个非常关键的问题:
能不能让模型拥有非常多的参数,但每个 Token 只使用其中一小部分?
16.1 从 Dense FFN 到稀疏专家
先回忆普通 Transformer 的 FFN。一个 Transformer Block 大致是:
Dense 模型里,所有 Token 都经过同一个 FFN:
MoE 的核心变化是:把这一个固定的 FFN,换成多个 FFN + 一个动态路由:
用一句话概括这个变化:
一个固定 FFN → 多个 FFN + 动态路由
这里要特别强调一点,否则很容易产生误解:
MoE 通常不是把整个 Transformer 复制成多个模型,而主要是把 FFN / MLP 部分专家化。 Attention 部分通常保持不变。
所以不要把"160 个专家"理解成"160 个完整的 Transformer",而是"某个 FFN 层里有 160 个并列的 FFN 子网络"。
16.2 Dense FFN 为什么会成为瓶颈?
传统 Dense FFN 的计算是:
FFN(x)=W2 σ(W1x)\text{FFN}(x) = W_2 \, \sigma(W_1 x)FFN(x)=W2σ(W1x)
所有 Token 都经过同一套参数 W1,W2W_1, W_2W1,W2。也就是说:
每一个 Token 都使用同一套参数。
假设模型有 100B 参数,那么每个 Token 都必须经过对应的大量计算。这导致一个非常关键的绑定关系:
模型参数量 ⟺ 每 Token 计算量\boxed{\text{模型参数量} \;\Longleftrightarrow\; \text{每 Token 计算量}}模型参数量⟺每 Token 计算量
想让模型更"聪明"(更多参数),每个 Token 的计算成本就会同比上升。这正是 Dense 架构的根本瓶颈。
16.3 MoE 的核心思想
MoE 把 FFN 复制成多个 Expert(Expert 1、Expert 2、……、Expert N),然后规定:
每个 Token 只选择少量 Expert。
例如总共 64 个 Expert,每个 Token 只激活 2 个:
于是就得到 MoE 最重要的性质:
总参数量可以很大但每 Token 的计算量不需要同比增加\boxed{\text{总参数量可以很大} \quad\text{但每 Token 的计算量不需要同比增加}}总参数量可以很大但每 Token 的计算量不需要同比增加
这就是"参数规模"和"计算规模"的解耦——本章后面会反复回到这个核心。
16.4 Router 到底在做什么?
Router(路由器)可以理解成:
决定"这个 Token 应该交给哪些专家处理"。
它的输入是一个 Token 的隐藏状态 x∈Rdx \in \mathbb{R}^{d}x∈Rd,通过一个小矩阵 WrW_rWr 打分后做 softmax:
g(x)=softmax(xWr)=[p1,p2,…,pN]g(x) = \text{softmax}(x W_r) = [p_1, p_2, \ldots, p_N]g(x)=softmax(xWr)=[p1,p2,…,pN]
得到每个 Expert 的分数。例如:
| Expert | Score |
|---|---|
| E1 | 0.05 |
| E2 | 0.02 |
| E3 | 0.61 |
| E4 | 0.12 |
| E5 | 0.20 |
| … | … |
如果 Top-K = 2,就选出分数最高的 E3 和 E5,最终输出是这两个 Expert 结果的加权和:
y=p3 E3(x)+p5 E5(x)y = p_3 \, E_3(x) + p_5 \, E_5(x)y=p3E3(x)+p5E5(x)
整个 Router 的流程可以画成:
16.5 MoE 在 Transformer 中的位置:每层独立的专家团队
前面讲的都是"一个 MoE 层"内部发生了什么。但一个完整的 Transformer 有几十个 Block,MoE 到底装在哪里、各层之间是什么关系?这是初学者最容易混淆的地方。
先说结论:
在典型的 Transformer-based MoE 模型中,MoE 通常是替换某些 Transformer Block 里的 FFN / MLP 子层;如果每个 Block 都采用 MoE,那么每个 Block 都有自己独立的一组 Experts 和自己的 Router。
16.5.1 普通 Transformer vs MoE Transformer
普通 Transformer 里,每个 Block 是 Attention + 一个 FFN。假设有 32 个 Block,这 32 个 FFN 本来就是不同的参数。MoE Transformer 只是把其中的 FFN 换成"Router + 多个 Expert":
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/richard_first/article/details/164508186




