CosineWarmup 理论与代码实战
本文分享自华为云社区《CosineWarmup理论介绍与代码实战》,作者: 李长安。
CosineWarmup 理论介绍与代码实战
CosineWarmup 是一种非常实用的训练策略,本次教程将带领大家实现该训练策略。教程将从理论和代码实战两个方面进行。
在代码实战部分,模型采用 LeNet-5 模型进行测试,数据采用 Cifar10 数据集作为基准数据,
Warmup 最早出现于这篇文章中:Accurate, Large Minibatch SGD:Training ImageNet in 1 Hour,warmup 类似于跑步中的热身,在刚刚开始训练的时候进行热身,使得网络逐渐熟悉数据的分布,随着训练的进行学习率慢慢变大,到了指定的轮数,再使用初始学习率进行训练。
consine learning rate 则来自于这篇文章Bag of Tricks for Image Classification with Convolutional Neural Networks,通过余弦函数对学习率进行调整
一般情况下,只在前五个 Epoch 中使用 Warmup,并且通常情况下,把 warm up 和 consine learning rate 一起使用会达到更好的效果。
Warmup
Warmup 是在 ResNet 论文中提到的一种学习率预热的方法,它在训练开始的时候先选择使用一个较小的学习率,训练了一些 epoches 或者 steps(比如 4 个 epoches,10000steps),再修改为预先设置的学习来进行训练。由于刚开始训练时,模型的权重(weights)是随机初始化的,此时若选择一个较大的学习率,可能带来模型的不稳定(振荡),选择 Warmup 预热学习率的方式,可以使得开始训练的几个 epoches 或者一些 steps 内学习率较小,在预热的小学习率下,模型可以慢慢趋于稳定,等模型相对稳定后再选择预先设置的学习率进行训练,使得模型收敛速度变得更快,模型效果更佳。
余弦退火策略
当我们使用梯度下降算法来优化目标函数的时候,当越来越接近 Loss 值的全局最小值时,学习率应该变得更小来使得模型尽可能接近这一点,而余弦退火(Cosine annealing)可以通过余弦函数来降低学习率。余弦函数中随着 x 的增加余弦值首先缓慢下降,然后加速下降,再次缓慢下降。这种下降模式能和学习率配合,以一种十分有效的计算方式来产生很好的效果。
带 Warmup 的余弦退火策略
单个周期余弦退火衰减图形
以单个周期余弦退火衰减为例,介绍带 Warmup 的余弦退火策略,如下图所示,学习率首先缓慢升高,达到设定的最高值之后,通过余弦函数进行衰减调整。但是通常面对大数据集的时候,学习率可能会多次重复上述调整策略。
代码实现
实战
总结
之前一直提到这个 CosineWarmup,但是一直没有实现过,这次也算是填了一个很早之前就挖的坑。同样,这里也不再设置对比实验,因为这个东西确实很管用。小模型和小数据集可能不太能够体现该训练策略的有效性。大家如果有兴趣可以使用更大的模型、更大的数据集测试一下。
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/8254e22a57943c7b6fe2ae685】。文章转载请联系作者。
评论