神经网络中的自适应梯度下降优化算法(2)
渐变更新规则:
G(t,I)表示目标函数在时间t对θ(i)的偏导数,SGD各参数的更新过程如下:
更新Adagrad各参数的过程如下:
G(t)是对角矩阵,对角线上的每个元素是θ(i)在时间t之前的所有梯度的平方和,ε通常取1e-8的阶,它的存在是为了避免除数为0。一个有趣的现象是,如果没有平方根运算,算法的性能是很差的。
Adagrad的主要缺点是它的分母是平方梯度的积累,它的值会一直增加,最终会导致学习速率衰减到很小的程度,从而使学习算法无法进行下去。
TensorFlow实现:
TF . train . Adagrad optimizer(learning _ rate,initial _ accumulator _ value = 0.1,use_locking=False,name='Adagrad ')
Adadelta算法主要解决了Adagrad的缺陷,不再累加过去所有的梯度,而只是累加过去固定数量的梯度。
Adadelta不是用平方梯度的简单累加,而是用历史平方梯度衰减的平均值。
γ通常等于0.9。
分母相当于梯度的均方根,RMS),即所有值的平方和,求平均值,再平方得到RMS值。
渐变更新规则:
将学习率eta设置为
我们不需要提前设定学习率。
RMSprop是Geoff Hinton提出的一种自适应学习速率方法,它与Adadelta方法一起,旨在解决Adagrad学习速率急剧下降的问题。与阿达德尔塔法一致。
梯度更新规则
参数设置:
Hinton建议设置γ=0.9,学习率η=0.001。
TensorFlow实现:
TF . train . rmspropoptimizer . _ _ init _ _(learning _ rate,decay,momentum=0.0,epsilon=1e-10,use_locking=False,name='RMSProp ')
Adam还自适应地为不同的参数设置不同的学习速率。它对历史梯度和历史平方梯度都采用指数衰减平均。
梯度更新规则
Adam观察到,如果m(t)和v(t)被初始化为零向量,并且衰减率很小(例如,当β1和β2非常接近1时),在初始迭代中,m(t)和v(t)总是偏移为零,因此需要进行偏移校正。
然后用校正值更新梯度:
亚当提出β 1 = 0.9,β 2 = 0.999,ε = 10 {-8}。
在实践中,Adam优于其他算法。
TensorFlow实现:
TF . train . adamoptimizer(learning _ rate = 0.001,beta1=0.9,beta2=0.999,epsilon=1e-08,use_locking=False,name='Adam ')
Adam更新规则中的梯度缩放与历史梯度的L2范数成反比。
我们可以把这个规则推广到Lp范数。
当p的值增大时,Lp的值往往变得不稳定,所以实际中常用L1和L2。但是Adamax发现L∞可以收敛到一个稳定的值。
那么我们可以用u(t)来代替。
来更新Adam中的渐变。
同时,u(t)不需要进行零失调校正。默认值建议: