2017 年,Shazeer 等人在 Google 提出稀疏门控混合专家层(MoE)。
每一层放很多个「专家」前馈网络,门控网络为每个 token 只选 top-k 个专家计算,其余不激活。这样模型总参数量可以做得很大,单次计算量却只按激活部分算。
论文用带噪声的 top-k 门控和负载均衡损失把训练稳住,是今天 MoE 大模型的直系祖先。
原文:https://arxiv.org/abs/1701.06538
一、先打个比方:医院的分诊台
想让模型更聪明,最直接的办法是把它做大,也就是参数更多。
参数就是模型里那些训练时会被调整的数字。
普通的模型叫「稠密」模型:每来一个 token,全部参数都要参与计算。参数翻一倍,计算量也跟着翻一倍。
MoE 换了个思路,我们拿医院来打比方。
一家医院有很多科室,每个科室就是一个「专家」。病人(token)进门先到分诊台,分诊台就是「门控网络」。
分诊台看一眼病人,只给他挂两三个科室的号,这就是 top-k,k 是挑几个。其余科室这次不用管这个病人,这就是「不激活」。

这样医院可以开很多很多科室,也就是总参数很多。每个病人却只看两三个科室,计算量很小。
论文把这种「每次只用网络的一部分」的做法叫条件计算。
比方有一处不像:真实的专家擅长什么,是训练中自己分出来的,不是人提前安排的,也不像「内科」「外科」那样一看就懂。
「混合专家」这个想法早在 1991 年就有了。这篇论文的新东西是「稀疏」和「规模」:每次只用很少几个专家,专家的数量却做到几千、几万个。
二、一层 MoE 长什么样
先说前馈网络。模型每一层里都有一个小网络,把每个 token 单独加工一遍,这就是前馈网络。
它做的事很简单:先把 token 的一串数字变长,再变回原来的长度。
论文里每个专家就是这样一个前馈网络:输入 512 个数,中间变成 1024 个,再变回 512 个。
它的参数主要是两张表:512 × 1024 + 1024 × 512 = 1048576,大约 100 万个。
一个 token 经过 MoE 层,要走四步:
- 门控网络给每个专家打一个分
- 只留分数最高的 k 个专家,其余落选
- 把留下的分数变成加起来等于 1 的权重
- 被选中的专家各自把 token 算一遍,结果按权重加起来

论文把它写成一个式子:
y = G(x)₁·E₁(x) + G(x)₂·E₂(x) + … + G(x)ₙ·Eₙ(x)x 是进来的 token,Eᵢ(x) 是第 i 个专家算出来的结果,G(x)ᵢ 是门控给它的权重,n 是专家个数。
落选专家的权重是 0,乘出来也是 0,所以干脆不算。省计算就省在这里。
同一句话里的每个 token,都经过同一个 MoE 层,但各自挑各自的专家。比如「苹果」去了 3 号和 17 号,「手机」去了 3 号和 205 号(编号为示意)。
三、门控怎么挑:打分、留前几名、算权重
门控网络其实很简单,就是一张表 W_g:有多少个专家,表就有多少列。
token 的那串数字和这张表一乘,每个专家就得到一个分数。分数越高,说明门控越觉得这个专家适合处理它。
我们拿 8 个专家、每次选 2 个来走一遍,打分是编的:

第 ① 步,专家 2 得 2.5 分,专家 5 得 2.1 分,是前两名。
第 ② 步,其余 6 个专家的分数全部换成 −∞(负无穷)。论文管这一步叫 KeepTopK。
第 ③ 步是 softmax:把每个分数变成 e 的那么多次方,再按比例分成加起来是 1 的权重。e 的 −∞ 次方是 0,所以落选专家的权重正好是 0。
前两名:e 的 2.5 次方约 12.18,e 的 2.1 次方约 8.17。
专家 2 的权重是 12.18 ÷(12.18 + 8.17)≈ 0.60,专家 5 是 0.40。分数高的拿大头。
论文里,专家不多时 k = 4,每个 token 用 4 个专家。
专家多到几千个时,论文分两级挑。比如 4096 个专家分成 16 组,每组 256 个:先挑 2 组,每组里再挑 2 个,一共还是 4 个。
这样每次只要在 16 个组、256 个专家里挑,不用一下子在 4096 个里挑。论文给这种模型的名字加了个 h,比如 MoE-4096-h。
四、为什么要加噪声
门控有个毛病:越被选中的专家,越容易被选中。
还是拿医院来说。分诊台总把病人往两个科室送,这两个科室的医生看得多,越来越会看,分诊台就更愿意往那送。
另外几个科室一个病人都没有,医生一直是新手,分诊台就更不敢送。

论文里说,训练时门控很容易变成总给同样几个专家大权重。这个毛病还会自己加重:被偏爱的专家训练得更快,于是更常被选中。
结果就是:开了几千个科室,真正干活的只有几个。
论文的第一个办法,是在打分时加一点随机的噪声:
H(x)ᵢ = (x·W_g)ᵢ + 随机数 × softplus((x·W_noise)ᵢ)前一半就是原来的打分。后一半是噪声:随机数每次重新抽,大多落在 −2 到 2 之间。