如何選擇優(yōu)化器 optimizer

在很多機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的應(yīng)用中碍论,我們發(fā)現(xiàn)用的最多的優(yōu)化器是 Adam挚躯,為什么呢昆汹?

下面是 TensorFlow 中的優(yōu)化器序矩,
https://www.tensorflow.org/api_guides/python/train

在 keras 中也有 SGD蜈抓,RMSprop启绰,Adagrad,Adadelta沟使,Adam 等:
https://keras.io/optimizers/

我們可以發(fā)現(xiàn)除了常見(jiàn)的梯度下降委可,還有 Adadelta,Adagrad腊嗡,RMSProp 等幾種優(yōu)化器着倾,都是什么呢,又該怎么選擇呢燕少?

在 Sebastian Ruder 的這篇論文中給出了常用優(yōu)化器的比較卡者,今天來(lái)學(xué)習(xí)一下:
https://arxiv.org/pdf/1609.04747.pdf

本文將梳理:

  • 每個(gè)算法的梯度更新規(guī)則和缺點(diǎn)
  • 為了應(yīng)對(duì)這個(gè)不足而提出的下一個(gè)算法
  • 超參數(shù)的一般設(shè)定值
  • 幾種算法的效果比較
  • 選擇哪種算法

1. 優(yōu)化器算法簡(jiǎn)述?

首先來(lái)看一下梯度下降最常見(jiàn)的三種變形 BGD,SGD客们,MBGD崇决,
這三種形式的區(qū)別就是取決于我們用多少數(shù)據(jù)來(lái)計(jì)算目標(biāo)函數(shù)的梯度,
這樣的話(huà)自然就涉及到一個(gè) trade-off底挫,即參數(shù)更新的準(zhǔn)確率和運(yùn)行時(shí)間恒傻。

1. Batch gradient descent

梯度更新規(guī)則:
BGD 采用整個(gè)訓(xùn)練集的數(shù)據(jù)來(lái)計(jì)算 cost function 對(duì)參數(shù)的梯度:

缺點(diǎn):
由于這種方法是在一次更新中,就對(duì)整個(gè)數(shù)據(jù)集計(jì)算梯度建邓,所以計(jì)算起來(lái)非常慢盈厘,遇到很大量的數(shù)據(jù)集也會(huì)非常棘手,而且不能投入新數(shù)據(jù)實(shí)時(shí)更新模型

for i in range(nb_epochs):
  params_grad = evaluate_gradient(loss_function, data, params)
  params = params - learning_rate * params_grad

我們會(huì)事先定義一個(gè)迭代次數(shù) epoch官边,首先計(jì)算梯度向量 params_grad沸手,然后沿著梯度的方向更新參數(shù) params外遇,learning rate 決定了我們每一步邁多大。

Batch gradient descent 對(duì)于凸函數(shù)可以收斂到全局極小值契吉,對(duì)于非凸函數(shù)可以收斂到局部極小值臀规。


2. Stochastic gradient descent

梯度更新規(guī)則:
和 BGD 的一次用所有數(shù)據(jù)計(jì)算梯度相比,SGD 每次更新時(shí)對(duì)每個(gè)樣本進(jìn)行梯度更新栅隐,
對(duì)于很大的數(shù)據(jù)集來(lái)說(shuō)塔嬉,可能會(huì)有相似的樣本,這樣 BGD 在計(jì)算梯度時(shí)會(huì)出現(xiàn)冗余租悄,
而 SGD 一次只進(jìn)行一次更新谨究,就沒(méi)有冗余,而且比較快泣棋,并且可以新增樣本胶哲。

for i in range(nb_epochs):
  np.random.shuffle(data)
  for example in data:
    params_grad = evaluate_gradient(loss_function, example, params)
    params = params - learning_rate * params_grad

看代碼,可以看到區(qū)別潭辈,就是整體數(shù)據(jù)集是個(gè)循環(huán)鸯屿,其中對(duì)每個(gè)樣本進(jìn)行一次參數(shù)更新。

缺點(diǎn):
但是 SGD 因?yàn)楦卤容^頻繁把敢,會(huì)造成 cost function 有嚴(yán)重的震蕩寄摆。

BGD 可以收斂到局部極小值,當(dāng)然 SGD 的震蕩可能會(huì)跳到更好的局部極小值處修赞。

當(dāng)我們稍微減小 learning rate婶恼,SGD 和 BGD 的收斂性是一樣的。


