8. DeepSeek-V3(V2)详读 3(架构 + DeepSeekMoE)

DeepSeek-V3(V2)详读 3 (架构 + DeepSeekMoE)

本节主要内容:传统MoE架构、DeepSeekMoE、负载均衡(Load Balancing)、Switch Transformers(损失控制)、Switch Transformer的问题、DeepSeek的Loss-Free方法

写在引用符号里的,都是添加的知识点和理解。没有添加的是原文翻译的concise整理


1. Transformer结构简述

  • Transformer由两大核心层组成:AttentionFFN(Feed-Forward Network/MLP)
    • Attention层:负责信息交互与全局建模,参数量较少,但计算量较大。
    • FFN层
      • 负责存储模型知识(参数量大),是模型scale-up时体量激增的主要来源。
      • LLM的强大部分依赖于FFN的高容量,但FFN也带来了计算与资源的挑战。

2. MoE(Mixture of Experts)原理简述

先看一下 review paper 介绍的什么是MoE。

  • 核心思想:把 Transformer 的 FFN 层拆分为多个专家(Expert)组,输入经过gate分配给不同expert。
  • Gate(门控)
    • 输入 X,Gate网络通常也是一个小MLP/FFN,计算每个expert的权重/概率 p
    • 类似于分类模型的softmax输出,每个expert像是一个类别
  • 常见两大MoE:
    • Dense MoE
      • 图(a),全连接,每个都参与
      • 每个 expert 都参与计算,Gate 生成的 p 作为权重,加权所有 expert 输出,做加权平均。
    • Sparse MoE(主流)
      • 输入 X,经过Gate计算出一些列 p, 把他们排序取 top K 个experts参与计算。
      • 只激活权重 top K 个expert,其他expert不参与本次计算
      • 图(b),使用 FFN2FFN3FFN1FFN4 就不用了,然后FFN的输出和 p 做一个乘积,再sum起来。
  • 优点
    1. 易扩展(scale up):可以轻松增大模型容量。
    2. 成本低(cost-saving):只需激活一小部分expert,computation就会减少
  • 缺点
    • 知识冗余:数据量大时,不同 expert 学到的知识可能重合(产生冗余),导致参数浪费。
    • 区分度低:不同 expert 之间的能力不明显,容易所有 expert 学到类似的内容。希望某些expert擅长数学,某些擅长coding,但实际中这种区分往往不明显
    • MoE最大挑战之一:负载均衡(load balancing),防止部分 expert 被过度调用、部分 expert 闲置(后面细讲)。

3. DeepSeekMoE 设计

DeepSeekMoE在传统MoE基础上做了两大核心改进:

  • 图(a): 传统MoE,每次top K=2,输入只选 2 个 experts 参与计算。
  • 图(b): DeepSeekMoE 第一改进细粒度分割,expert 数量加倍,top K 数量加倍,参数均摊。
  • 图(c): DeepSeekMoE 第二改进引入 shared expert 学习通用知识
  1. Fine-Grained Expert Segmentation(细粒度专家分割)
    • 将原本的 n 个专家(experts)扩展为 2n 个小专家,并将路由机制中的 top K 值从默认值从 top K=2 增加到 K=4
    • 具体做法:
      • 把原本数量较少、规模较大的experts,拆分为数量更多、规模更小的expert
      • 每个 expert 内部由 2 个 MLP 组成,通过减小这两个 MLP 层中间隐藏层的维度来压缩单个专家的参数量,虽然单个小专家的质量略有下降,但专家总数增加,总体参数量保持不变。
    • 性能提升原理:
      • 保持总参数量不变的前提下,通过增加专家数量来提升模型性能
      • Model Ensemble(模型集成): 这个改进类似于 Kaggle 比赛中常用的 ensemble 方法。每个专家可以看作一个基础模型。增加专家数量相当于增加了集成的模型数量,虽然每个小模型(小专家)的能力变弱了,但集成后的整体效果通常更好。
      • Bias-Variance Tradeoff(偏差-方差权衡):从 machine Learning 的角度就是,单一模型若方差(variance)过高,易导致过拟合。通过model ensemble可以降低模型的 variance,哪怕每个模型性能变差了(bias增加),最终ensemble之后,整体性能因 variance 减小而得到优化。
      • 数量-质量的互换:数量提升了,质量降低了,但性能提升了,在科研里面也是用的比较多的。
  2. Shared Expert Isolation(共享专家隔离)
    • 在LLM推理的时,不同任务间有一些共同的knowledge,引入共享expert,负责学习common knowledge(通用知识)。
    • 对于每一个输入,这个共享expert总是被激活,不参与 gate 的 top K 竞争。
    • 因此,实际路由的top-K值从默认的 K=4 降至 K=3,系统始终优先调用共享expert,再从剩余专家中动态选择3个最相关的专才expert。
    • 这样最终的输出是:共享expert + 3个专才expert的加权平均。
    • 优势
      • 提供“全才+专才”机制共享expert 懂得广但不深,专才expert 在特定领域表现突出。
      • 高效性:模型的参数量没有增加。
      • 计算守恒: 激活的专家总数 K 保持不变,因此计算量 (FLOPs) 也基本维持不变。
      • 共享expert起到error correlation(错误相关性)的缓冲作用,可以补足专才expert偶发的盲区。
        • error correlation(错误相关性):多个专家(experts)如果都是专才型,可能在同一个知识盲区上一起犯错——也就是说,他们的错误是“相关”的(有重叠/同源)。 而共享expert由于知识更广,可以“独立于”这些专才的错误,起到一个兜底、纠错的作用,缓冲这种“集体盲区”。

