常見Optimizer

深度學(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ù)J(\theta),梯度下降算法流程如下:

  • 計算目標(biāo)函數(shù)關(guān)于參數(shù)\theta的梯度:g_t = \bigtriangledown_{\theta_t}J(\theta)
  • 根據(jù)歷史梯度計算一介動量和二階動量:m_t = \phi(g_1, g_2, ... g_t), V_t = \psi(g_1, g_2, ... g_t)
  • 計算當(dāng)前時刻的下降梯度:\bigtriangledown_t = \eta \times \frac{m_t}{\sqrt{V_t}}
  • 根據(jù)下降梯度泽示,更新\theta\theta_{t+1} = \theta_t - \bigtriangledown_t

2. Gradient Descent

GD算法是最傳統(tǒng)的梯度下降算法缸血,他沒有動量的概念蜜氨,也就是說m_t = g_t, V_t = 1械筛。參數(shù)更新方式為: \theta_{t+1} = \theta_t - \eta \times g_t
沿著梯度的防線不斷減小模型參數(shù)飒炎,從而最小化目標(biāo)函數(shù)埋哟。如下圖所示:

梯度下降

但是梯度下降也有一些不足:

  1. 訓(xùn)練速度慢,每次迭代都需要遍歷所有樣本郎汪,會使訓(xùn)練過程十分緩慢赤赊。
  2. 容易陷入局部最優(yōu),有些點梯度為0煞赢,導(dǎo)致參數(shù)不再發(fā)生變化抛计,但不一定是目標(biāo)函數(shù)的最優(yōu)值(如鞍點)。
  3. 隨著梯度的變小照筑,參數(shù)更新很慢吹截。

3. Batch Gradient Descent (BGD)

為了解決GD算法每輸入一個樣本就要更新一次參數(shù),從而導(dǎo)致的效率低下的問題凝危。BGD做了一些改進波俄,不再是對每個樣本都進行參數(shù)更新,而是對整體樣本進行參數(shù)更新蛾默,假設(shè)現(xiàn)在有n各樣本懦铺。BGD算法如下:
\theta_{t+1} = \theta_t - \eta \times \frac{1}{n} \times \sum_{i=0}^n \bigtriangledown_{\theta_t}J(\theta, x_i, y_i)
BGD的核心就是先算整體樣本的梯度均值,在根據(jù)這個梯度均值進行參數(shù)更新支鸡。這樣會大大加快參數(shù)更新速度冬念,但還有更好的方法。

4. Stochastic Gradient Descent(SGD)

隨機梯度下降牧挣,不再是用整體梯度的均值進行跟新了急前,而是從訓(xùn)練數(shù)據(jù)中選取一個樣本進行參數(shù)更新:
\theta_{t+1} = \theta_t - \eta \times\bigtriangledown_{\theta_t}J(\theta, x_i, y_i)
從上邊公式看跟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:
\theta_{t+1} = \theta_t - \eta \times \frac{1}{m} \times \sum_{i=x}^{x+m-1}\bigtriangledown_{\theta_t}J(\theta, x_i, y_i)
MBGD即保證了訓(xùn)練速度,又保證了最優(yōu)收斂的準確率色乾。
但是以上所有優(yōu)化算法都存在一個問題誊册,就是learning rate,如果選的太小會導(dǎo)致收斂很慢暖璧,太大會讓loss function在極小值處來回震蕩案怯,錯過極小值。

6. Momentum

momentum的核心思想澎办,參數(shù)更新時在一定程度上保留之前的更新方向嘲碱,同時又用當(dāng)前batch的梯度微調(diào)最終的更新方向。也就是通過積累之前的動量來加速當(dāng)前的梯度浮驳。從這個算法開始我們就要引入動量的概念了悍汛。其中動量為:
m_{t+1} = \beta_1 \times m_t + (1-\beta_1) \times g_t
其中\beta_1的經(jīng)驗值為0.9。參數(shù)更新公式為:
\theta_{t+1} = \theta_t - m_{t+1}
從以上公式中可以看出至会,t時刻下降的方向不僅跟當(dāng)前點的梯度有關(guān)离咐,而且跟之前積累的梯度相關(guān)。該方法可以緩解梯度波動較大的問題奉件,加速收斂宵蛀。

7. Nesterov Accelerated Gradient

