神经网络训练 trick 之 lr 设置

架构师之家

2018-01-12 12:03
关注

吴恩达 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 实现

举报/反馈