在昨天的文章中介紹到了 Adagrad 的方式,今天我們來看看其他的優化器
昨天提到關於 learning rate 太大太小的問題,這邊我們可以用 Adaptive Gradient Descent 來解決,但是還有個問題可能還沒有辦法被解決,那就是我們透過了 Gradient Descent or Adagrad 來達到一個低點,但那可能只是局部的最低點,而不是整體的最低點。
因為在接近局部最低點的時候,下降速度會越來越慢,如果我們是用 Adagrad 的話那就更慢了,導致我們沒有任何機會能夠跳出這個點來找到另外一個更低的點。
因此,我們需要其他的辦法來解決這個問題
Momentum 在物理學裡面稱作動量,你可以想像是它用來描述一個物體運動的傾向。以日常經驗來說,一個移動越快的物體,動量也就越大,因為越難讓它停止下來;另外一方面,在一樣的速度下,越重的物體(譬如公車)動量也就越大,因為它比輕的物體(譬如水滴)難以停下來。
套用在梯度下降上,我們希望能夠加入動量這個概念,也就是說,如果目前梯度下降的方向,跟過去參數更新的方向一致的話,那麼就會增強這個方向上的梯度;如果目前梯度下降的方向,跟過去參數更新的方向相反的話,那麼梯度就會降低。
你可以想像過去我們一直往北邊跑,如果今天跑到某一個點,這個點繼續要我們往北邊跑,那麼我們就可以輕易地加速;但是如果這個點告訴我們要往南跑,因為方向相反,這時候我們就不得不放慢腳步,考慮是不是真的要往南跑。
在這樣的情況下,當我們越往局部最低點靠近的時候,因為歷史下降的方向和當前下降的方向一致,因此在下降的速度上不會快速的趨近於零,並有機會根據不同的下降方向做調整,甚至可以跳出局部最低點。
概念上就先講解到這邊,這裡我們介紹 TensorFlow 當中的 Adam Optimizer 出場。Adam 的意思為 Adaptive Moment Estimation,也就是一個採用的 Adagrad 以及 Momentum 優點的算法。
在 TensorFlow 當中使用也很簡單,帶入一個 learning rate 以及兩個參數作為調整用(建議值為 0.9 & 0.99)
optimizer = tf.train.AdamOptimizer(1,0.9,0.99)
得到的 loss 下降結果如下
我們會發現雖然他一開始好像在亂跳,但同樣跑 50 次的情況下,實際上下降的速度比一般的 Gradient Descent 跟 Adagrad 還要快
如果比較三者的參數的變化(行進方式):
Gradient Descent(下降速度較慢)
Adagrad(下降速度較快,可以看到前面的步伐比較大)
Adam(除了下降的速度更快,也發現他會左右跳動)
如果換成從更遠的地方開始 (20,20) 然後執行 100 次,讓三種方法的差異更為明顯
Gradient Descent
Adagrad
Adam
可以看到 Adam 一開始在往左下角前進的時候,是一路往前衝,不像 Adagrad 開始減速。然而衝過頭之後,就會往回修正,因此就會看到像是蛇行的路線。Adam 是目前為止我們看到較好的優化器。
那麼,我們今天就先談到這裡。我們明天見!