4. MoE训练中的Load Balancing问题

问题起源

  • 初始随机性: MoE模型在训练初期,所有专家(Expert)均处于随机初始化状态,性能均较弱。
  • “赢家通吃”效应 (Winner-Takes-All / Self-Reinforcing): 训练过程中,某些专家(如Expert 1)可能因随机性或特定输入而较早表现出相对优势。模型发现将更多输入路由给这些表现较好的专家(Expert 1)能更快地降低损失(Loss)。
  • 恶性循环: 这导致模型倾向于将越来越多的输入给这些 Expert 1,形成马太效应(强者愈强)。表现较弱的 experts 因接收到的训练数据不足导致训练的不好。

导致的后果

  • 模型训练完成后,只有少数experts 得到充分训练,而大部分experts训练不足。
  • MoE的核心优势在于利用多个experts做sparse ensemble,提升模型容量与泛化性。若只有少数专家有效,就没有了做model ensemble的意义。最后只有一个expert训练的比较好,就会过拟合,影响模型泛化。

解决方案
为了解决 token 分配不均(load balancing)问题,当前主要有两种方法:

  1. Switch Transformers 的 Loss Control 方法
    • 在训练时,在 loss 函数中增加一个平衡项,对 token 分配极不均衡的情况进行惩罚(penalise)。
    • 这样可以促使 gate 将输入更公平地分配给各个 expert。
  2. DeepSeekMoE 的 Loss-Free 方法
    • 不在 loss 里加额外项,而是在 softmax 层内加入 bias(偏置)
    • 动态控制各 expert 被选中的概率,实现 tokens 分配的平衡。

5. Switch Transformers

先讲一下 Switch Transformers 中提出的 loss control 去做 load balancing。

核心概念

  • 目标:保证输入 tokens 在不同 experts 之间均匀分配,避免某些 experts 超载、某些 experts 闲置。
  • Loss 设计
    • 相比 Shazeer et al. (2017) 的“双损失”(负载均衡+重要性加权),Switch Transformer 用一个可微的 auxiliary loss 实现负载均衡。
    • 整体逻辑就是只用一个 loss 就能搞定 expert 负载均衡。

数学公式

  • (1) 负载均衡损失(Load Balancing Loss)loss=αNi=1NfiPi
    • α:超参数(hyperparameter),控制 loss 权重
    • N:experts 数量
    • fi:被 dispatch 到 expert i 的 tokens 占比
    • Pi:router 分给 expert i 的概率占比
  • (2) fi(实际分配比例 actual dispatch ratio)fi=1TxB1{argmax p(x)=i}
    • T:batch 内 token 总数
    • 1:indicator function
    • 物理意义:expert i 实际处理了多少 tokens
  • (3) Pi(router 概率分配比例)Pi=1TxBpi(x)
    • pi(x):router 认为 token x 属于 expert i 的概率
    • 物理意义:router 对 expert i 的“软分配”概率均值
      为何点积能促进负载均衡?
  • 设理想情况下每个 expert 分到的比例都是 ui=1N,用 Cauchy-Schwarz 不等式 可以推导:(i=1NfiPi)(i=1Nfi2)(i=1NPi2)
  • 只有 fi=Pi 时取等号。均匀分布下 fiPi=(1N)2=1N
  • 此时 fi2=Pi2=1N 达到最小。
  • 结论:loss 最小时,fiPi 都接近Uniform(均匀分布)——这就是点积促进负载均衡的数学原理。

