梯度下降法综述

Gradient Descent Variants

reference: http://sebastianruder.com/optimizing-gradient-descent/

(1)Batch gradient descent: 计算整个数据集上, Cost function 对于parameters的偏导,而后更新梯度;对于convex error surfaces可以得到global minimum,而对于non-convex error surfaces能得到local minimum

(2) Stochastic gradient descent: 计算单个sample上,Cost function对于parameters的偏导,而后更新梯度;相较于BGD,SGD更容易从一个local minimum跳到另一个local minimum(但是当learning rate过小时,performance便和BGD相似);High variance,更容易使得loss curve产生震荡

(3)Mini-batch gradient descent: 计算whole dataset某个子集(通常设置为50-256)对于paremeters的偏导,而后更新梯度;比SGD更稳定,更易收敛;能够使用高效的矩阵化trick,使得在runing的时候更加efficient

(4)面临几大问题:

1.Learning rate很难选择,太小了收敛很慢,太大了容易在local minimum周围晃动,甚至发散

2.在训练时当loss一直在某个范围摆动时,这时候应该减小learning rate,但是这个trick受数据集属性或者模型的capacity等因素的影响较大,需要认为的精调

3.所用的参数更新都是基于同一个learning rate的,但是当数据集很稀疏,或者features出现的频率有很大不同,这时候我们会希望用较大的learning rate来更新rarely出现的feature,即希望实现feature-wise的learning rate的调整

4.还有一个问题时saddle points 的问题,如下图:

梯度下降法综述_第1张图片
下文在SGD指的是Mini-batch gradient descent,其实在其他很多地方也是这样

Gradient descent optimization algorithms

Newton’s method.对于高维问题infeasible,所以下面不讨论

(1)Momentum: 当遇到沟壑问题(一个方向的坡度比其他方向明显要陡峭,大多数情况下都会对应到一个local minimum)时,SGD不会沿着沟壑加速下降到local minimum,而Momentum的想法则是将上一次更新时的梯度乘以一个因数 γ (一般设置为0.9),然后加上此时的梯度,若两个梯度的方向类似,则会加速在这一方向上的移动,即加速了收敛:

vt=γvt1+ηθJ(θ)

θ=θvt

梯度下降法综述_第2张图片

(2)Nesterov accelerated gradient: Momentum的一个问题是盲目,即不判断下一步将要下降到哪,就一直加速下降,所以在坡度开始由下降转为上升时,可能会越过local minimum;Nesterov有效的解决了这个问题,大概意思就是先大概预测下一步要下降到的位置(通过计算 J(θγvt1) 的梯度判断),而后再做出修正,Nesterov在很多RNN的tasks中都很有效:

vt=γvt1+ηθJ(θγvt1)

θ=θvt


蓝色箭头是Momentum:首先计算当前梯度(短箭头),然后再加上上一步的梯度(长箭头);棕色箭头是 J(θγvt1) 的梯度,即预判,然后再做出修正(绿色箭头)

(3)Adagrad:对于不同的timestep(可以理解为第几次更新)以及不同位置的weight(层内或者层间),Momentum和Nesterov都只能使用同一个learning rate进行更新,这样在处理稀疏数据集的时候(比如word embedding 任务),不能实现lager更新出现不频繁的parameters,small 更新频繁出现的parameters.Adagrad则可以有效改善这一情况:

θt+1,i=θt,iηGt,ii+ϵgt,i , GtRd×d 是一个对角矩阵,每个对角元素i,i等于前t个timesteps的关于 θi 的梯度的平方的总和, ϵ (一般设置为 1e8 )用于smoothing,以防分子为0     

向量化之后:  θt+1=θtηGt+ϵgt

Adagrad不需要精调learning rate(一般设置为0.01即可),但是有一个weakness,就是 ηGt+ϵ 会随着分子的增大(每个对角元素都是正数相加)而逐渐减小,甚至接近于0,使得相应的权重得不到更新

(4)Adadelta: Adadelta是Adagrad的一个拓展,为的是解决Adagrad learning rate减小为接近0的情况,所以相比较与Adagrad对过去所有的梯度的平方进行累加,Adadelta增加了一个限制窗口,大小为m(即只统计前m步的梯度的平方);而相较于直接计算累加和(需要保留前m步的梯度的平方),Adadelta采用的是计算前面steps的梯度的平方的均值方法:

E[g2]t=γE[g2]t1+(1γ)g2t

Δθt=ηE[g2]t+ϵgt

The authors note that the units in this update (as well as in SGD, Momentum, or Adagrad) do not match, i.e. the update should have the same hypothetical units as the parameter. To realize this, they first define another exponentially decaying average, this time not of squared gradients but of squared parameter updates:

E[Δθ2]t=γE[Δθ2]t1+(1γ)Δθ2t

Δθt=RMS[Δθ]tRMS[g]tgt

θt+1=θt+Δθt

由上述式子可知,Adadelta甚至不需要设置Leaning rate

(5)RMSprop:Adadelta和RMSprop都是为了解决Adagrad learning rate消失的问题,而 RMSprop其实就是上述Adadelta的一部分(算梯度的均值):

E[g2]t=0.9E[g2]t1+0.1g2t

θt+1=θtηE[g2]t+ϵgt

γ 一般设置为0.9, η 一般设置为0.001

(6)Adam:Adam除了保留梯度平方的exponentially decaying average vt ,还保留了梯度的exponentially decaying average mt

mt=β1mt1+(1β1)gt

vt=β2vt1+(1β2)g2t

m^t=mt1βt1

v^t=vt1βt2

θt+1=θtηv^t+ϵm^t

default values of 0.9 for β1, 0.999 for β2, and 108 for ϵϵ

Visualization of algorithms

梯度下降法综述_第3张图片

你可能感兴趣的:(深度学习,梯度下降)