深度學習中的優化問題以及常用優化算法

 

 

 

 


3、神經網絡優化中的挑戰

優化是一個很困難的任務,在傳統機器學習中一般會很小心的設計目標函數和約束,以使得優化問題是凸的;然而在訓練神經網絡時,我們遇到的問題大多是非凸,這就給優化帶來更大的挑戰。

3.1 局部極小值

凸優化問題通常可以簡化爲尋找一個局部極小值點的問題,在凸函數中,任何一個局部極小點都是全局最小點;有些凸函數的底部是一個平坦區域,在這個平坦區域的任一點都是一個可以接受的解。如下圖所示:

但是在非凸函數中,梯度經常卡在局部極小值點出不來,所以得不到全局最優解,如下圖所示:

3.2 高原、鞍點和其他平坦區域

低維空間中,局部極小值很普遍。在更高維空間中,局部極小值很罕見,而鞍點則很常見。鞍點處的極值也爲0,在鞍點處,Hessian 矩陣同時具有正負特徵值。位於正特徵值對應的特徵
向量方向的點比鞍點有更大的代價,反之,位於負特徵值對應的特徵向量方向的點有更小的代價,從而神經網絡也不能優化到一個極小值。我們可以將鞍點視爲代價函數某個橫截面上的局部極小點,同時也可以視爲代價函數某個橫截面上的局部極大點,如下圖紅色小點所示:

另外如果在高原處,梯度是平坦的,那麼優化算法很難知道從高原的哪個方向去優化來減小梯度,因爲平坦的高原處每個方向的梯度都是0。高維空間的這種情形爲優化問題帶來很大的挑戰。

3.3 懸崖和梯度爆炸

多層神經網絡通常存在像懸崖一樣的斜率較大區域,如下圖所示。這是由於幾個較大的權重相乘導致的。遇到斜率極大的懸崖結構時,梯度更新會很大程度地改變參數值,通常會完全跳過這類懸崖結構。

高度非線性的深度神經網絡或循環神經網絡的目標函數通常包含由幾個參數連乘而導致的參數空間中尖銳非線性。這些非線性在某些區域會產生非常大的導數。當參數接近這樣的懸崖區域時,梯度下降更新可以使參數彈射得非常遠,可能會使大量已完成的優化工作成爲無用功。

3.4 長期依賴

當計算圖變得極深時,神經網絡優化算法會面臨的另外一個難題就是長期依賴問題——由於變深的結構使模型喪失了學習到先前信息的能力,讓優化變得極其困難。深層的計算圖不僅存在於前饋網絡,還存在於循環網絡中。因爲循環網絡要在很長時間序列的各個時刻重複應用相同操作來構建非常深的計算圖,並且模型參數共享,這使問題更加凸顯。

例如,假設某個計算圖中包含一條反覆與矩陣 [公式] 相乘的路徑。那麼 t 步後,相當於乘以 [公式] 。假設 [公式] 有特徵值分解 [公式] 。在這種簡單的情況下,很容易看出

當特徵值 λi 不在 1 附近時,若在量級上大於 1 則會爆炸;若小於 1 時則會消失。梯度消失與爆炸問題(vanishing and exploding gradient problem)是指該計算圖上的 梯度也會因爲 [公式] 大幅度變化。梯度消失使得我們難以知道參數朝哪個方向移動能夠改進代價函數,而梯度爆炸會使得學習不穩定。之前描述的促使我們使用梯度截斷的懸崖結構便是梯度爆炸現象的一個例子。

3.5 其他問題

比如非精確梯度,局部和全局結構間的弱對應,優化的理論限制等。


4、基本的優化算法

訓練深度神經網絡經常需要花費很多時間,在本文開頭介紹了之前寫的兩篇文章,我們可以知道一般加快神經網絡訓練速度的方法有:合適的初始化策略,使用合適的激活函數;還可以使用批量歸一化處理每層的輸出數據,也可以使用預訓練好的模型做遷移學習。這裏我們介紹一些常用的優化算法,這能非常有效的縮短梯度下降所需要的時間,這些優化算法包括:SGD, Momentum optimization, Nesterov Accelerated Gradient, AdaGrad, RMSProp, and Adam optimization。

4.1 隨機梯度下降

我們已經很熟悉梯度下降算法了,隨機梯度下降(SGD)其實就是通過數據生成分佈隨機抽取m個小批量樣本,在這些小批量樣本上應用梯度下降算法通過計算它們的梯度均值來得到梯度的無偏估計。

隨機梯度下降在第k個迭代更新

4.2 動量(Momentun)

動量可以加速學習,特別是處理高曲率、小但一致的梯度,或是帶噪聲的梯度。動量算法積累了之前梯度指數級衰減的移動平均,並且繼續沿該方向移動。動量的效果如下圖所示

有動量的梯度下降行爲

