当前位置:首页 > AI其它类

为什么大模型参数这么多却不太慢?MoE 混合专家架构原理拆解

1周前 (10-05)AI其它类19

这几年有个奇怪的现象:有的模型总参数大得吓人,跑起来却没想象中那么慢,训练成本还压得很低。背后的关键,很多时候就是"MoE"这三个字母——混合专家(Mixture of Experts)。

MoE 这几年因为 DeepSeek 被推到台前,但它不是新东西。这篇拆它的架构:为什么"参数变大、算力却不跟着变大",中间的"稀疏激活"到底是怎么做到的,以及它为此付出什么代价。

稠密模型的路越走越窄:每个 token 都要过全部参数

先看传统的大模型结构。标准的 Transformer 里,前馈层(FFN)占了大头,模型参数主要堆在这里。所谓"稠密"(Dense)模型,指的是:每来一个 token,它都要把这套前馈层的所有参数都过一遍,参数是全量激活的。

这就带来一个两难:想让模型更强,就往里堆更多参数;但参数一多,每个 token 的计算量跟着涨,推理变慢、训练变贵。参数规模和算力成本死死绑在一起,能力的天花板被算力卡住。

MoE 想干的,就是把这两者解绑。

moe-cover.jpg

MoE 的巧:只点亮少数「专家」

MoE 的做法,是把前馈层从"一个大网",改成"一排并列的小网"。这些小网,各自是一个独立的前馈网络,被叫做"专家"(expert)。

关键在这个"只点亮少数":来一个 token,不是让所有专家都参与,而是由一个门控网络(也叫路由器,router/gate)先算一圈,挑出当前 token 更该走的少数几个专家(常见 top-2,即激活两个),只有这几个专家被真正计算,其余专家原地待命。

这么一改,参数和算力就分家了:专家的总参数可以铺得很开(比如有几十上百个专家,总参数量轻松上千亿),但单个 token 实际只激活其中两个,算力跟一个"总参数只有激活部分那么大"的模型差不多。

门控是怎么挑专家的

门控网络本身也是个小的线性层加 softmax:进来一个 token 的表征,它给每个专家打一个分数,归一化成概率,再选概率高的那 k 个。

简化后可以这么想:

scores = softmax( W_gate · h )     # 每个专家一个分数
topk   = 取 scores 排在前 k 的专家
out    = Σ 分数ᵢ × expertᵢ(h)       # 只在这些专家上算,再按分数加权求和

这个 token 的输出,是那几个被选中专家的结果按门控分数加权得来的。没被选中的专家,这轮完全不出力——这正是"稀疏激活"的来源。

顺带说一句"稀疏"到底省在哪:省的不是内存,是计算量。所有专家的权重都还得装下,参数一多,显存或存储照样涨;真正省下的是每个 token 要做的乘加运算量,因为只算了少部分专家。

稀疏激活的好处,和它埋下的三个坑

好处很直接:在算力几乎不变的前提下,把模型容量(参数量)做大,训练和推理的单 token 成本都压下来。

但稀疏激活不是白捡的,它带来了几个专属难题。

一是负载均衡。理想情况是每个专家被选中的机会差不多。现实是门控容易偷懒——训着训着,大多数 token 都往少数几个"热门专家"挤,别的专家闲置。结果热门专家过载、冷门专家浪费,容量优势打了折扣。

二是路由塌缩。更糟的情况是,如果门控把所有 token 都路由到同一个专家,MoE 就退化成一个普通稠密层,等于白搭。

三是训练不稳定。门控是离散的"选或不选",梯度怎么传、专家怎么均衡更新,都比稠密模型难伺候。

应对的办法常见有这样几味:加一个辅助的负载均衡损失(aux loss),训练时惩罚"专家分配太不平均"的情况;再给门控分数加点噪声(noisy top-k)让路由更愿意探索;有时再设一个容量上限,防止某个专家一口气吞下太多 token。

DeepSeek 的改进:更细的专家 + 共享专家

把 MoE 带火的 DeepSeek,在这套框架上做了自己的文章,核心是两个改动。

一是细粒度专家的分割。传统专家又大又少,DeepSeekMoE 改成更多、更小的专家,让每个专家更专、颗粒更细。这样做的好处,是专家之间的知识分得更开,激活组合也更灵活,提升专家利用率。

二是共享专家(shared experts)。除了路由选择的专家,再设一批"默认总是激活"的共享专家,用来承接那些通用的、底层的知识。路由专家处理差异化的活,共享专家兜住公共的底,路由压力就小了不少。

这套思路落到 DeepSeek-V2、V3,再到 R1,让它在推理和训练成本上做出了很亮眼的账,也让 MoE 从论文里的小众技巧,变成了人人都想学一手的架构。

小结

把 MoE 收一下:稠密模型的问题是参数和算力绑死,能力被算力卡住;MoE 用"一排专家 + 门控路由 + 只激活 top-k"把两者解绑,靠稀疏激活实现"参数量做大、单 token 算力不变";代价是负载均衡、路由塌缩、训练不稳定三个坑,靠辅助损失、噪声门控、容量上限来填;DeepSeekMoE 再用细粒度专家和共享专家,把专家利用率和成本账做得更漂亮。

理解了这套"少数专家替全班干活"的结构,再看那些"总参数吓人、跑起来却挺轻快"的模型,就能心知肚明——大,是容量的大;快,是激活的少。两者能在 MoE 里同时成立。

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。