发布日期:2024-05-06 来源: 网络 阅读量()
目前最流行的5种优化器:Momentum(动量优化)、NAG(Nesterov梯度加速)、AdaGrad、RMSProp、Adam,所有的优化算法都是在原始梯度下降算法的基础上增加惯性和环境感知因素进行持续优化 momentum优化的一个简单思想:考虑物体运动惯性,想象一个保龄球在光滑表面滚下一个平缓的坡度,最开始会很慢,但是会迅速地恢复动力,直到达到最终速度(假设又一定的摩擦力核空气阻力) momentum优化关注以前的梯度是多少,公式: \((1)m \leftarrow \beta m + \eta
abla _ heta J( heta)\) \((2) heta \leftarrow heta - m\) 超参数\(\beta\)称为动量,其必须设置在0(高摩擦)和1(零摩擦)之间,默认值为0.9 可以很容易地验证当梯度保持一个常量,最终速度(即权重的最大值)就等于梯度乘以学习率乘以\(\frac{1}{1-\beta}\),当\(\beta=0.9\)时,那么最终速度等于10倍梯度乘以学习率,所有momentum优化最终会比梯度下降快10倍,在不适用批量归一化的深度神经网络中,高层最终常会产生不同尺寸的输入,因此使用momentum优化会很有帮助,同时还会帮助跨过局部最优 由于又动量,优化器可能会超调一点,然后返回,再超调,来回震荡多次后,最后稳定在最小值,这也是系统中要有一些摩擦的原因之一,它可以帮助摆脱震荡,从而加速收敛 optimizer=tf.train.MomentumOptimizer(learning_rate=learning_rate,momentum=0.9) 公式: \((1)m \leftarrow \beta m + \eta
abla _ heta J( heta + \beta m)\) \((2) heta \leftarrow heta - m\) 与momentum唯一不同的是用\( heta + \beta m\)来测量梯度,这个小调整有效是因为在通常情况下,动量矢量会指向正确的方向,所以在该方向相对远的地方使用梯度会比在原有地方更准确一些 optimizer=tf.train.MomentumOptimizer(learning_rate=learning_rate,momentum=0.9,use_nesterov=True) AdaGrad对于简单的二次问题一般表现都不错,但是在训练神经网络时却经常很早就停滞了,学习速率缩小得很多,在到达全局最优前算法就停止了,所以尽管tensorflow又AdagradOptimizer,也不要用它来训练深度神经网络 \((1)s \leftarrow s +
abla _ heta J( heta) \otimes
abla _ heta J( heta)\) \((2) heta \leftarrow heta - \eta
abla _ heta J( heta) \oslash \sqrt{s+\varepsilon}\) AdaGrad降速太快而且没有办法收敛到全局最优,RMSProp算法却通过仅积累最近迭代中得梯度(而非从训练开始得梯度)解决这个问题,它通在第一步使用指数衰减开实现 \((1)s \leftarrow \beta s + (1-\beta)
abla _ heta J( heta) \otimes
abla _ heta J( heta)\) \((2) heta \leftarrow heta - \eta
abla _ heta J( heta) \oslash \sqrt{s+\varepsilon}\) 衰减率\(\eta\)通常为0.9 optimizer=tf.train.RMSPropOptimizer(learning_rate=learning_rate,momentum=0.9,decay=0.9,epsilon=0.9) 除去非常简单得问题,这个优化器得表现几乎全部优于AdaGrad,同时表现也基本都优于Momentum优化和NAG,事实上在Adam优化出现之前,它是众多研究者所推荐得优化算法 Adam代表了自适应力矩估计,集合了Momentum优化和RmsProp的想法,类似Momentum优化,它会跟踪过去梯度的指数衰减平均值,同时也类似RMSProp,它会跟踪过去梯度平方的指数衰减平均值, Adam算法: \((1)m \leftarrow \beta_1 m + (1-\beta_i)
abla _ heta J( heta)\) \((2)s \leftarrow \beta_2s +(1-\beta_2)
abla _ heta J( heta) \otimes
abla _ heta J( heta)\) \((3)m \leftarrow \frac{m}{1-\beta_1^T}\) \((4)s \leftarrow \frac{s}{1-\beta_2^T}\) \((5) heta \leftarrow heta - \eta m\oslash \sqrt{s+\varepsilon}\) 注:T表示迭代次数(从1开始) optimizer=tf.train.AdamOptimizer(learning_rate=learning_rate)
公式:
公式: