在开始assignment之前,要先马一个国外大神对于gradient descent optimization algorithm的总结:http://sebastianruder.com/optimizing-gradient-descent/index.html#fnref:1
Gradient Descent
(1) SGD
SGD的问题在于,在很多情况下收敛速度过慢,考虑如下情况:
在flat的方向上过慢,而在steep的方向上上下幅度过大导致收敛过程异常缓慢。为了解决这个问题,有人提出了Momentum Update
(2) Momentum update
Andrej大神教我们如何去理解这个momentum(动量)。首先我们的loss function在这个field内就像一个小球,它需要force产生加速度,从而有速度。gradient就相当于加速度,v就是速度,那么mu*v就是friction。也就是说为了让小球能稳定下来,我们需要一个friction来达到steady state。mu就是momentum,表示虽然我们希望改变梯度,但是要保留原来的值,好比惯性一样,和当前计算得出的改变量做一个tradeoff。mu可以取0.5,0.9,0.99等...
当然有人在momentum基础上又做了一步改进,就是
NAG的意义在于,向前多“观测”了一步,这样调整过程可以更快速。
(3) AdaGrad
这样的意义在于,当我们发现原来在steep方向上下降速度过快(可以从累积的cache体现),这样的scale down做法就可以减缓这个方向的下降速度,从而减小jiggle,加快收敛。但是问题是,过了一些迭代之后“小球”就停下来了,这并不是我们想要的,尤其是在训练深度神经网络的时候。Hinton在12年对这个算法做出了改进。加入了leaky:
这样的好处在于解决了当cache过大的时候,梯度下降不再继续的尴尬。 比较funny的一点在于,Hinton本人并没有发表文章,只是在他po在coursera的课上的一个slide里面提到...之后有人在论文里只好引用这个slide...哈哈哈6666,Hinton都不屑于发这种东西了是嘛……
(4) Adam Update
Adam: combining momentum update and RMSProp
Andrej说一般来讲beta1取0.9,beta2取0.995。
(5) 关键是 Learning decay rate over time!
通常这些exponential decay用于sgd。
(6) Second order optimization methods
nice feature: no learning rate,可以由hessian矩阵更直接的知道该向最速下降方向走多少。
两种常见的second order optimization: BFGS and L-BFGS