转载至作者香侬科技
https://www.zhihu.com/question/338066667
scheduler = get_linear_schedule_with_warmup(
optimizer, num_warmup_steps=int(opt.warmup_proportion * t_total), num_training_steps=t_total
)
# 使用 SGD 训练神经网络时,在初始使用较大学习率而后期切换为较小学习率
warmup 需要在训练最初使用较小的学习率来启动,并很快切换到大学习率而后进行常见的decay。(在预热期间,学习率从0线性增加到优化器中的初始lr。在预热阶段之后创建一个schedule,使其学习率从优化器中的初始lr线性降低到0)
有助于减缓模型在初始阶段对mini-batch的提前过拟合现象,保持分布的平稳
有助于保持模型深层的稳定性
在训练的开始阶段,模型权重迅速改变
刚开始模型对数据的“分布”理解为零,或者是说“均匀分布”(当然这取决于你的初始化);在第一轮训练的时候,每个数据点对模型来说都是新的,模型会很快地进行数据分布修正,如果这时候学习率就很大,极有可能导致开始的时候就对该数据“过拟合”,后面要通过多轮训练才能拉回来,浪费时间。当训练了一段时间(比如两轮、三轮)后,模型已经对每个数据点看过几遍了,或者说对当前的batch而言有了一些正确的先验,较大的学习率就不那么容易会使模型学偏,所以可以适当调大学习率。这个过程就可以看做是warmup。那么为什么之后还要decay呢?当模型训到一定阶段后(比如十个epoch),模型的分布就已经比较固定了,或者说能学到的新东西就比较少了。如果还沿用较大的学习率,就会破坏这种稳定性,用我们通常的话说,就是已经接近loss的local optimal了,为了靠近这个point,我们就要慢慢来。
mini-batch size较小,样本方差较大
在训练的过程中,如果有mini-batch内的数据分布方差特别大,这就会导致模型学习剧烈波动,使其学得的权重很不稳定,这在训练初期最为明显,最后期较为缓解