前言
在訓練模型時,會使⽤優化算法不斷迭代模型參數以降低模型損失函數的值
本節詳細學習常用的優化算法
- 梯度下降
- 動量法
- AdaGrad算法
- RMSProp算法
- AdaDelta算法
- Adam算法
1、優化算法的挑戰
優化算法的⽬標函數通常是⼀個基於訓練數據集的損失函數
優化的⽬標在於降低訓練誤差
通常會遇上兩個挑戰
- 局部最小值
- 鞍點
局部最小值
- 如果f(x)在x上的值⽐在x鄰近的其他點的值更小,那麼f(x)可能是⼀個局部最小值(local minimum)
- 如果f(x)在x上的值是⽬標函數在整個定義域上的最小值,那麼f(x)是全局最小值(global minimum)
當⼀個優化問題的數值解在局部最優解附近時,由於⽬標函數有關解的梯度接近或變成零,最終迭代求得的數值解可能只令⽬標函數局部最小化而⾮全局最小化
鞍點
梯度接近或變成零也可能是由於當前解在鞍點(saddle point)附近
如果在深度學習訓練過程中,損失函數落到了局部最小值和鞍點上,必然會造成模型效果不是最佳
這是優化算法需要解決的問題
2、梯度下降
梯度下降應該是最常見的優化算法了
對於f(x),其梯度是
f沿着單位向量u的方向導數是
我們希望找到f下降最快的方向,來迅速找到f的最小值
當u在梯度⽅向∇f(x)的相反⽅向時,⽅嚮導數被最小化
故有梯度下降
式中的超參數稱作學習率
調整學習率也就是我們日常所說的調參了
隨機梯度下降
當訓練數據樣本數很⼤時,梯度下降每次迭代的計算開銷很⾼
隨機梯度下降(stochastic gradient descent,SGD)減少了每次迭代的計算開銷
在隨機梯度下降的每次迭代中,我們隨機均勻採樣⼀個樣本索引
這是對梯度的無偏估計
小批量隨機梯度下降
傳統的是對整個樣本集進行梯度下降
隨機梯度下降則是每次抽取一個樣本
那我們同樣可以每次抽取一小批樣本B
得到梯度
其梯度下降
3、動量法
梯度下降根據⾃變量當前位置,沿着當前位置的梯度更新⾃變量
如果⾃變量的迭代⽅向僅僅取決於⾃變量當前位置,這可能會帶來⼀些問題
動量法創建速度變量v
對小批量隨機梯度下降的迭代做修改
動量超參數
4、AdaGrad算法
梯度下降和動量法使用統⼀的學習率,難以適應所有維度
引入AdaGrad算法,根據⾃變量在每個維度的梯度值的⼤小來調整各個維度上的學習率
- 將小批量隨機梯度g按元素平⽅後累加到變量s
- 將⽬標函數⾃變量中每個元素的學習率通過按元素運算重新調整
其中,
不過,當學習率在迭代早期降得較快且當前解依然不佳時,AdaGrad算法在迭代後期
由於學習率過小,可能較難找到⼀個有⽤的解
5、RMSProp算法
RMSProp算法對AdaGrad算法做了⼀點小小的修改
該算法源⾃Coursera上的⼀⻔課程“機器學習的神經⽹絡”
可以看到,是參考了動量法
使得⾃變量每個元素的學習率在迭代過程中不再⼀直降低
6、AdaDelta算法
AdaDelta算法也是針對AdaGrad算法的改進
相較於RMSProp算法
AdaDelta算法維護了⼀個額外的狀態變量Δxt
然後更新自變量
7、Adam算法
Adam算法在RMSProp算法基礎上對小批量隨機梯度也做了指數加權移動平均
做偏差修正
更新自變量
結語
較爲全面的學習了常用的優化算法