梯度下降算法及其改進方法詳解
本文中例子來源於:
https://zhuanlan.zhihu.com/p/21486826
https://zhuanlan.zhihu.com/p/22810533
1. 前提
1.1 成本函數
設計完神經網絡結構之後,接下來就要設計神經網絡的學習算法。假設向量
上式中,
公式(1)實際上是計算的期望輸出與實際輸出差值的平均值,因此(1)也被稱爲均方誤差(MSE, mean squard error)。當我們的算法足夠好時,期望輸出與實際輸出應近似相等,此時公式(1)均方誤差
1.2 爲什麼要用均方誤差?
我們最終的目的是神經網絡輸出的準確率,爲什麼不直接讓正確率最大化而是找一個替代方法?這是因爲神經網絡的正確率不是關於權值和偏置的光滑函數。更進一步來說,權值和偏置的微小變化不一定能引起正確率的變化,所以我們就不能通過正確率來不斷修改權值和偏置來提升性能。爲什麼我們選擇均方誤差作爲成本函數而不用其他?當然有其他成本函數我們在後面介紹,但要指出的是,公式(1)很好用。
2. 梯度下降算法
上面已經說了,我們的目的是求成本函數的最小值。數學上常用的方法是通過求導計算目標函數的最小值(如拉格朗日乘數法)。這在目標函數變量不太多時非常有效,但在變量很多時就有些力不從心了。比如,一個大型神經網絡,權值和偏置的數目往往以億萬計,如果用上述方法會變得異常麻煩(此時拉格朗日乘數法要解一個億萬個函數組成的方程組)。對此,我們提出了梯度下降算法(GD, gradient descent)來解決這個問題。
2.1 批梯度下降算法(BGD)
我們把成本函數
假設球在
接下來要找到一種方式,保證
其中
其中
因爲
由公式(5)我們可以得到權值和偏置的更新公式
上述算法稱爲批梯度下降算法(BGD, batch gradient descent) ,由公式(1)和公式(5)我們可以看出,爲了計算出
下面是批梯度下降算法的流程圖:
2.2 隨機梯度下降算法(SGD)
當樣本很多時,梯度下降算法每更新一次都要輸入所有樣本,因此非常耗時。因此就有了隨機梯度下降算法(SGD, stochastic gradient descent),其基本思想是:隨機選擇一個樣本作爲輸入然後更新一次權值和偏置。此時公式(1)變爲:
更新公式爲:
流程圖爲:
實際上隨機梯度下降算法計算的並不是真正的梯度,真正的梯度應該像批梯度計算那樣需要所有樣本才能計算。隨機梯度只是用一個樣本進行對真正的梯度進行了一次預估,因此可能會有偏差。即隨機梯度下降算法不一定保證每次前進方向都是正確的,所以會帶來波動。
2.3 微批量梯度下降算法(MGD)
隨機梯度下降算法雖然更新速度變快,但每次更新方向不一定正確,所以有可能“繞遠路”。因此又提出了微批量梯度下降算法(MGD, mini-batch gradient descent)。其核心思想是:每次選擇若干樣本估計梯度,比如每學習100個樣本更新一次梯度和權值。
首先,從所有樣本中隨機選出
其中
因此,公式(11)就用
其流程圖爲:
2.4 三種梯度下降算法比較
批梯度和隨機梯度相比較而言,批梯度由於使用了所有樣本數據,因此每一次都會朝着正確的方向前進,最後能保證收斂於極值點(凸函數收斂於極值點,非凸函數可能會收斂於局部極值點)。而隨機梯度只用了一個樣本數據進行估計真正的梯度,因此每次前進的方向不一定都是正確的,訓練過程中會出現波動。這些波動使得會導致出現“繞遠路”現象,即迭代次數變多,甚至收斂速度變慢。不過從另一個方面來看,隨機梯度下降所帶來的波動有個好處就是,對於類似盆地區域(即很多局部極小值點)那麼這個波動的特點可能會使得優化的方向從當前的局部極小值點跳到另一個更好的局部極小值點,這樣便可能對於非凸函數,最終收斂於一個較好的局部極值點,甚至全局極值點。另外,由於隨機梯度的期望是梯度本身,即隨機梯度以概率收斂於梯度,所以在訓練樣本足夠多的情況下隨機梯度和梯度有相似的結果。
微批量梯度下降算法與另外兩種比較,
3. 梯度下降算法的改進
梯度下降算法有很多改進算法,比如一階方法主要有:動量法、Nesterov accelerated gradient 、Adagrad、Adadelta與RMSprop,二階方法有:牛頓法、擬牛頓法等。因爲有些改進方法僅僅是某些情況下才有較好的效果,而有的方法較爲複雜,增加了計算量。因而它們大部分應用並不廣泛。這裏我們僅僅介紹一種簡單而且應用最廣泛的一種改進方法——動量法(momentum)。
3.1 動量法(Momentmu)
動量法是一種非常簡單的改進方法,已經成功應用數十年。動量法的核心思想是:在梯度方向一致的地方加速,在梯度方向不斷改變的地方減速。其更新公式爲:
其中
* 在下降初期,使用前一次的大比重下降方向,加速。
* 在越過函數谷面時,異常的學習率,會使得兩次更新方向基本相反,在原地“震盪” 此時,動量因子使得更新幅度減小,協助越過函數谷面。
* 在下降中後期,函數面局部最小值所在的吸引盆數量較多,一旦陷進吸引盆地當中,梯度趨於零,會導致止步不前,學習無法進行。如果有動量項的話,動量因子使得更新幅度增大,協助躍出吸引盆。
爲了更詳細理解動量法的作用,下面我們舉一個例子。假設被優化函數即成本函數
我們現在用隨機梯度下降算法用較小步長迭代50次看看:
可以看到整體是向着最優點前進,但到後面卻有些乏力。接下來增大步長看看:
可以看出有很嚴重的震盪現象,繼續增大步長:
可以明顯看出,再面對山谷這種函數表面時,隨機梯度下降算法會在橫跨山谷的方向上來回震盪。接下來,我們有加入動量項的改進方法試試:
我們發現,加入動量項在迭代50次以後,已經基本來到了最優點附近,比原來方法要好不少。
3.2 涅斯捷羅夫梯度加速法(NAG)
由公式(13)我們可以看出,動量法更新其實包括兩部分:一部分是上一時刻的更新值
上式與動量法公式(13)相比,唯一的區別就是梯度的計算不是在位置
我們用NAG方法迭代50次之後得到下圖:
可以看出,NAG方法不僅接近了最優點,而且更有效的減少了震盪。