Gryffindor
首发于Gryffindor
《An overview of gradient descent optimization algorithms》

《An overview of gradient descent optimization algorithms》

本文包含的主要内容

  1. gradient descent基本形式:BGD,SGD,MBGD。
  2. 几种启发式优化算法:momentum,NAG,Adagrad等。
  3. 可视化与一些tricks。

===========================正文开始====================================

Gradient descent variants(BGD,SGD,MBGD)

BGD code:

SGD&MBGD code:

嗯,手写公式很方便。就酱。

Q:想想看,为什么后两者都要shuffle?


Challenges

Q:如何设计learning rate?过大会在目标的附近波动;过小会收敛很慢。

Q:采用动态调整的方式?例如退火等方式,那有些参数也要事先define好....对吧。。。

Q:所有参数都依赖一个learning rate来更新?在什么样的场景下,这种缺点会放大?

Q:当是非凸函数时,追求梯度为零向量还不够,如何避免鞍点?


  • Momentum([物]动量)

这是一种启发式算法。形式是这样的:

既然是启发式方法,那么就试图从启发的角度去理解它~

即物体的动能 = 上一个时刻的动能 + 上一时刻的势能差。由于有阻力和转换时的损失,所以两者都乘以一个系数。

就像一个小球从坡上向下滚,当前的速度取决于上一个时刻的速度和势能的改变量。

这样在更新参数时,除了考虑到梯度以外,还考虑了上一个时刻参数的历史变更幅度。例如,参数上一次更新幅度较大,并且梯度还不小,那么再更新时是不是得更猛烈些了~

这样启发式算法,确实从逻辑感知上有它的道理。原文认为其faster convergence and reduced oscillation,前者同意,但后者持保留意见(因为最终结果是一个多维向量综合作用的结果,还真不好下这个结论)。Accelerate SGD倒是真的。。。


  • Nesterov accelerated gradient(NAG)

还是以上面小球的例子来看,momentum方式下小球完全是一种盲目被动的方式滚下的。这样有个缺点就是在临近最优点附近是控制不住速度。我们希望小球很smart,它可以预判后面的"地形",要是后面地形还是很陡,那就继续坚定不移的大胆走下去;不然的话咱就收敛点~

当然,小球自己也不知道真正要走到哪里,这里以

作为近似下一位置,就有:

相比于之前momentum方式是考虑上一时刻的动能和当前点的梯度,而NAG考虑的是上一时刻的动能和近似下一点的梯度。这使得它可以先看看自己的"前途",然后慎重一些。

Hinton的slides是这样给出的:

感觉还有必要试着解释一下:

两个blue vectors分别理解为梯度和动能,两个向量和即为momentum方式的作用结果。

而靠左边的brown vector是动能,可以看出它那条blue vector是平行的,但是它预测了下一阶段的梯度是red vector,因此向量和就是green vector,即NAG方式的作用结果。


  • Adagrad

"It adapts the learning rate to the parameters, performing larger updates for infrequent and smaller updates for frequent parameters."因此,Adagrad对于稀疏数据上有着良好的表现。

之前所讲的方法中所有参数在更新时均使用同一个learning rate,而在Adagrad的每一个参数的每一次更新中都使用不同的learning rate。这样的话,令第t步更新时对第i个参数的梯度为:

参数的更新的一般形式为:

如上所述,Adagrad的差异之处正是在于learning rate不同于其他,将learning rate改为如下:

这里的Gt是一个d*d维对角矩阵,对角线上的元素(i,i)表示在第t步更新时,历史上θi梯度平方和的积累。ϵ只是一个值很小的防止分母为0的平滑项。

Q:若是这样的话,为什么在step t用对角矩阵保存中间信息呢?使用一维数组不就可以了么,是为了某些方便计算么?(哪位了解,望指点。

Q:为何带上平方根符号?据说这样的效果更好。

个人感觉,巨大多数自适应的learning rate都是有根据变化幅度而更改,并且具有逐渐收敛的特性。所以这种启发式方法仅是一种可行性方式,并不是唯一的,也绝不是最好的。把握其本质即可。


可视化

Alec Radford这位大哥做了两张动态图(知乎上貌似目前还有bug,动态图需要点击一下才会动),SGD optimization on loss surface contours:

SGD optimization on saddle point:

一些tricks

  1. 为避免bias,做shuffle。但有时在某种背景下,也可刻意地事先order training examples。
  2. Batch normalization。
  3. Early stopping。若指标趋近平稳,及时终止。
  4. Gradient noise。引入一个符合高斯分布的noise项,使得在poor initialization时具有更好的鲁棒性。形式如下:

同时对方差退火,因为随着训练进行越来越稳定,noise也随之减弱,退火项如下:

参考:

[1] sebastianruder.com/opti

[2] cnblogs.com/maybe2030/p

[3] csdn.net/article/2016-0

[4] cs.toronto.edu/~tijmen/


欢迎关注与讨论,谢谢。

编辑于 2017-11-21

文章被以下专栏收录