这个问题目前还没有被充分证明,我们只能从直觉上和已有的一些论文得到推测:
- 有助于减缓模型在初始阶段对mini-batch的提前过拟合现象,保持分布的平稳
- 有助于保持模型深层的稳定性
下面来看一下为什么warmup会有这样的效果。
首先,当我们的mini-batch增大的时候,learning rate也可以成倍增长,即mini-batch大小乘以k,lr也可以乘以k。这是为什么呢?比如现在模型已经train到第t步,权重为 ,我们有k个mini-batch,每个大小为n,记为
。下面我们来看,以学习率
训k次 和以学习率
一次训
时学习率的关系。
假设我们用的是SGD,那么训k次后我们可以得到:
如果我们一次训就可以得到:
显然,这两个是不一样的。但如果我们假设 ,那么令
就可以保证
。那么,在什么时候
可能不成立呢?可能有如下两种情况 :
- 在训练的开始阶段,模型权重迅速改变
- mini-batch size较小,样本方差较大
第一种情况很好理解,可以认为,刚开始模型对数据的“分布”理解为零,或者是说“均匀分布”(当然这取决于你的初始化);在第一轮训练的时候,每个数据点对模型来说都是新的,模型会很快地进行数据分布修正,如果这时候学习率就很大,极有可能导致开始的时候就对该数据“过拟合”,后面要通过多轮训练才能拉回来,浪费时间。当训练了一段时间(比如两轮、三轮)后,模型已经对每个数据点看过几遍了,或者说对当前的batch而言有了一些正确的先验,较大的学习率就不那么容易会使模型学偏,所以可以适当调大学习率。这个过程就可以看做是warmup。那么为什么之后还要decay呢?当模型训到一定阶段后(比如十个epoch),模型的分布就已经比较固定了,或者说能学到的新东西就比较少了。如果还沿用较大的学习率,就会破坏这种稳定性,用我们通常的话说,就是已经接近loss的local optimal了,为了靠近这个point,我们就要慢慢来。
第二种情况其实和第一种情况是紧密联系的。在训练的过程中,如果有mini-batch内的数据分布方差特别大,这就会导致模型学习剧烈波动,使其学得的权重很不稳定,这在训练初期最为明显,最后期较为缓解(所以我们要对数据进行scale也是这个道理)。
这说明,在上面两种情况下,我们并不能单纯地成倍增长lr 。要么改变学习率增长方法,要么设法解决上面两个问题。
综上所述,如果来总结一下现在大batch size和大learning rate下的学习率变化和规律的话,可以认为,学习率是呈现“上升—平稳—下降”的规律,这尤其在深层模型和具有多层MLP层的模型中比较显著。如果从模型学习的角度来说,学习率的这种变化对应了模型“平稳—探索—平稳”的学习阶段。
那么你也许会问,为什么早期的神经网络没有warmup?这就回到了之前我们说的两点,与它们对应,早期神经网络的环境是:
- 网络不够大、不够深
- 数据集普遍较小,batch size普遍较小
这两点和上面提到的两点是对应的。网络不够大不够深就意味着模型能够比较容易地把分布拉回来,数据集比较小意味着mini-batch之间的方差可能没有那么大,从而学习率不进行warmup可能不会出现很严重的学习问题。