引出Adagrad
在使用梯度下降來求取合適的預測函數的參數的時候我們要設置合適的學習率(learning rate)。的取值過大的話會使得每次步子太大,從而導致損失函數(loss function)不能達到最小值,甚至有可能越來越大;而的取值過小的話會導致梯度下降的速度太慢很費時間。因爲剛開始進行梯度下降的時候我們所選擇的參數的初始值會使得損失函數離它所能達到的最小值比較遠,所以我們可以在剛開始進行梯度下降的時候設置較大的,當經過幾輪梯度下降後我們的損失函數離它所能達到的最小值比較近了我們就可以設置較小的。當然最理想的情況就是在每一次執行梯度下降的時候都有不同的學習率,這就引出了Adagrad。
Adagrad的具體實現
先定義:
·····································································(1)
t代表迭代次數,這個式子部分實現了隨着梯度下降執行次數的增加,學習率下降的目標,但還不夠。
定義:
······································································(2)
用每個參數上一次迭代之後的學習率來除以之前這次迭代之前的每一次迭代所計算出的梯度的均方根。
Vanilla Gradient descent:
·································································(3)
Adagrad:
·································································(4)
····························································(5)
將(1)和(5)代入(4)中得:
······················································(6)
這時候就出現一個問題,我們可以看到在(3)中的值越大那麼在參數一定的情況下梯度下降的越快,但在(6)中越大的話這一項的分母也會越大,這在一定程度上阻值了梯度下降的速度,那麼這樣設計有什麼好處嗎?
看一下下面這張圖:
上面這個座標系的橫軸是,縱軸是;
下面這個座標系的橫軸是,縱軸是。
可以看到,這個函數的最低點在處,當剛開始處於點時想要一下子就到達最低點那麼
最優路線就是移動的步長。
從這裏可以總結出一個比較普遍的規律,那就是微分越大,該點的離最低點的距離就越大。但這隻適用於參數個數爲1的情況,當參數個數比較多的時候就不行了。
這個圖中右邊的和放反了。
這種情況下如果只看這個參數(或者只看)的話我們可以將它跟損失函數的關係曲線畫出來,a點的梯度大於b點的梯度,同時a比b離最低點遠(同理c點梯度大於d點梯度,c比b離最低點遠)。但是如果比較c和a的話就會發現c的梯度大於a的梯度,但是c離最低點比較近。那麼當有多個參數時該怎麼辦呢,下面來討論一下。
這裏的分子正是,而分母是,即函數的二階導數。
從圖中可以看到如果求函數的二階導數的話,的二階導數會比的二階導數小,故一階導數和二階導數相除就可以更好地確定學習率的大小了。
但是因爲計算一個比較複雜的函數的導數就比較費勁兒了,如果再計算二階導數的話就會更費勁,所以這裏用來代替二階導數。
如上圖所示,上面爲原函數的圖像,下面爲它的導數的圖像。可以看到函數對求導總體上比函數對求導要小,所以在左下方圖像中取幾個點做均方根的值小於在右下方取的。故一階導數的均方根可以近似代替二階導數。