日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

梯度下降法解读

發(fā)布時(shí)間:2024/3/12 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 梯度下降法解读 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

梯度下降法,是當(dāng)今最流行的優(yōu)化(optimization)算法,亦是至今最常用的優(yōu)化神經(jīng)網(wǎng)絡(luò)的方法。本文旨在讓你對(duì)不同的優(yōu)化梯度下降法的算法有一個(gè)直觀認(rèn)識(shí),以幫助你使用這些算法。我們首先會(huì)考察梯度下降法的各種變體,然后會(huì)簡(jiǎn)要地總結(jié)在訓(xùn)練(神經(jīng)網(wǎng)絡(luò)或是機(jī)器學(xué)習(xí)算法)的過(guò)程中可能遇到的挑戰(zhàn)。

目錄

  • 梯度下降的各種變體

  • 批量梯度下降(Batch gradient descent)

  • 隨機(jī)梯度下降(Stochastic gradient descent)

  • 小批量梯度下降(Mini-batch gradient descent)

    • 面臨的挑戰(zhàn)

    • 梯度下降的優(yōu)化算法

  • Momentum法

  • Nesterov加速梯度法

  • Adagrad法

  • Adadelta法

  • RMSprop法

  • 適應(yīng)性動(dòng)量估計(jì)法(Adam)

  • 幾種算法的可視化

  • 該選擇哪種優(yōu)化器

    • 對(duì)SGD進(jìn)行平行或分布式運(yùn)算

  • Hogwild!

  • Downpour SGD

  • 容忍延遲的SGD算法

  • TensorFlow

  • 彈性平均梯度下降法(Elastic Averaging SGD)

    • 優(yōu)化SGD的其他手段

  • 重排(Shuffling )和遞進(jìn)學(xué)習(xí)(Curriculum Learning)

  • 批量標(biāo)準(zhǔn)化(Batch normalization)

  • 早停(Early Stopping)

  • 梯度噪聲(Gradient noise)

    • 結(jié)論

    • 參考資料

    ?


    梯度下降法,是當(dāng)今最流行的優(yōu)化(optimization)算法,亦是至今最常用的優(yōu)化神經(jīng)網(wǎng)絡(luò)的方法。與此同時(shí),最新的深度學(xué)習(xí)程序庫(kù)都包含了各種優(yōu)化梯度下降的算法(可以參見(jiàn)如 lasagne、caffe 及 Kera 等程序庫(kù)的說(shuō)明文檔)。但它們的算法則不被公開(kāi),都作為黑箱優(yōu)化器被使用,這也就是為什么它們的優(yōu)勢(shì)和劣勢(shì)往往難以被實(shí)際地解釋。

    本文旨在讓你對(duì)不同的優(yōu)化梯度下降法的算法有一個(gè)直觀認(rèn)識(shí),以幫助你使用這些算法。我們首先會(huì)考察梯度下降法的各種變體,然后會(huì)簡(jiǎn)要地總結(jié)在訓(xùn)練(神經(jīng)網(wǎng)絡(luò)或是機(jī)器學(xué)習(xí)算法)的過(guò)程中可能遇到的挑戰(zhàn)。接著,我們將會(huì)討論一些最常見(jiàn)的優(yōu)化算法,研究它們的解決這些挑戰(zhàn)的動(dòng)機(jī)及推導(dǎo)出更新規(guī)律(update rules)的過(guò)程。我們還會(huì)簡(jiǎn)要探討一下,在平行計(jì)算或是分布式處理情況下優(yōu)化梯度下降法的算法和架構(gòu)。最后,我們會(huì)考慮一下其他有助于優(yōu)化梯度下降法的策略。

    梯度下降法的核心,是最小化目標(biāo)函數(shù) J(θ),其中θ是模型的參數(shù),θ∈Rd。它的方法是,在每次迭代中,對(duì)每個(gè)變量,按照目標(biāo)函數(shù)在該變量梯度的相反方向,更新對(duì)應(yīng)的參數(shù)值。其中,學(xué)習(xí)率η決定了函數(shù)到達(dá)(局部)最小值的迭代次數(shù)。換句話說(shuō),我們?cè)谀繕?biāo)函數(shù)的超平面上,沿著斜率下降的方向前進(jìn),直到我們遇到了超平面構(gòu)成的「谷底」。如果你不熟悉梯度下降法的話,你可以在這里找到一個(gè)很好的關(guān)于優(yōu)化神經(jīng)網(wǎng)絡(luò)的介紹。

    梯度下降法變體

    本文討論了三種梯度下降法的變體——它們的不同之處在于,一次性使用多少數(shù)據(jù)來(lái)計(jì)算目標(biāo)函數(shù)的梯度。對(duì)于不同的數(shù)據(jù)量,我們需要在參數(shù)更新準(zhǔn)確性和參數(shù)更新花費(fèi)時(shí)間兩方面做出權(quán)衡。

    批量梯度下降法(Batch Gradient Descent)

    Vanilla 梯度下降法(譯者注:Vanilla 是早期機(jī)器學(xué)習(xí)算法相關(guān)的名詞,也是如今一個(gè)機(jī)器學(xué)習(xí) python 程序庫(kù)的名字,在該處指的是后者,參見(jiàn):https://github.com/vinhkhuc/VanillaML),也就是大家所熟知的批量梯度下降法,在整個(gè)數(shù)據(jù)集上(求出罰函數(shù) J(θ 并)對(duì)每個(gè)參數(shù) θ 求目標(biāo)函數(shù) J(θ) 的偏導(dǎo)數(shù):

    在該方法中,每次更新我們都需要在整個(gè)數(shù)據(jù)集上求出所有的偏導(dǎo)數(shù)。因此批量梯度下降法的速度會(huì)比較慢,甚至對(duì)于較大的、內(nèi)存無(wú)法容納的數(shù)據(jù)集,該方法都無(wú)法被使用。同時(shí),梯度下降法不能以「在線」的形式更新我們的模型,也就是不能再運(yùn)行中加入新的樣本進(jìn)行運(yùn)算。

    批量梯度下降法的實(shí)現(xiàn)代碼,如下所示:

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

    對(duì)于給定的迭代次數(shù),我們首先基于輸入的罰函數(shù) loss_function 對(duì)輸入的參數(shù)向量 params 計(jì)算梯度向量 params_grad。注意,最新的深度學(xué)習(xí)程序庫(kù)中,提供了自動(dòng)求導(dǎo)的功能,能夠高效、快速地求給定函數(shù)對(duì)于特定參數(shù)的導(dǎo)數(shù)。如果你希望自己寫代碼求出梯度值,那么「梯度檢查」會(huì)是一個(gè)不錯(cuò)的注意。(你可以參考這里,了解關(guān)于如何檢查梯度的相關(guān)建議。)

    然后,我們對(duì)參數(shù)減去梯度值乘學(xué)習(xí)率的值,也就是在反梯度方向,更新我們參數(shù)。當(dāng)目標(biāo)函數(shù) J(θ) 是一凸函數(shù)時(shí),則批量梯度下降法必然會(huì)在全局最小值處收斂;否則,目標(biāo)函數(shù)則可能會(huì)局部極小值處收斂。

    隨機(jī)梯度下降法(Stochastic Gradient Descent)

    相比批量梯度下降法,隨機(jī)梯度下降法的每次更新,是對(duì)數(shù)據(jù)集中的一個(gè)樣本(x,y)求出罰函數(shù),然后對(duì)其求相應(yīng)的偏導(dǎo)數(shù):

    因?yàn)榕刻荻认陆捣ㄔ诿看胃虑?#xff0c;會(huì)對(duì)相似的樣本求算梯度值,因而它在較大的數(shù)據(jù)集上的計(jì)算會(huì)有些冗余(redundant)。而隨機(jī)梯度下降法通過(guò)每次更新僅對(duì)一個(gè)樣本求梯度,去除了這種冗余的情況。因而,它的運(yùn)行速度被大大加快,同時(shí)也能夠「在線」學(xué)習(xí)。

    隨機(jī)梯度下降法更新值的方差很大,在頻繁的更新之下,它的目標(biāo)函數(shù)有著如下圖所示的劇烈波動(dòng)。

    SGD 函數(shù)波動(dòng),來(lái)源:Wikipedia

    相比批量梯度下降法的收斂會(huì)使目標(biāo)函數(shù)落入一個(gè)局部極小值,SGD 收斂過(guò)程中的波動(dòng),會(huì)幫助目標(biāo)函數(shù)跳入另一個(gè)可能的更小的極小值。另一方面,這最終會(huì)讓收斂到特定最小值的過(guò)程復(fù)雜化,因?yàn)樵摲椒赡艹掷m(xù)的波動(dòng)而不停止。但是,當(dāng)我們慢慢降低學(xué)習(xí)率的時(shí)候,SGD 表現(xiàn)出了與批量梯度下降法相似的收斂過(guò)程,也就是說(shuō),對(duì)非凸函數(shù)和凸函數(shù),必然會(huì)分別收斂到它們的極小值和最小值。

    相比批量梯度下降法的代碼,在如下的代碼中,我們僅僅加入了一個(gè)循環(huán),用以遍歷所有的訓(xùn)練樣本并求出相應(yīng)的梯度值。注意,如這里所說(shuō),在每次迭代中,我們會(huì)打亂訓(xùn)練數(shù)據(jù)集。

    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

    小批量梯度下降法(Mini-Batch Gradient Descent)

    小批量梯度下降法集合了上述兩種方法的優(yōu)勢(shì),在每次更新中,對(duì) n 個(gè)樣本構(gòu)成的一批數(shù)據(jù),計(jì)算罰函數(shù) J(θ),并對(duì)相應(yīng)的參數(shù)求導(dǎo):

    這種方法,(a) 降低了更新參數(shù)的方差(variance),使得收斂過(guò)程更為穩(wěn)定;(b) 能夠利用最新的深度學(xué)習(xí)程序庫(kù)中高度優(yōu)化的矩陣運(yùn)算器,能夠高效地求出每小批數(shù)據(jù)的梯度。通常一小批數(shù)據(jù)含有的樣本數(shù)量在 50 至 256 之間,但對(duì)于不同的用途也會(huì)有所變化。小批量梯度下降法,通常是我們訓(xùn)練神經(jīng)網(wǎng)絡(luò)的首選算法。同時(shí),有時(shí)候我們也會(huì)使用隨機(jī)梯度下降法,來(lái)稱呼小批量梯度下降法(譯者注:在下文中,我們就用 SGD 代替隨機(jī)梯度下降法)。注意:在下文對(duì)于隨機(jī)梯度法優(yōu)化的介紹中,為方便起見(jiàn),我們會(huì)省略式子中的參數(shù) x(i:i+n),y(i:i+n)。

    如下的代碼所示,我們不再對(duì)每個(gè)樣本進(jìn)行循環(huán),而是對(duì)每批帶有 50 個(gè)樣本的小批數(shù)據(jù)進(jìn)行循環(huán):

    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

    面臨的挑戰(zhàn)

    由于 Vanilla 小批量梯度下降法并不能保證良好地收斂,這給我們留下了如下待解決的挑戰(zhàn):

    • 選擇適當(dāng)?shù)膶W(xué)習(xí)率是一個(gè)難題。太小的學(xué)習(xí)率會(huì)導(dǎo)致較慢的收斂速度,而太大的學(xué)習(xí)率則會(huì)阻礙收斂,并會(huì)引起罰函數(shù)在最小值處震蕩,甚至有可能導(dǎo)致結(jié)果發(fā)散;

    • 我們可以設(shè)置一個(gè)關(guān)于學(xué)習(xí)率地列表,通過(guò)如退火的方法,在學(xué)習(xí)過(guò)程中調(diào)整學(xué)習(xí)率——按照一個(gè)預(yù)先定義的列表、或是當(dāng)每次迭代中目標(biāo)函數(shù)的變化小于一定閾值時(shí)來(lái)降低學(xué)習(xí)率。但這些列表或閾值,需要根據(jù)數(shù)據(jù)集地特性,被提前定義。

    • 此外,我們對(duì)所有的參數(shù)都采用了相同的學(xué)習(xí)率。但如果我們的數(shù)據(jù)比較稀疏,同時(shí)特征有著不同的出現(xiàn)頻率,那么我們不希望以相同的學(xué)習(xí)率來(lái)更新這些變量,我們希望對(duì)較少出現(xiàn)的特征有更大的學(xué)習(xí)率。

    在對(duì)神經(jīng)網(wǎng)絡(luò)最優(yōu)化非凸的罰函數(shù)時(shí),另一個(gè)通常面臨的挑戰(zhàn),是如何避免目標(biāo)函數(shù)被困在無(wú)數(shù)的局部最小值中,以導(dǎo)致的未完全優(yōu)化的情況。Dauphin 及其他人 [19] 認(rèn)為,這個(gè)困難并不來(lái)自于局部最小值,而是來(lái)自于「鞍點(diǎn)」,也就是在一個(gè)方向上斜率是正的、在一個(gè)方向上斜率是負(fù)的點(diǎn)。這些鞍點(diǎn)通常由一些函數(shù)值相同的面環(huán)繞,它們?cè)诟鱾€(gè)方向的梯度值都為 0,所以 SGD 很難從這些鞍點(diǎn)中脫開(kāi)。

    梯度下降的優(yōu)化算法

    在如下的討論中,我們將會(huì)列舉一些應(yīng)對(duì)上述問(wèn)題的算法,它們被廣泛應(yīng)用于深度學(xué)習(xí)社區(qū)。同時(shí),我們不會(huì)討論那些不能應(yīng)用于高維數(shù)據(jù)集的方法,例如牛頓法等針對(duì)二階問(wèn)題的方法。


    ? ?

    動(dòng)量法

    SGD 很難在陡谷——一種在一個(gè)方向的彎曲程度遠(yuǎn)大于其他方向的表面彎曲情況——中找到正確更新方向。而這種陡谷,經(jīng)常在局部極值中出現(xiàn)。在這種情況下,如圖 2 所示,SGD 在陡谷的周圍震蕩,向局部極值處緩慢地前進(jìn)。

    動(dòng)量法 [2],如圖 3 所示,則幫助 SGD 在相關(guān)方向加速前進(jìn),并減少它的震蕩。他通過(guò)修改公式中,在原有項(xiàng)前增加一個(gè)折損系數(shù)γ,來(lái)實(shí)現(xiàn)這樣的功能:

    注意:在其他的一些算法實(shí)現(xiàn)中,公式中的符號(hào)也許有所不同。動(dòng)量項(xiàng) γ 往往被設(shè)置為 0.9 或?yàn)槠渌畈欢嗟闹怠?/p>

    從本質(zhì)上說(shuō),動(dòng)量法,就仿佛我們從高坡上推下一個(gè)球,小球在向下滾動(dòng)的過(guò)程中積累了動(dòng)量,在途中他變得越來(lái)越快(直到它達(dá)到了峰值速度,如果有空氣阻力的話,γ<1)。在我們的算法中,相同的事情發(fā)生在我們的參數(shù)更新上:動(dòng)量項(xiàng)在梯度指向方向相同的方向逐漸增大,對(duì)梯度指向改變的方向逐漸減小。由此,我們得到了更快的收斂速度以及減弱的震蕩。

    Nesterov 加速梯度法

    但當(dāng)一個(gè)小球從山谷上滾下的時(shí)候,盲目的沿著斜率方向前行,其效果并不令人滿意。我們需要有一個(gè)更「聰明」的小球,它能夠知道它再往哪里前行,并在知道斜率再度上升的時(shí)候減速。

    Nesterov 加速梯度法(NAG)是一種能給予梯度項(xiàng)上述「預(yù)測(cè)」功能的方法。我們知道,我們使用動(dòng)量項(xiàng)γvt-1 來(lái)「移動(dòng)」參數(shù)項(xiàng)θ。通過(guò)計(jì)算θ-γvt-1,我們能夠得到一個(gè)下次參數(shù)位置的近似值——也就是能告訴我們參數(shù)大致會(huì)變?yōu)槎嗌佟D敲?#xff0c;通過(guò)基于未來(lái)參數(shù)的近似值而非當(dāng)前的參數(shù)值計(jì)算相得應(yīng)罰函數(shù) J(θ-γvt-1) 并求偏導(dǎo)數(shù),我們能讓優(yōu)化器高效地「前進(jìn)」并收斂:

    在該情況下,我們依然設(shè)定動(dòng)量系數(shù)γ 在 0.9 左右。如下圖 4 所示,動(dòng)量法首先計(jì)算當(dāng)前的梯度值(小藍(lán)色向量),然后在更新的積累向量(大藍(lán)色向量)方向前進(jìn)一大步。但 NAG 法則首先(試探性地)在之前積累的梯度方向(棕色向量)前進(jìn)一大步,再根據(jù)當(dāng)前地情況修正,以得到最終的前進(jìn)方向(綠色向量)。這種基于預(yù)測(cè)的更新方法,使我們避免過(guò)快地前進(jìn),并提高了算法地響應(yīng)能力(responsiveness),大大改進(jìn)了 RNN 在一些任務(wù)上的表現(xiàn) [8]。

    Nesterov Update 法,來(lái)源:G. Hinton's lecture 6c

    參考這里,以查看 Ilya Sutskever 在它博士論文中,對(duì) NAG 機(jī)理的更為詳盡的解釋 [9]。

    因?yàn)槲覀儸F(xiàn)在能根據(jù)我們罰函數(shù)的梯度值來(lái)調(diào)整我們的更新,并能相應(yīng)地加速 SGD,我們也希望能夠?qū)αP函數(shù)中的每個(gè)參數(shù)調(diào)整我們的更新值,基于它們的重要性以進(jìn)行或大或小的更新。

    Adagrad 法

    Adagrad[3] 是一個(gè)基于梯度的優(yōu)化算法,它的主要功能是:它對(duì)不同的參數(shù)調(diào)整學(xué)習(xí)率,具體而言,對(duì)低頻出現(xiàn)的參數(shù)進(jìn)行大的更新,對(duì)高頻出現(xiàn)的參數(shù)進(jìn)行小的更新。因此,他很適合于處理稀疏數(shù)據(jù)。Dean 等人 [14] 發(fā)現(xiàn),Adagrad 法大大提升了 SGD 的魯棒性,并在谷歌使用它訓(xùn)練大規(guī)模的神經(jīng)網(wǎng)絡(luò),其諸多功能包括識(shí)別 Youtube 視頻中的貓。此外,Pennington 等人 [5] 使用它訓(xùn)練 GloVe 單詞向量映射(Word Embedding),在其中不頻繁出現(xiàn)的詞語(yǔ)需要比頻繁出現(xiàn)的更大的更新值。

    在這之前,我們對(duì)于所有的參數(shù)使用相同的學(xué)習(xí)率進(jìn)行更新。但 Adagrad 則不然,對(duì)不同的訓(xùn)練迭代次數(shù) t,adagrad 對(duì)每個(gè)參數(shù)都有一個(gè)不同的學(xué)習(xí)率。我們首先考察 adagrad 每個(gè)參數(shù)的的更新過(guò)程,然后我們?cè)偈怪蛄炕楹?jiǎn)潔起見(jiàn),我們記在迭代次數(shù) t 下,對(duì)參數(shù)θi 求目標(biāo)函數(shù)梯度的結(jié)果為 gt,i:

    那么普通 SGD 的更新規(guī)則為:

    而 adagrad 將學(xué)習(xí)率η進(jìn)行了修正,對(duì)迭代次數(shù) t,基于每個(gè)參數(shù)之前計(jì)算的梯度值,將每個(gè)參數(shù)的學(xué)習(xí)率η按如下方式修正:

    其中 是一個(gè)對(duì)角陣,其中對(duì)角線上的元素是從一開(kāi)始到 時(shí)刻目標(biāo)函數(shù)對(duì)于參數(shù) 梯度的平方和。是一個(gè)平滑項(xiàng),以避免分母為 0 的情況,它的數(shù)量級(jí)通常在。有趣的是,如果不開(kāi)方的話,這個(gè)算法的表現(xiàn)會(huì)變得很糟。

    因?yàn)?在其對(duì)角線上,含有過(guò)去目標(biāo)函數(shù)對(duì)于參數(shù) 梯度的平方和,我們可以利用一個(gè)元素對(duì)元素的向量乘法,將我們的表達(dá)式向量化:

    Adagrad 主要優(yōu)勢(shì)之一,是它不需要對(duì)每個(gè)學(xué)習(xí)率手工地調(diào)節(jié)。而大多數(shù)算法,只是簡(jiǎn)單地使用一個(gè)相同地默認(rèn)值如 0.1,來(lái)避免這樣地情況。

    Adagrad 地主要劣勢(shì),是他在分母上的項(xiàng)中積累了平方梯度和。因?yàn)槊看渭尤氲捻?xiàng)總是一個(gè)正值,所以累積的和將會(huì)隨著訓(xùn)練過(guò)程而增大。因而,這會(huì)導(dǎo)致學(xué)習(xí)率不斷縮小,并最終變?yōu)橐粋€(gè)無(wú)限小值——此時(shí),這個(gè)算法已經(jīng)不能從數(shù)據(jù)中學(xué)到額外的信息。而下面的算法,則旨在解決這個(gè)問(wèn)題。

    Adadelta 法

    Adadelta 法 [6] 是 Adagrad 法的一個(gè)延伸,它旨在解決它學(xué)習(xí)率不斷單調(diào)下降的問(wèn)題。相比計(jì)算之前所有梯度值的平方和,Adadelta 法僅計(jì)算在一個(gè)大小為 的時(shí)間區(qū)間內(nèi)梯度值的累積和。

    但該方法并不會(huì)存儲(chǔ)之前 個(gè)梯度的平方值,而是將梯度值累積值按如下的方式遞歸地定義:它被定義為關(guān)于過(guò)去梯度值的衰減均值(decade average),當(dāng)前時(shí)間的梯度均值是基于過(guò)去梯度均值和當(dāng)前梯度值平方的加權(quán)平均,其中是類似上述動(dòng)量項(xiàng)的權(quán)值。

    與動(dòng)量項(xiàng)的設(shè)定類似,我們?cè)O(shè)定 為以 0.9 左右的值。為明確起見(jiàn),我們將我們的 SGD 更新規(guī)則寫為關(guān)于參數(shù)更新向量 的形式:

    由此,我們剛剛在 Adagrad 法中推導(dǎo)的的參數(shù)更新規(guī)則的向量表示,變?yōu)槿缦滦问?#xff1a;

    我們現(xiàn)在將其中的對(duì)角矩陣 用上述定義的基于過(guò)去梯度平方和的衰減均值 替換:

    因?yàn)榉帜副磉_(dá)式的形式與梯度值的方均根(root mean squared,RMS)形式類似,因而我們使用相應(yīng)的簡(jiǎn)寫來(lái)替換:

    作者還注意到,在該更新中(在 SGD、動(dòng)量法或者 Adagrad 也類似)的單位并不一致,也就是說(shuō),更新值的量綱與參數(shù)值的假設(shè)量綱并不一致。為改進(jìn)這個(gè)問(wèn)題,他們定義了另外一種指數(shù)衰減的衰減均值,他是基于參數(shù)更新的平方而非梯度的平方來(lái)定義的:

    因此,對(duì)該問(wèn)題的方均根為:

    因?yàn)?值未知,所以我們使用 時(shí)刻的方均根來(lái)近似。將前述規(guī)則中的學(xué)習(xí)率 替換為,我們最終得到了 Adadelta 法的更新規(guī)則:

    借助 Adadelta 法,我們甚至不需要預(yù)設(shè)一個(gè)默認(rèn)學(xué)習(xí)率,因?yàn)樗呀?jīng)從我們的更新規(guī)則中被刪除了。

    RMSprop 法

    RMSprop 是由 Geoff Hinton 在他 Coursera 課程中提出的一種適應(yīng)性學(xué)習(xí)率方法,至今仍未被公開(kāi)發(fā)表。

    RMSprop 法和 Adadelta 法幾乎同時(shí)被發(fā)展出來(lái)。他們 解決 Adagrad 激進(jìn)的學(xué)習(xí)率縮減問(wèn)題。實(shí)際上,RMSprop 和我們推導(dǎo)出的 Adadelta 法第一個(gè)更規(guī)則相同:

    RMSprop 也將學(xué)習(xí)率除以了一個(gè)指數(shù)衰減的衰減均值。Hinton 建議設(shè)定 為 0.9,對(duì) 而言,0.001 是一個(gè)較好的默認(rèn)值。

    Adam

    適應(yīng)性動(dòng)量估計(jì)法(Adam)[15] 是另一種能對(duì)不同參數(shù)計(jì)算適應(yīng)性學(xué)習(xí)率的方法。除了存儲(chǔ)類似 Adadelta 法或 RMSprop 中指數(shù)衰減的過(guò)去梯度平方均值 外,Adam 法也存儲(chǔ)像動(dòng)量法中的指數(shù)衰減的過(guò)去梯度值均值 :

    和 分別是梯度的一階矩(均值)和二階矩(表示不確定度的方差),這也就是該方法名字的來(lái)源。因?yàn)楫?dāng) 和 一開(kāi)始被初始化為 0 向量時(shí),Adam 的作者觀察到,該方法會(huì)有趨向 0 的偏差,尤其是在最初的幾步或是在衰減率很小(即 和 接近 1)的情況下。

    他們使用偏差糾正系數(shù),來(lái)修正一階矩和二階矩的偏差:

    他們使用這些來(lái)更新參數(shù),更新規(guī)則很我們?cè)?Adadelta 和 RMSprop 法中看到的一樣,服從 Adam 的更新規(guī)則:

    作者認(rèn)為參數(shù)的默認(rèn)值應(yīng)設(shè)為:0.9 for?

    β1, 0.999 for?β2, and?10?8?for??.?? ?。他們的經(jīng)驗(yàn)表明,Adam 在實(shí)踐中表現(xiàn)很好,和其他適應(yīng)性學(xué)習(xí)算法相比也比較不錯(cuò)。

    算法可視化

    如下的兩個(gè)動(dòng)畫(圖像版權(quán):Alec Radford)給了我們關(guān)于特定優(yōu)化算法在優(yōu)化過(guò)程中行為的直觀感受。你可以參見(jiàn)這里,以獲取 Karpathy 對(duì)相同圖像的一些描述,及另關(guān)于一些相關(guān)算法的細(xì)致討論。

    在圖 5 中,我們可以看到,在罰函數(shù)的等高線圖中,優(yōu)化器的位置隨時(shí)間的變化情況。注意到,Adagrad、 Adadelta 及 RMSprop 法幾乎立刻就找到了正確前進(jìn)方向并以相似的速度很快收斂。而動(dòng)量法和 NAG 法,則找錯(cuò)了方向,如圖所示,讓小球沿著梯度下降的方向前進(jìn)。但 NAG 法能夠很快改正它的方向向最小指出前進(jìn),因?yàn)樗軌蛲翱床?duì)前面的情況做出響應(yīng)。

    圖 6 展現(xiàn)了各算法在鞍點(diǎn)附近的表現(xiàn)。如上面所說(shuō),這對(duì)對(duì)于 SGD 法、動(dòng)量法及 NAG 法制造了一個(gè)難題。他們很難打破」對(duì)稱性「帶來(lái)的壁壘,盡管最后兩者設(shè)法逃脫了鞍點(diǎn)。而 Adagrad 法、RMSprop 法及 Adadelta 法都能快速的沿著負(fù)斜率的方向前進(jìn)。

    圖5:SGD optimization on loss surface contours

    圖6:SGD optimization on saddle point10?8

    如我們所見(jiàn),適應(yīng)性學(xué)習(xí)率方法,也就是 Adagrad 法、Adadelta 法 、RMSprop 法及 Adam 法最適合處理上述情況,并有最好的收斂效果。

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

    那么,我們?cè)撊绾芜x擇優(yōu)化器呢?如果你的輸入數(shù)據(jù)較為稀疏(sparse),那么使用適應(yīng)性學(xué)習(xí)率類型的算法會(huì)有助于你得到好的結(jié)果。此外,使用該方法的另一好處是,你在不調(diào)參、直接使用默認(rèn)值的情況下,就能得到最好的結(jié)果。

    總的來(lái)說(shuō),RMSprop 法是一種基于 Adagrad 法的拓展,他從根本上解決學(xué)習(xí)率驟縮的問(wèn)題。Adadelta 法于 RMSprop 法大致相同,除了前者使用了。而 Adam 法,則基于 RMSprop 法添加了偏差修正項(xiàng)和動(dòng)量項(xiàng)。在我們地討論范圍中,RMSprop、Adadelta 及 Adam 法都是非常相似地算法,在相似地情況下都能做的很好。Kingma 及其他人 [15] 展示了他們的偏差修正項(xiàng)幫助 Adam 法,在最優(yōu)化過(guò)程快要結(jié)束、梯度變得越發(fā)稀疏的時(shí)候,表現(xiàn)略微優(yōu)于 RMSprop 法。總的來(lái)說(shuō),Adam 也許是總體來(lái)說(shuō)最好的選擇。

    有趣的是,很多最新的論文,都直接使用了(不帶動(dòng)量項(xiàng)的)Vanilla SGD 法,配合一個(gè)簡(jiǎn)單的學(xué)習(xí)率(退火)列表。如論文所示,這些 SGD 最終都能幫助他們找到一個(gè)最小值,但會(huì)花費(fèi)遠(yuǎn)多于上述方法的時(shí)間。并且這些方法非常依賴于魯棒的初始化值及退火列表。因此,如果你非常在你的模型能快速收斂,或是你需要訓(xùn)練一個(gè)深度或復(fù)雜模型,你可能需要選擇上述的適應(yīng)性模型。

    對(duì) SGD 進(jìn)行平行計(jì)算或分布式計(jì)算

    現(xiàn)如今,大規(guī)模數(shù)據(jù)集隨處可見(jiàn)、小型計(jì)算機(jī)集群也易于獲得。因而,使用分布式方法進(jìn)一步加速 SGD 是一個(gè)慣常的選擇。

    SGD 它本事是序列化的:通過(guò)一步一步的迭代,我們最終求到了最小值。運(yùn)行它能夠得到不錯(cuò)的收斂結(jié)果,但是特別是對(duì)于大規(guī)模的數(shù)據(jù)集,它的運(yùn)行速度很慢。相比而言,異步 SGD 的運(yùn)行速度相對(duì)較快,但在不同的工作機(jī)之間的關(guān)于非完全優(yōu)化的溝通可能會(huì)導(dǎo)致較差的收斂結(jié)果。此外,我們能夠?qū)?SGD 進(jìn)行平行運(yùn)算而不需要一個(gè)計(jì)算機(jī)集群。下文討論了相關(guān)的算法或架構(gòu),它們或關(guān)于平行計(jì)算或者對(duì)其進(jìn)行了分布式優(yōu)化。

    Hogwild!

    Niu 等人提出了一種叫做 Hogwild! 的更新規(guī)則,它允許在平行 GPU 上進(jìn)行 SGD 更新。處理器。這僅能在輸入數(shù)據(jù)集是稀疏的時(shí)起效,在每次更新過(guò)程中僅會(huì)修正一部分的參數(shù)值。他們展示了,在這種情況下,這個(gè)更新規(guī)則達(dá)到了最優(yōu)化的收斂速度,因?yàn)樘幚砥鞑惶珪?huì)覆蓋有用的信息。

    Downpour SGD

    Downpour SGD 是一個(gè)異步的 SGD 法變體,它被 Dean 等人 [4] 用在了谷歌的 DistBelief 架構(gòu)中(它是 TensorFlow 的前身)。他對(duì)訓(xùn)練集地子集同步地運(yùn)行模型的多個(gè)副本。這些模型將它們的更新值發(fā)送到參數(shù)服務(wù)器,服務(wù)器被分為了許多臺(tái)主機(jī)。每一臺(tái)主機(jī)都負(fù)責(zé)存儲(chǔ)和上載模型的一部分參數(shù)。但是,副本之間卻沒(méi)有相互的通信——例如,共享權(quán)重值或者更新值——其參數(shù)面臨著發(fā)散的風(fēng)險(xiǎn),會(huì)阻止收斂。

    容忍延遲的 SGD 算法

    McMahan 和 Streeter [12] 改良了 AdaGrad 法使之能夠用于平行運(yùn)算的場(chǎng)景。通過(guò)實(shí)現(xiàn)延遲容忍的算法,它不僅能能夠適應(yīng)于過(guò)去的梯度,還能夠適應(yīng)于更新的延遲。在實(shí)踐中,它的表現(xiàn)很好。

    TensorFlow

    TensorFlow[13] 是谷歌最近開(kāi)源的一個(gè)實(shí)現(xiàn)和部署大規(guī)模機(jī)器學(xué)習(xí)模型的架構(gòu)。它基于他們之前對(duì)于使用 DistBelief 的經(jīng)驗(yàn),并已在內(nèi)部被部署在一系列的移動(dòng)設(shè)備及大規(guī)模的分布式系統(tǒng)上進(jìn)行計(jì)算。為了分布式執(zhí)行,一個(gè)計(jì)算圖被分為了許多子圖給不同的設(shè)備,設(shè)備之間的通信使用了發(fā)送和接受節(jié)點(diǎn)對(duì)。2016 年 4 月 13 日更新:一個(gè)分布式 TensorFlow 的版本已經(jīng)被發(fā)布。

    彈性平均梯度下降法(Elastic Averaging SGD)

    張等人 [14] 提出了彈性平均梯度下降法(EASGD),他使不同工作機(jī)之間不同的 SGD 以一個(gè)「彈性力」連接,也就是一個(gè)儲(chǔ)存于參數(shù)服務(wù)器的中心變量。這允許局部變量比中心變量更大地波動(dòng),理論上允許了對(duì)參數(shù)空間更多的探索。他們的經(jīng)驗(yàn)表明,提高的探索能力有助于在尋找新的局部極值中提升(優(yōu)化器的)表現(xiàn)。

    優(yōu)化 SGD 的其他手段

    最后,我們將討論一些其他手段,他們可以與前述的方法搭配使用,并能進(jìn)一步提升 SGD 的效果。你可以參考 [22],以了解一些其他常用策略。

    重排法(Shuffling)和遞進(jìn)學(xué)習(xí)(Curriculum Learning)

    總體而言,我們希望避免訓(xùn)練樣本以某種特定順序傳入到我們的學(xué)習(xí)模型中,因?yàn)檫@會(huì)向我們的算法引入偏差。因此,在每次迭代后,對(duì)訓(xùn)練數(shù)據(jù)集中的樣本進(jìn)行重排(shuffling),會(huì)是一個(gè)不錯(cuò)的注意。

    另一方面,在某些情況下,我們會(huì)需要解決難度逐步提升的問(wèn)題。那么,按照一定的順序遍歷訓(xùn)練樣本,會(huì)有助于改進(jìn)學(xué)習(xí)效果及加快收斂速度。這種構(gòu)建特定遍歷順序的方法,叫做遞進(jìn)學(xué)習(xí)(Curriculum Learning)[16]。*這個(gè)詞目前沒(méi)有標(biāo)準(zhǔn)翻譯,我根據(jù)表意和意義翻譯成這個(gè)。

    Zaremba 和 Sutskever [17] 僅使用了遞進(jìn)學(xué)習(xí)法訓(xùn)練 LSTMs 來(lái)學(xué)習(xí)簡(jiǎn)單的項(xiàng)目,但結(jié)果表明,遞進(jìn)學(xué)習(xí)法使用的混合策略的表現(xiàn)好于樸素策略——后者不斷地重排數(shù)據(jù),反而增加了學(xué)習(xí)過(guò)程的難度。

    批量標(biāo)準(zhǔn)化(Batch Normalization)

    我們通常設(shè)置我們參數(shù)初值的均值和方差分別為 0 和單位值,以幫助模型進(jìn)行學(xué)習(xí)。隨著學(xué)習(xí)過(guò)程的進(jìn)行,每個(gè)參數(shù)被不同程度地更新,相應(yīng)地,參數(shù)的正則化特征也隨之失去了。因此,隨著訓(xùn)練網(wǎng)絡(luò)的越來(lái)越深,訓(xùn)練的速度會(huì)越來(lái)越慢,變化值也會(huì)被放大。

    批量標(biāo)準(zhǔn)化 [18] 對(duì)每小批數(shù)據(jù)都重新進(jìn)行標(biāo)準(zhǔn)化,并也會(huì)在操作中逆?zhèn)鞑?#xff08;back-propgate)變化量。在模型中加入批量標(biāo)準(zhǔn)化后,我們能使用更高的學(xué)習(xí)率且不要那么在意初始化參數(shù)。此外,批量正則化還可以看作是一種正則化手段,能夠減少(甚至去除)留出法的使用。

    早停(Early Stopping)

    誠(chéng)如 Geoff Hinton 所言:「Early stopping (is) beautiful free lunch(早停是美妙的免費(fèi)午餐,又簡(jiǎn)單效果又好)」(NIPS 2015 Tutorial Sildes, Slide 63)。在訓(xùn)練過(guò)程中,你應(yīng)該時(shí)刻關(guān)注模型在驗(yàn)證集上的誤差情況,并且在改誤差沒(méi)有明顯改進(jìn)的時(shí)候停止訓(xùn)練。

    梯度噪聲(Gradient Noise)

    Neelakentan 等人 [21] 在每次梯度的更新中,向其中加入一個(gè)服從合高斯分布 N(0,σ^2) 的噪聲值:

    并按照如下的方式修正方差:

    他們指出,這種方式能夠提升神經(jīng)網(wǎng)絡(luò)在不良初始化前提下的魯棒性,并能幫助訓(xùn)練特別是深層、復(fù)雜的神經(jīng)網(wǎng)絡(luò)。他們發(fā)現(xiàn),加入噪聲項(xiàng)之后,模型更有可能發(fā)現(xiàn)并跳出在深度網(wǎng)絡(luò)中頻繁出現(xiàn)的局部最小值。

    結(jié)論

    在本文中,我們首先分析了梯度下降法的三個(gè)變體,在其中小批量梯度下降法最受歡迎。接著,我們研究了常用的優(yōu)化 SGD 的算法,包括:動(dòng)量法、Nesterov accelerated gradient 法、Adagrad 法、Adadelta 法、RMSprop 法、Adam 法及其他優(yōu)化異步 SGD 的算法。最終,我們討論了另外一些改進(jìn) SGD 的策略,包括樣本重排法(shuffling)、遞進(jìn)學(xué)習(xí)(curriculum learning)、批量標(biāo)準(zhǔn)化(Batch Normali·zation)及早停(early stopping)等。

    我希望本文能增進(jìn)讀者關(guān)于這些優(yōu)化算法的認(rèn)識(shí),能對(duì)這些算法的行為與動(dòng)機(jī)有一個(gè)了解。也許我遺漏了一些常用的優(yōu)化 SGD 的算法,或是你有一些自己使用 SGD 訓(xùn)練的技巧。如果有的話,請(qǐng)?jiān)谙路搅粞詤^(qū)留言讓我知道。

    原文連接查看參考文獻(xiàn):

    1. http://ruder.io/optimizing-gradient-descent/;

    2. https://www.jiqizhixin.com/articles/2016-11-21-4

    總結(jié)

    以上是生活随笔為你收集整理的梯度下降法解读的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。