AdaGrad、RMSProp和Adam

AdaGrad、RMSProp以及Adam都是逐元素的自适应学习率方法(per-parameter adaptive learning rate methods),根据每个神经元的梯度变化进行权重调整,能够有效的提高模型精度

AdaGrad

数学公式如下:

其中是权重,是梯度,是学习率,使用累加梯度平方和

是常量,通常设为1e-8,用于保证数值稳定性

实现如下:

1
2
cache += dw**2
w += - learning_rate * dw / (np.sqrt(cache) + eps)

与原始实现相比,有两点优势:

  1. 其学习率除以的平方根,起到了学习率退火的效果
  2. 如果得到了高梯度,则有效学习率下降,反之有效学习率提高,这样保证权重向量的变化更加稳定,不易被个别样本影响

其缺点在于变量是单调递增的,这导致学习率的单调递减,最终趋向于,过早的停止学习

RMSProp

数学公式如下:

其中是权重,是梯度,是学习率,表示衰减率,通常设为[0.9, 0.99, 0.999]其中之一,使用累加梯度平方和

是常量,通常设为1e-8,用于保证数值稳定性

实现如下:

1
2
cache = decay_rate * cache + (1 - decay_rate) * dw**2
w += - learning_rate * dw / (np.sqrt(cache) + eps)

AdaGrad相比,其取值进行了弱化调整,通过指数移动平均值的方式,避免梯度平方和(二阶动量)的单调累积,根据梯度变化进行自主调整,有效延长学习过程

Adam

Adam方法集成了前两者,数学实现如下:

表示迭代次数

是常量,取值在[0,1]之间

是学习率

是常量,用于数值稳定,保证不除以,取值在[1e-4, 1e-8]之间

常用的取值组合为

参考:

实现如下:

1
2
3
4
5
m = beta1*m + (1-beta1)*dw
mt = m / (1-beta1**t)
v = beta2*v + (1-beta2)*(dw**2)
vt = v / (1-beta2**t)
w += - learning_rate * mt / (np.sqrt(vt) + eps)

Adam方法计算了梯度的一阶动量(均值,mean)和二阶动量(方差,the uncentered variance),同时为了避免初始动量不趋向于,进行了偏置校正(bias correction

RMSProp方法相比,Adam方法进一步平滑了权重更新过程

梯度下降流程

文章从 SGD 到 Adam —— 深度学习优化算法概览(一)总结了梯度下降方法的更新框架

  1. 计算梯度
  2. 计算梯度的一阶动量和二阶动量
  3. 更新权重

小结

逐元素的自适应学习率方法能够更加有效的利用神经元的梯度变化,加速学习过程

相关阅读