省钱第一招:把一个大厨换成专家团

先给结论: 要想模型更强,最直觉的办法是把它做大;但做大之后,你为每一个字都要付全部代价。DeepSeek 省钱的第一招是混合专家(MoE):把网络拆成很多"专家",每次只叫相关的几个来干活——总参数量很大,但每次真正动用的只是一小部分。

一、笨办法为什么贵:每个字都要过全部参数

回到第三篇说过的那件事:大模型做的事就是猜下一个词。而在它内部,每猜一个字,都要经过一遍全部"参数"——参数就是模型内部那些可调的数字,比如 7B 表示七十亿个。

第三篇里我们说过,参数量、数据量、计算量是三个不同的"大小"。这里要盯住的是最后一项:计算量。

如果模型有 6710 亿个参数,而每一个字都要把这 6710 亿个数字全部算一遍,那么你写一句话、它答一段话,每一次都按这个总数的价钱收费。

这种"全员上阵"的做法在术语里叫稠密模型——不是指它聪明,而是指它的每个字都用到了全部参数。它的问题很直接:能力靠参数堆,账单也靠参数堆,两件事绑死了。

二、MoE 的做法是让总参数很大、每次只动一小部分

MoE:一个词只叫醒少数专家一个词元门控打分给每个专家打一个分专家 1top-k 之一专家 2top-k 之一…共 256 个绝大多数不动共享专家每次都在场按门控权重合并只算被叫醒的那几个输出给下一层难处:怎么保证每个专家都别被叫太多次 → 均衡机制

MoE 路由:门控 → 选 top-k → 并行计算 → 加权合并

MoE 的想法是把这两件事拆开。

它把一个网络里的"专家"部分分成很多份,每个字进来时只挑其中几位。这样一来,模型的总参数可以做得很大(它存着很多套知识),但每个字的计算量只由被叫到的那几位决定。这个"每次真正参与计算的参数量",叫激活参数。

数字上有多夸张?看 DeepSeek-V3:

数量前提
总参数671BV3 的全部参数,包含所有专家的参数
每词元激活37B同一个模型,处理每一个词元时真正参与计算的参数
占比约 5.5%37 ÷ 671

注意这个数字的前提: “约 5.5%“是 V3 这个模型自己的激活参数除以自己的总参数,不是"MoE 一通吃遍天”。换一个模型、换一组专家配置,这个比例就变。它也不等于"省了 94.5% 的电”——为什么不能这么读,本篇第七节会讲。

在 V3 里,这个"叫几位"的规矩是:每个词元激活 1 个共享专家 + 8 个路由专家,而路由专家一共有 256 位。共享和路由各是什么,下面两节说。

三、专家团没有预先贴好的标签,分工是训练中自己长出来的

先破一个常见的误会。听到"数学专家"“代码专家”,很容易以为工程师事先给每个专家规定了专业方向。不是的。 论文里没有这种标签——分工是训练中自己长出来的,不能把语义标签当成事实。

回到餐厅的比喻:一个全能大厨做所有菜,手艺全面但每一道菜都得他自己动手;换成专家团分诊,每道菜只叫对应的厨师。但要注意,“对应"不是菜单上写死的——哪位厨师擅长什么,是厨房开张后自己磨合出来的。

DeepSeek 的专家团里有两种角色:

共享专家:每一次都要上场,谁的问题它都参与一点。它负责的是那些谁都需要的通用知识。

路由专家:只在自己被叫到时才上场。它们分摊的是各有各的专门知识。

这么切的好处是:通用知识不用在几十个专家里重复学一遍,重复的部分沉到共享专家那里;专门知识则分散在路由专家手里,可以细分成很多份。

这个结构在 2024 年 1 月的 DeepSeekMoE 论文里定型,当时公开的 16B 模型是这样配的:每个 MoE 层 2 个共享专家 + 64 个路由专家,每个词元激活 2+6 位。

顺带一句"细"是怎么回事:同一个总预算下,把每个专家切小、数量加倍,能选出的组合会多得多。论文举的组合例子从 120 种跳到 44 亿种。但作者同时提醒:这只是"潜在选择集合"变大,不等于模型真用遍了这些组合,更不等于知识容量或分数按这个倍数上涨。

四、叫哪几位专家,由一块很小的打分器决定

那么,每个字进来的时候,是谁决定叫哪几位专家?

答案是一块很小的打分器(论文里叫路由器)。它的工作分三步:

  1. 打分:给每一位路由专家打一个分,表示"这个问题交给你,有多合适”。
  2. 取前几名:只保留分数最高的那几位(比如 V3 取 8 位),其余的打分全部作废、不参与计算。
  3. 按分数加权:被选中的专家各出一份结果,按各自的分数比例合成一个总结果。

你可以把它想成医院分诊台:病人进来,分诊台扫一眼,决定这次叫哪几个科室。真正省下的,是没被叫到的科室这次完全不用开工。

还有一个细节值得知道,因为它会影响训练:在 2024 年那篇论文里,被选中的专家的权重不重新归一化,所以选中权重加起来一般小于 1。这与一些"归一化后再加权"的实现不同,是真实存在的差异。

五、MoE 最难的地方:别让全体任务挤给同几个人

上面讲的一切都建立在"分诊台会公平分配"这个假设上。而现实是,它一开始并不公平,而且会越来越不公平。

原因是个恶性循环:某位专家一开始稍微领先一点点,被叫的次数就多一些;被叫得多,它拿到的训练信号就多,于是变得更好用;更好用,就被更频繁地叫……而从头到尾没被叫过的专家,连一次练习机会都没有,永远追不上来。

结果就是有人累死、有人闲死。 术语叫负载均衡问题。它不只是"效率差一点":跨设备部署时,被挤爆的那几位专家所在的机器会成为整条流水线的瓶颈。

DeepSeek 在这条线上做过两次重要改进,不要把两次混成一次:

第一次,2024 年 1 月的 DeepSeekMoE:给均衡加一笔"罚款"。 做法是在训练目标里额外加一项,专家被指派得越不均匀,这一项罚得越重,逼着路由器把任务摊开。

这里说的"辅助损失"就是为了逼迫均衡而额外加进训练目标的惩罚项。它的麻烦在于:模型本来只想"给这个字找到最合适的专家",罚款项却要求"各位专家平均分要接近"——两个要求方向相反,一起压在同一个打分器上。罚得太重,模型效果明显受损;罚得太轻或者不罚,又会失衡甚至塌掉。论文自己承认:“a perfect trade-off may not exist”(可能根本没有完美折中)。

第二次,2024 年 8 月的无辅助损失均衡,V3 用上了它。 这次换了个思路:给每位专家配一个可以上下浮动的小偏置值,只影响"选谁",不影响"选中的权重",而且它根本不进训练目标。每批训练结束后统计一下谁过载、谁空闲,过载的把偏置调低一点,空闲的调高一点,下一批生效。

好处很直白:均衡这件事不再往模型的梯度里掺东西,前面那个两难就被绕开了。2024 年 8 月的论文在 1B 和 3B 的小模型上验证过:困惑度(衡量语言模型好坏,越低越好)降约 0.63%,最大负载偏移降低 94%/92%。V3 是它第一次在旗舰规模上落地。

不过注意措辞:V3 不是"辅助损失完全消失"。它依然保留了一条很弱的序列级辅助损失——作用是防止单条序列内部出现极端不均衡,权重被调得极小。V3 的做法是:绝大多数训练里用偏置调节,最后 500B 词元时连偏置也停止更新。

六、V3 不是只靠 MoE:还有三件配套的事

MoE 把"每个字要算多少参数"压到了 5.5%,但 V3 做到这个规模还靠另外几件配套设计。这里只点名字,不展开:

FP8 低精度训练:用更少的位数(8 位)来存和算数字,而不是常用的 16 位,理论上算力可以翻倍。代价是精度更难保——论文在 16B 和 230B 两档模型上对照验证,相对损失误差始终 小于 0.25%。

DualPipe:跨节点通信和计算抢时间的问题。MoE 的专家分散在不同机器上,任务派发和回收都要走网络。DualPipe 把通信藏进计算的时间里,让流水线空转(气泡)大约减半,而且这个空转不随批量数增长。

不丢词元:V2 训练时会把安排不过来的词元丢掉一批(按每台机器的容量算,超出的部分丢最低分的),并且特意豁免约 10% 的训练序列以保证这些序列上训练和使用一致。V3 因为均衡做得好,训练全程不丢任何词元,训练和使用的差异随之消失。

这三件事和 MoE 是互相成全的:激活压得够低,不用张量并行也训得动;均衡做得好,256 位专家的跨机器通信才有规律可优化;通信被藏起来,低精度省下的算力才不是白拿。只抄其中一件,效果大概不等于 V3。

七、代价与后续:省的是计算,不是全部

最后必须说清 MoE 换来了什么、又付出了什么。

它省的主要是"算"(每回答一个字要动多少参数),不是全部。 换句话说,5.5% 这个比例描述的是计算量这一项,别读成"什么都省了 94.5%":

  • 显存不省。所有专家的参数都得存着、随时能被叫到。V3 的发布说明里,权重文件总大小是 685B(671B 主模型 + 14B 的 MTP 模块);这个"14B"是粗口径,其中 MTP 独有的参数是 11.5B,剩下的部分与主模型共享。而且官方只提供 FP8 权重,要用 16 位版本得自己跑仓库里的转换脚本。

  • 部署门槛不低。V3 论文自己承认推荐的部署单元偏大,对小团队是负担。

  • 路由本身就难均衡,前面整整一节都在讲这件事。

这条线还在延伸。2026 年 4 月的 V4 报告里,V4-Pro 的规模到了 1.6T 总参数 / 49B 激活。

这里留一个本系列反复要用的提醒:49B 比 V3 的 37B 更大,不是更小。V4 那篇报告自己写的是"V4-Pro 拥有更多的激活参数"。所以"激活参数一路变小所以越来越省"是个假叙事——效率的提升另有来源,这是第十篇的主题,这里先记下这个坑。


一句话总结: MoE 把"参数总量"和"每次算多少"拆成两件事,用一小撮专家换来大得多的知识容量;但它真正的难点不在切分,而在让分诊台公平——DeepSeek 为此从"加罚款"走到了"只调选择、不碰梯度"。

记住这个数字: 671B 总参数、37B 激活——DeepSeek-V3 只用约 5.5% 的参数参与每个词元的计算(前提:这是 V3 自己的两个数字相除,不代表 MoE 通用比例,也不代表显存省了这么多)。

下一篇: 模型怎么会"想"了:GRPO 与 R1——省下来的算力,后来被拿去做什么了。