详细摘要 摘要

生成:2025-05-13 17:13

摘要详情

音频文件
Stanford CS336 Language Modeling from Scratch | Spring 2025 | 04 Mixture of experts
摘要类型
详细摘要
LLM 提供商
openai
LLM 模型
gemini-2.5-pro-exp-03-25
已创建
2025-05-13 17:13:02

概览/核心摘要 (Executive Summary)

本讲座(Stanford CS336, Spring 2025)深入探讨了“混合专家模型”(Mixture of Experts, MoE)的架构、优势、挑战及最新进展。讲师强调,MoE已成为构建和部署现代高性能语言模型(如Grok, DeepSeek, Llama 4)的关键技术,其核心优势在于能在相似的FLOPs(计算量)下实现比密集模型更优的性能,通过稀疏激活大量参数来提升模型能力,尤其在记忆世界知识方面。

讲座详细解析了MoE的基本原理:将传统Transformer中的前馈网络(FFN)替换为一个路由器(Router)和多个小型FFN(专家),每次前向传播时,路由器仅选择性激活一小部分专家(如top-k)。这带来了参数量增加但计算量(FLOPs)可控的好处。尽管MoE带来了系统复杂性(如多节点训练、路由学习的非微分性、负载均衡),但其性能增益已得到广泛证实。讲座回顾了关键研究(如Fedus et al. 2022, AI2 Olmo),展示了MoE在训练损失和困惑度上的优势。

核心议题包括路由机制(主流为Token Choice Top-K)、专家配置(DeepSeek推广的共享专家和细粒度专家)、训练路由器的挑战及解决方案(如启发式负载均衡损失函数,DeepSeek V3的在线调整b_i因子)。此外,还讨论了MoE的系统级并行(专家并行)、稳定性问题(如使用float32进行路由计算、Z-loss)以及微调挑战(如过拟合和upcycling技术)。最后,以DeepSeek系列模型(V1, V2, V3)为例,详细剖析了其MoE架构的演进和关键技术创新,如分层路由和多头潜在注意力(MLA)。讲座结论指出,MoE因其成本效益,已成为大规模语言模型领域值得学习和应用的核心架构。

引言与MoE的重要性

Speaker 1指出,混合专家模型(MoE)已从一个有趣的附加讲座内容演变为一个至关重要的议题,因为当前(2025年)许多最先进的高性能系统都采用MoE架构。
* 业界采用情况
* Nvidia曾有泄露信息暗示GPT-4可能是MoE架构("GPT moe one bt" [不确定,原文为1bt,可能指1 trillion parameters])。
* Grok、DeepSeek、以及新发布的Llama 4均已采用MoE架构。
* MoE的优势
* 在2025年,MoE相对于密集(Dense)架构的优势已非常明显。
* 在几乎所有计算规模下,良好训练的MoE模型能提供优于密集模型的性能。
* “如果你想在有限的FLOPs下构建最好的模型,理解MoE将非常重要。”

MoE的核心概念与架构

Speaker 1澄清了MoE的常见误解,并解释了其基本工作原理。
* 概念澄清
* MoE并非指专家针对不同领域(如编码专家、英语专家)进行特化。
* 它是一种具有多个子组件(称为“专家”)并进行稀疏激活的特定网络架构。
* “当你思考混合专家时,你应该关注MLPs(多层感知机),这是所有行动发生的地方。”
* 架构对比
* MoE与非MoE架构在大部分组件上相似,主要区别在于前馈网络(FFN)部分。
* 密集模型:FFN是一个单一的大模块。
* 稀疏模型(MoE):将原FFN拆分或复制成多个较小的FFN副本,并引入一个路由器(Router)在每次前向传播中选择其中一小部分(例如top-k)进行激活。
* 示意图解释:用一个选择器层(Selector Layer)和多个小型FFN替代了原先单个大型FFN。
* MoE的核心优势
* 更多参数,相同FLOPs:如果MoE稀疏激活(例如只选一个专家),且该专家大小与原密集FFN相同,则MoE模型与密集模型在前向传播中执行的FLOPs(浮点运算次数)相同。
* “你可以在不影响FLOPs的情况下拥有更多的参数。”
* 这对于需要大量参数来记忆世界知识等任务非常有利。

