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更easy从一个local minimum跳到另一个local minimum(可是当learning rate过小时。performance便和BGD类似)。High variance,更easy使得loss curve产生震荡
(3)Mini-batch gradient descent: 计算whole dataset某个子集(通常设置为50-256)对于paremeters的偏导,而后更新梯度;比SGD更稳定。更易收敛。能够使用高效的矩阵化trick。使得在runing的时候更加efficient
(4)面临几大问题:
1.Learning rate非常难选择,太小了收敛非常慢,太大了easy在local minimum周围晃动。甚至发散
2.在训练时当loss一直在某个范围摆动时,这时候应该减小learning rate,可是这个trick受数据集属性或者模型的capacity等因素的影响较大,须要觉得的精调
3.所用的參数更新都是基于同一个learning rate的,可是当数据集非常稀疏,或者features出现的频率有非常大不同。这时候我们会希望用较大的learning rate来更新rarely出现的feature,即希望实现feature-wise的learning rate的调整
4.另一个问题时saddle points 的问题,例如以下图:
下文在SGD指的是Mini-batch gradient descent,事实上在其它非常多地方也是这样
Gradient descent optimization algorithms
Newton’s method.对于高维问题infeasible。所以以下不讨论
(1)Momentum: 当遇到沟壑问题(一个方向的坡度比其它方向明显要陡峭,大多数情况下都会相应到一个local minimum)时,SGD不会沿着沟壑加速下降到local minimum,而Momentum的想法则是将上一次更新时的梯度乘以一个因数γ (一般设置为0.9),然后加上此时的梯度。若两个梯度的方向类似。则会加速在这一方向上的移动,即加速了收敛:
vt=γvt−1+η∇θJ(θ)
θ=θ−vt
(2)Nesterov accelerated gradient: Momentum的一个问题是盲目,即不推断下一步将要下降到哪,就一直加速下降,所以在坡度開始由下降转为上升时。可能会越过local minimum。Nesterov有效的攻克了这个问题。大概意思就是先大概预測下一步要下降到的位置(通过计算J(θ−γvt−1) 的梯度推断),而后再做出修正,Nesterov在非常多RNN的tasks中都非常有效:
vt=γvt−1+η∇θJ(θ−γvt−1)
θ=θ−vt
蓝色箭头是Momentum:首先计算当前梯度(短箭头),然后再加上上一步的梯度(长箭头)。棕色箭头是