Adam和学习率衰减(learning rate decay)

摘要:
目录梯度下降方法更新参数Adam更新参数Adam+学习速率衰减Adam衰减学习速率参考本文首先介绍了一般梯度下降方法如何更新参数,然后描述了Adam如何更新参数以及Adam如何与学习速率衰减相结合。Adam+学习速率衰减在StackOverflow上存在问题,应为自适应StackOverload提供广泛的学习步长。我也想过这个问题。我们应该为Adam的自适应学习率方法进行逐步学习吗?论文“分解权重衰减规则化”第4.1节提到:由于Adamalreadyadapts的参数将被出售,因此,与SGD相比,学习率并不是一个常见的学习多个计划,但结果表明,这样的计划可以显著提高Dam的性能,并且不可能过度使用它们来进行自适应的分级算法。am,你也可以使用learningsteppay。所以问题是,亚当的学习率会下降吗?

目录

本文先介绍一般的梯度下降法是如何更新参数的,然后介绍 Adam 如何更新参数,以及 Adam 如何和学习率衰减结合。

梯度下降法更新参数

梯度下降法参数更新公式:

[ heta_{t+1} = heta_{t} - eta cdot abla J( heta_t) ]

其中,(eta) 是学习率,( heta_t) 是第 (t) 轮的参数,(J( heta_t)) 是损失函数,( abla J( heta_t)) 是梯度。

在最简单的梯度下降法中,学习率 (eta) 是常数,是一个需要实现设定好的超参数,在每轮参数更新中都不变,在一轮更新中各个参数的学习率也都一样。

为了表示简便,令 (g_t = abla J( heta_t)),所以梯度下降法可以表示为:

[ heta_{t+1} = heta_{t} - eta cdot g_t ]

Adam 更新参数

Adam,全称 Adaptive Moment Estimation,是一种优化器,是梯度下降法的变种,用来更新神经网络的权重。

Adam 更新公式:

[egin{aligned} m_{t} &=eta_{1} m_{t-1}+left(1-eta_{1} ight) g_{t} \ v_{t} &=eta_{2} v_{t-1}+left(1-eta_{2} ight) g_{t}^{2} \ hat{m}_{t} &=frac{m_{t}}{1-eta_{1}^{t}} \ hat{v}_{t} &=frac{v_{t}}{1-eta_{2}^{t}} \ heta_{t+1}&= heta_{t}-frac{eta}{sqrt{hat{v}_{t}}+epsilon} hat{m}_{t} end{aligned} ]

在 Adam 原论文以及一些深度学习框架中,默认值为 (eta = 0.001)(eta_1 = 0.9)(eta_2 = 0.999)(epsilon = 1e-8)。其中,(eta_1)(eta_2) 都是接近 1 的数,(epsilon) 是为了防止除以 0。(g_{t}) 表示梯度。

咋一看很复杂,接下一一分解:

  • 前两行:

[egin{aligned} m_{t} &=eta_{1} m_{t-1}+left(1-eta_{1} ight) g_{t} \ v_{t} &=eta_{2} v_{t-1}+left(1-eta_{2} ight) g_{t}^{2} end{aligned} ]

这是对梯度和梯度的平方进行滑动平均,使得每次的更新都和历史值相关。

  • 中间两行:

[egin{aligned} hat{m}_{t} &=frac{m_{t}}{1-eta_{1}^{t}} \ hat{v}_{t} &=frac{v_{t}}{1-eta_{2}^{t}} end{aligned} ]

这是对初期滑动平均偏差较大的一个修正,叫做 bias correction,当 (t) 越来越大时,(1-eta_{1}^{t})(1-eta_{2}^{t}) 都趋近于 1,这时 bias correction 的任务也就完成了。

  • 最后一行:

[ heta_{t+1}= heta_{t}-frac{eta}{sqrt{hat{v}_{t}}+epsilon} hat{m}_{t} ]

这是参数更新公式。

