详细摘要 摘要
生成:2025-05-13 17:29摘要详情
- 音频文件
- 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:29:10
摘要内容
概览/核心摘要 (Executive Summary)
本讲座(Stanford CS336, Spring 2025, Lecture 04)深入探讨了“专家混合”(Mixture of Experts, MoE)架构,指出其已成为构建和部署现代高性能语言模型(如GPT-4、Grok、DeepSeek、Llama 4)的关键技术。MoE的核心优势在于,通过稀疏激活机制,模型可以在不显著增加计算量(FLOPs)的情况下拥有更多参数,从而提升性能,尤其是在记忆世界知识方面。讲座强调,在相同的训练FLOPs下,MoE模型通常比密集模型表现更好,训练损失下降更快。
MoE架构主要对Transformer模型中的前馈网络(FFN/MLP)层进行修改,将其替换为一个路由器(router)和多个较小的“专家”(即多个FFN副本)。路由器负责为每个输入token选择激活少数几个专家。关键设计挑战包括路由机制的选择(“token choice top-k”已成主流)、专家数量与大小的配置(细粒度专家和共享专家是重要创新)、以及如何训练非微分的路由决策(启发式平衡损失函数是当前主流方案)。
讲座还讨论了MoE带来的系统复杂性、训练不稳定性、并行化优势(专家并行),并回顾了早期研究(如Google的GShard、Switch Transformer)和近期开源进展,特别强调了中国团队(如Qwen、DeepSeek)在MoE领域的早期开源贡献。最后,详细剖析了DeepSeek系列MoE架构的演进(V1至V3),包括其在路由、平衡损失、以及如多头潜在注意力(MLA)等非MoE组件上的创新。尽管MoE带来了复杂性,但其在FLOPs受限场景下的成本效益已得到广泛证实。
引言与MoE核心价值
Speaker 1指出,专家混合(MoE)已从去年的一个“有趣的附加讲座”转变为今年“更为关键的讲座”,因为大量研究者和模型(如Grok、DeepSeek、Llama 4,甚至传闻中的GPT-4)已采用MoE架构。
-
MoE的普及:
- Nvidia泄露信息暗示GPT-4可能是“GPT MoE”。
- Grok、DeepSeek、以及最新的Llama 4均采用MoE架构。
- Speaker 1认为:“在2025年,MoE相对于密集架构的优势已非常明显。”
- “几乎所有计算规模下,良好实现的MoE模型训练都将优于密集模型。”
-
MoE的基本理念:
- MoE并非指领域专家(如编码专家、语言专家),而是一种具有多个稀疏激活子组件(专家)的特定网络架构。
- 核心改动在于Transformer模型中的前馈网络(FFN)/多层感知机(MLP)部分。
- 标准Transformer的单个大型FFN被替换为一个选择器层(路由器)和多个较小的FFN副本(专家)。
- 路由器在每个前向传播中为每个token选择激活一小部分专家(例如,只选一个)。
-
MoE的核心优势:更多参数,相同FLOPs
- 如果一个专家的大小与原密集模型的FFN相同,且只激活一个专家,则MoE模型与密集模型的前向传播FLOPs相同。
- “你拥有了更多参数,而没有影响你的FLOPs。”
- 这对于需要大量参数记忆世界知识的模型而言是巨大优势。
-
性能提升证据:
- 大量研究表明,在相同训练FLOPs下,MoE模型性能优于密集模型。
- 引用Fedus et al. (2022) 的经典Google论文:
- 在FLOPs匹配的训练下,增加专家数量,训练损失持续下降。
- Switch Base模型(128个专家)比密集模型更快达到更优的困惑度(perplexity)。
- 引用OLMo (AI2) 论文的消融实验,同样证实MoE(粉线)训练损失下降速度远快于密集模型(青线)。
- DeepSeek V2论文展示图:x轴为激活参数量,y轴为MMLU性能,DeepSeek V2以较少激活参数实现了高MMLU性能。
- “如果你只关心训练和推理的FLOPs,激活参数是关键。”
MoE的系统复杂性与并行化
-
系统复杂性 (Speaker 2 提问关于非FLOPs开销):
- Speaker 1承认MoE存在显著的系统复杂性,这是其未成为标准教学内容的原因之一。
- “高效实现MoE,尤其是在每个专家位于不同设备上时,需要大量基础设施投入和复杂工程。”
- 但如果实现得当,所有FLOPs都能得到有效利用。
-
专家并行 (Expert Parallelism):
- MoE提供了新的并行维度。
- 可以将不同专家放置在不同设备上。
- 由于专家稀疏激活,只需将token路由到相应设备进行计算。
- “这是一种自然的模型切分方式,便于将大模型分片到不同设备。”
- 这是MoE流行的另一个原因,尤其对于超大模型。
-
开源MoE的演进:
- MoE最初在Google等闭源实验室发展。
- 开源领域的MoE成果早期多来自中国团队,如Qwen (原文为Quan) 和 DeepSeek。
- 近期西方开源社区(如Mixtral、Llama)也开始更多采用MoE。
- Llama 4 最新发布,也是稀疏MoE架构。
早期开源MoE探索:Qwen与DeepSeek
-
Qwen 1.5:
- 是最早一批大规模、经过良好测试和文档记录的MoE模型之一。
- 采用一种“upcycle”技巧,将Qwen 1.5密集模型转换为MoE模型。
- 在计算效率方面展现显著增益。
-
DeepSeek (早期工作):
- 在DeepSeek V3成名前,其早期MoE论文已奠定了开源MoE研究的基础。
- 其论文包含详细的对比实验:
- 密集模型 vs. 朴素MoE vs. 智能路由MoE (Switch MoE)。
- 结果一致显示,在固定FLOPs下,从密集模型到稀疏MoE,各项基准指标均有提升。
- Speaker 1指出:“DeepSeek V3是这一系列工作的顶峰... 他们很早就掌握了核心架构,只是在工程上不断优化。”
MoE的挑战与设计考量
尽管MoE效果显著,但其复杂性和“混乱性”使其推广受阻。
-
主要挑战:
- 基础设施复杂:尤其在多节点训练时,跨模型分片专家才显现最大优势。
- 路由学习困难:将token路由到特定专家的决策是离散的,难以通过梯度下降直接优化。
- “路由决策是不可微的,因为我们必须选择并提交给特定的专家。”
- 训练目标要么是启发式的,要么不稳定。
-
MoE主要作用于FFN层:
- 经典MoE是将FFN层拆分/复制,并进行稀疏路由。
- 理论上也可以对注意力层进行稀疏路由,但实践中罕见,因其“更不稳定,难以持续训练”。
-
核心设计问题:
- 如何路由 (Routing Function)?
- 专家数量与大小 (Number and Size of Experts)?
- 如何训练路由器 (Training the Router)?
路由机制 (Routing Mechanisms)
参考Fedus et al. (2022) 的综述,路由机制主要有三种:
-
Token Choice (令牌选择):每个token为不同专家打分,选择Top-K个专家。
- 这是目前绝大多数大型MoE模型(如DeepSeek V1/V2, Qwen, Grok, Mixtral, DBRX, Llama 4)采用的机制。
- OLMo论文的消融实验表明,Token Choice在验证损失上表现更优,收敛更快。
- 路由器的实现通常很简单:token的隐藏状态向量
x与每个专家的学习向量E_i做内积,然后通过Softmax(或其他归一化)得到分数。 - K的选择:通常
K=2是经典选择。早期MoE论文认为K>=2有助于探索(exploration),避免模型只利用(exploit)最优专家。K=2会使激活参数和FLOPs翻倍(相较于K=1且专家大小与密集FFN相同时)。 - 输出合并:当
K>1时,多个被选中专家的输出会通过加权平均(权重来自路由器的打分)或直接求和的方式合并。
-
Expert Choice (专家选择):每个专家对所有token打分,选择Top-K个token进行处理。
- 优点:可以确保每个专家的负载均衡。
-
Global Assignment (全局分配):通过解决优化问题,实现专家和token之间的平衡映射。
-
令人惊讶的发现:随机哈希路由也有效
- “即使使用哈希函数(完全没有语义信息)将token映射到专家,基于哈希的MoE仍然能带来收益,这相当疯狂。”
- 这表明MoE的部分收益可能来自参数量的增加本身,而非完全依赖智能路由。
-
被放弃的路由方法:
- 强化学习 (RL):早期工作尝试用RL学习路由策略,但计算成本过高,且稳定性问题使其未被广泛采用。
- 线性分配/最优传输:虽然理论优雅,但实际成本远超收益。
-
主流Top-K路由详解 (以DeepSeek V1/V2, Qwen, Grok为例):
- 输入:残差流输入
U_t。 - 计算亲和度:
U_t与每个专家的可学习向量E_i做内积。 - Softmax归一化:得到每个token对各专家的概率分布
S_i(t)。 - Top-K选择:选出得分最高的K个专家,其余置零,形成门控信号
G_i(t)。 - 加权输出:
Output = Σ G_i(t) * Expert_i(U_t)。 - 残差连接:
Final_Output = U_t + Output。 - Speaker 1强调,Softmax在此处主要起归一化作用,使后续加权平均的权重和为1。Top-K选择是保证稀疏性的关键,否则训练时会激活所有专家,失去效率。
- 关于Softmax后Top-K导致权重不再和为1的问题:一些架构会重新归一化,一些则不会,因为后续层(如LayerNorm)可以调整尺度。
- 输入:残差流输入
专家配置:细粒度专家与共享专家
这是DeepSeek MoE引入并被广泛采用的重要创新,灵感可能来自DeepSpeed MoE和Qwen。
- 标准MoE:将密集模型的FFN复制多份作为专家。若Top-2路由,则激活参数量约为原密集模型的两倍。
- 细粒度专家 (Fine-grained Experts):
- 动机:希望拥有大量专家,但不想承担过高的参数成本。
- 做法:将每个专家的FFN中间层维度减小。例如,标准FFN的隐藏层维度是输入维度的4倍,细粒度专家可能只用2倍,从而可以用相同参数量得到更多(但更“瘦”)的专家。
- DeepSeek论文的消融实验及OLMo的复现均表明,增加细粒度专家的数量(如从8到32到64)能持续改进模型性能。
-
共享专家 (Shared Experts):
- 动机:某些计算可能对所有token都是通用的,无需通过复杂路由分配给特定专家。
- 做法:设置一个或多个所有token都会经过的FFN专家。
- DeepSeek MoE论文显示共享专家有益。
- OLMo的复现实验中,共享专家带来的收益不明显,最终未使用。因此,共享专家的有效性可能存在争议或依赖特定配置。
-
常见配置表解读 (X out of Y 表示 Y个总路由专家中激活X个):
- 早期Google模型 (GShard, Switch Transformer, ST-MoE):专家数量可以非常大。
- 中期 (Mixtral, DBRX, Grok):通常8-16个专家,激活2个。
- DeepSeek MoE V1 (原型):64个细粒度专家(每个约为标准大小的1/4),激活6个,外加2个共享专家。
- 后续模型 (Qwen 1.5, DeepSeek V3, Minimax, OLMo, Llama 4):普遍采用细粒度专家,通常有大量路由专家(如Llama 4有128个,DeepSeek V3有189个[表格显示,但后文DeepSeek V3部分未明确提及此数字,以V1的64个为基础讨论])。共享专家数量不一,Llama 4使用1个。
- 专家大小比例:指专家FFN的中间层维度相对于标准配置(如4倍输入维度)的比例。例如1/4意味着中间层维度是标准配置的1/4。有些模型甚至会小于输入维度(down-projection)。
- 关于为何需要多个共享专家(如DeepSeek V1的2个):Speaker 1推测可能是为了保持所有激活专家(路由的+共享的)大小一致,便于系统处理,但无明确理论依据。
训练MoE模型
训练MoE的主要挑战在于训练时也需要保持稀疏性,以避免巨大的FLOPs开销,同时路由决策不可微。
-
被放弃的训练策略:
- 强化学习 (RL):Clark et al. (2020) 的研究表明RL效果不比哈希路由好,且梯度方差大、实现复杂。
- 随机探索 (Stochastic Exploration):
- Shazeer et al. (2017) 提出在路由打分时加入高斯噪声
Normal(0, W_noise),W_noise可学习,以控制探索-利用平衡。 - 目标是让专家不那么特化,更鲁棒。
- 缺点:随机性导致特化不足,效率降低。后续论文发现不如启发式损失方法,逐渐被弃用。
- Shazeer et al. (2017) 提出在路由打分时加入高斯噪声
-
主流训练策略:平衡损失 (Balancing Losses)
- 核心问题:若无约束,模型倾向于将所有token路由到少数几个“超级专家”,导致其他专家“死亡”,浪费参数。
- Switch Transformer (Fedus et al., 2022) 提出的辅助损失:
Loss_balance = α * Σ (f_i * p_i)(遍历所有专家i)f_i:实际分配给专家i的token比例。p_i:路由器分配给专家i的概率总和(Softmax输出,Top-K选择前)。- α是超参数。
- 该损失会惩罚获得过多token的专家(
p_i越大,负梯度越大),促使负载均衡。
- DeepSeek的平衡损失应用:
- 逐专家、逐批次平衡:确保每个批次内,token在各专家间均匀分配。公式与Switch Transformer类似。
- 逐设备平衡:确保分配到不同设备(GPU)的token数量均衡,优化系统利用率。计算方式类似,但
f_i统计的是分配到各设备的token比例。
-
DeepSeek V3的创新:辅助损失重平衡 (Auxiliary Loss Rebalancing)
- 摒弃传统平衡损失项:不再直接将
f_i * p_i加入总损失。 - 引入偏置项
b_i:在计算路由分数S_i时加入一个可学习的偏置b_i。S_i_new = S_i + b_i。 b_i的在线学习:- 若某专家i获得的token过少,则
b_i增加 (b_i += γ)。 - 若获得的token过多,则
b_i减少 (b_i -= γ)。 γ是学习率。b_i仅用于路由决策,不参与门控权重的计算。
- 若某专家i获得的token过少,则
- 实际情况:DeepSeek V3论文声称此方法使训练更稳定,但随后又补充道,为了实现序列级别的专家负载均衡(应对推理时可能出现的分布外序列),他们还是加回了一个启发式的辅助损失(称为“互补序列级辅助损失”)。
- Speaker 1评论:“所以它并不像他们声称的那样完全没有辅助损失。”
- 为何需要专家平衡(非系统层面):若不进行专家平衡,模型会倾向于只使用少数几个专家,其他专家“死亡”,导致模型实际变小,性能下降。OLMo论文的消融实验证实了这一点:无负载均衡时,少数专家占据了大部分token。
- 摒弃传统平衡损失项:不再直接将
系统层面考量与优化
-
专家并行 (Expert Parallelism) 的通信:
- token经过路由器后,通过集体通信操作(如all-to-all)分发到持有对应专家的设备。
- 专家计算完成后,结果再通过集体通信收集并合并。
- 如果FFN计算足够密集,可以摊销通信成本。
- 这是工具箱中除数据并行、模型并行外的又一种并行方式。
-
设备级稀疏性 (Device-level Sparsity):
- 当单个设备上承载多个专家时,由于计算是稀疏的(不同token激活不同专家),现代GPU的稀疏矩阵乘法引擎(如NVIDIA的cuSPARSELt)和库(如Megablocks)可以高效执行这些操作,避免浪费FLOPs。
-
Token丢弃与随机性 (Token Dropping and Stochasticity):
- 在推理或训练时,如果一个批次内的许多token都涌向同一个专家,可能超出该专家所在设备的处理容量(内存或设定的最大token数,即
load factor)。 - 此时,多余的token会被“丢弃”,即不经过该专家MLP计算,直接通过残差连接传递。
- 这会导致即使在
temperature=0(确定性采样)时,由于批次内其他查询的不同,同一查询也可能得到不同结果,引入了非预期的随机性。 - 这是GPT-4 API早期
temperature=0仍有随机性的一种可能解释。
- 在推理或训练时,如果一个批次内的许多token都涌向同一个专家,可能超出该专家所在设备的处理容量(内存或设定的最大token数,即
MoE的稳定性与微调
-
训练不稳定性:MoE模型有时会“爆炸”(梯度爆炸/损失突增)。
- Barret Zoph等人的研究专门探讨如何稳定MoE训练。
- 技巧1:路由器计算使用FP32精度:Softmax操作是数值不稳定的常见来源,使用更高精度有助于缓解。
- 技巧2:Z-loss (Log-Sum-Exp Squared Loss):对路由器Softmax的logit应用Z-loss,可以使归一化后的值接近1,增强稳定性。OLMo论文图表显示,移除Z-loss会导致验证损失出现巨大尖峰。
-
微调挑战:
- 过拟合:MoE参数量巨大,在小规模微调数据上容易过拟合,导致训练集和验证集之间差距过大。
- 解决方案1 (早期提出,现不常用):采用交替的MoE层和密集层,微调时只调整密集层。
- 解决方案2 (DeepSeek MoE采用):使用海量SFT数据进行微调(如DeepSeek MoE使用了140万样本)。
模型上采样 (Upcycling)
- 思想:将一个预训练好的密集模型转换为MoE模型。
- 取密集模型的MLP层,复制多份作为专家。
- 可以对副本进行微小扰动。
- 从头初始化路由器。
- 以此为起点继续训练MoE模型。
- 优势:
- 成本效益高,能以较低训练成本获得一个参数量更大的MoE模型。
- 推理时仍享受MoE的稀疏激活带来的效率。
- 成功案例:
- MiniCPM:成功将密集模型上采样为MoE,性能显著提升。
- Qwen:早期MoE尝试即采用此方法,用27亿激活参数的MoE达到了70亿参数密集模型的性能水平。
案例研究:DeepSeek MoE架构演进
Speaker 1强调,DeepSeek的MoE架构从V1开始就基本定型,后续主要是工程优化和规模扩展。
-
DeepSeek MoE (V1) (约1.5-2年前)
- 参数量:160亿总参数,28亿激活参数。
- 架构:2个共享专家 + 64个细粒度专家(每个约为标准大小的1/4),激活6个。
- 路由:标准Top-K路由,Softmax在Top-K选择之前。
- 平衡:辅助损失平衡项(专家级和设备级)。
-
DeepSeek V2
- 参数量:2360亿总参数,210亿激活参数。
- MoE架构:与V1相同,仅专家数量和激活数量调整。
- 路由:Top-K选择器与V1相同。
- 新增技巧:Top-M设备选择
- 背景:细粒度专家数量多、激活专家多时,通信成本可能很高(token需发往大量设备)。
- 做法:在选择Top-K专家前,先选择Top-M个“候选设备”。即,先基于路由分数选出最相关的M个设备,然后在这些设备上的专家中再为每个token选择Top-K个。
- 目的:控制通信开销,提高大规模训练效率。
- 新增平衡损失:通信平衡损失
- 考虑输出通信成本(token计算完后需返回原设备),增加平衡损失项以均衡输出通信。
-
DeepSeek V3
- 参数量:6710亿总参数,370亿激活参数。
- MoE架构:与V1/V2核心部分相同。
- 路由机制调整:
- 门控权重归一化到1(Softmax移到Top-K之后,或类似操作)。
- 使用Sigmoid而非Softmax的指数函数作为激活,更平滑。
- 平衡损失调整:
- 采用前述的“辅助损失重平衡”技巧(通过
b_i偏置项在线调整)。 - 但仍保留了“序列级辅助损失”以确保单个序列内的专家负载均衡。
- 采用前述的“辅助损失重平衡”技巧(通过
- 保留Top-M设备选择技巧,但移除了V2中的通信平衡损失。
-
DeepSeek V3 非MoE组件创新:
- 多头潜在注意力 (Multi-Head Latent Attention, MLA)
- 目的:优化KV Cache大小。
- 做法:
- 输入
H_t先投影到一个低维的“潜在表示”C。 - 缓存这个较小的
C。 - 需要K, V时,从
C上采样回K, V。 K = C * W_k,V = C * W_v。- 计算注意力时
Q * K^T = Q * (C * W_k)^T = Q * W_k^T * C^T。 - 可以将
Q的投影矩阵W_q与这里的W_k(或其转置)合并,从而不增加额外的矩阵乘法FLOPs。
- 输入
- 与RoPE的兼容性:原始MLA与RoPE不直接兼容,DeepSeek有特定解决方案(在非压缩维度上应用RoPE)。
- 多令牌预测 (Multi-Token Prediction, MTP)
- 思想:模型不仅预测下一个token,还预测未来多个token。
- 做法:在主Transformer输出最终隐状态后,接一个非常轻量级的一层Transformer,用它来预测更远未来的token。
- 实际应用:尽管图示复杂,DeepSeek V3的MTP仅预测未来1个额外token(即总共预测未来2个token)。
- 多头潜在注意力 (Multi-Head Latent Attention, MLA)
结论
- MoE已成为构建和部署大规模、高性能语言模型的核心技术。
- MoE利用稀疏激活思想,在不显著增加FLOPs的情况下扩展模型参数量。
- 主要挑战在于离散路由的优化和系统复杂性,但启发式方法(如平衡损失)已被证明有效。
- 大量经验证据表明,在FLOPs受限的场景下,MoE是成本效益高的选择,值得学习和应用。