在昨天的文章 [Day 26] 用 TensorFlow 實作梯度下降,我們挑選了 GradientDescentOptimizer 來當作我們的優化器 Optimizer 來訓練機器,不過我們也發現有其他不同的優化器可以使用,今天就讓我們來看看吧!
我們在先前的文章當中,有提到關於 learning rate 的問題。在梯度下降當中,learning rate 是一個我們最初給定的值,太大或太小都有可能產生問題,因此人們開始去思考,如何可以用不同的方法來調整 learning rate,讓這個值可以根據我們要處理問題的狀況,自己做調適改變,來達到最佳的效果。
因此我們會看到有不同的優化器,也就是不同的算法來幫助我們執行梯度下降。今天讓我們先來看看 Adagrad!
Adagrad 這個字當中的 Ada
指的是 Adaptive,而 grad
就是指 Gradient Descent,結合起來就是指可以自適應的梯度下降法。
在距離目標點遠的時候,我們希望 learning rate 可以大一點,走得比較快以節省時間,而在靠近目標點的時候,可以將 learning rate 逐漸調小,讓我們可以在靠近目標點的同時不至於跨太大步而超過了。
最簡單的想法就是,讓每次執行的實際 learning rate,等於原 learning rate 除以到目前為止的執行次數,所以只要跑過越多次,learning rate 就會不斷降低。
不過實際上 Adagrad 的做法是,每一次執行的 learning rate,會是原 learning rate 除以 過去每一步的斜率的方均根
那讓我們來用 TensorFlow 馬上實驗一下,下面兩張圖分別是一般的梯度下降,以及使用 Adagrad 的梯度下降,同樣跑 50 次之後的結果。
一般的梯度下降
使用 Adagrad 的梯度下降,會發現下降速度比上面的還要快(曲線更快走到平緩區)
在使用 Adagrad 的情況下,最初的 learning rate 可以設定的比較大一點,因為我們之後最後他的 learning rate 會自己逐漸縮小,因此在最一開始的時候可以跨大步走,但是到後面又不至於跳過目標點太遠。
然而不是什麼新工具都是神丹妙藥,Adagrad 因為會逐漸縮小 learning rate,因此在訓練中後段時有可能會讓 learning rate 太小,而提早結束學習。
今天就先到這邊,明天再讓我們一起來看看其他的優化器吧!