学习率为 (frac{eta}{sqrt{hat{v}_{t}}+epsilon}),每轮的学习率不再保持不变,在一轮中,每个参数的学习率也不一样了,这是因为 (eta) 除以了每个参数 (frac{1}{1- eta_2} = 1000) 轮梯度均方和的平方根,即 (sqrt{frac{1}{1000}sum_{k = t-999}^{t}g_k^2})。而每个参数的梯度都是不同的,所以每个参数的学习率即使在同一轮也就不一样了。(可能会有疑问,(t) 前面没有 999 轮更新怎么办,那就有多少轮就算多少轮,这个时候还有 bias correction 在。)

而参数更新的方向也不只是当前轮的梯度 (g_t) 了,而是当前轮和过去共 (frac{1}{1- eta_1} = 10) 轮梯度的平均。

有关滑动平均的理解,可以参考我之前的博客:理解滑动平均(exponential moving average)

Adam + 学习率衰减

在 StackOverflow 上有一个问题 Should we do learning rate decay for adam optimizer - Stack Overflow,我也想过这个问题,对 Adam 这些自适应学习率的方法,还应不应该进行 learning rate decay?

论文 《DECOUPLED WEIGHT DECAY REGULARIZATION》的 Section 4.1 有提到:

Since Adam already adapts its parameterwise learning rates it is not as common to use a learning rate multiplier schedule with it as it is with SGD, but as our results show such schedules can substantially improve Adam’s performance, and we advocate not to overlook their use for adaptive gradient algorithms.

上述论文是建议我们在用 Adam 的同时,也可以用 learning rate decay。

我也简单的做了个实验,在 cifar-10 数据集上训练 LeNet-5 模型,一个采用学习率衰减 tf.keras.callbacks.ReduceLROnPlateau(patience=5),另一个不用。optimizer 为 Adam 并使用默认的参数,(eta = 0.001)。结果如下:

Adam和学习率衰减(learning rate decay)第1张
Adam和学习率衰减(learning rate decay)第2张

加入学习率衰减和不加两种情况在 test 集合上的 accuracy 分别为: 0.5617 和 0.5476。(实验结果取了两次的平均,实验结果的偶然性还是有的)

通过上面的小实验,我们可以知道,学习率衰减还是有用的。(当然,这里的小实验仅能代表一小部分情况,想要说明学习率衰减百分之百有效果,得有理论上的证明。)

当然,在设置超参数时就可以调低 (eta) 的值,使得不用学习率衰减也可以达到很好的效果,只不过参数更新变慢了。

将学习率从默认的 0.001 改成 0.0001,epoch 增大到 120,实验结果如下所示:
Adam和学习率衰减(learning rate decay)第3张
Adam和学习率衰减(learning rate decay)第4张

加入学习率衰减和不加两种情况在 test 集合上的 accuracy 分别为: 0.5636 和 0.5688。(三次实验平均,实验结果仍具有偶然性)

这个时候,使用学习率衰减带来的影响可能很小。

那么问题来了,Adam 做不做学习率衰减呢?
我个人会选择做学习率衰减。(仅供参考吧。)在初始学习率设置较大的时候,做学习率衰减比不做要好;而当初始学习率设置就比较小的时候,做学习率衰减似乎有点多余,但从 validation set 上的效果看,做了学习率衰减还是可以有丁点提升的。

ReduceLROnPlateau 在 val_loss 正常下降的时候,对学习率是没有影响的,只有在 patience(默认为 10)个 epoch 内,val_loss 都不下降 1e-4 或者直接上升了,这个时候降低学习率确实是可以很明显提升模型训练效果的,在 val_acc 曲线上看到一个快速上升的过程。对于其它类型的学习率衰减,这里没有过多地介绍。

Adam 衰减的学习率

从上述学习率曲线来看,Adam 做学习率衰减,是对 (eta) 进行,而不是对 (frac{eta}{sqrt{hat{v}_{t}}+epsilon}) 进行,但有区别吗?

