吴恩达 Coursera 第二课中有讲如何选择学习率 lr,本文是阅读论文 Cyclical Learning Rates for Training Neural Networks,一种新的 lr 设置策略论文的笔记。
论文内容
增加 lr 短期可能会让 loss 增大,但是长期来看对 loss 减少是有帮助的。基于上面的观察,我们有别于传统的 lr 指数下降,我们采用周期性调整的策略,一种最简单的方式叫
Triangular learning rate policy
:
为什么这种周期性变化的 lr 策略有效呢?
我们可以见知乎的一个问答有哪些学术界都搞错了,忽然间有人发现问题所在的事情?
长期以来,人们普遍认为,的神经网络中包含很多局部极小值(local minima),使得算法容易陷入到其中某些点,这是造成神经网络很难优化的原因,但是到 2014 年,一篇论文《Identifying and attacking the saddle point problem inhigh-dimensional non-convex optimization》指出高维优化问题中根本没有那么多局部极值。作者依据统计物理,随机矩阵理论和神经网络理论的分析,以及一些经验分析提出高维非凸优化问题之所以困难,是因为存在大量的鞍点(梯度为零并且 Hessian 矩阵特征值有正有负)而不是局部极值。
因此在鞍点附近增加 lr,能够让我们快速跳出鞍点。有篇中文博客 SGD,Adagrad,Adadelta,Adam 等优化方法总结和比较描述了现在各种方法在鞍点附近的优化,看图:
下面回到论文,前面论文介绍了一种方法叫:triangular,
里面需要我们确定的参数有:stepsize,base_lr,max_lr,下面我们来看 step_size 怎么选取?
假设有 5w 个训练样本,batchsize=100,则每个 epoch 有 500 次迭代,实验结果表明 stepsize 设置为 2~8 倍的迭代次数比较合适。
使用 triangular 策略还给我们带来的一个好处是我们可以知道什么时候停止训练:我们可以采用周期性的 lr 进行训练 3 回,然后再继续训练 4 次甚至更多,能够达到很好的效果。
下一步我们需要回答的是怎么去选择 base_lr,max_lr 两个参数。
方案:设置 stepsize 和 max_iter 为一个 epoch 中迭代次数,然后 lr 从 base_lr 增大到 max_lr ,然后画出 accuracy 在此过程中的变化曲线。
如上图,我们找寻 base_lr 和 max_lr 的方式是:accuacy 开始剧升的时候是一个点,accuacy 开始下坡的时候是一个点。
下面来看一个 GitHub 上对于此论文的实现.
triangular
当前迭代次数属于哪个 cycle 中:
cycle = np.floor(1+iterations/(2*step_size))
下面是想计算上图中每个点其具体的 lr 值是多少,建立坐标后,开始计算点 (x,y),我们知道了当前 cycle,每个 cycle 的 iter 是
2*cycle*step_size
,然后再用当前 iterations 减去这个值:
x = np.abs(iterations/step_size - 2*cycle + 1)
y 要区分是上升还是下降阶段:
lr = base_lr + (max_lr-base_lr)*np.maximum(0, (1-x))
triangular2
这个策略是每个新的 cycle,新的 max_lr 都减半:
exp_range
这个策略是每个新的 cycle,新的 max_lr 指数下降:
几个相关资料:
深度学习论文 - Cyclical Learning Rates for Training Neural Networks
手把手教你估算深度神经网络的最优学习率(附代码 & 教程)
bckenstler/CLR keras 实现