DeepSeek-v2
Deepseek系列博客目录
| Model | 核心 | Date |
|---|---|---|
| DeepSeekLLM | 探究LLM Scalling Law | 2024.01 |
| DeepSeekMath | 提出GRPO | 2024.04 |
| DeepSeek-V2 | DeepSeekMoE, Multi-Head Latent Attention (MLA) | 2024.06 |
| DeepSeek-V3 | 新版DeepSeekMoE, MTP, 混合精度训练 | 2024.12 |
| DeepSeek-R1 | GRPO应用 | 2025.01 |
MoE
一、MoE简介
在Transformer模型的上下文中,MoE由两个主要元素组成:
使用稀疏MoE层代替密集前馈网络(FFN)层。 MoE层具有一定数量的“专家”(例如8个),其中每个专家是一个神经网络。在实践中,专家是FFN,但它们也可以是更复杂的网络,甚至是MoE本身,比如分层MoE。
一种网关网络或路由器,用于确定将哪些令牌发送给哪个专家。 例如,在下图中,令牌“More”被发送到第二个专家,令牌“Parameters”被发送到第一个网络。正如我们稍后将探讨的那样,我们可以向多个专家发送令牌。如何将令牌路由给专家是使用MoE时的一个重大决策:路由器由学习到的参数组成,并与网络的其余部分同时进行预训练。

1. 专家层
- 专家层用于 替换传统的 FFN(前馈神经网络)结构。
- 每个“专家”实际上是一个 独立的小型 FFN。
- 例如,如果有 8 个专家,那么模型可以根据输入数据动态选择其中的一部分来进行计算,而不是每次都用全部参数。
2. 路由层
- 决定输入 token 发送到哪个专家 进行处理的模块。
- 也就是说,在每次推理时,只会使用部分参数,而不是整个模型的全部计算单元。
- 需要注意的是,路由层每次只选择 top-K 个专家进行激活,而不是所有专家一起工作,这样可以提升计算效率。
3. 负载均衡
- 需要确保所有专家网络的负载均衡,避免只有某几个专家总是被激活,而其他专家几乎不工作。
- 如果总是激活固定的少数专家,那么模型最终会变成一个普通的密集(Dense)网络,失去 MoE 的优势。
- 解决方案是引入辅助损失函数,鼓励模型更均匀地选择不同的专家进行计算,从而提升计算资源利用率。
二、MoE存在的挑战
尽管与密集模型相比,MoE提供了高效的预训练和更快的推理等优点,但它们也带来了挑战:
训练:MoE可以显著提高预训练的计算效率,但它们在微调过程中一直难以泛化,导致过度拟合。
推理:虽然MoE可能有许多参数,但在推理过程中只使用其中的一些参数。与具有相同数量参数的密集模型相比,这导致更快的推理。但是,所有参数都需要加载到RAM中,因此对内存的要求很高。例如,给定一个MoE(如Mixtral 8x7 B),我们需要有足够的VRAM来容纳密集的47 参数模型。
Note: 为什么是47B参数而不是8 x 7B = 56B?这是因为在MoE模型中,只有FFN层被视为单独的专家,其余的模型参数是共享的。同时,假设每个token只使用两个专家,推理速度(FLOPs)就像使用12B模型(而不是14B模型),因为它尽管需要计算2x7B矩阵乘法,但有一些层是共享的。
三、 DeepSeekMoE 的改进
1.结构
相较于传统 MoE,DeepSeekMoE 引入了共享专家,并做出了以下优化:
1️⃣ 更精细的专家划分,实现更高的专业化
- 例如 67B 模型中有 256 个路由专家,每次推理时 激活 8 个专家,相比 QwenMoE 模型更加精细化。
2️⃣ 共享专家减少冗余
- 共享专家可以让多个 token 复用相同的计算单元,减少整体计算成本,提高计算效率。
3️⃣ 计算路由权重时从 softmax 变为 sigmoid(v3)
- 这可能是为了避免 softmax 的极端权重分布(即部分专家被高度偏向),让更多专家能够均衡参与计算。
4️⃣ 不需要额外的 loss 进行负载均衡,而是通过偏置权重 b_i进行微调 (v3)
- 计算量更小,但 效果更好,偏置权重仅用于计算路由,不会影响最终输出的加权求和计算。
2. 数学公式解析
(1) 最终隐藏状态计算
- $h'_t $:新的隐藏状态
- $ u_t $:原始输入
- $ N_s $:共享专家的个数
- $ \text{FFN}^{(s)}(u_t) $:共享专家处理后的输出
- $ N_r $:路由专家的个数
- $ g_{i,t} \text{FFN}^{(r)}_i (u_t) $:选定专家的加权输出
🚀 改进点:
- 共享专家 $ \text{FFN}^{(s)} $ 提供基础特征
- 路由专家 $ \text{FFN}^{(r)} $ 通过 $ g_{i,t} $ 的权重选择特定专家
- 这种结构比传统 MoE 计算更稳定,并提高了通用性。
(2) 计算路由权重 $ g_{i,t} $(公式 13)
- 归一化专家权重,确保所有专家的贡献总和为 1。
(3) 选择 Top-K 专家 (v2)
- 只激活 Top-K 个专家,其余专家权重设为 0。
- $ s_{i,t} $ 是 token 对专家的分数。
(4) 计算专家分数 $ s_{i,t} $
- 通过 sigmoid 计算专家选择分数。
- 这里 $ u_t^T e_i $ 代表 token 与专家的匹配度。
(5) 偏置权重优化 (v3)
- 增加了偏置项 $ b_i $,用于优化负载均衡,减少额外 loss 的需求。


浙公网安备 33010602011771号