神经网络中自适应的梯度下降优化算法(二)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了神经网络中自适应的梯度下降优化算法(二)相关的知识,希望对你有一定的参考价值。

参考技术A

Adagrad算法可以针对不同的参数自适应的采用不同的更新频率,对低频出现的特征采用低的更新率,对高频出现的特征采用高的更新率,因此,对于稀疏的数据它表现的很好,很好的提升了SGD的鲁棒性,在Google的通过Youtube视频识别猫的神经网络训练中有很好的表现。

梯度更新规则:

g(t,i)表示在t时刻目标函数对θ(i)的偏导数。SGD的每个参数的更新过程如下:

Adagrad的每个参数更新过程如下:

G(t)是一个对角矩阵,对角线上的每个元素是t时刻前所有θ(i)的梯度的平方和。ε通常取值在1e-8量级,它的存在是为了避免除数为0。一个有趣的现象是,如果没有平方根操作,算法的表现就非常糟糕。

Adagrad的主要缺点是,它的分母是平方梯度的累积,它的值会一直增加,最终导致学习率衰减到非常小,从而使得学习算法无法进行下去。

TensorFlow实现:

tf.train.AdagradOptimizer(learning_rate, initial_accumulator_value=0.1, use_locking=False, name=\'Adagrad\')

Adadelta算法主要解决Adagrad的缺陷,它不再累加过去所有的梯度,而是仅累积过去固定个数的梯度。

Adadelta不是采用平方梯度的简单累加,而是采用 历史 平方梯度的衰减的平均。

γ通常等于0.9

分母相当于梯度的均方根(root mean squared, RMS),即将所有值平方求和,求其均值,再开平方,就得到均方根值。

梯度更新规则:

将学习率η设置为

,我们就不需要提前设定学习率。

RMSprop是Geoff Hinton提出的一种自适应学习率的方法,它与Adadelta方法都是为了解决Adagrad学习率急剧下降问题的。它与Adadelta方法是一致的。

梯度更新规则

超参数设定值:

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也是对不同的参数自适应设置不同的学习率。它对 历史 梯度和 历史 平方梯度同时采用指数梯度衰减(exponentially decaying average)。

梯度更新规则

Adam作者观察到,如果m(t)和v(t)初始化为零向量,并且衰减率很小时(比如β1和β2都非常接近于1时),在开始的迭代中,m(t)和v(t)总是向零偏移,所以需要做偏移校正。

然后用校正后的值进行梯度更新:

Adam作者建议β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)不需要做零偏校正。默认取值建议:

零基础神经网络优化之Adam

一、序言

  Adam是神经网络优化的另一种方法,有点类似上一篇中的“动量梯度下降”,实际上是先提出了RMSprop(类似动量梯度下降的优化算法),而后结合RMSprop和动量梯度下降整出了Adam,所以这里我们先由动量梯度下降引申出RMSprop,最后再介绍Adam。不过,由于RMSprop、Adam什么的,真的太难理解了,我就只说实现不说原理了。

二、RMSprop

  先回顾一下动量梯度下降中的“指数加权平均”公式:

  vDW1 = beta*vDW0 + (1-beta)*dw1

  vDb1 = beta*vDb0 + (1-beta)*db1

  动量梯度下降:

  W = W - learning_rate*vDW

  b = b - learning_rate*vDb

  简而言之就是在更新W和b时不使用dw和db,而是使用其“指数加权平均”的值。

  RMSprop只是做了一点微小的改变,为了便于区分将v改成s:

  sDW1= beta*sDW0 + (1-beta)*dw1^2

  sDb1 = beta*sDb0 + (1-beta)*db1^2

  RMSprop梯度下降,其中sqrt是开平方根的意思:

  W = W - learning_rate*(dw/sqrt(sDW))

  b = b - learning_rate*(db/sqrt(sDb))

  需要注意的是,无论是dw^2还是sqrt(sDW)都是矩阵内部元素的平方或开根。

三、Adam

  Adam是结合动量梯度下降和RMSprop的混合体,先按动量梯度下降算出vDW、vDb

  vDW1 = betaV*vDW0 + (1-beta)*dw1

  vDb1 = betaV*vDb0 + (1-beta)*db1

  然后按RMSprop算出sDW、sDb:

  sDW1= betaS*sDW0 + (1-beta)*dw1^2

  sDb1 = betaS*sDb0 + (1-beta)*db1^2

  最后Adam的梯度下降是结合了v和s:

  W = W - learning_rate*( vDW/sqrt(sDW) )

  b = b - learning_rate*( vDb/sqrt(sDb) )

  我们来看下最终实现后的效果:

技术图片

 

   是的,你没有看错。。。只需要100次训练,就比以前2000次训练的效果还要好!看到这个结果其实我也很震惊,反复查了几遍。

  不过使用Adam优化后的神经网络一定要注意learning_rate的设置,我这里改成了0.01(之前一直是0.1,多次试错后才发现是这个问题)否则会发生梯度消失(表现为dw等于0)。

四、回顾

  本篇是在mini_batch的基础上,结合动量梯度下降、RMSprop做的Adam梯度下降,其目的与mini_batch、动量梯度下降一样,都是使神经网络可以更快找到最优解,不得不说Adam实在太给力了。完整的实现代码请关注公众号“零基础爱学习”回复“AI13”获取。

技术图片

  

 

以上是关于神经网络中自适应的梯度下降优化算法(二)的主要内容,如果未能解决你的问题,请参考以下文章

Adam梯度下降算法分析

深度解读最流行的优化算法:梯度下降

梯度下降法和粒子群优化算法的区别

自适应滤波:梯度下降算法

优化算法—梯度下降

pytorch常用优化器总结(包括warmup介绍及代码实现)