转载自 | PaperWeekly
©PaperWeekly 原创 · 作者 | 苏剑林
单位 | 追一科技
研究方向 | NLP、神经网络
看了标题,可能读者会有疑惑,大家不都想着将大模型缩小吗?怎么你想着将小模型放大了?其实背景是这样的:通常来说更大的模型加更多的数据确实能起得更好的效果,然而算力有限的情况下,从零预训练一个大的模型时间成本太大了,如果还要调试几次参数,那么可能几个月就过去了。
这时候“穷人思维”就冒出来了(土豪可以无视):能否先训练一个同样层数的小模型,然后放大后继续训练? 这样一来,预训练后的小模型权重经过放大后,就是大模型一个起点很高的初始化权重,那么大模型阶段的训练步数就可以减少了,从而缩短整体的训练时间。
含义
有的读者可能想到:这肯定可以呀,大模型的拟合能力肯定大于小模型呀。的确,从拟合能力角度来看,这件事肯定是可以办到的,但这还不是本文关心的“无损放大”的全部。
以 BERT 为例,预训练阶段主要就是一个 MLM 模型,那么“无损放大”的含义就是:是否可以通过某种变换,把一个小模型直接变换成一个大模型,并且输出完全不改变?
这里的变换,指的是对权重做一些确定性的变换,而不用通过梯度下降来继续训练;输出完全不改变,指的是对于同一个输入,小模型和大模型给出的预测结果是完全一致的,也就是说它们表面上看起来不一样,但数学上它们是完全一致的函数,所以称为“无损放大”。由于是无损放大,我们至少可以保证大模型不差于小模型,所以继续预训练理论上有正的收益。至于先小后大这样预训练在效果上能不能比得上一开始就从大训练,这个需要实验来确定,并不是本文关心的问题。
尝试
2.1 Embedding
两种方案都可以作为候选方案,但直觉上来想,补零这种方式引入了太多的零,会导致过度稀疏和同一个值重复次数过多,不利于权重的多样性,因此我们还是选择了重复这种方案。不过,就算只看重复,也不指上述一种方式,比如
2.2 LayerNorm
2.3 FeedForward
按照顺序,接下来本来应该分析 Attention 层才对,不过 FeedForward 层相对简单一点,并且 FeedForward 层的分析结果也对后面理解 Attention 层的变换有所帮助,因此这里先来考虑 FeedForward 层的变换。
事实上,BERT 用的 GeLU 激活函数就不满足该恒等式;线性激活函数(不加激活函数)显然是满足这个等式的,而满足这个等式一个常见的非线性激活函数便是 ReLU(也包括 LeakyReLU)函数,因此一个直接的解决方式就是 FeedForward 层换用 ReLU 激活函数。事实上,这也已经是预训练模型的一个常见选择了,百度的 Ernie 和 Google 的 T5 模型,它们的 FeedForward 层激活函数都是用 ReLU。
上述内容只是针对 Attention 的单个头进行分析,事实上 Attention 有多个头,多个头的输出结果还要拼接起来再接一个全连接层。当然,由于每个头都是平等的、独立的,因此上述结论基本不变,最后全连接层也只需要按照式(6)进行变换,就可以让 Attention 的变换效果。但是,多头带来的一个效应是,我们在重复的时候,必须局部地进行重复。
2.5 输出概率分布
结论
现在我们可以确认,对于 BERT 来说,如果非线性激活函数用 ReLU,那么 BERT 是可以直接无损放大的,如果非线性激活函数不是 ReLU,那么可以实现 MLM 准确率无损的放大(事实上经过更精细的调整,也可以实现完全无损放大,但每个层的变换有点不统一了,不够优雅);对于 GPT、T5 等模型来说,不管激活函数用啥(包括 mT5 用的 GLU 激活,也可以定制适当),其实都可以实现无损放大。
联系客服