卡码笔记-最强八股文
首页
计算机基础
Python
C++
Java
Go
  • ChatGPT充值
  • Claude充值
  • 国内使用Claude
  • 中转站推荐
🔥大模型🔥
  • 大模型面经
  • Java面经
  • C++面经
大模型Github (opens new window)
代码随想录 (opens new window)
首页
计算机基础
Python
C++
Java
Go
  • ChatGPT充值
  • Claude充值
  • 国内使用Claude
  • 中转站推荐
🔥大模型🔥
  • 大模型面经
  • Java面经
  • C++面经
大模型Github (opens new window)
代码随想录 (opens new window)
  • 本栏必读

    • 卡码大模型专栏介绍
  • 大模型面经

  • 大模型动态

  • Claude学习专栏

  • 入门认知

  • Prompt与调用基础

  • RAG检索增强

  • Agent智能体

  • 微调认知

  • 部署与工程化

  • 多模态入门

  • Transformer原理

  • 手撕Transformer

  • 模型家族与Llama架构

# MoE:稀疏模型为什么越来越流行

2023 年底,Mixtral 8×7B 发布,用 8 个专家网络实现了接近 GPT-3.5 的效果,但激活参数只有 13B(8 个专家每次只激活 2 个)。

2024 年初,DeepSeek-V2 发布,用 MoE 架构做到了千亿参数、推理成本只有 GPT-4 的 1/10。

2024 年,Grok、Gemini 1.5、Claude 3 都在用 MoE 架构。

MoE(Mixture of Experts)为什么突然成为主流?

# 一、稠密模型的瓶颈:参数多≠计算多

# 1.1 FFN 占了模型一半以上的参数

回顾 Transformer Block 的结构:

输入
  ↓
Multi-Head Self-Attention
  ↓
Add & Norm
  ↓
FFN(维度: d_model → 4 × d_model → d_model)
  ↓
Add & Norm
  ↓
输出
1
2
3
4
5
6
7
8
9
10
11

FFN 的参数量远大于 Attention:

  • Attention 的参数:4 × d_model × d_model(W_Q, W_K, W_V, W_O)
  • FFN 的参数:2 × d_model × 4 × d_model = 8 × d_model²

以 Llama-7B 为例(d_model=4096):

  • Attention 参数:4 × 4096 × 4096 = 67M
  • FFN 参数:8 × 4096² = 134M

FFN 的参数量是 Attention 的 2 倍。

整个模型有 32 层,FFN 的总参数占比超过 60%。

# 1.2 稠密模型的问题:每个 Token 都要过所有参数

在标准 Transformer 里,每个 Token 都要经过完整的 FFN:

  • 输入一个 Token,FFN 的所有参数都要参与计算
  • 输入 100 个 Token,FFN 的所有参数都要计算 100 遍

但不是所有 Token 都需要同样的计算:

  • 处理「我爱吃麻辣烫」,需要的是「中文语义理解」
  • 处理「print("Hello")」,需要的是「代码生成」
  • 处理「1+1=?」,需要的是「算术推理」

能不能让不同的 Token 走不同的 FFN 路径?

这就是 MoE 的核心思想。

# 二、MoE 的核心思想:用多个专家,每次只激活部分

# 2.1 把一个 FFN 换成 N 个专家

MoE 把标准 Transformer 的单个 FFN 替换成 N 个专家网络(Expert)+ 一个门控路由(Router)。

标准 Transformer Block:
输入 → Attention → FFN → 输出

MoE Transformer Block:
输入 → Attention → [Router + N 个 Expert] → 输出
1
2
3
4
5

每个 Expert 就是一个独立的 FFN,结构和标准 FFN 一样:

输入(d_model) → W1(d_model → 4 × d_model) → 激活函数 → W2(4 × d_model → d_model) → 输出
1

关键点:每个 Token 不走所有 Expert,只走其中 K 个(通常 K=1 或 K=2)。

# 2.2 Router 决定每个 Token 走哪些 Expert

Router 是一个简单的线性层 + Softmax:

输入:Token 的向量(d_model)
输出:N 个 Expert 的得分(Softmax 后的概率分布)
1
2

例如有 8 个 Expert,Router 输出:

[0.02, 0.45, 0.03, 0.38, 0.05, 0.02, 0.03, 0.02]
1

取得分最高的 K 个 Expert(如 Top-2:Expert-1 和 Expert-3),其他 Expert 不激活。

每个 Token 只经过 K 个 Expert 的计算,参数利用率是 K/N。

# 2.3 稀疏激活:参数多,计算少

假设模型有 8 个 Expert,每次只激活 2 个(Top-2):

  • 总参数量:8 个 Expert 的参数总和
  • 激活参数量:2 个 Expert 的参数(25%)
  • 实际计算量:只有 2 个 Expert 在算(25%)

这就是"稀疏激活"(Sparse Activation):

  • 模型参数很多(8 个 Expert)
  • 每次计算只用一部分(2 个 Expert)
  • 参数多≠计算多

对比稠密模型:

  • 稠密模型:100% 参数都激活
  • MoE 模型(8 Expert,Top-2):25% 参数激活

MoE 在相同计算量下,可以用更多参数,达到更大模型的效果。

# 三、MoE 的数据流:一个例子

假设输入句子「我爱吃麻辣烫」,经过 Attention 后,每个词得到一个向量。

现在进入 MoE 层,有 4 个 Expert,每次激活 Top-1。

# 3.1 Router 给每个 Token 打分

Token Expert-0 Expert-1 Expert-2 Expert-3 选择的 Expert
我 0.1 0.6 0.2 0.1 Expert-1
爱 0.3 0.5 0.1 0.1 Expert-1
吃 0.2 0.1 0.5 0.2 Expert-2
麻辣烫 0.1 0.2 0.6 0.1 Expert-2

Router 自动学会了:

  • Expert-1 擅长处理抽象词(「我」「爱」)
  • Expert-2 擅长处理具象词(「吃」「麻辣烫」)

# 3.2 每个 Token 只过自己选中的 Expert

「我」 → Expert-1 → 输出1
「爱」 → Expert-1 → 输出2
「吃」 → Expert-2 → 输出3
「麻辣烫」 → Expert-2 → 输出4
1
2
3
4

Expert-0 和 Expert-3 在这个句子里完全没被激活,参数利用率是 50%(2/4)。

# 3.3 如果是 Top-2 激活呢?

每个 Token 选得分最高的 2 个 Expert,并用加权求和:

Token Expert-1 权重 Expert-2 权重 输出
我 0.6 0.2 0.6 × Expert-1(我) + 0.2 × Expert-2(我)
爱 0.5 0.3 0.5 × Expert-1(爱) + 0.3 × Expert-0(爱)
吃 0.5 0.2 0.5 × Expert-2(吃) + 0.2 × Expert-0(吃)
麻辣烫 0.6 0.2 0.6 × Expert-2(麻辣烫) + 0.2 × Expert-1(麻辣烫)

每个 Token 的输出是 2 个 Expert 输出的加权和,权重就是 Router 的得分。

# 四、MoE 的核心挑战:负载均衡(Load Balancing)

# 4.1 问题:Router 可能只选一个 Expert

如果不加限制,Router 可能学会了只用一个 Expert 处理所有 Token:

Token Expert-0 Expert-1 Expert-2 Expert-3 选择
我 0.9 0.05 0.03 0.02 Expert-0
爱 0.85 0.07 0.05 0.03 Expert-0
吃 0.88 0.06 0.04 0.02 Expert-0
麻辣烫 0.92 0.04 0.03 0.01 Expert-0

所有 Token 都走 Expert-0,其他 Expert 闲置——这就退化成了单个 FFN,MoE 失效了。

# 4.2 解决方法:Load Balancing Loss

在训练时加一个 Load Balancing Loss,惩罚 Expert 使用不均衡的情况。

定义:

  • fif_ifi​:Expert-i 被选中的次数占比
  • PiP_iPi​:所有 Token 对 Expert-i 的平均得分