MoE的性能验证

Speaker 1引用了多项研究来证明MoE在相同FLOPs下的性能优势。
* Fedus et al. (2022) 的研究 (Google)
* 在FLOPs匹配的训练条件下(即训练所用总计算量相同),增加专家数量能持续降低语言模型的训练损失。
* 图表显示:随着专家数量增加(例如到256个),测试损失(test loss)显著下降。
* SwitchBase模型(128个专家)比较:训练时间越长,拥有更多专家的模型能更快达到更优的困惑度(perplexity)。
* 数据点:该研究展示了拥有多个专家可以带来高达“7倍的加速”(原文指性能提升或训练效率,此处指性能)。
* AI2 Olmo 论文
* 在现代架构和规模下,MoE的优势依然存在。Olmo论文进行了仔细的消融实验和对比。
* 图表比较:MoE(粉色线)的训练损失下降速度远快于密集模型(青色线)。
* DeepSeek V2 论文
* 展示了MoE在实际部署系统中的效果。
* X轴为“激活参数量”(activated parameters),Y轴为MMLU性能。
* DeepSeek V2以较少的激活参数实现了非常好的MMLU性能。
* “如果你只关心训练和推理的FLOPs,激活参数量就是关键。”

MoE的系统级优势与复杂性

Speaker 1讨论了MoE在系统层面的好处以及其固有的复杂性。
* 专家并行 (Expert Parallelism)
* MoE提供了新的并行维度。可以将不同的专家放置在不同的设备(如GPU)上。
* 由于专家是稀疏激活的,只需将token路由到相应的设备进行计算。
* “这是一种自然的切割点,可以将你的模型分片到不同的设备上。”
* 这是MoE流行的另一个原因,尤其对于超大规模模型的并行化至关重要。
* 发展历程
* MoE最初在Google等闭源实验室发展。
* 开源领域的MoE成果早期主要来自中国团队,如Qwen和DeepSeek。
* 近期西方开源社区(如Mixtral, Llama)也开始更多地采用MoE。Llama 4也是稀疏MoE架构。
* 早期开源贡献
* Qwen 1.5:是最早进行大规模、良好测试和文档化MoE的模型之一。他们采用了一种“upcycle”(升级改造)技巧,将密集模型转换为MoE,并在计算效率上取得显著提升。
* DeepSeek MoE (原始论文):进行了许多基础性的开源MoE研究,包括对不同路由策略(如naive MoE vs Switch MoE)与密集模型在固定FLOPs下的仔细比较,结果显示从密集到稀疏,各项基准指标均有一致性提升。
* MoE的复杂性与挑战
* 基础设施复杂:MoE的最大优势通常在多节点训练(当模型必须被拆分时)才能体现,此时跨模型分片专家变得自然。
* 路由学习困难:决定将token路由到哪个专家是一个难以学习的非可微(non-differentiable)决策。
* 训练目标不稳定:相关的训练目标要么是启发式的,要么可能不稳定,需要仔细的工程调优。

MoE架构的关键设计选择

Speaker 1详细阐述了MoE设计中的几个核心问题。
* MoE主要应用于FFN
* 经典MoE是将FFN层进行拆分和稀疏路由。
* 虽然理论上也可以对注意力层进行稀疏路由(有少量研究和模型尝试),但这在主流模型中非常罕见,据称更不稳定且难以训练。
* 核心设计问题
1. 如何路由 (Routing Function)
2. 专家数量与大小 (Number and Size of Experts)
3. 如何训练路由器 (Training the Router)?(针对其非可微特性)

