本文從梯度學習算法的角度中看學習率對於學習算法性能的影響,以及介紹如何調整學習率的一般經驗和技巧。
在機器學習中,監督式學習(Supervised Learning)通過定義一個模型,並根據訓練集上的數據估計最優參數。梯度下降法(Gradient Descent)是一個廣泛被用來最小化模型誤差的參數優化算法。梯度下降法通過多次迭代,並在每一步中最小化成本函數(cost function)來估計模型的參數(weights)。
梯度下降的偽代碼如下:
重復已下過程,直到收斂為止{
ωj = ωj - λ ∂F(ωj) / ∂ωj
}
說明:(1) ωj 是模型參數, F()是成本函數, ∂F(ωj) / ∂ωj 是ωj 的一階導數,λ 是學習率
(2)如果F()是單調函數,經過多次迭代會得到最小的成本函數;如果F()非單調,那么我們有可能陷入局部最優,一個簡單的解決辦法是通過多次嘗試不同的ωj 初始值,對比不同估計參數下的成本函數的值是否一致,來發現是否陷入局部最優。
(3)梯度下降法未必是最優的計算權重參數的方法,但是作為一種簡單快速的方法,常常被使用。參照Andrew Ng的Stanford公開課程。
梯度下降過程的圖示如下:

學習率的調整
為了能夠使得梯度下降法有較好的性能,我們需要把學習率的值設定在合適的范圍內。學習率決定了參數移動到最優值的速度快慢。如果學習率過大,很可能會越過最優值;反而如果學習率過小,優化的效率可能過低,長時間算法無法收斂。所以學習率對於算法性能的表現至關重要。
對於不同大小的數據集,調節不同的學習率
根據我們選擇的成本函數F()不同,問題會有區別。當平方誤差和(Sum of Squared Errors)作為成本函數時, ∂F(ωj) / ∂ωj 會隨着訓練集數據的增多變得越來越大,因此學習率需要被設定在相應更小的值上。
解決此類問題的一個方法是將學習率λ 乘上1/N,N是訓練集中數據量。這樣每部更新的公式變成下面的形式:
ωj = ωj - (λ/N) * ∂F(ωj) / ∂ωj
相關內容可參考: Wilson et al. paper “The general inefficiency of batch training for gradient descent learning”
另外一種解決方法是:選擇一個不被訓練集樣本個數影響的成本函數,如均值平方差(Mean Squared Errors)。
在每次迭代中調節不同的學習率
在每次迭代中去調整學習率的值是另一種很好的學習率自適應方法。此類方法的基本思路是當你離最優值越遠,你需要朝最優值移動的就越多,即學習率就應該越大;反之亦反。
但是這里有一個問題,就是我們並不知道實際上的最優值在哪里,我們也不知道每一步迭代中我們離最優值有多遠。
解決辦法是,我們在每次迭代的最后,使用估計的模型參數檢查誤差函數(error function)的值。如果相對於上一次迭代,錯誤率減少了,就可以增大學習率,以5%的幅度;如果相對於上一次迭代,錯誤率增大了(意味着跳過了最優值),那么應該重新設置上一輪迭代ωj 的值,並且減少學習率到之前的50%。這種方法叫做 Bold Driver.
建議:歸一化輸入向量
歸一化輸入向量在機器學習問題中是一個通用的方法。在一些應用中,由於使用距離或者特征方差,要求必須歸一化輸入向量,因為如果不歸一化將導致結果會嚴重被具有大方差的特征和不同的尺度影響。歸一化輸入能夠幫助數值最優方法(例如,梯度下降法)更快,更准確地收斂。
盡管有一些不同的歸一化變量的方法,[0,1]歸一化(也叫做min-max)和z-score歸一化是兩種最為廣泛應用的。
XminmaxNorm = (X - min(X)) / (max(X) - min(X));
XzscoreNorm = (X - mean(X)) / std(X);
說明:本文為http://blog.datumbox.com/tuning-the-learning-rate-in-gradient-descent/ 的譯文版,原文作者 Vasilis Vryniotis.
希望有助於大家理解與使用!
