在開始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