3. Mini-batch gradient descent

梯度更新規(guī)則:
MBGD 每一次利用一小批樣本柏副,即 n 個(gè)樣本進(jìn)行計(jì)算勾邦,
這樣它可以降低參數(shù)更新時(shí)的方差,收斂更穩(wěn)定割择,
另一方面可以充分地利用深度學(xué)習(xí)庫(kù)中高度優(yōu)化的矩陣操作來(lái)進(jìn)行更有效的梯度計(jì)算眷篇。

和 SGD 的區(qū)別是每一次循環(huán)不是作用于每個(gè)樣本,而是具有 n 個(gè)樣本的批次

for i in range(nb_epochs):
  np.random.shuffle(data)
  for batch in get_batches(data, batch_size=50):
    params_grad = evaluate_gradient(loss_function, batch, params)
    params = params - learning_rate * params_grad

超參數(shù)設(shè)定值:
n 一般取值在 50~256

缺點(diǎn):
不過(guò) Mini-batch gradient descent 不能保證很好的收斂性荔泳,

  1. learning rate 如果選擇的太小蕉饼,收斂速度會(huì)很慢,如果太大换可,loss function 就會(huì)在極小值處不停地震蕩甚至偏離椎椰。

有一種措施是先設(shè)定大一點(diǎn)的學(xué)習(xí)率,當(dāng)兩次迭代之間的變化低于某個(gè)閾值后沾鳄,就減小 learning rate,不過(guò)這個(gè)閾值的設(shè)定需要提前寫(xiě)好确憨,這樣的話(huà)就不能夠適應(yīng)數(shù)據(jù)集的特點(diǎn)译荞。

  1. 此外瓤的,這種方法是對(duì)所有參數(shù)更新時(shí)應(yīng)用同樣的 learning rate,如果我們的數(shù)據(jù)是稀疏的吞歼,我們更希望對(duì)出現(xiàn)頻率低的特征進(jìn)行大一點(diǎn)的更新圈膏。

  2. 另外,對(duì)于非凸函數(shù)篙骡,還要避免陷于局部極小值處稽坤,或者鞍點(diǎn)處,因?yàn)榘包c(diǎn)周?chē)膃rror 是一樣的糯俗,所有維度的梯度都接近于0尿褪,SGD 很容易被困在這里。

鞍點(diǎn)就是:一個(gè)光滑函數(shù)的鞍點(diǎn)鄰域的曲線(xiàn)得湘,曲面杖玲,或超曲面,都位于這點(diǎn)的切線(xiàn)的不同邊淘正。
例如這個(gè)二維圖形摆马,像個(gè)馬鞍:在x-軸方向往上曲,在y-軸方向往下曲鸿吆,鞍點(diǎn)就是(0囤采,0)


為了應(yīng)對(duì)上面的三點(diǎn)挑戰(zhàn)就有了下面這些算法。

[應(yīng)對(duì)挑戰(zhàn) 1]

4. Momentum

SGD 在 ravines 的情況下容易被困住惩淳, ravines 就是曲面的一個(gè)方向比另一個(gè)方向更陡斑唬,這時(shí) SGD 會(huì)發(fā)生震蕩而遲遲不能接近極小值:

梯度更新規(guī)則:
Momentum 通過(guò)加入 γv_t?1 ,可以加速 SGD黎泣, 并且抑制震蕩

當(dāng)我們將一個(gè)小球從山上滾下來(lái)時(shí)恕刘,沒(méi)有阻力的話(huà),它的動(dòng)量會(huì)越來(lái)越大抒倚,但是如果遇到了阻力褐着,速度就會(huì)變小。
加入的這一項(xiàng)托呕,可以使得梯度方向不變的維度上速度變快含蓉,梯度方向有所改變的維度上的更新速度變慢,這樣就可以加快收斂并減小震蕩项郊。

超參數(shù)設(shè)定值:
一般 γ 取值 0.9 左右馅扣。

缺點(diǎn):
這種情況相當(dāng)于小球從山上滾下來(lái)時(shí)是在盲目地沿著坡滾,如果它能具備一些先知着降,例如快要上坡時(shí)差油,就知道需要減速了的話(huà),適應(yīng)性會(huì)更好。


5. Nesterov accelerated gradient