Load Balancing Loss:

Lbalance=α⋅N⋅∑i=1Nfi⋅PiL_{\text{balance}} = \alpha \cdot N \cdot \sum_{i=1}^N f_i \cdot P_i Lbalance​=α⋅N⋅i=1∑N​fi​⋅Pi​

直觉:

  • 如果 Expert-i 经常被选中(fif_ifi​ 大),但得分不高(PiP_iPi​ 小),说明它在"承担不擅长的任务"
  • 如果 Expert-i 很少被选中(fif_ifi​ 小),但得分很高(PiP_iPi​ 大),说明 Router 没有充分利用它

加上这个 Loss,Router 会学会让每个 Expert 的负载尽量均衡。

# 4.3 其他负载均衡策略

Capacity Factor(容量因子):

  • 给每个 Expert 设一个最大容量(如每个 Expert 最多处理 20% 的 Token)
  • 超过容量的 Token 被丢弃或分配给其他 Expert

Expert Choice(专家主动选择):

  • 传统 MoE:Token 选 Expert
  • Expert Choice:Expert 选 Token(每个 Expert 选得分最高的 K 个 Token)
  • 天然保证负载均衡(每个 Expert 选同样多的 Token)

# 五、MoE 的变体:Switch Transformer、Mixtral、DeepSeek-V2

# 5.1 Switch Transformer(2021,Google)

核心改动:每个 Token 只激活 Top-1(一个 Expert)。

优势:

  • 推理更快(每个 Token 只过 1 个 Expert)
  • 参数利用率低(N 个 Expert,只有 1/N 被激活)

效果:Switch-XXL(1.6T 参数)在很多任务上超过 GPT-3(175B 参数),但推理速度更快。

# 5.2 Mixtral 8×7B(2023,Mistral AI)

架构:

  • 8 个 Expert,每个是 7B 参数的 FFN
  • 每个 Token 激活 Top-2
  • 总参数:56B(8 × 7B)
  • 激活参数:14B(2 × 7B)

效果:

  • 在 Llama-2 70B 的性能上,推理速度快 6 倍
  • 成本只有 GPT-3.5 的 1/5

# 5.3 DeepSeek-V2(2024,DeepSeek)

架构:

  • 64 个 Expert,每个 Token 激活 Top-6
  • 总参数:236B
  • 激活参数:21B
  • 创新:Multi-Head Latent Attention(MHLA)+ MoE,进一步降低推理成本

效果:

  • 性能接近 GPT-4
  • 推理成本只有 GPT-4 的 1/10

# 5.4 Grok-1(2024,xAI)

架构:

  • 8 个 Expert,每个 Token 激活 Top-2
  • 总参数:314B
  • 激活参数:86B

特点:

  • 开源(Apache 2.0 协议)
  • 训练数据包含 Twitter(现 X)的实时数据

# 六、MoE vs 稠密模型:各有什么优劣

稠密模型(如 Llama) MoE 模型(如 Mixtral)
参数利用率 100%(所有参数都激活) 低(如 25%,Top-2 激活 8 个中的 2 个)
推理速度 慢(所有参数都要算) 快(只算激活的 Expert)
显存占用 高(所有参数都要加载) 更高(所有 Expert 都要加载到显存)
训练难度 简单 难(负载均衡、Expert 崩溃)
模型容量 受限于计算量 更大(相同计算量可以用更多参数)
适合场景 通用任务 长文本、多领域、推理密集任务

MoE 的核心优势:

  • 推理快:每个 Token 只过部分 Expert
  • 模型容量大:相同计算量可以用更多参数,学到更多知识

MoE 的核心劣势:

  • 显存占用高:所有 Expert 都要加载到显存,即使只激活一部分
  • 训练难:负载均衡、Expert 崩溃(某些 Expert 完全不被选中)

# 七、MoE 为什么是大模型的未来

# 7.1 规模定律遇到瓶颈

OpenAI 的 Scaling Law 发现:模型能力随参数量和计算量呈幂律增长。

