深度學習優化器總結
深度學習(一般指深度神經網路DNN)有幾個關鍵的要素:訓練集,網路結構,損失函式(目標函式),優化方法。這裡記錄一下優化方法相關知識點吧。
1. why using optimizer?
訓練DNN時,我們的目標是更新網路引數以使得損失函式最小化,optimizer就是更新引數的方法。不同的optimizer都遵循一個基本原則:
是學習率,也就是每次引數更新的程度。根據是否改變學習率,可以將optimizer分為兩大派別。
2. 學習率固定的optimizer
1) BGD:Batch gradient descent,即在整個訓練集上forward和backward一次,然後更新一次引數。缺點:收斂速度慢,大量重複計算。
2) SGD:Stochastic gradient descent,即在每一個訓練樣本上forward和backward一次,然後更新一次引數。優點:收斂速度快;缺點:波動大。
3) mini-batch SGD:將訓練集分為小的批次(batch),在每一個批次上forward和backward一次,然後更新一次引數。中和了前兩個。一般所說的SGD即為mini-batch SGD。
4) momentum SGD 動量:
更新當前引數時既考慮當前梯度,又考慮之前的梯度(稱之為動量)。
5) Nesterov SGD 牛頓動量:
添加了校正因子的momentum, 即先用舊的動量更新一遍引數,然後再依據momentum的流程走。
上述兩種動量方法都加速了學習速率,牛頓法添加了校正因子,進一步優化了原始動量方法。
3. 改變學習率的optimizer
上述方法學習率均固定,然而選擇學習率又是很困難的,太小會使得收斂速度太慢,訓練花費時間太長,太大又會產生波動(可能會跨過最優點)。可以參考下面兩張圖:
1) AdaGrad SGD:
每次迭代都會改變學習率,其目的是在平緩的地方使用大學習率,在陡峭的地方使用小學習率,使得收斂速度快的同時防止波動。r 是更新學習率時用的,由公式可知,越平緩,梯度g越小,r越小,則學習率增大(實現平緩處用大梯度)。為一個小常數,為了防止分母為0。
其中學習率的改變取決於梯度平方的累積(梯度累積為指數累積)(第二個公式)。
2) RMSProp SGD:
與AdaGrad類似,改進梯度累積為指數衰減的移動平均,對非凸函式友好。為衰減指數,指的是對於遙遠的過去資訊使用量較小。
3) RMSProp + Nesterov
RMSProp也可以結合動量,既使用了動量又改變了學習率,從兩個方面改進優化演算法。公式如下,紅色部分是RMSProp梯度衰減累積部分,黑色是牛頓動量部分。
4) Adam SGD (Momentum + RMSProp):
結合了momentum和RMSProp,同時也引入了修正項(即衰減的指數梯度累積,和衰減的動量累積)
一般來說,使用動量且改變學習率,會使得收斂加速且減少波動,因此,adam SGD較為流行。