5.1 Loss control 的直观例子

如果数学的东西很直观(可以跳过),看不懂的看下面这个例子:

  • 假设有一个 batch,包含 3 个 tokens(t1, t2, t3),4 个 experts(e1, e2, e3, e4)
  • 红色向量:表示实际分配到每个 expert 的 token 百分比,也就是观测到的每个 expert 实际接收到多少 tokens。
  • 蓝色向量:表示 gate 层 softmax 的平均值(即分配概率的期望),代表理论上每个 expert 应该分到多少 tokens。
  • Switch Transformer 的核心思想
    • 计算“实际分配向量(红色)”与“理论分配向量(蓝色)”之间的差距。
    • 用这两个向量的关系(具体为 fiPi 的和)作为一个 penalty loss(即 load balancing loss 或 auxiliary loss),加到训练目标里。
    • 通过优化这个 penalty loss,使实际分配更接近期望分配(减小差距),实现 token 分配的负载均衡。

6. 理论问题与新方法

  1. 常见误区澄清
    上面数学理论是错误的,文献认为当负载均衡损失(如 f,P)最小时,token 分配一定是均匀分布(uniform)。但实际上这并不总成立。普林斯顿大学的一份 lecture note 给出反例:当 N=2(expert数),T=3(token数)时,f,P=0.447<0.5 此时分布明显不是均匀,但内积更小(图示如下)。
  2. DeepSeek 2024 年的 Auxiliary-Loss-Free 方法
    DeepSeek 在 2024 年提出了 Auxiliary-Loss-Free 的负载均衡方法。该 paper 对比了传统 loss control 方法和 loss-free 方法。图3:
    • 纵坐标:DeepSeek 定义的负载均衡度量
    • 横坐标:训练步数
    • 结果:Loss-Free 方法(红线)负载均衡效果始终优于传统 Loss-Control 方法(蓝线),表现为衡量值更低、更平稳。Switch Transformer 出现负载异常上升,且难以收敛到理想状态。
  • 现实状况
    虽然 Switch Transformer 理论有问题,但由于引用量高依然被广泛沿用。即便如 DeepSeek-V3 的技术报告,也采用了 Switch Transformer 的一个变种。

2.1.2. 带无辅助损失负载均衡的 DeepSeekMoE

DeepSeekMoE 的基本架构。 DeepSeek-V3 的前馈神经网络(FFN)采用 DeepSeekMoE 架构。相比传统 MoE(如 GShard),DeepSeekMoE 使用更细粒度的专家,并设置部分为共享专家。
对于第 t 个 token,设 ut 为其 FFN 输入,输出 ht 计算如下:

(12)ht=ut+i=1NsFFNi(s)(ut)+i=1Nrgi,tFFNi(r)(ut),(13)gi,t=gi,tj=1Nrgj,t,(14)gi,t={si,t,si,tTopk({sj,t|1jNr},Kr)0,otherwise(15)si,t=Sigmoid(utei),

其中,NsNr 分别为共享专家和路由专家数量;FFNi(s)FFNi(r) 为对应的专家;Kr 是每次激活的路由专家数;gi,t 为门控值,si,t 为 token 的亲和度分数,ei 是专家中心向量,Topk(,K) 取最大 K 个分数。不同于 V2,V3 用 sigmoid 计算亲和度,并对选中分数归一化生成门控值。

先来看一下图2 中 DeepSeekMoE架构,绿色的是shared expert 每个输入都会经过,不会做选择,蓝色的是 routed expert 就是会选择 top K 经过。最后把两部分结果做加权平均。

无辅助损失负载均衡(Auxiliary-Loss-Free Load Balancing)。 MoE 模型中,专家负载不均会导致路由崩溃和效率降低 (Shazeer et al., 2017)。传统依赖辅助损失平衡负载,但过大会影响性能。DeepSeek-V3 创新引入无辅助损失负载均衡,为每个专家添加偏置项 bi,在 Top-K 路由选择时与亲和度分数 si,t 相加。

(16)gi,t={si,t,si,t+biTopk({sj,t+bj|1jNr},Kr)0,otherwise.

注意,偏置项只影响路由选择,最终门控值仍由原始亲和度 si,t 决定。训练时持续监控专家负载,每步结束后,负载过高则减小偏置,负载不足则增加,调整步长为超参数 γ。这种动态调整实现了更优的负载均衡,性能也优于传统辅助损失方法。

Switch Transformer 采用在主损失外添加辅助损失(auxiliary loss)来改善 load balancing。作者发现这个方法会影响模型性能,因为这个 loss 的最终目的是让 token 平均分配到每个 expert,本身并不直接优化模型能力。如果过度去 minimize 这个 loss(尤其是 loss 很大时),模型性能就会受影响。

针对这个问题,DeepSeek 提出了 Loss-Free 方法

  • 在 Top-K 路由选择阶段,每个 expert 增加一个 bias term bi,与亲和度分数 si,t 相加,控制最终选择哪些 expert。
  • 如公式(16),bias 只影响路由选择,门控值 si,t 不变,主 loss 也不变。
  • 动态调整机制:
    • 训练过程中,实时监控每个 expert 实际收到的 token 数量。
    • 如果某 expert token 过多,就减小对应 bi;如果 token 过少,就增大 bi
    • 每次调整步长由超参数 γ 控制。
  • 这是一个动态调整,LLM的loss是不变的,这种方式既能控制 load balancing 也不会影响模型性能。

补充的序列级辅助损失(Complementary Sequence-Wise Auxiliary Loss)。 虽然 DeepSeek-V3 主要采用无辅助损失负载均衡,但为防止单个序列内负载极端不均,还引入了一个序列级平衡损失:

(17)LBal=αi=1NrfiPi,(18)fi=NrKrTt=1T1(si,tTopk({sj,t|1jNr},Kr)),(19)si,t=si,tj=1Nrsj,t,(20)Pi=1Tt=1Tsi,t,

其中,平衡因子 α 是一个超参数,在 DeepSeek-V3 中会被设置为极小值;1() 表示指示函数;T 表示序列中的 token 数。该序列级平衡损失用于鼓励每个序列内专家负载更加均衡。

除了上面介绍的 Loss-Free 方法,作者还提到了Sequence-Wise 的负载均衡方法:

  • 这个方法本质上和 Switch Transformer 的 load balancing loss 类似,只不过是把负载均衡从 token level 拓展到了 sequence level,对应公式(17)。
  • 说白了,还是“换汤不换药”——只是统计的粒度变了,思想没变。
  • 这个 loss 的目的,是保持 Sequence 维度上的负载均衡(Sequence-Wise Balance Loss)。
  • 但这种 loss 依然有问题,所以在实际训练时,只给了一个极小的权重(extremely small weight)。,所以这个 loss 在整体训练上作用不是很大。

节点限制路由(Node-Limited Routing)。 DeepSeek-V3 采用节点限制路由机制,每个 token 最多只被分配到 M 个节点,每个节点负责 KrM 个专家,具体由节点上亲和度得分最高的专家决定。这样不仅显著降低了通信开销,还实现了计算与通信的高效重叠。

在 LLM 训练中,模型的不同部分通常会分布在不同的 GPU 上。对于大型 GPU 集群来说,每个 cluster 有多个 node,每个 node 里有多张 GPU。

  • 问题:node 之间的数据通讯非常昂贵。如果一个 token 在计算过程中需要频繁跨 node 移动,会大大增加开销。
  • DeepSeek 提出的方法:给每个 token 的路由加一个限制——每个 token 最多只能被分配到 M 个不同的 node 上
  • 这样可以有效减少 token 跨 node 通讯的次数,降低整体的分布式通信成本,提高训练效率。

无 token 丢弃(No Token-Dropping)。 凭借高效负载均衡,DeepSeek-V3 在训练和推理过程中都无需丢弃 token,确保任务完整、高效运行。

如果某些 expert 的负载(load balancing)已经很高了,这时再继续分配 token 只会让负载更不均衡。

  • 常见做法是把这些 token “drop 掉”,其实并不是直接丢弃 token。
  • 实际上,由于 Transformer 结构有 residual connection,所谓 “dropping” 是指不让 token 经过该 expert 的 FFN 层,而直接走 residual 路径,相当于跳过专家网络。这就是 token dropping 的实际意义。
  • 之所以可以这样做,是因为前面的负载均衡机制已经保证了整体的 balance,所以不需要额外的 token-dropping 机制。

参考资料


“觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”

微信二维码

微信支付

支付宝二维码

支付宝支付

8. DeepSeek-V3(V2)详读 3(架构 + DeepSeekMoE)
http://neurowave.tech/2025/06/22/11-8.3-Deepseek-V3/
作者
Artin Tan
发布于
2025年6月22日
更新于
2025年8月16日