橫跨輪廓的紅色路徑表示動量學習規則所遵循的路徑,它使該函數最小化。我們在該路徑的每個步驟畫一個箭頭,表示梯度下降將在該點採取的步驟。我們可以看到,一個病態條件的二次目標函數看起來像一個長而窄的山谷或具有陡峭邊的峽谷。動量正確地縱向穿過峽谷,而普通的梯度步驟則會浪費時間在峽谷的窄軸上來回移動。比較下圖,它也顯示了沒有動量的梯度下降的行爲。

沒有動量的梯度下降行爲

動量算法引入了變量 v 充當速度角色,它的作用是如果當前梯度越大,那麼此時參數更新幅度越大,更新規則如下:

具體算法如下圖所示:

在梯度下降算法中,步長等於梯度範數乘以學習率,而現在步長取決於梯度序列的大小和排列。當許多連續的梯度指向相同的方向時,步長最大。如果動量算法總是能觀測到梯度 g ,那麼它會在方向 -g 上不停加速,知道達到最終速度,其中步長大小爲: [公式] ,如果動量超參數設置爲 [公式] ,則對應着最大速度10倍於梯度下降算法。

optimizer = tf.train.MomentumOptimizer(learning_rate=learning_rate,
                                            momentum=0.9)

4.3 Nesterov 動量

Nesterov 動量和標準動量之間的區別體現在梯度計算上。Nesterov 動量中,梯度計算在施加當前速度之後。因此,Nesterov 動量可以解釋爲往標準動量方法中添加了一個校正因子。完整的 Nesterov 動量算法如下所示。

參數更新規則爲:

optimizer = tf.train.MomentumOptimizer(learning_rate=learning_rate,
                                           momentum=0.9, use_nesterov=True)

4.4 AdaGrad

由於學習率對模型的性能有顯著影響,又比較難以設置,於是有了自適應學習率算法。 AdaGrad算法,如下圖所示,獨立地適應所有模型參數的學習率,縮放每個參數反比於其所有梯度歷史平方值總和的平方根。具有損失最大偏導的參數相應地有一個快速下降的學習率,而具有小偏導的參數在學習率上有相對較小的下降。淨效果是在參數空間中更爲平緩的傾斜方向會取得更大的進步。 然而,經驗上已經發現,對於訓練深度神經網絡模型而言,從訓練開始時積累梯度平方會導致有效學習率過早和過量的減小。AdaGrad 在某些深度學習模型上效果不錯,但不是全部。

4.5 RMSProp

RMSProp 算法修改 AdaGrad 以在非凸設定下效果更好,改變梯度積累爲指數加權的移動平均。AdaGrad 旨在應用於凸問題時快速收斂。當應用於非凸函數訓練神經網絡時,學習軌跡可能穿過了很多不同的結構,最終到達一個局部是凸碗的區域。AdaGrad 根據平方梯度的整個歷史收縮學習率,可能使得學習率在達到這樣的凸結構前就變得太小了。RMSProp 使用指數衰減平均以丟棄遙遠過去的歷史,使其能夠在找到凸碗狀結構後快速收斂,它就像一個初始化於該碗狀結構的 AdaGrad 算法實例。

RMSProp 的標準形式如算法 8.5 所示,結合 Nesterov 動量的形式如算法 8.6 所
示。相比於 AdaGrad,使用移動平均引入了一個新的超參數ρ,用來控制移動平均的
長度範圍。

經驗上,RMSProp 已被證明是一種有效且實用的深度神經網絡優化算法。目前
它是深度學習從業者經常採用的優化方法之一。

optimizer = tf.train.RMSPropOptimizer(learning_rate=learning_rate,
                                      momentum=0.9, decay=0.9, epsilon=1e-10)

4.6 Adam

Adam 是另一種學習率自適應的優化算法,如算法 8.7 所示。“Adam’’ 這個名字派生自短語 “adaptive moments’’。

首先,在 Adam 中,動量直接併入了梯度一階矩(指數加權)的估計。將動量加入 RMSProp 最直觀的方法是將動量應用於縮放後的梯度。結合縮放的動量使用沒有明確的理論動機。其次,Adam 包括偏置修正,修正從原點初始化的一階矩(動量項)和(非中心的)二階矩的估計(算法 8.7 )。RMSProp 也採用了(非中心的)二階矩估計,然而缺失了修正因子。因此,不像 Adam,RMSProp 二階矩估計可能在訓練初期有很高的偏置。Adam 通常被認爲對超參數的選擇相當魯棒,儘管學習率有時需要從建議的默認修改。

optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)

在訓練深度神經網絡模型時,Adam 優化算法可以被優先選擇,它通常比其他優化算法快並且效果好;Adam 算法有三個參數,一般使用默認的參數就可以了,但是如果需要調整的話,建議熟悉一下它的理論,然後根據實際情況設置參數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章