但计算量增长有上限:

  • GPT-3(175B)训练一次需要几千万美元
  • GPT-4(据传 1.76T)训练一次可能上亿美元

如果要继续扩大模型,就必须降低计算量——MoE 是唯一的路。

# 7.2 推理成本是商业化的关键

ChatGPT 每天几千万用户,每次请求都要跑一遍模型。

推理成本 = 每次请求的计算量 × 请求次数

MoE 的推理成本只有稠密模型的 1/4(Top-2 激活 8 个中的 2 个)。

DeepSeek-V2 的推理成本只有 GPT-4 的 1/10,这是商业上的巨大优势。

# 7.3 多领域知识的天然表示

不同的 Expert 可以学到不同领域的知识:

  • Expert-0:中文语义
  • Expert-1:英语语法
  • Expert-2:数学推理
  • Expert-3:代码生成

这比用一个巨大的 FFN 学所有领域更高效。

# 八、MoE 的训练和推理细节

# 8.1 训练时的通信开销

MoE 的训练需要大量的跨设备通信:

  • 每个 Token 的 Router 输出需要发送给所有设备
  • 每个 Expert 可能在不同的 GPU 上
  • Token 需要路由到对应的 GPU,计算完再传回来

这导致 MoE 的训练比稠密模型慢很多(通信开销大)。

优化方法:

  • Expert 并行:把不同 Expert 放在不同 GPU 上
  • Data 并行:同一个 Expert 在多个 GPU 上复制

# 8.2 推理时的显存占用

MoE 推理时所有 Expert 都要加载到显存,即使每次只激活一部分。

例如 Mixtral 8×7B:

  • 总参数:56B
  • 激活参数:14B
  • 显存占用:按 56B 算(所有 Expert 都要加载)

这是 MoE 的最大劣势——推理时显存占用比稠密模型高。

解决方法:

  • Expert 卸载:把不常用的 Expert 放在 CPU 内存,需要时再加载到 GPU
  • 量化:用 INT8 或 INT4 量化 Expert,降低显存占用

# 九、总结

MoE 的核心是 稀疏激活:

  • 用多个专家网络(Expert)替代单一 FFN
  • 每个 Token 只激活其中 K 个 Expert
  • 参数多≠计算多,在相同计算量下可以用更多参数

MoE 的核心优势:

  1. 推理快:每个 Token 只过部分 Expert
  2. 模型容量大:相同计算量可以学到更多知识
  3. 多领域知识的天然表示:不同 Expert 学不同领域

MoE 的核心挑战:

  1. 负载均衡:Router 可能只选一个 Expert,用 Load Balancing Loss 解决
  2. 显存占用高:所有 Expert 都要加载到显存
  3. 训练难:通信开销大、Expert 崩溃

为什么 MoE 是大模型的未来:

  • 规模定律遇到瓶颈,必须降低计算量
  • 推理成本是商业化的关键,MoE 推理成本低
  • DeepSeek、Mixtral、Grok 都在用 MoE,这是主流方向

下一篇我们手撕一个极简 MoE-FFN,看看 Router 和 Expert 的代码实现。


相关文章:

  • FFN 和 LayerNorm(理解标准 FFN)
  • Transformer Block(理解 MoE 在 Block 里的位置)
  • 手撕 MoE-FFN(下一篇,代码实现)
Last Updated: 10/24/2026, 10:55:19 AM

评论

验证登录状态...

侧边栏 侧边栏
夜间模式 夜间
卡码简历 卡码简历
代码随想录 代码随想录
卡码投递表 卡码投递表🔥
2026实习校招群 2026群
添加客服微信 2026实习校招客服微信 PS:通过微信后,请发送姓名-学校-年级-2026实习/校招
支持卡码笔记 支持卡码笔记
鼓励/支持/赞赏Carl 卡码笔记赞赏码
1. 如果感觉本站对你很有帮助,也可以请Carl喝杯奶茶,金额大小不重要,心意已经收下
2. 希望大家都能梦想成真,有好的前程,加油💪