学习率衰减一般如下:

  • exponential_decay:
    decayed_learning_rate = learning_rate * decay_rate ^ (global_step / decay_steps)

  • natural_exp_decay:
    decayed_learning_rate = learning_rate * exp(-decay_rate * global_step / decay_steps)

  • ReduceLROnPlateau
    如果被监控的值(如‘val_loss’)在 patience 个 epoch 内都没有下降,那么学习率衰减,乘以一个 factor
    decayed_learning_rate = learning_rate * factor

这些学习率衰减都是直接在原学习率上乘以一个 factor ,对 (eta) 或对 (frac{eta}{sqrt{hat{v}_{t}}+epsilon}) 操作,结果都是一样的。

References

[1] An overview of gradient descent optimization algorithms -- Sebastian Ruder
[2] Should we do learning rate decay for adam optimizer - Stack Overflow
[3] Tensorflow中learning rate decay的奇技淫巧 -- Elevanth
[4] Loshchilov, I., & Hutter, F. (2017). Decoupled Weight Decay Regularization. ICLR 2019. Retrieved from http://arxiv.org/abs/1711.05101

免责声明:文章转载自《Adam和学习率衰减(learning rate decay)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python使用imap-tools模块下载邮件中的附件Xilinx ISE 14.7 安装教程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

零基础入门深度学习(5)

无论即将到来的是大数据时代还是人工智能时代,亦或是传统行业使用人工智能在云上处理大数据的时代,作为一个有理想有追求的程序员,不懂深度学习(Deep Learning)这个超热的技术,会不会感觉马上就out了?现在救命稻草来了,《零基础入门深度学习》系列文章旨在讲帮助爱编程的你从零基础达到入门级水平。零基础意味着你不需要太多的数学知识,只要会写程序就行了,...

Pytorch学习笔记02----深度学习中的epochs,batch_size,iterations详解

batch_size、epoch、iteration是深度学习中常见的几个超参数: (1)batch_size:每批数据量的大小。DL通常用SGD的优化算法进行训练,也就是一次(1 个iteration)一起训练batchsize个样本,计算它们的平均损失函数值,来更新参数。 (2)iteration:1个iteration即迭代一次,也就是用batchs...

对偶上升

强对偶条件成立(对偶问题和原问题最优解一致) 原问题转化为最小化含最优对偶变量的拉格朗日函数 利用梯度上升法。更新x和对偶变量第一步x最小化,第二步对偶变量更新。 利用了梯度上升法求极大值(梯度下降是求极小值) 梯度用了约束条件的残差有点费解! 对偶分解: 一个f(x)是separable,能分成n个 这n个就可以并行运算了。 为了计算总的残差residu...

OpenCV4系列之图像梯度

在图像处理中,求解图像梯度是常用操作。 Sobel算子 Calculates the first, second, third, or mixed image derivatives using an extended Sobel operator. Sobel 算子是一种离散性差分算子,用来计算图像像素值的一阶、二阶、三阶或混合梯度。在图像的任何一点使...

数学基础系列(二)----偏导数、方向导数、梯度、微积分

一、偏导数 对于一元函数y=f(x)只存在y随x的变化,但是二元函数z=f(x,y)存在z随x变化的变化率,随y变化的变化率,随x﹑y同时变化的变化率。如下图所示 1、偏导数定义 设函数$z=f(x,y)$在点(x0,y0)的某个邻域内有定义,定y=y0,一元函数$f(x_{0},y_{0})$在点x=x0处可导,即极限$limlimits_{Delta...

Histogram of Oriented Gridients(HOG) 方向梯度直方图

Histogram of Oriented Gridients,缩写为HOG,是目前计算机视觉、模式识别领域很常用的一种描述图像局部纹理的特征。这个特征名字起的也很直白,就是说先计算图片某一区域中不同方向上梯度的值,然后进行累积,得到直方图,这个直方图呢,就可以代表这块区域了,也就是作为特征,可以输入到分类器里面了。那么,接下来介绍一下HOG的具体原理和计...