【深度学习】Cyclical Learning Rates 周期学习率

版权声明:转载请注明 https://blog.csdn.net/u013166817/article/details/86503899

论文地址:https://arxiv.org/abs/1506.01186

目录

1. 背景介绍

2. 实现方式

2.1 选取base lr,max lr

2.2 选取step size 步长

2.3 选取衰减函数

3. 论文结果


1. 背景介绍

学习率是深度神经网络中很重要的一个超参数,指代的是我们在梯度下降时参数更新的步长,选取合适的学习率十分重要,太小了会减慢收敛,太大会在最优点旁边左右摆动,如下图所示。

传统的优化器分为“固定学习率”的(SGD)和“自适应学习率”的(Adaboost,Adam,...)。详细信息参考:https://blog.csdn.net/u013166817/article/details/83375158。而Cyclical Learning Rates(CLR)是一种自适应学习率的方法,它可以和上述的优化器结合,让学习率在一个范围内周期性地变化,从而加速收敛并提升模型性能。

SGD optimization on loss surface contours
SGD optimization on saddle point(鞍点)

直觉上看,随着训练次数的增加我们应该保持学习率一直减小以便于在某一时刻达到收敛。

然而,事实恰与直觉相反,使用一个在给定区间里周期性变化的LR可能更有用处。原因是周期性高的学习率能够使模型跳出在训练过程中遇到的局部最低点和鞍点。事实上,Dauphin等指出相比于局部最低点,鞍点更加阻碍收敛。如果鞍点正好发生在一个巧妙的平衡点,小的学习率通常不能产生足够大的梯度变化使其跳过该点(即使跳过,也需要花费很长时间)。这正是周期性高学习率的作用所在,它能够更快地跳过鞍点。


参考:https://blog.csdn.net/weixin_43896398/article/details/84762886 

 

 

2. 实现方式

详细流程可参考CLR的keras实现源码:https://github.com/bckenstler/CLR

具体实现过程,让lr在base_lr 和 max_lr 之间周期行变化(先增加再减小),一轮(cycle)包含两个step_size,每次step lr会更新一次。更新方式(衰减函数)有多种选择。

基本更新流程如下:

cycle = np.floor(1+iterations/(2*step_size))
x = np.abs(iterations/step_size - 2*cycle + 1)
lr= base_lr + (max_lr-base_lr)*np.maximum(0, (1-x))*scale_fn(x)

cycle依赖于整个训练的iterations迭代次数,随着迭代次数增加,cycle也会增加;

lr依赖于最小最大lr以及衰减函数scale_fn。

2.1 选取base lr,max lr

没有特别的方法,只能先预设两个值,然后训练几个epoch,找到稳定的最小值和最大值。如下图:

max lr 一般取平缓区域开始或结束位置,如图中的0.005/0.006左右;

base lr 则是上述max lr 的1/3或1/4,比如图中的0.001左右。

当然也可以具体问题具体分析最大最小学习率。

2.2 选取step size 步长

已有证明,将step size设成一个epoch包含的iteration数量的2-10倍即可。

2.3 选取衰减函数

triangular: scale_fn = 1;

triangular: scale\_fn = \frac{1}{2^{(cycle-1)}}

exp_range: scale\_fn = \gamma^{iters}, gamma可以取0.99994等值;

Alt text

Alt text

Alt text

3. 论文结果

如下图,CLR确实加快了收敛并且提升了准确率。

没有更多推荐了,返回首页