1. 程式人生 > >機器學習中的優化演算法(附程式碼)

機器學習中的優化演算法(附程式碼)

摘要

> 優化演算法指通過改善訓練方式,來最小化(或最大化)損失函式E(x)

區域性最優問題

區域性最優與鞍點。在神經網路中,最小化非凸誤差函式的另一個關鍵挑戰是避免陷於多個其他區域性最小值中。實際上,問題並非源於區域性極小值,而是來自鞍點,即一個維度向上傾斜且另一維度向下傾斜的點。這些鞍點通常被相同誤差值的平面所包圍,這使得SGD演算法很難脫離出來,因為梯度在所有維度上接近於零。
公式

batch優化

很難選擇出合適的學習率。太小的學習率會導致網路收斂過於緩慢,而學習率太大可能會影響收斂,並導致損失函式在最小值上波動,甚至出現梯度發散。
2.此外,相同的學習率並不適用於所有的引數更新。如果訓練集資料很稀疏,且特徵頻率非常不同,則不應該將其全部更新到相同的程度,但是對於很少出現的特徵,應使用更大的更新率。

隨機梯度下降

對每個訓練樣本進行引數更新,每次執行都進行一次更新,且執行速度更快。
頻繁的更新使得引數間具有高方差,損失函式會以不同的強度波動。這實際上是一件好事,因為它有助於我們發現新的和可能更優的區域性最小值,而標準梯度下降將只會收斂到某個區域性最優值。
但SGD的問題是,由於頻繁的更新和波動,最終將收斂到最小限度,並會因波動頻繁存在超調量。

批量梯度下降

傳統的批量梯度下降將計算整個資料集梯度,但只會進行一次更新,因此在處理大型資料集時速度很慢且難以控制,甚至導致記憶體溢位。
權重更新的快慢是由學習率η決定的,並且可以在凸面誤差曲面中收斂到全域性最優值,在非凸曲面中可能趨於區域性最優值。
使用標準形式的批量梯度下降還有一個問題,就是在訓練大型資料集時存在冗餘的權重更新。

mini-batch梯度下降

聽說GPU對2的冪次的batch可以發揮更佳的效能,因此設定成16、32、64、128…時往往要比設定為整10、整100的倍數時表現更優
視訊記憶體估算,在每一個epoch計算完所有的樣本後,計算下一代樣本的時候,可以選擇打亂所有樣本順序。

一階優化

使用各引數的梯度值來最小化或最大化損失函式E(x)

學習率優化

全域性調整
調整每一個需要優化的引數的學習率.
- 學習率衰減
每隔幾個epoch減少一次learning rate, 一般是每執行5個epoch左右把learning rate減少一半, 或者是每隔20個epoch減少為原來的1/10.
線性衰減。例如:每過5個epochs學習率減半
指數衰減。例如:每過5個epochs將學習率乘以0.1
指數加權平均

公式

帶修正的指數加權平均

修正公式


  • 動量梯度下降Momentum

給學習率增加了慣性
公式

演算法


  • NAG(Nesterov Momentum)

Momentum由前面下降方向的一個累積和當前點的梯度方向組合而成.先按照歷史梯度往前走那麼一小步,按照前面一小步位置的“超前梯度”來做梯度合併
公式
- AdaGrad
學習率 η 會隨著每次迭代而根據歷史梯度的變化而變化。
將每一個引數的每一次迭代的梯度取平方累加再開方,用基礎學習率除以這個數,來做學習率的動態更新

公式

其學習率是單調遞減的,訓練後期學習率非常小
其需要手工設定一個全域性的初始學習率
學習率的調整太激進, 因此常常過早結束了學習過程.
為每一個引數保留一個學習率以提升在稀疏梯度(即自然語言和計算機視覺問題)上的效能
- Rprop
- RMSprop
目前並沒有發表, 基於權重梯度最近量級的均值為每一個引數適應性地保留學習率

公式
- Adam

結合momentum和RMSprop

二階優化

使用了二階導數(也叫做Hessian方法)來最小化或最大化損失函式。由於二階導數的計算成本很高,所以這種方法並沒有廣泛使用。
如果估計不好一階導數,那麼對二階導數的估計會有更大的誤差,這對於這些演算法來說是致命的。對於二階優化演算法,減小batch換來的收斂速度提升遠不如引入大量噪聲導致的效能下降。在使用二階優化演算法時,往往要採用大batch

牛頓法

擬牛頓法

牛頓法有個缺點,海森矩陣是非稀疏矩陣,引數太多,其計算量太大。

優化演算法效果對比圖
- AdaDelta

通過設定視窗 w, 只使用部分時間的梯度累積.

優化演算法效果對比圖
優化演算法效果對比圖
- Hessian

其它


  • 共軛梯度法
  • 啟發式優化

模擬退火方法、遺傳演算法、蟻群演算法以及粒子群演算法

程式碼演示

總結

文章則是通過對比給出如下結論:自適應優化演算法通常都會得到比SGD演算法效能更差(經常是差很多)的結果,儘管自適應優化演算法在訓練時會表現的比較好,因此使用者在使用自適應優化演算法時需要慎重考慮!

優化演算法效果對比圖

> 推薦使用Adam方法. Adam 演算法通常會比 RMSProp 演算法效果好. 另外,也可以嘗試 SGD+Nesterov Momentum

參考資料
- 一文看懂各種神經網路優化演算法:從梯度下降到Adam方法
- 神經網路優化演算法綜述
- 談談深度學習中的 Batch_Size
- 深度機器學習中的batch的大小對學習效果有何影響?
- 自適應學習率調整:AdaDelta
- 卷積神經網路中的優化演算法比較
- Deep Learning 之 最優化方法
- 卷積神經網路中的優化演算法比較
- 教程 | 聽說你瞭解深度學習最常用的學習演算法:Adam優化演算法?
- [Math] 常見的幾種最優化方法