路由机制 (How to Route?)

  • 路由类型概述 (Fedus et al. 2022 survey)
    • Token Choice:每个token为其选择亲和度最高的top-k个专家。这是目前绝大多数MoE采用的机制。
    • Expert Choice:每个专家选择亲和度最高的top-k个token。优点是能实现专家间的负载均衡。
    • Global Assignment:通过解决复杂的优化问题来实现专家与token的平衡映射。
  • Token Choice Top-K 的优势
    • Olmo论文的消融实验显示,Token Choice在验证损失(validation loss)上表现更好,损失下降更快。
    • 学生提问:token如何知道哪个专家好?讲师回答:这是路由器的作用,通过计算token的隐藏状态与专家特定向量的内积来评分。
  • Top-K中的K值选择
    • K是一个超参数。早期MoE论文认为K应大于等于2,以实现一定的探索(exploration)。K=1可能导致模型只利用已知最佳的专家。K=2是经典且流行的选择。
    • 选择K个专家意味着FLOPs会相应增加(例如K=2会使FFN部分的FLOPs翻倍,如果专家大小与原FFN相同)。输出通常是这K个专家输出的加权平均或直接求和。
  • 主流Top-K路由实现
    • 几乎所有主流MoE(Switch Transformer, GShard, Grok, Mixtral, DeepSeek各版本)都使用Top-K路由。
    • 过程
      1. 输入 x (残差流中的token表示) 进入路由器。
      2. 路由器计算 x 与每个专家的可学习向量 E_i 的内积(亲和度)。
      3. 通过Softmax归一化得到分数 S_i(t)
      4. 选择得分最高的Top-K个专家,生成门控信号 G_i(t) (非Top-K的专家权重为0)。
      5. 将输入 x 分别送入被选中的K个专家 FFN_i。
      6. 最终输出是K个专家输出的加权和(权重为 G_i(t)),再加上原始输入 x (残差连接)。
        • Output = sum(G_i(t) * FFN_i(x)) + x
    • Softmax的位置:DeepSeek V1/V2, Qwen, Grok 在Top-K选择前使用Softmax。DeepSeek V3, Mixtral, DBRX 则在Top-K选择后对门控值 G_i(t) 进行Softmax(或类似归一化)。这是一个细微的实现差异。
  • 其他路由思想
    • Hashing路由:令人惊讶的是,即使使用哈希函数(无任何语义信息)将token映射到专家,依然能获得性能提升。
    • 强化学习 (RL) 路由:早期MoE工作尝试过,但因计算成本过高和稳定性问题,目前基本无人使用。
    • 最优传输/线性分配:理论上优雅,但实际成本远超收益,未被广泛采用。

专家配置 (Expert Configuration)

  • DeepSeek MoE的创新:共享专家 (Shared Experts) 与细粒度专家 (Fine-grained Experts)
    • 背景:增加专家数量有益,但参数成本也随之增加。
    • 细粒度专家:将每个专家的FFN做得更小。例如,标准FFN的中间层维度是隐藏层的4倍,细粒度专家可能只用2倍。这样可以在总参数量近似的情况下拥有更多专家。
    • 共享专家:引入一个或多个所有token都会经过的MLP,用于处理通用的、共享的计算模式,避免了路由开销。
    • 此配置最初由DeepSeek MoE提出(灵感可能来自DeepSpeed MoE和Qwen)。后续几乎所有开源MoE都采纳了这些创新,尤其是细粒度专家。
  • 效果验证
    • DeepSeek MoE论文消融实验
      • GShard (基础MoE) < GShard + 1个共享专家 < GShard + 1个共享专家 + 细粒度专家。组合使用效果最佳。
      • 图示中,"X out of Y" 表示Y个总专家中激活X个。
    • Olmo论文佐证
      • 细粒度专家从8个增加到32个再到64个,损失持续下降,性能提升明显。
      • 共享专家在Olmo的实验设置中未显示明显增益,因此他们最终未使用共享专家。这表明共享专家的效果可能依赖于具体设置。
  • 常见MoE配置汇总表 (讲师根据近期模型发布整理):
    | 模型/系列 | 总专家数 (Routed) | 激活专家数 (Active) | 共享专家数 | 专家大小比例 (Ratio) | 备注 |
    | ----------------- | ----------------- | ------------------- | ---------- | -------------------- | -------------------------------------- |
    | GShard, Switch-T | 较大 (e.g., 2048) | 1-2 | - | - | 早期Google论文 |
    | Mixtral, DBRX, Grok | 8-16 | 2 | 0 | ~1 (full size) | |
    | DeepSeek MoE V1 | 64 | 6 (fine-grained) | 2 (shared) | 1/4 | 细粒度+共享 |
    | Qwen 1.5, DeepSeek V3, Minimax | 类似DeepSeek V1 | 变化 | 常有 | 细粒度 | 遵循细粒度专家思路 |
    | Olmo, Llama 4 | 较多 | 变化 | Llama 4有 | 细粒度 | Llama 4 (e.g., 128 total, 8 active) |
    • 专家大小比例 (Ratio):指每个路由专家的大小相对于标准密集FFN中间层大小的比例(如标准是hidden_dim4,1/4比例意味着hidden_dim1)。
    • 学生提问关于共享专家数量的直觉:讲师认为,从1个到多个共享专家的收益并不明确,DeepSeek V1用2个共享专家可能是为了保持与激活的细粒度专家大小一致,从而总共有8个大小相似的活跃专家单元。

