跳至内容
Fubune's Wiki
用户工具
登录
站点工具
搜索
工具
显示页面
过去修订
反向链接
最近更改
媒体管理器
网站地图
登录
>
最近更改
媒体管理器
网站地图
您的足迹:
moe
本页面只读。您可以查看源文件,但不能更改它。如果您觉得这是系统错误,请联系管理员。
====== MoE ====== **MoE(Mixture of Experts,混合专家模型)**是一种通过多个 Expert(专家)和 Router(路由器)实现**条件计算(Conditional Computation)**的神经网络架构。 MoE 最早由 **Robert A. Jacobs、Michael I. Jordan、Steven J. Nowlan 和 Geoffrey E. Hinton** 于 **1991 年**提出。他们在论文 ''Adaptive Mixtures of Local Experts'' 中提出了 Mixture of Experts 的基本思想。该论文发表于 **Neural Computation**,作者来自 MIT 和多伦多大学等研究机构。 早期 MoE 的思想是:让多个 Expert 分别学习处理输入空间中的不同区域,再通过一个 **Gating Network(门控网络)**根据输入决定应该使用哪些 Expert。 现代 [[大语言模型]] 中使用的 MoE 则主要是在这一思想基础上发展出来的 **Sparse MoE(稀疏混合专家模型)**。2017 年,Google 的 **Noam Shazeer 等人**发表 ''Sparsely-Gated Mixture-of-Experts'',将稀疏门控机制用于大规模神经网络,使模型能够拥有巨大的总参数量,同时只激活其中少数 Expert。此后,[[GShard]]、[[Switch Transformer]]、[[Mixtral]]、[[DeepSeek MoE]] 等工作进一步推动了 MoE 在大规模 [[Transformer]] 和 [[大语言模型]] 中的发展。 MoE 的核心思想可以概括为: **模型拥有很多 Expert,但每次处理一个 Token 时,只让其中少数 Expert 参与计算。** 因此,MoE 可以在一定程度上将**模型容量**与**计算量**解耦。 ===== MoE 的历史 ===== MoE 的发展可以大致分为三个阶段。 **第一阶段:1991 年,Mixture of Experts** Jacobs、Jordan、Nowlan 和 Hinton 提出了 ''Adaptive Mixtures of Local Experts''。 其基本结构为: 输入 → Gating Network → 选择 Expert → 输出 Gating Network 根据输入决定不同 Expert 的权重,使不同 Expert 可以学习输入空间中的不同区域。 这一阶段的 MoE 主要用于**模块化学习**和**条件计算**。 **第二阶段:2017 年,Sparse MoE** Shazeer 等人在 Google 发表 ''Sparsely-Gated Mixture-of-Experts''。 这一工作的关键变化是: **不再让所有 Expert 都参与计算,而是只选择少数几个 Expert。** 这使得模型可以拥有大量参数,同时避免计算量随着 Expert 数量完全同步增长。 **第三阶段:大规模 Transformer 与 LLM** 随着 [[Transformer]] 成为主流架构,MoE 开始被大量应用于大规模语言模型。 代表性工作包括: * [[GShard]]:研究大规模 Transformer 和 MoE 的分布式训练。 * [[Switch Transformer]]:采用 Top-1 Routing,进一步简化 MoE 路由。 * [[Mixtral]]:将稀疏 MoE 应用于开放权重大语言模型。 * [[DeepSeek MoE]]:研究细粒度 Expert、共享 Expert 等结构。 因此,今天大语言模型中的 MoE 并不是 2017 年才出现的概念,而是**1991 年提出的 Mixture of Experts 思想经过稀疏化、大规模训练和分布式系统优化之后形成的现代架构**。 ===== 核心思想 ===== 传统的稠密模型(Dense Model)中,每个 Token 都需要经过模型中的主要计算模块。 例如,一个拥有 100B 参数的 Dense 模型,在处理每个 Token 时,都需要执行相应的大规模计算。 MoE 则把原本的一个 FFN 拆成多个 Expert: 输入 Token → Router → 选择 Expert → Expert 计算 → 加权合并 → 输出 例如,一个 MoE 层拥有 64 个 Expert,但 Router 对每个 Token 只选择 2 个 Expert。 那么这个 Token 就不需要经过剩余的 62 个 Expert。 因此: **总参数量可以非常大,而每个 Token 实际激活的参数量相对较小。** 这是 MoE 最重要的设计思想。 ===== Expert ===== **Expert(专家)**是 MoE 中负责实际计算的子网络。 在现代 [[Transformer]] 中,MoE 最常见的做法是将原本的 [[前馈神经网络]](FFN)替换为多个 Expert。 普通 Transformer: 输入 → Self-Attention → FFN → 输出 MoE Transformer: 输入 → Self-Attention → Router → 多个 Expert → 输出 每个 Expert 通常都是一个独立的 FFN。 例如,一个 MoE 层可以拥有 8 个 Expert: * Expert 1 * Expert 2 * Expert 3 * Expert 4 * Expert 5 * Expert 6 * Expert 7 * Expert 8 这些 Expert 通常具有相同或相似的网络结构,但参数不同。 在训练过程中,不同 Expert 可能逐渐形成不同的功能倾向。 不过,不能简单地把 Expert 理解成: * Expert 1 = 数学 * Expert 2 = 英语 * Expert 3 = 编程 实际情况下,Expert 的分工通常是训练过程中自然形成的,而且未必能够被人类清晰解释。 ===== Router ===== **Router(路由器)**负责决定一个 Token 应该交给哪些 Expert。 假设输入 Token 的隐藏状态为 x。 Router 可以通过一个可学习的线性层计算每个 Expert 的分数: **s = Wᵣx** 其中: * x 是 Token 的隐藏状态。 * Wᵣ 是 Router 的参数。 * s 是各个 Expert 的路由分数。 之后可以通过 [[Softmax]] 将这些分数转换成概率。 第 i 个 Expert 的概率可以表示为: **pᵢ = exp(sᵢ) / Σⱼ exp(sⱼ)** Router 根据这些概率选择若干个 Expert。 例如: Expert 1:0.05 Expert 2:0.62 Expert 3:0.08 Expert 4:0.25 如果使用 Top-2 Routing,就会选择 Expert 2 和 Expert 4。 最终输出可以理解为被选择 Expert 输出的加权组合: **y = Σᵢ∈TopK(x) pᵢEᵢ(x)** 其中 Eᵢ 表示第 i 个 Expert。 ===== Top-K Routing ===== 现代 Sparse MoE 通常不会让一个 Token 同时经过所有 Expert,而是使用 **Top-K Routing**。 例如: * 8 个 Expert,Top-1:每个 Token 只选择 1 个 Expert。 * 8 个 Expert,Top-2:每个 Token 选择 2 个 Expert。 * 64 个 Expert,Top-2:每个 Token 只激活 2 个 Expert。 例如一个 MoE 层有 64 个 Expert,而 Top-K 设置为 2。 那么对于每个 Token: 64 个 Expert → Router → 选择 2 个 Expert 因此只有很少一部分 Expert 实际参与计算。 这就是 **Sparse MoE(稀疏 MoE)** 的核心。 ===== 为什么 MoE 有用 ===== MoE 主要解决 [[大语言模型]] 扩展过程中一个重要的问题: **如何增加模型容量,同时避免计算量按照参数量同比增加?** 对于传统 Dense 模型: 参数量增加 → 每 Token 计算量增加 而对于 Sparse MoE: 总参数量增加 → 模型容量增加 同时保持 Top-K 较小: 每 Token 激活参数量可以维持在相对较低的水平。 因此可以实现: **更大的总参数量 + 相对有限的每 Token 计算量** 例如,一个 MoE 模型可以拥有 1T 总参数,但每个 Token 只激活其中一部分参数。 不过需要特别注意: **总参数量 ≠ 激活参数量 ≠ 推理显存需求** MoE 虽然减少了每 Token 的计算量,但部署时通常仍需要保存全部 Expert 参数,因此模型的显存需求仍然受到总参数量影响。 ===== MoE 与 Transformer ===== MoE 并不是 [[Transformer]] 的替代架构。 现代 MoE 通常是对 Transformer 内部的 FFN 部分进行修改。 普通 Transformer: 输入 → Self-Attention → FFN → 输出 MoE Transformer: 输入 → Self-Attention → MoE-FFN → 输出 因此可以理解为: **Transformer 是整体架构,而 MoE 是一种可以嵌入 Transformer 的稀疏计算机制。** 现代 MoE [[大语言模型]] 仍然可以使用 [[Self-Attention]]、残差连接、[[Layer Normalization]] 等 Transformer 组件。 ===== 稀疏激活 ===== MoE 的关键并不是“拥有很多专家”,而是: **每次计算只激活少数专家。** 例如,一个 MoE 层拥有 64 个 Expert,每个 Token 只选择 2 个。 那么从 Expert 数量来看: 2 / 64 = 3.125% 也就是说,每个 Token 只激活约 3.125% 的 Expert。 当然,这个比例不能直接等同于整个模型的“激活参数比例”,因为模型中还存在 Attention、Embedding、Normalization 等其他参数。 ===== Expert Load Balancing ===== MoE 的一个重要问题是 **Load Imbalance(负载不均衡)**。 假设 Router 总是把大量 Token 分配给少数几个 Expert: Token → Expert 1:大量 Token → Expert 2:大量 Token → Expert 3:很少 Token → Expert 4:几乎没有 那么就会出现: **部分 Expert 过载,而其他 Expert 空闲。** 在分布式训练中,这会进一步造成 GPU 之间的计算负载不均衡。 因此 MoE 通常需要进行 **Load Balancing(负载均衡)**。 一种经典方法是在训练目标中加入 **辅助负载均衡损失(Auxiliary Load Balancing Loss)**,鼓励 Router 更均匀地使用 Expert。 ===== Capacity ===== 为了防止某个 Expert 接收过多 Token,MoE 系统通常会设置 Expert 的 **Capacity(容量)**。 如果一个 Expert 接收到的 Token 数量超过其容量,就可能出现: Token 被丢弃、重新路由,或者采用其他处理方式。 因此,实际 MoE 系统不仅仅是: Router → Expert 还需要处理: Router → Token Dispatch → Expert → Token Combine 这也是 MoE 在工程实现上比普通 FFN 更复杂的重要原因。 ===== MoE 的通信问题 ===== MoE 在大规模训练中的一个重要工程挑战是**通信成本**。 如果不同 Expert 被部署在不同 GPU 上,那么 Router 选择 Expert 后,需要把 Token 发送到对应 GPU。 典型过程是: Token → Router → All-to-All 通信 → Expert → All-to-All 通信 → Token 重组 其中 [[All-to-All]] 通信可能成为整个训练系统的性能瓶颈。 因此 MoE 不只是一个模型结构问题,同时也是一个重要的**分布式训练和系统优化问题**。 ===== MoE 的训练 ===== MoE 通常通过 [[反向传播]] 和 [[梯度下降]]进行训练。 训练过程可以简单理解为: **输入 Token → Router 选择 Expert → Expert 计算 → 得到 Loss → 反向传播 → 更新 Router 和 Expert** 相比普通 Dense 模型,MoE 的训练需要额外考虑: * Router 的学习。 * Expert 的负载均衡。 * Token Dispatch。 * Expert Capacity。 * GPU 之间的通信。 * 路由导致的训练稳定性问题。 ===== Sparse MoE 与 Dense MoE ===== 需要区分 Dense MoE 和 Sparse MoE。 **Dense MoE** 所有 Expert 都参与计算。 **Sparse MoE** 每个 Token 只选择少数 Expert。 现代大语言模型中通常所说的 MoE,主要指 **Sparse MoE**。 如果所有 Expert 都参与计算,那么 MoE 最重要的计算优势就基本不存在了。 ===== MoE 在大语言模型中的应用 ===== MoE 已经成为现代 [[大语言模型]] 扩展模型容量的重要路线之一。 典型思路是: **增加 Expert 数量 → 增加总参数量 → 保持较小的 Top-K → 控制每 Token 计算量** 因此,相比单纯扩大 Dense Transformer,MoE 可以在相近的计算预算下获得更大的模型容量。 代表性的 MoE 模型和研究包括: * [[GShard]] * [[Switch Transformer]] * [[Mixtral]] * [[DeepSeek MoE]] * [[DeepSeek-V2]] * [[DeepSeek-V3]] ===== MoE 的优点 ===== * **高参数容量**:可以拥有非常大的总参数量。 * **稀疏计算**:每个 Token 只激活少数 Expert。 * **计算效率**:在合理设计下,可以用相对有限的计算量获得更大的模型容量。 * **条件计算**:模型可以根据不同输入动态选择计算路径。 * **适合规模扩展**:适合构建超大规模模型。 ===== MoE 的缺点 ===== * **训练复杂度更高**:需要额外处理 Router 和负载均衡。 * **通信成本高**:分布式训练中可能需要大量 All-to-All 通信。 * **显存需求高**:虽然每个 Token 只激活部分 Expert,但通常仍需要保存全部 Expert 参数。 * **负载不均衡**:Router 可能导致部分 Expert 过载。 * **训练稳定性问题**:路由机制增加了优化难度。 * **硬件利用率问题**:Expert 分配不均时可能导致 GPU 利用率下降。 ===== MoE 与模型参数量 ===== 讨论 MoE 模型时,需要区分两个重要概念。 **总参数量(Total Parameters)** 所有 Expert 以及模型其他部分的参数总和。 **激活参数量(Active Parameters)** 处理一个 Token 时实际参与计算的参数量。 例如: 总参数量:1T 激活参数量:100B 这并不意味着模型只有 100B 参数,而是意味着**单个 Token 的计算主要使用约 100B 参数**。 因此,在比较 MoE 模型时,只比较总参数量是不够的,还应该关注: **总参数量 + 激活参数量 + 每 Token FLOPs** ===== MoE 的核心意义 ===== MoE 最重要的意义可以概括为: **把模型容量和计算量部分解耦。** 传统 Dense 模型扩大参数量时,计算量通常也会同步增长。 MoE 则通过 [[条件计算]],让模型根据输入动态决定: **这一次计算应该使用哪些参数。** 因此,MoE 本质上是一种**条件计算架构**。 它的重要性并不只是“把一个模型拆成很多专家”,而是让神经网络具备了**动态选择计算路径**的能力。 这也是 MoE 能够支持超大规模 [[大语言模型]] 的重要原因。 ===== 相关条目 ===== * [[Transformer]] * [[大语言模型]] * [[前馈神经网络]] * [[条件计算]] * [[稀疏激活]] * [[Switch Transformer]] * [[Mixtral]] * [[DeepSeek MoE]] ===== 参考资料 ===== * Jacobs, R. A., Jordan, M. I., Nowlan, S. J. & Hinton, G. E.,''Adaptive Mixtures of Local Experts'',Neural Computation,1991。 * Shazeer, N. et al.,''Sparsely-Gated Mixture-of-Experts'',2017。 * Lepikhin, D. et al.,''GShard: Scaling Giant Models with Conditional Computation and Automatic Sharding'',2020。 * Fedus, W., Zoph, B. & Shazeer, N.,''Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity'',2021。 * Jiang, A. Q. et al.,''Mixtral of Experts'',2024。 * [[https://www.cs.toronto.edu/~hinton/absps/jjnh91.pdf|Adaptive Mixtures of Local Experts]] * [[https://arxiv.org/abs/1701.06538|Sparsely-Gated Mixture-of-Experts]] * [[https://arxiv.org/abs/2006.16668|GShard]] * [[https://arxiv.org/abs/2101.03961|Switch Transformers]] * [[https://arxiv.org/abs/2401.04088|Mixtral of Experts]]
moe.txt
· 最后更改:
2026/09/10 14:16
由
holdsark
页面工具
显示页面
过去修订
反向链接
回到顶部