最近参考[5]重新回顾了AdaGrad、RMSProp、AdaDelta、Adam几个优化算法的基本思想,在此简单做一下这几个算法的概述和对比。
简单的梯度下降等优化算法存在一个问题:目标函数自变量的每一个元素在相同时间步都使用同一个学习率来迭代,如果存在如下图的情况(不同自变量的梯度值有较大差别时候),存在如下问题:
因此,自然而然想到,要解决这一问题,不同自变量应该根据梯度的不同有不同的学习率。本篇介绍的几种优化算法都是基于这个思想的。
[1]使用一个小批量随机梯度
按元素平方的累加变量
,在时间步0,AdaGrad将
中每个元素初始化为0,其更新公式为:
其中
是按元素相乘,
是学习率,
是为了维持数值稳定性而添加的常数(如
)。
由于AdaGrad算法的机制,导致每个元素的学习率在迭代过程中只能降低或者不变,因此很可能出现早期迭代到不好的极值点之后,由于学习率太小而无法冲出这个极值点导致最后收敛到的解不优,为了解决这一问题,RMSProp[2]是基于AdaGrad算法做了一点小修改,其更新公式为:
其中,
是学习率,
是为了维持数值稳定性而添加的常数(如
)。另外,比AdaGrad多了超参数
,
可以看作是最近
个时间步的小批量随机梯度平方项的加权平均,从而使得每个元素的学习率在迭代过程中不再一直降低或者不变。具体可以理解为:
如果最近的时间步梯度平方加权累积较小,说明梯度较小,那么学习率会增加 如果最近的时间步梯度平方加权累计较大,说明梯度较大,那么学习率会减小 有了如上机制,可以使得收敛稳定的同时,有一定几率冲出不优解,而使得最后收敛结果和开始的迭代表现相关性降低。
AdaDelta算法[3]和RMSProp算法一样,使用小批量随机梯度
按元素平方的指数加权移动平均变量
,在时间步为0时,所有元素被初始化为0,其更新公式为:
其中,
是为了维持数值稳定性而添加的常数(如
)。另外,AdaDelta算法没有学习率这个超参,而是通过
来记录自变量变化量
按元素平方的指数加权移动平均,如果不考虑
的影响,AdaDelta算法跟RMSProp算法的不同之处在于使用
来替代学习率
。
Adam算法[4]使用了动量变量
和RMSProp算法中小批量随机梯度按元素平方的指数加权移动平均变量
,并在时间步0将它们中的每个元素初始化为0。其更新公式为:
其中,
是学习率,
是为了维持数值稳定性而添加的常数(如
),超参数
建议设为0.9,超参数
建议设为0.999。
综上分析,可以得出如下几个结论:
做运算来间接代替学习率;
[1] Duchi, J., Hazan, E., & Singer, Y. (2011). Adaptive subgradient methods for online learning and stochastic optimization. Journal of Machine Learning Research, 12(Jul), 2121-2159.
[2] Tieleman, T., & Hinton, G. (2012). Lecture 6.5-rmsprop: Divide the gradient by a running average of its recent magnitude. COURSERA: Neural networks for machine learning, 4(2), 26-31.
[3] Zeiler, M. D. (2012). ADADELTA: an adaptive learning rate method. arXiv preprint arXiv:1212.5701.
[4] Kingma, D. P., & Ba, J. (2014). Adam: A method for stochastic optimization. arXiv preprint arXiv:1412.6980.
[5] http://zh.d2l.ai/chapter_optimization
本文分享自 Python编程和深度学习 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!