训练路由器 (Training the Router)

  • 核心挑战:训练时必须保持稀疏性以控制FLOPs,但稀疏的门控决策(选择哪些专家)是不可微的,类似RL问题。
  • 尝试过的方法
    1. 强化学习 (RL):理论上最符合原则,但实际效果不佳,梯度方差大,复杂度高,难以使用。Clark et al. (2020) 的研究显示RL不如其他方法。
    2. 随机近似 (Stochastic Approximations)
      • Shazeer et al. (2017) 提出在计算专家亲和度时加入噪声:H(x) = W_g*x + Normal_noise * W_noiseW_noise是可学习的噪声尺度,用于控制探索-利用平衡。
      • 这能使专家不那么特化,更鲁棒,但也可能损失效率。
      • 这类随机路由技巧在后续研究中被启发式损失方法取代,目前已基本被弃用。
    3. 启发式负载均衡损失 (Load Balancing Losses)这是目前实际应用中最关键和最普遍的技巧。
      • 动机:若无负载均衡,模型倾向于将所有token路由到少数几个专家,导致其他专家“死亡”(从未被激活),浪费参数。
      • Switch Transformer (Fedus et al. 2022) 辅助损失 L_aux
        • L_aux = α * Σ_i (f_i * P_i)
        • f_i:该批次中,路由到专家 i 的token比例。
        • P_i:路由器分配给专家 i 的概率(Softmax输出,Top-K选择前)。
        • 此损失项会惩罚(降低权重)那些被分配了过多token的专家。
      • DeepSeek的平衡策略
        • V1/V2:采用类似的 f_i * P_i 结构,实现了:
          • 每批次专家间负载均衡 (Per-expert balancing per batch)
          • 设备间负载均衡 (Per-device balancing):衡量token到不同设备的分配情况,确保GPU利用率均衡。
        • V3的“无辅助损失”重平衡 (Auxiliary Loss Free Rebalancing)
          • 最初宣称移除了上述专家平衡损失项。
          • 改为在Softmax分数 S_i 上加一个可调整的偏置项 b_iS_i_new = S_i + b_i
          • b_i 通过在线学习调整:若专家 i token过少,则增加 b_i;若过多,则减少 b_i
          • 然而,DeepSeek V3最终还是引入了一个“互补的序列级辅助损失 (complementary sequence-wise auxiliary loss)”,其结构与原先的辅助损失类似,目的是在单个序列级别平衡专家负载,特别是在推理时应对分布外序列。所以并非完全“无辅助损失”。
      • 负载均衡的重要性:Olmo论文的消融实验显示,若移除负载均衡损失,少数专家会主导所有token,其他专家失效,导致整体性能下降。

MoE的系统级实现与考量

  • 专家并行实践
    • 将专家分布在不同设备上。Token经过路由器后,通过集体通信操作(如all-to-all)分发到相应设备上的专家进行计算,然后再收集结果。
    • 如果FFN计算足够密集,可以覆盖通信开销。
  • 设备内稀疏性与硬件加速
    • 即使多个专家在同一设备上,现代GPU和库(如MegaBlocks)可以利用稀疏矩阵乘法优化,有效执行多个小而稀疏的矩阵乘法,避免浪费FLOPs。
  • Token Dropping 带来的随机性
    • 当一个专家接收到的token数量超过其容量(由一个“负载因子”控制)时,多余的token会被丢弃(dropped)。
    • 被丢弃的token对应的MLP计算将为零,仅通过残差连接传递。
    • 这意味着,即使在推理时设置temperature为0,模型的输出也可能因为批处理中其他查询的不同而产生差异(因为哪些token被丢弃可能不同)。这可能是GPT-4在T=0时仍表现出随机性的一个原因。