梯度更新規(guī)則:
用 θ?γv_t?1 來(lái)近似當(dāng)做參數(shù)下一步會(huì)變成的值蓄喇,則在計(jì)算梯度時(shí)发侵,不是在當(dāng)前位置,而是未來(lái)的位置上

超參數(shù)設(shè)定值:
γ 仍然取值 0.9 左右妆偏。

效果比較:

藍(lán)色是 Momentum 的過(guò)程刃鳄,會(huì)先計(jì)算當(dāng)前的梯度,然后在更新后的累積梯度后會(huì)有一個(gè)大的跳躍钱骂。
而 NAG 會(huì)先在前一步的累積梯度上(brown vector)有一個(gè)大的跳躍叔锐,然后衡量一下梯度做一下修正(red vector),這種預(yù)期的更新可以避免我們走的太快见秽。

NAG 可以使 RNN 在很多任務(wù)上有更好的表現(xiàn)愉烙。

目前為止,我們可以做到张吉,在更新梯度時(shí)順應(yīng) loss function 的梯度來(lái)調(diào)整速度齿梁,并且對(duì) SGD 進(jìn)行加速。

我們還希望可以根據(jù)參數(shù)的重要性而對(duì)不同的參數(shù)進(jìn)行不同程度的更新肮蛹。


[應(yīng)對(duì)挑戰(zhàn) 2]

6. Adagrad

這個(gè)算法就可以對(duì)低頻的參數(shù)做較大的更新勺择,對(duì)高頻的做較小的更新,也因此伦忠,對(duì)于稀疏的數(shù)據(jù)它的表現(xiàn)很好省核,很好地提高了 SGD 的魯棒性,例如識(shí)別 Youtube 視頻里面的貓昆码,訓(xùn)練 GloVe word embeddings气忠,因?yàn)樗鼈兌际切枰诘皖l的特征上有更大的更新。

梯度更新規(guī)則:

其中 g 為:t 時(shí)刻參數(shù) θ_i 的梯度

如果是普通的 SGD赋咽, 那么 θ_i 在每一時(shí)刻的梯度更新公式為:

但這里的 learning rate η 也隨 t 和 i 而變:

其中 G_t 是個(gè)對(duì)角矩陣旧噪, (i,i) 元素就是 t 時(shí)刻參數(shù) θ_i 的梯度平方和。

Adagrad 的優(yōu)點(diǎn)是減少了學(xué)習(xí)率的手動(dòng)調(diào)節(jié)

超參數(shù)設(shè)定值:
一般 η 就取 0.01脓匿。

缺點(diǎn):
它的缺點(diǎn)是分母會(huì)不斷積累淘钟,這樣學(xué)習(xí)率就會(huì)收縮并最終會(huì)變得非常小。


7. Adadelta

這個(gè)算法是對(duì) Adagrad 的改進(jìn)陪毡,

和 Adagrad 相比米母,就是分母的 G 換成了過(guò)去的梯度平方的衰減平均值,

這個(gè)分母相當(dāng)于梯度的均方根 root mean squared (RMS) 毡琉,所以可以用 RMS 簡(jiǎn)寫(xiě):

其中 E 的計(jì)算公式如下铁瞒,t 時(shí)刻的依賴(lài)于前一時(shí)刻的平均和當(dāng)前的梯度:

梯度更新規(guī)則:

此外,還將學(xué)習(xí)率 η 換成了 RMS[Δθ]桅滋,這樣的話(huà)慧耍,我們甚至都不需要提前設(shè)定學(xué)習(xí)率了:

超參數(shù)設(shè)定值:
γ 一般設(shè)定為 0.9,

7. RMSprop

RMSprop 是 Geoff Hinton 提出的一種自適應(yīng)學(xué)習(xí)率方法。

RMSprop 和 Adadelta 都是為了解決 Adagrad 學(xué)習(xí)率急劇下降問(wèn)題的蜂绎,

梯度更新規(guī)則:
RMSprop 與 Adadelta 的第一種形式相同:

超參數(shù)設(shè)定值:
Hinton 建議設(shè)定 γ 為 0.9, 學(xué)習(xí)率 η 為 0.001栅表。


8. Adam

這個(gè)算法是另一種計(jì)算每個(gè)參數(shù)的自適應(yīng)學(xué)習(xí)率的方法笋鄙。

除了像 Adadelta 和 RMSprop 一樣存儲(chǔ)了過(guò)去梯度的平方 vt 的指數(shù)衰減平均值 师枣,也像 momentum 一樣保持了過(guò)去梯度 mt 的指數(shù)衰減平均值:

