是什么门的缩写_MoE: 稀疏门控制的专家混合层

2023-05-16

Moe,是Mixture-Of-Experts的缩写,可以在保证运算速度的情况下,将模型的容量提升>1000倍。

动机

现在的模型越来越大,训练样本越来越多,每个样本都需要经过模型的全部计算,这就导致了训练成本的平方级增长。

为了解决这个问题,参考文献[1]提出了一种方式,即将大模型拆分成多个小模型,对于一个样本来说,无需经过所有的小模型去计算,而只是激活一部分小模型进行计算,这样就节省了计算资源。

那么如何决定一个样本去经过哪些小模型呢?这就引入了一个稀疏门机制,即样本输入给这个门,得到要激活的小模型索引,这个门需要确保稀疏性,从而保证计算能力的优化。

难点

听起来这个方法其实还是很直接的,那么为什么之前没有人做呢?主要因为以下几点:

  • 现在的设备,比如GPU,比较擅长做运算,不擅长做分支。
  • 大批量是训练模型的必须,但是这种方式下会导致每个小模型的样本数较少,无法训练得到好的模型
  • 网络通信是瓶颈。
  • 为了控制稀疏性,可能需要在loss上去做些改进,确保模型质量和小模型上的负载均衡
  • 模型容量对大数据集比较重要,现有的工作都是在类似cifar10之类的数据上做的,很难有好效果。

模型结构

模型结构如下图,首先MoE是一个层,而不是一整个模型。其次,正如我们刚才所说,这个模型结构包含一个门网络来决定激活哪个expert,同时包含n个expert网络,这n个expert网络一般是同结构的。

公式如下,当G(x)i=0的时候,对应的expert就不会激活。

更具体的,这个门网络其实比较简单,就是一个dense layer再来一个softmax。

为了保证稀疏性和均衡性,对这个softmax做了如下处理:

第一个变动就是KeepTopK,这是个离散函数,将top-k之外的值强制设为负无穷大,从而softmax后的值为0。

第二个变动是加了noise,这个的目的是为了做均衡,这里引入了一个Wnoise的参数,后面还会在损失函数层面进行改动。

批缩小问题

刚才说到,这种gate的方式会导致每个expert分到的样本太少。假设有n个experts,batch_size=b,每次会有k个expert被选择,每个expert会接收到平均kb/n << b个样本。

这里提出了一些解决方法:

  • 数据并行和模型并行: 相当于变相的扩大b,假设有d个device,每个device上一次处理b个样本,那么在这次训练中,batch=bd,从而每个expert会接收kbd/n个样本。
  • 单步拆分: 在我们的实验中,MoE中每个expert都是一个单层全连接,而这个层次是在LSTM层之间,因而,可以把训练LSTM时的多步给拆分开,从而相当于增大MoE训练的batch_size。
  • 采用一些方法优化模型训练时的内存,从而进一步增大batch size。

均衡问题

如果不做改进,那么这么多的expert,只有几个expert会被集中使用。为了改进这一问题,给每个expert定义了一个importance的概念。importance就是指这个expert所处理的样本数,简而言之就是G(x)对应位置的和。损失函数则是importance的平方乘以一个系数。

实验结果

在语言模型和机器翻译上进行了实验,其中语言模型任务上分别在1b/100b词语的语料上进行了实验:

可以看到,同样的计算量下,MoE效果更好,同时,更大的语料上,MoE还可以进一步提升。

同样的,MoE虽然总参数量上去了,但是计算量下来了,效果也比之前的模型要好。

总结与思考

MoE是一种比较通用的框架,虽然论文里只在单层全连接上做了实验,但其实这个框架可以用其他层次,甚至一些比较复杂的层次块,比如Attention。

参考文献

  • [1]. Shazeer, Noam, et al. "Outrageously large neural networks: The sparsely-gated mixture-of-experts layer." arXiv preprint arXiv:1701.06538 (2017).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是什么门的缩写_MoE: 稀疏门控制的专家混合层 的相关文章

随机推荐