優化器的使用:在機器學習與深度學習中,主要應用於梯度下降。比如:傳統的優化器主要結合數據集,通過變化單次循環所采用的數據量的大小來對梯度下降進行控制;非傳統的優化器則進一步結合數據集的特點和模型的訓練時間,以不同的形式變化梯度下降的學習率。常見的優化器SGD、BGD、MBGD、Momentum、NAG、Adagrad、RMSprop、Adam梯度下降的原理:$\theta ^{n+1}=\theta ^{n}-\eta \bigtriangledown _{\theta }J\left ( \theta \right )$其中$\eta$為學習率;$\theta ^{n}$為更新前的參數;$\theta ^{n+1}$為更新后的參數;$ \bigtriangledown _{\theta }J\left ( \theta \right )$是當前參數的導數。 1.SGD(Stochastic Gradient Descent )SGD隨機梯度下降參數更新原則:單條數據就可對參數進行一次更新。優點:參數更新速度快。 缺點:由於每次參數更新時采用的數據量很小,造成梯度更新時震盪幅度大,但大多數情況都是向着梯度減小的方向。 ![]() 2.BGD(Batch Gradient Descent )BGD批量梯度下降參數更新原則:所有數據都參與參數的每一次更新。優點:由於每次參數更新時采用的數據量很大,梯度更新時很平滑。 缺點:由於每次參數更新時采用的數據量很大,造成參數更新速度慢。 ![]() 3.MBGD(Mini-Batch Gradient Descent )MBGD小批量梯度下降參數更新原則:只用所有數據的一部分進行參數的每一次更新。優點:相比於SGD,由於每次參數更新時采用的數據量相對較大,梯度更新時相對平滑;相比於BGD,由於每次參數更新時采用的數據量相對較小,參數更新速度相對較快。 缺點:沒有考慮數據集的稀疏度和模型的訓練時間對參數更新的影響。 ![]() 4.MomentumMomentum解決的問題:SGD隨機梯度下降時的震盪問題。Momentum參數更新原則:通過加入 $\gamma v_{n}$ ,加速 SGD, 並且抑制震盪。 更新公式: $v_{n+1}=\gamma v_{n}+\eta \bigtriangledown _{\theta }J\left ( \theta \right )$ $\theta ^{n+1}=\theta ^{n}-v_{n+1}$ 超參數設定值: 一般$\gamma$取值 0.9 左右。 優點:加入的這一項,可以使得梯度方向不變的維度上速度變快,梯度方向有所改變的維度上的更新速度變慢,這樣就可以加快收斂並減小震盪。 缺點:這種情況相當於小球從山上滾下來時是在盲目地沿着坡滾,如果它能具備一些先知,例如快要到坡底時,就知道需要減速了的話,適應性會更好。 5.NAG(Nesterov Accelerated Gradient)NAG解決的問題:在Momentum的基礎上進一步解決SGD隨機梯度下降時的震盪問題。NAG參數更新原則:用 $\theta -\gamma v_{n}$ 來近似當做參數下一步會變成的值,則在計算梯度時,不是在當前位置,而是未來的位置上。 更新公式: $v_{n+1}=\gamma v_{n}+\eta \bigtriangledown _{\theta }J\left ( \theta- \gamma v_{n} \right )$ $\theta ^{n+1}=\theta ^{n}-v_{n+1}$ ![]() 超參數設定值: 一般$\gamma$仍取值 0.9 左右。 優點:藍色是 Momentum 的過程,會先計算當前的梯度,然后在更新后的累積梯度后會有一個大的跳躍。而NAG 會先在前一步的累積梯度上(brown vector)有一個大的跳躍,然后衡量一下梯度做一下修正(red vector),這種預期的更新可以避免我們走的太快。 應用:NAG 可以使 RNN 在很多任務上有更好的表現。 缺點:不能根據參數的重要性而對不同的參數進行不同程度的更新。 6.Adagrad(Adaptive gradient algorithm)Adagrad解決的問題:解決不能根據參數的重要性而對不同的參數進行不同程度的更新的問題。Adagrad參數更新原則:對低頻的參數做較大的更新,對高頻的做較小的更新。 更新公式: $\theta _{t+1,i}=\theta _{t,i}-\frac{\eta }{\sqrt{G_{t,ii}+\epsilon }}g_{t,i}$ 其中$g$為$t$時刻$\theta _{i}$的梯度。 $g_{t,i}=\bigtriangledown _{\theta }J\left ( \theta _{i} \right )$ 如果是普通的 SGD, 那么$\theta _{i}$在每一時刻的梯度更新公式為: $\theta _{t+1,i}=\theta _{t,i}-\eta g_{t,i}$ 其中 $G_{t,ii}$是個對角矩陣, $(i,i)$ 元素就是$t$ 時刻參數 $\theta _{i} $ 的梯度平方和。 超參數設定值:一般$ \eta$ 選取0.01。 優點:減少了學習率的手動調節。 缺點:它的缺點是分母會不斷積累,這樣學習率就會收縮並最終會變得非常小。 7.AdadeltaAdadelta解決的問題:解決Adagrad分母會不斷積累,這樣學習率就會收縮並最終會變得非常小的問題。Adadelta參數更新原則:和 Adagrad 相比,就是分母的 $G_{t,ii}$ 換成了過去的梯度平方的衰減平均值,指數衰減平均值。 ![]() 這個分母相當於梯度的均方根 root mean squared (RMS),在數據統計分析中,將所有值平方求和,求其均值,再開平方,就得到均方根值 ,所以可以用 RMS 簡寫: ![]() 其中 $E$ 的計算公式如下,$t$ 時刻的依賴於前一時刻的平均和當前的梯度: ![]() 更新公式: 此外,還將學習率$ \eta$換成了 $RMSE\left ( \bigtriangleup \theta \right )$,這樣的話,我們甚至都不需要提前設定學習率了: ![]() 超參數設定值: $\gamma$一般設定為 0.9。 優點:減少了學習率的手動調節。 8.RMSpropRMSprop解決的問題:RMSprop 和 Adadelta 都是為了解決 Adagrad 學習率急劇下降問題。RMSprop參數更新原則:RMSprop 與 Adadelta 的第一種形式相同:(使用的是指數加權平均,旨在消除梯度下降中的擺動,與Momentum的效果一樣,某一維度的導數比較大,則指數加權平均就大,某一維度的導數比較小,則其指數加權平均就小,這樣就保證了各維度導數都在一個量級,進而減少了擺動。允許使用一個更大的學習率$ \eta$)。 更新公式: ![]() 超參數設定值:Hinton 建議設定 $\gamma$為 0.9, 學習率$ \eta$ 為 0.001。 優點:減少了學習率的手動調節。 9.Adam(Adaptive Moment Estimation)Adam解決的問題:這個算法是另一種計算每個參數的自適應學習率的方法。Adam參數更新原則:相當於 RMSprop + Momentum。除了像 Adadelta 和 RMSprop 一樣存儲了過去梯度的平方$ v_{t}$ 的指數衰減平均值 ,也像 momentum 一樣保持了過去梯度 mt 的指數衰減平均值: ![]() ![]() 更新公式: ![]() 超參數設定值:建議 β1 = 0.9,β2 = 0.999,ϵ = 10e−8。 優點:實踐表明,Adam 比其他適應性學習方法效果要好。 如何選擇優化算法?1.如果數據是稀疏的,就用自適用方法,即 Adagrad, Adadelta, RMSprop, Adam。2.RMSprop, Adadelta, Adam 在很多情況下的效果是相似的。Adam 就是在 RMSprop 的基礎上加了 bias-correction 和 momentum,隨着梯度變的稀疏,Adam 比 RMSprop 效果會好。 3.整體來講,Adam 是最好的選擇 4.SGD 雖然能達到極小值,但是比其它算法用的時間長,而且可能會被困在鞍點。 5.如果需要更快的收斂,或者是訓練更深更復雜的神經網絡,需要用一種自適應的算法。 |