如果 mt 和 vt 被初始化為 0 向量,那它們就會(huì)向 0 偏置萧落,所以做了偏差校正践美,
通過(guò)計(jì)算偏差校正后的 mt 和 vt 來(lái)抵消這些偏差:

梯度更新規(guī)則:

超參數(shù)設(shè)定值:
建議 β1 = 0.9,β2 = 0.999找岖,? = 10e?8

實(shí)踐表明陨倡,Adam 比其他適應(yīng)性學(xué)習(xí)方法效果要好。


2. 效果比較?

下面看一下幾種算法在鞍點(diǎn)和等高線(xiàn)上的表現(xiàn):

SGD optimization on saddle point
SGD optimization on loss surface contours

上面兩種情況都可以看出许布,Adagrad, Adadelta, RMSprop 幾乎很快就找到了正確的方向并前進(jìn)兴革,收斂速度也相當(dāng)快,而其它方法要么很慢蜜唾,要么走了很多彎路才找到杂曲。

由圖可知自適應(yīng)學(xué)習(xí)率方法即 Adagrad, Adadelta, RMSprop, Adam 在這種情景下會(huì)更合適而且收斂性更好。


3. 如何選擇袁余?

如果數(shù)據(jù)是稀疏的擎勘,就用自適用方法,即 Adagrad, Adadelta, RMSprop, Adam颖榜。

RMSprop, Adadelta, Adam 在很多情況下的效果是相似的棚饵。

Adam 就是在 RMSprop 的基礎(chǔ)上加了 bias-correction 和 momentum,

隨著梯度變的稀疏掩完,Adam 比 RMSprop 效果會(huì)好噪漾。

整體來(lái)講,Adam 是最好的選擇且蓬。

很多論文里都會(huì)用 SGD欣硼,沒(méi)有 momentum 等。SGD 雖然能達(dá)到極小值缅疟,但是比其它算法用的時(shí)間長(zhǎng)分别,而且可能會(huì)被困在鞍點(diǎn)。

如果需要更快的收斂存淫,或者是訓(xùn)練更深更復(fù)雜的神經(jīng)網(wǎng)絡(luò)耘斩,需要用一種自適應(yīng)的算法。

資料:
http://sebastianruder.com/optimizing-gradient-descent/index.html#fn:24
http://www.redcedartech.com/pdfs/Select_Optimization_Method.pdf
https://stats.stackexchange.com/questions/55247/how-to-choose-the-right-optimization-algorithm


推薦閱讀 歷史技術(shù)博文鏈接匯總
http://www.reibang.com/p/28f02bb59fe5
也許可以找到你想要的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末桅咆,一起剝皮案震驚了整個(gè)濱河市括授,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖荚虚,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件薛夜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡版述,警方通過(guò)查閱死者的電腦和手機(jī)梯澜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)渴析,“玉大人晚伙,你說(shuō)我怎么就攤上這事〖蠹耄” “怎么了咆疗?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)母债。 經(jīng)常有香客問(wèn)我午磁,道長(zhǎng),這世上最難降的妖魔是什么毡们? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任迅皇,我火速辦了婚禮,結(jié)果婚禮上漏隐,老公的妹妹穿的比我還像新娘喧半。我一直安慰自己,他們只是感情好青责,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布挺据。 她就那樣靜靜地躺著,像睡著了一般脖隶。 火紅的嫁衣襯著肌膚如雪扁耐。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天产阱,我揣著相機(jī)與錄音婉称,去河邊找鬼。 笑死构蹬,一個(gè)胖子當(dāng)著我的面吹牛王暗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播庄敛,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼俗壹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了藻烤?” 一聲冷哼從身側(cè)響起绷雏,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤头滔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后涎显,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體坤检,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年期吓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了早歇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡膘婶,死狀恐怖缺前,靈堂內(nèi)的尸體忽然破棺而出蛀醉,到底是詐尸還是另有隱情悬襟,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布拯刁,位于F島的核電站脊岳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏垛玻。R本人自食惡果不足惜割捅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望帚桩。 院中可真熱鬧亿驾,春花似錦、人聲如沸账嚎。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)郭蕉。三九已至疼邀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間召锈,已是汗流浹背旁振。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涨岁,地道東北人拐袜。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像梢薪,于是被迫代替她去往敵國(guó)和親蹬铺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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