MoE的稳定性与微调

  • 训练不稳定性:MoE有时会“爆炸”(blow up),尤其在微调时。
    • Barret Zoph等人的研究专门探讨了稳定MoE训练的方法。
    • 稳定技巧
      1. Router计算使用float32精度:Softmax操作对精度敏感。
      2. 辅助Z-loss (Auxiliary Z-loss):对路由器Softmax的logit应用Z-loss (log(sum(exp(logits)))^2),促使其标准化器的值接近1,增强稳定性。移除Z-loss会导致验证损失出现尖峰。
  • 微调挑战
    • 过拟合:MoE参数量巨大,在小规模微调数据上容易过拟合,导致训练集和验证集之间差距较大。
    • 解决方案
      • 交替使用密集层和MoE层:只微调密集层(早期方法,目前不常用)。
      • 使用大量SFT数据:DeepSeek MoE使用了140万个训练样本进行SFT。
  • Upcycling(升级改造)
    • 将一个预训练好的密集模型作为MoE的初始化。具体做法:复制密集模型的MLP层多次(可加扰动),然后从头初始化路由器,再进行训练。
    • 这是一种成本效益很高的方法来获得MoE模型,因为MoE在推理时是稀疏激活的,能以较少训练成本获得等效更大参数模型的推理能力。
    • 成功案例:MiniCPM, Qwen。均通过upcycling实现了性能提升。

案例研究:DeepSeek MoE架构的演进

Speaker 1详细介绍了DeepSeek从V1到V3在MoE架构上的迭代。
* DeepSeek MoE (V1)
* 参数:16B总参数,2.8B激活参数。
* 架构:2个共享专家 + 64个细粒度专家(1/4大小),激活其中6个。
* 路由:标准Top-K路由,Softmax在Top-K选择之前。
* 平衡:使用辅助损失进行专家级和设备级负载均衡。
* DeepSeek V2
* 参数:236B总参数,21B激活参数。
* MoE架构本身(专家类型和数量比例)与V1相同。
* 路由选择器(Top-K)与V1相同。
* 新增特性
* 分层路由 (Hierarchical Routing):为了控制大规模训练时的通信成本。首先选择Top-M个设备,然后在这些选定的设备内部再为每个token选择Top-K个专家
* 通信平衡损失 (Communication Balancing Loss):除了输入侧的负载均衡,还增加了针对输出通信成本的平衡损失。
* DeepSeek V3
* 参数:671B总参数,37B激活参数。
* MoE架构本身仍与V1/V2一致。
* 路由机制变化
* 门控值计算:使用Sigmoid而非Softmax,然后对门控值进行归一化(概念上类似Softmax在Top-K之后)。
* 损失函数变化
* 采用“无辅助损失”的 b_i 偏置项调整专家负载。
* 但仍保留了序列级辅助损失。
* 保留与移除:保留了V2的分层路由(Top-M设备选择),但移除了V2的通信平衡损失。
* DeepSeek V3的非MoE创新
* MLA (Multi-head Latent Attention):一种KV Cache优化技术。
* 将输入 H 投影到低维潜在表示 C,缓存 C
* 从 C 再上投影回 KV
* 通过矩阵结合律,将上投影矩阵 W_k 与查询投影矩阵 W_q 合并,不增加额外矩阵乘法。
* 与RoPE兼容性:通过对非压缩维度应用RoPE来解决。
* MTP (Multi-token Prediction):并行预测未来多个token。
* 在最终预测前,将隐藏状态通过一个轻量级单层Transformer来预测更远的token(如n+2)。
* 实际应用中,DeepSeek V3的MTP仅用于预测未来1个额外token(即总共预测n+1和n+2)。

结论

Speaker 1总结,MoE已成为构建和部署高性能、大规模语言模型的核心技术。
* 它们利用稀疏激活的思想,即并非所有参数在任何时候都需要被激活。
* 离散路由是主要挑战,但启发式方法(如负载均衡损失)已被证明行之有效。
* 大量经验证据表明,在FLOPs受限的情况下,MoE是一种成本效益高的方法,值得学习和应用。