[toc]html
本文先介绍通常的梯度降低法是如何更新参数的,而后介绍 Adam 如何更新参数,以及 Adam 如何和学习率衰减结合。网络
梯度降低法更新参数
梯度降低法参数更新公式: $$ \theta_{t+1} = \theta_{t} - \eta \cdot \nabla J(\theta_t) $$框架
其中,$\eta$ 是学习率,$\theta_t$ 是第 $t$ 轮的参数,$J(\theta_t)$ 是损失函数,$\nabla J(\theta_t)$ 是梯度。函数
在最简单的梯度降低法中,学习率 $\eta$ 是常数,是一个须要实现设定好的超参数,在每轮参数更新中都不变,在一轮更新中各个参数的学习率也都同样。学习
为了表示简便,令 $g_t = \nabla J(\theta_t)$,因此梯度降低法能够表示为: $$ \theta_{t+1} = \theta_{t} - \eta \cdot g_t $$优化
Adam 更新参数
Adam,全称 Adaptive Moment Estimation,是一种优化器,是梯度降低法的变种,用来更新神经网络的权重。spa
Adam 更新公式: $$ \begin{aligned} m_{t} &=\beta_{1} m_{t-1}+\left(1-\beta_{1}\right) g_{t} \ v_{t} &=\beta_{2} v_{t-1}+\left(1-\beta_{2}\right) g_{t}^{2} \ \hat{m}{t} &=\frac{m{t}}{1-\beta_{1}^{t}} \ \hat{v}{t} &=\frac{v{t}}{1-\beta_{2}^{t}} \ \theta_{t+1}&=\theta_{t}-\frac{\eta}{\sqrt{\hat{v}{t}}+\epsilon} \hat{m}{t} \end{aligned} $$3d
在 Adam 原论文以及一些深度学习框架中,默认值为 $\eta = 0.001$,$\beta_1 = 0.9$,$\beta_2 = 0.999$,$\epsilon = 1e-8$。其中,$\beta_1$ 和 $\beta_2$ 都是接近 1 的数,$\epsilon$ 是为了防止除以 0。$g_{t}$ 表示梯度。orm
咋一看很复杂,接下一一分解:htm
-
前两行: $$ \begin{aligned} m_{t} &=\beta_{1} m_{t-1}+\left(1-\beta_{1}\right) g_{t} \ v_{t} &=\beta_{2} v_{t-1}+\left(1-\beta_{2}\right) g_{t}^{2} \end{aligned} $$ 这是对梯度和梯度的平方进行滑动平均,使得每次的更新都和历史值相关。
-
中间两行: $$ \begin{aligned} \hat{m}{t} &=\frac{m{t}}{1-\beta_{1}^{t}} \ \hat{v}{t} &=\frac{v{t}}{1-\beta_{2}^{t}} \end{aligned} $$ 这是对初期滑动平均误差较大的一个修正,叫作 bias correction,当 $t$ 愈来愈大时,$1-\beta_{1}^{t}$ 和 $1-\beta_{2}^{t}$ 都趋近于 1,这时 bias correction 的任务也就完成了。
-
最后一行: $$ \theta_{t+1}=\theta_{t}-\frac{\eta}{\sqrt{\hat{v}{t}}+\epsilon} \hat{m}{t} $$ 这是参数更新公式。
学习率为 $\frac{\eta}{\sqrt{\hat{v}{t}}+\epsilon}$,每轮的学习率再也不保持不变,在一轮中,每一个参数的学习率也不同了,这是由于 $\eta$ 除以了每一个参数 $\frac{1}{1- \beta_2} = 1000$ 轮梯度均方和的平方根,即 $\sqrt{\frac{1}{1000}\sum{k = t-999}^{t}g_k^2}$。而每一个参数的梯度都是不一样的,因此每一个参数的学习率即便在同一轮也就不同了。(可能会有疑问,$t$ 前面没有 999 轮更新怎么办,那就有多少轮就算多少轮,这个时候还有 bias correction 在。)
而参数更新的方向也不仅是当前轮的梯度 $g_t$ 了,而是当前轮和过去共 $\frac{1}{1- \beta_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$。结果以下:
加入学习率衰减和不加两种状况在 test 集合上的 accuracy 分别为: 0.5617 和 0.5476。(实验结果取了两次的平均,实验结果的偶然性仍是有的)
经过上面的小实验,咱们能够知道,学习率衰减仍是有用的。(固然,这里的小实验仅能表明一小部分状况,想要说明学习率衰减百分之百有效果,得有理论上的证实。)
固然,在设置超参数时就能够调低 $\eta$ 的值,使得不用学习率衰减也能够达到很好的效果,只不过参数更新变慢了。
将学习率从默认的 0.001 改为 0.0001,epoch 增大到 120,实验结果以下所示:
加入学习率衰减和不加两种状况在 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
原文出处:https://www.cnblogs.com/wuliytTaotao/p/11101652.html