深度學(xué)習(xí)中的常用框架筹麸,無論是PyTorch還是TensorFlow,都封裝了很多優(yōu)化器雏婶。那么各優(yōu)化器之間有什么優(yōu)點和缺點呢物赶。下面我們就回顧一下主流的優(yōu)化算法。
1. 前言
當(dāng)前大部分的優(yōu)化算法留晚,其本質(zhì)都是梯度下降(Gradient Descent)酵紫,只是不同的算法,對梯度下降進行了不同的優(yōu)化。那么什么是梯度呢奖地,梯度就是一個函數(shù)對其參數(shù)求一介偏導(dǎo)數(shù)橄唬。梯度的特性就是,函數(shù)在該點處沿著梯度的方向變化最快参歹。因此梯度下降算法被用于求無約束凸函數(shù)的最小值仰楚。
假設(shè)目標(biāo)函數(shù),梯度下降算法流程如下:
- 計算目標(biāo)函數(shù)關(guān)于參數(shù)
的梯度:
- 根據(jù)歷史梯度計算一介動量和二階動量:
- 計算當(dāng)前時刻的下降梯度:
- 根據(jù)下降梯度泽示,更新
:
2. Gradient Descent
GD算法是最傳統(tǒng)的梯度下降算法缸血,他沒有動量的概念蜜氨,也就是說械筛。參數(shù)更新方式為:
。
沿著梯度的防線不斷減小模型參數(shù)飒炎,從而最小化目標(biāo)函數(shù)埋哟。如下圖所示:
但是梯度下降也有一些不足:
- 訓(xùn)練速度慢,每次迭代都需要遍歷所有樣本郎汪,會使訓(xùn)練過程十分緩慢赤赊。
- 容易陷入局部最優(yōu),有些點梯度為0煞赢,導(dǎo)致參數(shù)不再發(fā)生變化抛计,但不一定是目標(biāo)函數(shù)的最優(yōu)值(如鞍點)。
- 隨著梯度的變小照筑,參數(shù)更新很慢吹截。
3. Batch Gradient Descent (BGD)
為了解決GD算法每輸入一個樣本就要更新一次參數(shù),從而導(dǎo)致的效率低下的問題凝危。BGD做了一些改進波俄,不再是對每個樣本都進行參數(shù)更新,而是對整體樣本進行參數(shù)更新蛾默,假設(shè)現(xiàn)在有n各樣本懦铺。BGD算法如下:
BGD的核心就是先算整體樣本的梯度均值,在根據(jù)這個梯度均值進行參數(shù)更新支鸡。這樣會大大加快參數(shù)更新速度冬念,但還有更好的方法。
4. Stochastic Gradient Descent(SGD)
隨機梯度下降牧挣,不再是用整體梯度的均值進行跟新了急前,而是從訓(xùn)練數(shù)據(jù)中選取一個樣本進行參數(shù)更新:
從上邊公式看跟GD算法一樣,他們的主要區(qū)別是浸踩,SGD是從訓(xùn)練數(shù)據(jù)中隨機選一個樣本叔汁,而GD算法是所有訓(xùn)練數(shù)據(jù)都參與計算。SGD由于每次參數(shù)更新只需要一個樣本,所以參數(shù)更新很快据块,但由于單個樣本存在誤差码邻,不能很好代表整體數(shù)據(jù),可能會導(dǎo)致梯度下降方向不是整體的最優(yōu)方向另假,結(jié)果就是梯度下降的波動很大像屋。
SGD的優(yōu)點就是能更快的收斂,雖然波動很大边篮,會走很多彎路己莺,但一般總能收斂,而且速度要快得多戈轿。
但它依然沒有解決局部最優(yōu)的問題凌受。
5. Mini-batch Gradient Descent(MBGD)
于是人們想到了一種辦法,就是BGD和SGD的折中思杯,選擇一個mini_batch胜蛉,batch_size為m:
MBGD即保證了訓(xùn)練速度,又保證了最優(yōu)收斂的準確率色乾。
但是以上所有優(yōu)化算法都存在一個問題誊册,就是learning rate,如果選的太小會導(dǎo)致收斂很慢暖璧,太大會讓loss function在極小值處來回震蕩案怯,錯過極小值。
6. Momentum
momentum的核心思想澎办,參數(shù)更新時在一定程度上保留之前的更新方向嘲碱,同時又用當(dāng)前batch的梯度微調(diào)最終的更新方向。也就是通過積累之前的動量來加速當(dāng)前的梯度浮驳。從這個算法開始我們就要引入動量的概念了悍汛。其中動量為:
其中的經(jīng)驗值為0.9。參數(shù)更新公式為:
從以上公式中可以看出至会,t時刻下降的方向不僅跟當(dāng)前點的梯度有關(guān)离咐,而且跟之前積累的梯度相關(guān)。該方法可以緩解梯度波動較大的問題奉件,加速收斂宵蛀。
7. Nesterov Accelerated Gradient
NAG算法可以說是之前momentum算法的變種,他在梯度更新時做了一個矯正县貌,具體做法是在當(dāng)前的梯度上添加上上一時刻的動量术陶。公式如下:
加上nesterov后,梯度在經(jīng)過大的跳躍之后煤痕,會對下一步的梯度計算進行矯正()梧宫。
8. Adagrad
Adaptive Gradient(自適應(yīng)梯度)接谨,從這之后就會介紹一些自適應(yīng)學(xué)習(xí)率的優(yōu)化方法。AdaGrad其實是對學(xué)習(xí)率進行了一個約束塘匣,對于經(jīng)常更新的參數(shù)脓豪,我們已經(jīng)積累了足夠的關(guān)于他的信息,不希望被單個樣本影響太大忌卤,所以希望學(xué)習(xí)速率慢一些扫夜;對于不經(jīng)常更新的參數(shù),我們了解的信息太少驰徊,希望能從每個偶然出現(xiàn)的樣本中學(xué)習(xí)到更多的信息笤闯,因此希望學(xué)習(xí)速率高一些。在該方法中開始使用二介動量棍厂,標(biāo)志著自適應(yīng)學(xué)習(xí)率時代的到來颗味。
那么二介動量是個啥呢,他可以用來衡量歷史更新頻率勋桶,定義是迄今為止所有梯度值的平方和:脱衙,其中
為t時刻的梯度。根據(jù)前言中的公式(
):
參數(shù)更新公式如下:
在梯度下降的基礎(chǔ)上例驹,對梯度增加了分母:梯度平方累積和的平方根。頻繁更新的梯度退唠,則累積的分母項逐漸偏大鹃锈,那么更新的步長(stepsize)相對就會變小,而稀疏的梯度瞧预,則導(dǎo)致累積的分母項中對應(yīng)值比較小屎债,那么更新的步長則相對比較大。
然而這種優(yōu)化方法仍然需要定義超參數(shù)垢油,而且隨著訓(xùn)練的增加會使參數(shù)更新量趨近0盆驹,導(dǎo)致訓(xùn)練提前結(jié)束,無法學(xué)習(xí)滩愁。
9. Adadelta
Adagrad的方式躯喇,參數(shù)更新量調(diào)整的方式過于激進,因此可以考慮調(diào)整二介動量的計算方式硝枉,使其變得平緩:不使用全部的歷史梯度廉丽,而是使用過去一段時間窗口下的梯度,并且也不直接存儲這些梯度值妻味,僅僅是計算對應(yīng)的平均值(滑動平均)正压,從而避免二介動量持續(xù)累積,導(dǎo)致訓(xùn)練提前結(jié)束的問題出現(xiàn)责球。
從上面公式可以發(fā)現(xiàn)焦履,參數(shù)更新還是需要提供learning rate的拓劝。作者在上邊的基礎(chǔ)上做了進一步處理:
從上邊公式可以看出,更新量不再以來learnging rate嘉裤。
- 訓(xùn)練初中期凿将,加速效果不錯,很快
- 訓(xùn)練后期价脾,反復(fù)在局部最小值附近抖動
10. RMSprop
RMSprop牧抵,將AdaGrad的梯度平方和累加修改為指數(shù)加權(quán)移動平均,可以是其在非凸設(shè)定下效果更好侨把。
根據(jù)經(jīng)驗犀变,有一些超參數(shù)的設(shè)定可以參考,秋柄。
- RMSprop依然以來learning rate
- RMSprop算是Adagrad的一種發(fā)展获枝,和Adadelta的變體,效果趨于二者之間
- 適合處理非平穩(wěn)目標(biāo)(包括季節(jié)性骇笔、周期性)省店,對RNN比較友好。
11. Adam
Adaptive Moment Estimation笨触,結(jié)合了前面一階動量懦傍,二階動量的方法。算法偽代碼如下:
首先初始化為0芦劣,
為初始化參數(shù)粗俱,然后循環(huán)執(zhí)行如下步驟:
由于m,v都是0初始化的虚吟,根據(jù)上邊公式寸认,默認0.9的話,會使m趨近于0串慰,尤其是訓(xùn)練初期偏塞,因此對其進行處理:
最終更新參數(shù):
通常默認情況下,邦鲫。Adam對超參數(shù)的選擇比較魯棒灸叼,在很多情況下算作默認工作性能比較優(yōu)秀的優(yōu)化器。