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时的一个重大决策:路由器由学习到的参数组成,并与网络的其余部分同时进行预训练。

image

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 + \sum_{i=1}^{N_s} \text{FFN}^{(s)}(u_t) + \sum_{i=1}^{N_r} g_{i,t} \text{FFN}^{(r)}_i (u_t) \]

  • $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)

\[g_{i,t} = \frac{g'_{i,t}}{\sum_{j=1}^{N_r} g'_{j,t}} \]

  • 归一化专家权重,确保所有专家的贡献总和为 1。

(3) 选择 Top-K 专家 (v2)

\[g'_{i,t} = \begin{cases} s_{i,t}, & s_{i,t} \in \text{Topk}(\{s_{j,t} | 1 \leq j \leq N_r \}, K_r) \\ 0, & \text{otherwise} \end{cases} \]

  • 只激活 Top-K 个专家,其余专家权重设为 0。
  • $ s_{i,t} $ 是 token 对专家的分数。

(4) 计算专家分数 $ s_{i,t} $

\[s_{i,t} = \text{Softmax}(u_t^T e_i) ----- v2 \]

\[s_{i,t} = \text{Sigmoid}(u_t^T e_i) ----- v3 \]

  • 通过 sigmoid 计算专家选择分数。
  • 这里 $ u_t^T e_i $ 代表 token 与专家的匹配度。

(5) 偏置权重优化 (v3)

\[g'_{i,t} = \begin{cases} s_{i,t} + b_i, & s_{i,t} + b_j \in \text{Topk}(\{s_{j,t} + b_j | 1 \leq j \leq N_r \}, K_r) \\ 0, & \text{otherwise} \end{cases} \]

  • 增加了偏置项 $ b_i $,用于优化负载均衡,减少额外 loss 的需求。

image

MLA

posted @ 2025-03-14 18:56  AAA建材王师傅  阅读(71)  评论(0)    收藏  举报