批量梯度下降
批量梯度下降
本文主要介紹了在深度學習優化中遇到的問題以及解決方法,在此簡要地記錄核心的部分。
Stochastic Gradient Descent(隨機梯度下降)
在數值計算中,書本介紹了Gradient Descent算法,但是在實際使用中,梯度下降計算梯度時需要利用所有的數據樣本,其優點是這樣計算的梯度較為準確,但缺點是在樣本量大的情況下計算量較大。
假設我們有n個樣本,其均值的標準差為 \(\sigma\) ,其中 \(\frac{\sigma}{\sqrt{n}}\) 是MLE的真實標準差。我們可以看到,分母是 \(\sqrt{n}\) 表明隨著樣本的增多,計算梯度的準確度的回報是小于線性的。例如我們有兩種方法:1. 利用100個樣本計算梯度 2.利用10000個樣本計算梯度。 第二種方法是第一種的100倍的計算量,但只將均值的標準差減少了10倍,我們通常希望我們能更快的達到我們的優化目標,所以不需要每次計算梯度都嚴格的利用全部樣本,而是進行多次iteration,而每次估算的梯度有合適的準確度即可。在優化算法里,我們通常把一次僅利用一個樣本來更新的方式叫做stochastic或online方法。但對于深度學習來講,我們通常所說的stochastic gradient descent指的是minibatch stochastic methods,即每次計算梯度時利用一部分樣本,其樣本量是新引入的超參數batch size。隨機梯度下降算法參數更新規則如下表示:

tips: 隨機梯度下降在第一次樣本的迭代過程中可以看作是在求解真實數據生成分布 \(\mathit{p} _{data}\)對\(\mathit{p} _{model}(y|x)\)的交叉熵損失函數梯度 $-\mathbb{E}_{\mathbf{x,y}\sim \mathit{p} _{data}}\bigtriangledown _{\theta}\log\mathit{p} _{model}(y|x) $ 的無偏估計,其學習對象是泛化誤差而非訓練誤差。因為從模型的角度上來說,每次取mini batch 的時候是從數據流得到數據的,而數據流是來自真實的數據分布 \(\mathit{p}_{data}\),因此隨機梯度下降的泛化能力更好。從圖進行解釋,就是SGD算法相比與GD算法,更容易隨機地在函數曲面進行移動,相比于GD每次固定下降的梯度,SGD更容易跳出一些局部最小值點。
注意到,我們引入了另一個超參數學習率 \(\epsilon_k\) ,可以說學習率是深度學習中最重要的需要調節的參數,如果學習率過大,我們可能會一次就跳過極小點而到山谷的另一側,那么訓練的loss可能會有較大波動而不是一致的向極小點步進,另一方面,如果學習率過小,訓練更新過小,需要較長時間才能達到較好效果。通常我們需要經過不斷的試驗來選取合適的學習率,另外也可以在初始時使用稍大一些的學習率,隨著訓練的進行可以逐步的降低學習率從而避免波動,例如通常采用的方法是對于前 \(\tau\) 次iteration, 線性的降低學習率 \(\epsilon_k=\left(1-\frac{k}{\tau}\right) \epsilon_0+\frac{k}{\tau} \epsilon_\tau\),之后保持學習率恒定。
但是,對于SGD,常常會遇到一個問題:病態的Hessian矩陣。Hessian在條件數非常大的時候,會使得函數在各個方向上的曲率區別非常大,此時在使用SGD算法時,較短的步長也會導致函數值不降反升,或者下降的路徑曲折蜿蜒,非常影響效率,如下圖所示:

所以為了改進算法的性能,人們提出了幾種改進梯度下降算法。
Momentum(動量)
Momentum,顧名思義,來自物理學中的動量概念,即我們用一個新的變量 \(v(v\) 可以看做是速度,在質量為單位質量時大小等于Momentum) 來記錄之前的梯度變化的速度,其優勢在于對于 局域極小值或鞍點的情況,由于保持了原有的速度,模型可以繼續更新。
更新法則用公式表示為
其中 \(\alpha\) 表示了之前的梯度的貢獻衰減的速率,如果 \(\alpha\) 相對于 \(\epsilon\) 越大,則之前的梯度對當前方向影響越大。與SGD比較,可以看出原SGD只要梯度大步進幅度較大,而對于Momentum來說,如果之前若干次梯度方向一致,才有較大的步進幅度。受Nesterov加速算法的啟發,后續人們還提出了Nesterov動量的隨機梯度下降算法。其與動量的SGD只有一個區別,就是在計算梯度的時候進行了下一步的梯度預測,所以更加保守。
到此為止,學習算法依舊是在對梯度進行改進,而對于每一輪的學習,其學習率則采用常數。雖然對梯度進行改進確實改進了算法性能,但是同時也增加了新的超參數,那么我們自然會想到能否對學習率這個超參數進行學習。但是以下三種方法均是自適應學習率(Adaptive learning rate)的算法,即隨著模型進行自我調控學習率并對于不同的參數采取不同的學習率。
AdaGrad
與Momentum方法比較,AdaGrad沒有引入速度變量 \(v\) ,而是記錄每個參數方向上的梯度的值的平方和,在該參數方向上步進時除以這個平方和的平方根,則對于原梯度較小學習進展較慢的方向相較于原梯度較大的方向rescale的程度較小,從而加速在該方向上的學習進程。其具體的更新規則為:

其中 \(\odot\) 為元素乘積符號,即對于每個元素求平方,其輸出結果為矢量。矢量 \(r\) 即為每個參數方向 的梯度平方和的積累值,注意我們對其做除法時會假如一個極小量 \(\delta\) 以防除數為零的情況發生。
RMSProp
Adagrad雖然可以較好的解決不同方向曲率差異過大的情況,但是我們可以看到隨著訓練的進行, 除數 \(\sqrt{r}\) 在不斷增大,學習率衰減依賴于所有之前的梯度的歷史結果,可能在我們末達到極值點 前學習率已經減至過低從而無法有效的更新模型。所以RMSProp方法在其上做了改進,即對于 \(r\) 加入一定的衰減,使較早的梯度貢獻較小,即我們計算的是一個帶有指數權重的moving average。其更新法則與AdaGrad不同的地方在于

Adam
Adam 可以看做是RMSProp 與Momentum方法的一種結合,其得名于Adaptive moments,意在結合兩者的優點。它引入兩個moment, 第一個即為速度的Momentum,第二個moment則是如RMSProp中的梯度的平方和,并分別對兩個moment進行一些隨時間變化的修正。其更新法則如下:

Adam算法對梯度的一階矩和二階矩進行了修正,使其成為無偏估計量,相比于使用動量的RMSProp算法,其避免了二階矩的高偏置,擁有更好的魯棒性。

浙公網安備 33010602011771號