DeepSeek 细节(2)之 MoE(Mixture-of-Experts)

DeepSeek 细节(2)之 MoE(Mixture-of-Experts)

DeepSeek 团队通过引入 MoE(Mixture of Experts,混合专家) 机制,以“分而治之”的思想,在模型容量与推理成本之间找到了精妙的平衡点,其中的技术实现和细节值得剖思

Transformer 演变至 MoE

标准的 Transformer 层


T表示序列长度,Self-Att(·) 表示自注意力模块,FFN(·) 表示前馈网络 (FFN)

MOE 的 Transformer 层

混合专家模型 (MoE) 是一种利用稀疏门控机制的深度学习模型,它由一组专家模型和一个门控模型组成。MoE 的核心思想是将输入数据根据任务类型划分为多个区域,并为每个区域分配一个或多个专家模型。这样,每个专家模型可以专注于处理特定区域的数据,从而提升模型的整体性能。

MoE 架构的基本原理相对简单,主要包括两个关键组件:GateNet 和 Experts。GateNet 的功能是决定输入样本应由哪个专家模型进行处理。而 Experts 则是由多个相对独立的专家模型组成的集合,每个专家负责处理特定的输入子空间。


如上图右上所示,构建 MoE 语言模型的典型做法通常是用 MoE 层以指定的间隔替换 Transformer 中的FFN。MoE 层由多位专家组成,其中每个专家在结构上与标准 FFN 相同。然后,每个 token 将被分配给一位或两位专家。如果用 MoE 层替换 FFN 层,则其输出隐藏状态如下

门控网络

GateNet:混合专家模型中“门”是一种稀疏门网络,它接收单个数据元素作为输入,然后输出一个权重,这些权重表示每个专家模型对处理输入数据的贡献。一般是通过softmax门控函数通过专家或token对概率分布进行建模,并选择前K个。例如,如果模型有三个专家,输出的概率可能为0.5和0.4、0.1,这意味着第一个专家对处理此数据的贡献为50%,第二个专家为40%,第三个专家为10%,这个时候的K就可以选择为2,我们认为前两个专家模型的建议会更好,可以用于更加精确的回答中,而第三个专家模型的建议可以用于更加富有创意性的答案中。

专家

Experts:在训练的过程中,输入的数据被门控模型分配到不同的专家模型中进行处理;在推理的过程中,被门控选择的专家会针对输入的数据,产生相应的输出。这些输出最后会和每个专家模型处理该特征的能力分配的权重进行加权组合,形成最终的预测结果。

无辅助损失的负载平衡 DeepSeekMoE

对于前馈网络(FFNs),DeepSeek-V3 采用DeepSeekMoE 架构。与传统的MoE 架构如 GShard 相比,DeepSeekMoE 使用更细粒度的专家,并将一些专家隔离为共享的,演化历程如下图从左至右所示。

DeepSeek 中的 MoE 机制如下图所示:

共享专家和路由专家如下式所示进行加权求和,DeepSeek-V3 使用sigmoid 函数来计算亲和度得分,并在所有选定的亲和度得分之间应用归一化以生成门控值。

  • 对于MoE 模型,不平衡的专家负载会导致路由崩溃并在专家并行场景中降低计算效率
    • 传统解决方案通常依赖于辅助损失(例如专家级平衡损失,设备级平衡损失)来避免负载不平衡。然而,过大的辅助损失会损害模型性能
    • 为了在负载平衡和模型性能之间实现更好的权衡,他们首创了一种无辅助损失的负载平衡策略

具体而言,为每个专家引入一个偏置项,并将其添加到相应的亲和度分数中以确定前K个路由,但该偏置项仅用于路由。与FFN 输出相乘的门控值仍然来自原始的亲和度分数,在训练过程中,作者持续监控每个训练步骤的整个批次上的专家负载,在每一步结束时,如果对应的专家超负荷,则该专家将偏置项减少,如果对应的专家负载不足,我们将其偏置项增加,通过动态调整,DeepSeek-V3 在训练过程中保持了平衡的专家负载,并且比通过纯辅助损失鼓励负载平衡的模型表现更好

更多 DeepSeek 技术细节 ~~ DeepSeek 细节之 MLA (Multi-head Latent Attention)

参考文献

一文读懂:混合专家模型 (MoE)-deepseek
一文通透让Meta恐慌的DeepSeek-V3:在MoE、GRPO、MLA基础上提出Multi-Token预测(含FP8训练详解)
一文了解DeepSeek-MoE 架构

### DeepSeek-V3混合专家语言模型架构与特性 #### 架构概述 DeepSeek-V3采用了一种基于稀疏门控机制的混合专家(MoE)结构,这种设计允许网络根据不同输入动态激活不同的子网络路径。通过这种方式,在保持计算资源高效利用的同时实现了性能上的显著提升[^1]。 #### 关键组件 - **路由函数(Routing Function)**: 负责决定哪些数据样本应该被发送给特定的专家处理单元。该过程通常依赖于softmax层来分配概率权重。 - **多个独立工作的小型DNN(Experts)**: 这些小型神经网络各自专注于解决不同类型的任务或模式识别问题。当接收到由路由器指派的数据后,它们会并行执行推理操作- **融合模块(Gating Network)**: 它接收来自各个专家节点输出的结果,并对其进行加权求和得到最终预测值。此部分同样运用了注意力机制以增强重要特征的影响程度。 #### 特性亮点 - **参数效率(Parameter Efficiency)**: 只有少部分活跃状态下的专家参与前向传播流程,从而减少了整体训练所需的内存占用量以及浮点运算次数[Fewer FLOPs per token processed compared to dense models]. - **可扩展性强**: 随着硬件条件改善和技术进步,可以轻松增加更多种类别的专精领域处理器而不会造成原有体系崩溃. - **多模态支持**: 不仅限于文本序列建模,还能够兼容图像、音频等多种形式的信息表示方法[Multimodal capabilities allow integration of different types of data into a unified framework][^2]. ```python import torch.nn as nn class MoELayer(nn.Module): def __init__(self, num_experts=4, input_dim=768, output_dim=768): super().__init__() self.routing_fn = nn.Linear(input_dim, num_experts) self.expert_layers = nn.ModuleList([nn.TransformerEncoderLayer(d_model=input_dim,nhead=8) for _ in range(num_experts)]) self.gate_layer = nn.Linear(num_experts * input_dim,output_dim) def forward(self,x): route_weights = torch.softmax(self.routing_fn(x),dim=-1).unsqueeze(-1) expert_outputs = [] for i,expert in enumerate(self.expert_layers): out_i = expert(x)*route_weights[:,:,i] expert_outputs.append(out_i) combined_output = torch.cat(expert_outputs,dim=-1) final_out = self.gate_layer(combined_output) return final_out ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值