NAG算法可以說是之前momentum算法的變種,他在梯度更新時做了一個矯正县貌,具體做法是在當(dāng)前的梯度上添加上上一時刻的動量\beta_1m_t术陶。公式如下:
m_{t+1} = \beta_1m_t + (1-\beta_1)\times\bigtriangledown_{\theta_t}J(\theta_t-\beta_1m_t) \\ \theta_{t+1} = \theta_t - m_{t+1}
加上nesterov后,梯度在經(jīng)過大的跳躍之后煤痕,會對下一步的梯度計算進行矯正(\theta_t - \beta_1m_t)梧宫。

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í)率時代的到來颗味。
那么二介動量是個啥呢,他可以用來衡量歷史更新頻率勋桶,定義是迄今為止所有梯度值的平方和:V_t = \sum_{i=1}^{t}g_t^2脱衙,其中g_t為t時刻的梯度。根據(jù)前言中的公式(m_t=1):
V_t = \sum_{i=1}^{t}g_t^2
參數(shù)更新公式如下:
\theta_{t+1} = \theta_t - \eta\frac{g_t}{\sqrt{V_t + \epsilon}}
在梯度下降的基礎(chǔ)上例驹,對梯度增加了分母:梯度平方累積和的平方根。頻繁更新的梯度退唠,則累積的分母項逐漸偏大鹃锈,那么更新的步長(stepsize)相對就會變小,而稀疏的梯度瞧预,則導(dǎo)致累積的分母項中對應(yīng)值比較小屎债,那么更新的步長則相對比較大。
然而這種優(yōu)化方法仍然需要定義超參數(shù)\eta垢油,而且隨著訓(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)责球。
V_t = \beta_2 V_{t-1} + (1-\beta_2)(\bigtriangledown_{\theta_t}J(\theta_t))^2
\theta_{t+1} = \theta_t - \eta \frac{g_t}{\sqrt{V_t + \epsilon }}
從上面公式可以發(fā)現(xiàn)焦履,參數(shù)更新還是需要提供learning rate的拓劝。作者在上邊的基礎(chǔ)上做了進一步處理:
g_t = \bigtriangledown_{ \theta_t }J(\theta_t)
E[g_t^2]_t = \rho ·E[g_t^2]_{t-1} + (1-\rho) · g_t^2
\bigtriangledown_t = \frac{\sum_{i=1}^{t-1}\Delta\theta_r}{\sqrt{E[g_t^2]_t + \epsilon}}
從上邊公式可以看出,更新量\bigtriangledown_t不再以來learnging rate嘉裤。

  • 訓(xùn)練初中期凿将,加速效果不錯,很快
  • 訓(xùn)練后期价脾,反復(fù)在局部最小值附近抖動

10. RMSprop

RMSprop牧抵,將AdaGrad的梯度平方和累加修改為指數(shù)加權(quán)移動平均,可以是其在非凸設(shè)定下效果更好侨把。
g_t = \bigtriangledown_{\theta_t}J(\theta_t)
E[g_t^2]_t = \rho ·E[g_t^2]_{t-1} + (1-\rho) · g_t^2
\bigtriangledown_t = \frac{\eta · g_t}{\sqrt{E[g_t^2]_t + \epsilon}}
根據(jù)經(jīng)驗犀变,有一些超參數(shù)的設(shè)定可以參考,\eta=0.001, \rho=0.9, \epsilon=1e-9秋柄。

  • RMSprop依然以來learning rate
  • RMSprop算是Adagrad的一種發(fā)展获枝,和Adadelta的變體,效果趨于二者之間
  • 適合處理非平穩(wěn)目標(biāo)(包括季節(jié)性骇笔、周期性)省店,對RNN比較友好。

11. Adam

Adaptive Moment Estimation笨触,結(jié)合了前面一階動量懦傍,二階動量的方法。算法偽代碼如下:

Adam

首先初始化m_0, v_0, t為0芦劣,\theta_0為初始化參數(shù)粗俱,然后循環(huán)執(zhí)行如下步驟:
m_{t+1} = \beta_1 m_t + (1-\beta_1)\bigtriangledown_{\theta_t}J(\theta_t)
V_{t+1} = \beta_2 V_t + (1-\beta_2) (\bigtriangledown_{\theta_t}J(\theta_t))^2
由于m,v都是0初始化的虚吟,根據(jù)上邊公式寸认,\beta_1默認0.9的話,會使m趨近于0串慰,尤其是訓(xùn)練初期偏塞,因此對其進行處理:
\hat{m}_{t+1} = \frac{m_{t+1}}{1-\beta_1^t}
\hat{v}_{t+1} = \frac{v_{t+1}}{1-\beta_2^t}
最終更新參數(shù):
\theta_{t+1} = \theta_t - \eta \frac{\hat{m}_{t+1}}{\sqrt{\hat{V}_{t+1} + \epsilon}}
通常默認情況下,\beta_1=0.9, \beta_2=0.9999, \epsilon=10^{-8}邦鲫。Adam對超參數(shù)的選擇比較魯棒灸叼,在很多情況下算作默認工作性能比較優(yōu)秀的優(yōu)化器。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掂碱,一起剝皮案震驚了整個濱河市怜姿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疼燥,老刑警劉巖沧卢,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異醉者,居然都是意外死亡但狭,警方通過查閱死者的電腦和手機披诗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來立磁,“玉大人呈队,你說我怎么就攤上這事〕纾” “怎么了宪摧?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長颅崩。 經(jīng)常有香客問我几于,道長,這世上最難降的妖魔是什么沿后? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任沿彭,我火速辦了婚禮,結(jié)果婚禮上尖滚,老公的妹妹穿的比我還像新娘喉刘。我一直安慰自己,他們只是感情好漆弄,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布睦裳。 她就那樣靜靜地躺著,像睡著了一般置逻。 火紅的嫁衣襯著肌膚如雪推沸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天券坞,我揣著相機與錄音,去河邊找鬼肺素。 笑死恨锚,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的倍靡。 我是一名探鬼主播猴伶,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼塌西!你這毒婦竟也來了他挎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤捡需,失蹤者是張志新(化名)和其女友劉穎办桨,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體站辉,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡呢撞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年损姜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片殊霞。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡摧阅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绷蹲,到底是詐尸還是另有隱情棒卷,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布祝钢,位于F島的核電站比规,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏太颤。R本人自食惡果不足惜苞俘,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望龄章。 院中可真熱鬧吃谣,春花似錦、人聲如沸做裙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锚贱。三九已至仔戈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拧廊,已是汗流浹背监徘。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吧碾,地道東北人凰盔。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像倦春,于是被迫代替她去往敵國和親户敬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容