MoE:稀疏门控混合专家

4,710 字 · 预计阅读 13 分钟

2017 · Shazeer 等 / Google · 参数很多,但每个 token 只激活一小部分专家

2017 年,Shazeer 等人在 Google 提出稀疏门控混合专家层(MoE)。

每一层放很多个「专家」前馈网络,门控网络为每个 token 只选 top-k 个专家计算,其余不激活。这样模型总参数量可以做得很大,单次计算量却只按激活部分算。

论文用带噪声的 top-k 门控和负载均衡损失把训练稳住,是今天 MoE 大模型的直系祖先。

原文:https://arxiv.org/abs/1701.06538


一、先打个比方:医院的分诊台

想让模型更聪明,最直接的办法是把它做大,也就是参数更多。

参数就是模型里那些训练时会被调整的数字。

普通的模型叫「稠密」模型:每来一个 token,全部参数都要参与计算。参数翻一倍,计算量也跟着翻一倍。

MoE 换了个思路,我们拿医院来打比方。

一家医院有很多科室,每个科室就是一个「专家」。病人(token)进门先到分诊台,分诊台就是「门控网络」。

分诊台看一眼病人,只给他挂两三个科室的号,这就是 top-k,k 是挑几个。其余科室这次不用管这个病人,这就是「不激活」。

稠密模型每个 token 都要算完全部参数,MoE 只叫醒其中几个专家

这样医院可以开很多很多科室,也就是总参数很多。每个病人却只看两三个科室,计算量很小。

论文把这种「每次只用网络的一部分」的做法叫条件计算。

比方有一处不像:真实的专家擅长什么,是训练中自己分出来的,不是人提前安排的,也不像「内科」「外科」那样一看就懂。

「混合专家」这个想法早在 1991 年就有了。这篇论文的新东西是「稀疏」和「规模」:每次只用很少几个专家,专家的数量却做到几千、几万个。


二、一层 MoE 长什么样

先说前馈网络。模型每一层里都有一个小网络,把每个 token 单独加工一遍,这就是前馈网络。

它做的事很简单:先把 token 的一串数字变长,再变回原来的长度。

论文里每个专家就是这样一个前馈网络:输入 512 个数,中间变成 1024 个,再变回 512 个。

它的参数主要是两张表:512 × 1024 + 1024 × 512 = 1048576,大约 100 万个。

一个 token 经过 MoE 层,要走四步:

  1. 门控网络给每个专家打一个分
  2. 只留分数最高的 k 个专家,其余落选
  3. 把留下的分数变成加起来等于 1 的权重
  4. 被选中的专家各自把 token 算一遍,结果按权重加起来

一层 MoE:门控挑出专家和权重,被选中的专家各算一遍,再按权重相加

论文把它写成一个式子:

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 名,再用 softmax 变成加起来是 1 的权重

第 ① 步,专家 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 之间。

本文是会员内容

全文 4,710 字,已试读约 30%。开通专业版可阅读全文,并解锁全部官方课程与后续更新。

开通专业版

支持 7 天无理由退款 · 早鸟价 99 元/年(售完恢复365/年)

课程中涉及的第三方项目,其著作权与商标归各自权利人所有;引用处的署名与许可见《开源与来源说明》。