自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

從梯度下降到 Adam!一文看懂各種神經(jīng)網(wǎng)絡(luò)優(yōu)化算法

新聞 深度學(xué)習(xí) 算法
在有效地訓(xùn)練模型并產(chǎn)生準(zhǔn)確結(jié)果時(shí),模型的內(nèi)部參數(shù)起到了非常重要的作用。 這也是為什么我們應(yīng)該用各種優(yōu)化策略和算法,來更新和計(jì)算影響模型訓(xùn)練和模型輸出的網(wǎng)絡(luò)參數(shù),使其逼近或達(dá)到最優(yōu)值。

 [[431306]]

本文經(jīng)AI新媒體量子位(公眾號(hào)ID:QbitAI)授權(quán)轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)聯(lián)系出處。

在調(diào)整模型更新權(quán)重和偏差參數(shù)的方式時(shí),你是否考慮過哪種優(yōu)化算法能使模型產(chǎn)生更好且更快的效果?應(yīng)該用梯度下降,隨機(jī)梯度下降,還是Adam方法?

這篇文章介紹了不同優(yōu)化算法之間的主要區(qū)別,以及如何選擇最佳的優(yōu)化方法。

什么是優(yōu)化算法?

優(yōu)化算法的功能,是通過改善訓(xùn)練方式,來最小化(或最大化)損失函數(shù)E(x)。

模型內(nèi)部有些參數(shù),是用來計(jì)算測(cè)試集中目標(biāo)值Y的真實(shí)值和預(yù)測(cè)值的偏差程度的,基于這些參數(shù),就形成了損失函數(shù)E(x)。

比如說,權(quán)重(W)和偏差(b)就是這樣的內(nèi)部參數(shù),一般用于計(jì)算輸出值,在訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型時(shí)起到主要作用。

在有效地訓(xùn)練模型并產(chǎn)生準(zhǔn)確結(jié)果時(shí),模型的內(nèi)部參數(shù)起到了非常重要的作用。 這也是為什么我們應(yīng)該用各種優(yōu)化策略和算法,來更新和計(jì)算影響模型訓(xùn)練和模型輸出的網(wǎng)絡(luò)參數(shù),使其逼近或達(dá)到最優(yōu)值。

優(yōu)化算法分為兩大類:

1. 一階優(yōu)化算法

這種算法使用各參數(shù)的梯度值來最小化或最大化損失函數(shù)E(x)。 最常用的一階優(yōu)化算法是梯度下降。

函數(shù)梯度:導(dǎo)數(shù)dy/dx的多變量表達(dá)式,用來表示y相對(duì)于x的瞬時(shí)變化率。往往為了計(jì)算多變量函數(shù)的導(dǎo)數(shù)時(shí),會(huì)用梯度取代導(dǎo)數(shù),并使用偏導(dǎo)數(shù)來計(jì)算梯度。梯度和導(dǎo)數(shù)之間的一個(gè)主要區(qū)別是函數(shù)的梯度形成了一個(gè)向量場(chǎng)。

因此,對(duì)單變量函數(shù),使用導(dǎo)數(shù)來分析;而梯度是基于多變量函數(shù)而產(chǎn)生的。更多理論細(xì)節(jié)在這里不再進(jìn)行詳細(xì)解釋。

2. 二階優(yōu)化算法

二階優(yōu)化算法使用了二階導(dǎo)數(shù)(也叫做 Hessian方法 )來最小化或最大化損失函數(shù)。由于二階導(dǎo)數(shù)的計(jì)算成本很高,所以這種方法并沒有廣泛使用。

詳解各種神經(jīng)網(wǎng)絡(luò)優(yōu)化算法

梯度下降

在訓(xùn)練和優(yōu)化智能系統(tǒng)時(shí),梯度下降是一種最重要的技術(shù)和基礎(chǔ)。梯度下降的功能是:

通過尋找最小值,控制方差,更新模型參數(shù),最終使模型收斂。

網(wǎng)絡(luò)更新參數(shù)的公式為:θ=θ−η×∇(θ).J(θ) ,其中η是學(xué)習(xí)率,∇(θ).J(θ)是損失函數(shù)J(θ)的梯度。

這是在神經(jīng)網(wǎng)絡(luò)中最常用的優(yōu)化算法。

如今,梯度下降主要用于在神經(jīng)網(wǎng)絡(luò)模型中進(jìn)行權(quán)重更新,即在一個(gè)方向上更新和調(diào)整模型的參數(shù),來最小化損失函數(shù)。

2006年引入的反向傳播技術(shù),使得訓(xùn)練深層神經(jīng)網(wǎng)絡(luò)成為可能。反向傳播技術(shù)是先在前向傳播中計(jì)算輸入信號(hào)的乘積及其對(duì)應(yīng)的權(quán)重,然后將激活函數(shù)作用于這些乘積的總和。這種將輸入信號(hào)轉(zhuǎn)換為輸出信號(hào)的方式,是一種對(duì)復(fù)雜非線性函數(shù)進(jìn)行建模的重要手段,并引入了非線性激活函數(shù),使得模型能夠?qū)W習(xí)到幾乎任意形式的函數(shù)映射。然后,在網(wǎng)絡(luò)的反向傳播過程中回傳相關(guān)誤差,使用梯度下降更新權(quán)重值,通過計(jì)算誤差函數(shù)E相對(duì)于權(quán)重參數(shù)W的梯度,在損失函數(shù)梯度的相反方向上更新權(quán)重參數(shù)。

圖1: 權(quán)重更新方向與梯度方向相反

圖1顯示了權(quán)重更新過程與梯度矢量誤差的方向相反,其中U形曲線為梯度。要注意到,當(dāng)權(quán)重值W太小或太大時(shí),會(huì)存在較大的誤差,需要更新和優(yōu)化權(quán)重,使其轉(zhuǎn)化為合適值,所以我們?cè)噲D在與梯度相反的方向找到一個(gè)局部最優(yōu)值。

梯度下降的變體

傳統(tǒng)的批量梯度下降將計(jì)算整個(gè)數(shù)據(jù)集梯度,但只會(huì)進(jìn)行一次更新,因此在處理大型數(shù)據(jù)集時(shí)速度很慢且難以控制,甚至導(dǎo)致內(nèi)存溢出。

權(quán)重更新的快慢是由學(xué)習(xí)率η決定的,并且可以在凸面誤差曲面中收斂到全局最優(yōu)值,在非凸曲面中可能趨于局部最優(yōu)值。

使用標(biāo)準(zhǔn)形式的批量梯度下降還有一個(gè)問題,就是在訓(xùn)練大型數(shù)據(jù)集時(shí)存在冗余的權(quán)重更新。

標(biāo)準(zhǔn)梯度下降的上述問題在隨機(jī)梯度下降方法中得到了解決。

1. 隨機(jī)梯度下降(SDG)

隨機(jī)梯度下降(Stochastic gradient descent,SGD)對(duì)每個(gè)訓(xùn)練樣本進(jìn)行參數(shù)更新,每次執(zhí)行都進(jìn)行一次更新,且執(zhí)行速度更快。

θ=θ−η⋅∇(θ) × J(θ;x(i);y(i)),其中x(i)和y(i)為訓(xùn)練樣本。

頻繁的更新使得參數(shù)間具有高方差,損失函數(shù)會(huì)以不同的強(qiáng)度波動(dòng)。這實(shí)際上是一件好事,因?yàn)樗兄谖覀儼l(fā)現(xiàn)新的和可能更優(yōu)的局部最小值,而標(biāo)準(zhǔn)梯度下降將只會(huì)收斂到某個(gè)局部最優(yōu)值。

但SGD的問題是,由于頻繁的更新和波動(dòng),最終將收斂到最小限度,并會(huì)因波動(dòng)頻繁存在超調(diào)量。

雖然已經(jīng)表明,當(dāng)緩慢降低學(xué)習(xí)率η時(shí),標(biāo)準(zhǔn)梯度下降的收斂模式與SGD的模式相同。

圖2: 每個(gè)訓(xùn)練樣本中高方差的參數(shù)更新會(huì)導(dǎo)致?lián)p失函數(shù)大幅波動(dòng),因此我們可能無法獲得給出損失函數(shù)的最小值。

另一種稱為“小批量梯度下降”的變體,則可以解決高方差的參數(shù)更新和不穩(wěn)定收斂的問題。

2. 小批量梯度下降

為了避免SGD和標(biāo)準(zhǔn)梯度下降中存在的問題,一個(gè)改進(jìn)方法為小批量梯度下降(Mini Batch Gradient Descent),因?yàn)閷?duì)每個(gè)批次中的n個(gè)訓(xùn)練樣本,這種方法只執(zhí)行一次更新。

使用小批量梯度下降的優(yōu)點(diǎn)是:

1) 可以減少參數(shù)更新的波動(dòng),最終得到效果更好和更穩(wěn)定的收斂。

2) 還可以使用最新的深層學(xué)習(xí)庫中通用的矩陣優(yōu)化方法,使計(jì)算小批量數(shù)據(jù)的梯度更加高效。

3) 通常來說,小批量樣本的大小范圍是從50到256,可以根據(jù)實(shí)際問題而有所不同。

4) 在訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí),通常都會(huì)選擇小批量梯度下降算法。

這種方法有時(shí)候還是被成為SGD。

使用梯度下降及其變體時(shí)面臨的挑戰(zhàn)

1. 很難選擇出合適的學(xué)習(xí)率。太小的學(xué)習(xí)率會(huì)導(dǎo)致網(wǎng)絡(luò)收斂過于緩慢,而學(xué)習(xí)率太大可能會(huì)影響收斂,并導(dǎo)致?lián)p失函數(shù)在最小值上波動(dòng),甚至出現(xiàn)梯度發(fā)散。

2. 此外,相同的學(xué)習(xí)率并不適用于所有的參數(shù)更新。如果訓(xùn)練集數(shù)據(jù)很稀疏,且特征頻率非常不同,則不應(yīng)該將其全部更新到相同的程度,但是對(duì)于很少出現(xiàn)的特征,應(yīng)使用更大的更新率。

3. 在神經(jīng)網(wǎng)絡(luò)中,最小化非凸誤差函數(shù)的另一個(gè)關(guān)鍵挑戰(zhàn)是避免陷于多個(gè)其他局部最小值中。實(shí)際上,問題并非源于局部極小值,而是來自鞍點(diǎn),即一個(gè)維度向上傾斜且另一維度向下傾斜的點(diǎn)。這些鞍點(diǎn)通常被相同誤差值的平面所包圍,這使得SGD算法很難脫離出來,因?yàn)樘荻仍谒芯S度上接近于零。

進(jìn)一步優(yōu)化梯度下降

現(xiàn)在我們要討論用于進(jìn)一步優(yōu)化梯度下降的各種算法。

1. 動(dòng)量

SGD方法中的高方差振蕩使得網(wǎng)絡(luò)很難穩(wěn)定收斂,所以有研究者提出了一種稱為動(dòng)量(Momentum)的技術(shù), 通過優(yōu)化相關(guān)方向的訓(xùn)練和弱化無關(guān)方向的振蕩,來加速SGD訓(xùn)練 。換句話說,這種新方法將上個(gè)步驟中更新向量的分量’γ’添加到當(dāng)前更新向量。

V(t)=γV(t−1)+η∇(θ).J(θ)

最后通過θ=θ−V(t)來更新參數(shù)。

動(dòng)量項(xiàng)γ通常設(shè)定為0.9,或相近的某個(gè)值。

這里的動(dòng)量與經(jīng)典物理學(xué)中的動(dòng)量是一致的,就像從山上投出一個(gè)球,在下落過程中收集動(dòng)量,小球的速度不斷增加。

在參數(shù)更新過程中,其原理類似:

1) 使網(wǎng)絡(luò)能更優(yōu)和更穩(wěn)定的收斂;

2) 減少振蕩過程。

當(dāng)其梯度指向?qū)嶋H移動(dòng)方向時(shí),動(dòng)量項(xiàng)γ增大;當(dāng)梯度與實(shí)際移動(dòng)方向相反時(shí),γ減小。這種方式意味著動(dòng)量項(xiàng)只對(duì)相關(guān)樣本進(jìn)行參數(shù)更新,減少了不必要的參數(shù)更新,從而得到更快且穩(wěn)定的收斂,也減少了振蕩過程。

2. Nesterov梯度加速法

一位名叫Yurii Nesterov研究員,認(rèn)為動(dòng)量方法存在一個(gè)問題:

如果一個(gè)滾下山坡的球,盲目沿著斜坡下滑,這是非常不合適的。一個(gè)更聰明的球應(yīng)該要注意到它將要去哪,因此在上坡再次向上傾斜時(shí)小球應(yīng)該進(jìn)行減速。

實(shí)際上,當(dāng)小球達(dá)到曲線上的最低點(diǎn)時(shí),動(dòng)量相當(dāng)高。由于高動(dòng)量可能會(huì)導(dǎo)致其完全地錯(cuò)過最小值,因此小球不知道何時(shí)進(jìn)行減速,故繼續(xù)向上移動(dòng)。

Yurii Nesterov在1983年發(fā)表了一篇關(guān)于解決動(dòng)量問題的論文,因此,我們把這種方法叫做Nestrov梯度加速法。

在該方法中,他提出先根據(jù)之前的動(dòng)量進(jìn)行大步跳躍,然后計(jì)算梯度進(jìn)行校正,從而實(shí)現(xiàn)參數(shù)更新。這種預(yù)更新方法能防止大幅振蕩,不會(huì)錯(cuò)過最小值,并對(duì)參數(shù)更新更加敏感。

Nesterov梯度加速法(NAG)是一種賦予了動(dòng)量項(xiàng)預(yù)知能力的方法,通過使用動(dòng)量項(xiàng)γV(t−1)來更改參數(shù)θ。通過計(jì)算θ−γV(t−1),得到下一位置的參數(shù)近似值,這里的參數(shù)是一個(gè)粗略的概念。因此, 我們不是通過計(jì)算當(dāng)前參數(shù)θ的梯度值,而是通過相關(guān)參數(shù)的大致未來位置,來有效地預(yù)知未來 :

V(t)=γV(t−1)+η∇(θ)J( θ−γV(t−1) ),然后使用θ=θ−V(t)來更新參數(shù)。

現(xiàn)在,我們通過使網(wǎng)絡(luò)更新與誤差函數(shù)的斜率相適應(yīng),并依次加速SGD,也可根據(jù)每個(gè)參數(shù)的重要性來調(diào)整和更新對(duì)應(yīng)參數(shù),以執(zhí)行更大或更小的更新幅度。

3. Adagrad方法

Adagrad方法是通過參數(shù)來調(diào)整合適的學(xué)習(xí)率η,對(duì)稀疏參數(shù)進(jìn)行大幅更新和對(duì)頻繁參數(shù)進(jìn)行小幅更新。因此,Adagrad方法非常適合處理稀疏數(shù)據(jù)。

在時(shí)間步長中,Adagrad方法基于每個(gè)參數(shù)計(jì)算的過往梯度,為不同參數(shù)θ設(shè)置不同的學(xué)習(xí)率。

先前,每個(gè)參數(shù)θ(i)使用相同的學(xué)習(xí)率,每次會(huì)對(duì)所有參數(shù)θ進(jìn)行更新。在每個(gè)時(shí)間步t中,Adagrad方法為每個(gè)參數(shù)θ選取不同的學(xué)習(xí)率,更新對(duì)應(yīng)參數(shù),然后進(jìn)行向量化。為了簡(jiǎn)單起見,我們把在t時(shí)刻參數(shù)θ(i)的損失函數(shù)梯度設(shè)為g(t,i)。

圖3 參數(shù)更新公式

Adagrad方法是在每個(gè)時(shí)間步中,根據(jù)過往已計(jì)算的參數(shù)梯度,來為每個(gè)參數(shù)θ(i)修改對(duì)應(yīng)的學(xué)習(xí)率η。

Adagrad方法的主要好處是,不需要手工來調(diào)整學(xué)習(xí)率。大多數(shù)參數(shù)使用了默認(rèn)值0.01,且保持不變。

Adagrad方法的主要缺點(diǎn)是,學(xué)習(xí)率η總是在降低和衰減。

因?yàn)槊總€(gè)附加項(xiàng)都是正的,在分母中累積了多個(gè)平方梯度值,故累積的總和在訓(xùn)練期間保持增長。這反過來又導(dǎo)致學(xué)習(xí)率下降,變?yōu)楹苄?shù)量級(jí)的數(shù)字,該模型完全停止學(xué)習(xí),停止獲取新的額外知識(shí)。

因?yàn)殡S著學(xué)習(xí)速度的越來越小,模型的學(xué)習(xí)能力迅速降低,而且收斂速度非常慢,需要很長的訓(xùn)練和學(xué)習(xí),即 學(xué)習(xí)速度降低 。

另一個(gè)叫做Adadelta的算法改善了這個(gè)學(xué)習(xí)率不斷衰減的問題。

4. AdaDelta方法

這是一個(gè)AdaGrad的延伸方法,它傾向于解決其學(xué)習(xí)率衰減的問題。Adadelta不是累積所有之前的平方梯度,而是將累積之前梯度的窗口限制到某個(gè)固定大小w。

與之前無效地存儲(chǔ)w先前的平方梯度不同,梯度的和被遞歸地定義為所有先前平方梯度的衰減平均值。作為與動(dòng)量項(xiàng)相似的分?jǐn)?shù)γ,在t時(shí)刻的滑動(dòng)平均值Eg²僅僅取決于先前的平均值和當(dāng)前梯度值。

Eg²=γ.Eg²+(1−γ).g²(t),其中γ設(shè)置為與動(dòng)量項(xiàng)相近的值,約為0.9。

Δθ(t)=−η⋅g(t,i).

θ(t+1)=θ(t)+Δθ(t)

圖4: 參數(shù)更新的最終公式

AdaDelta方法的另一個(gè)優(yōu)點(diǎn)是,已經(jīng)不需要設(shè)置一個(gè)默認(rèn)的學(xué)習(xí)率。

目前已完成的改進(jìn)

1) 為每個(gè)參數(shù)計(jì)算出不同學(xué)習(xí)率;

2) 也計(jì)算了動(dòng)量項(xiàng)momentum;

3) 防止 學(xué)習(xí)率衰減或梯度消失 等問題的出現(xiàn)。

還可以做什么改進(jìn)?

在之前的方法中計(jì)算了每個(gè)參數(shù)的對(duì)應(yīng)學(xué)習(xí)率,但是為什么不計(jì)算每個(gè)參數(shù)的對(duì)應(yīng)動(dòng)量變化并獨(dú)立存儲(chǔ)呢?這就是Adam算法提出的改良點(diǎn)。

Adam算法

Adam算法 即自適應(yīng)時(shí)刻估計(jì)方法(Adaptive Moment Estimation) ,能計(jì)算每個(gè)參數(shù)的自適應(yīng)學(xué)習(xí)率。這個(gè)方法不僅存儲(chǔ)了AdaDelta先前平方梯度的指數(shù)衰減平均值,而且保持了先前梯度M(t)的指數(shù)衰減平均值,這一點(diǎn)與動(dòng)量類似:

M(t)為梯度的第一時(shí)刻平均值,V(t)為梯度的第二時(shí)刻非中心方差值。

圖5: 兩個(gè)公式分別為梯度的第一個(gè)時(shí)刻平均值和第二個(gè)時(shí)刻方差

則參數(shù)更新的最終公式為:

圖6: 參數(shù)更新的最終公式

其中,β1設(shè)為0.9,β2設(shè)為0.9999,ϵ設(shè)為10-8。

在實(shí)際應(yīng)用中,Adam方法效果良好。與其他自適應(yīng)學(xué)習(xí)率算法相比,其收斂速度更快,學(xué)習(xí)效果更為有效,而且可以糾正其他優(yōu)化技術(shù)中存在的問題,如學(xué)習(xí)率消失、收斂過慢或是高方差的參數(shù)更新導(dǎo)致?lián)p失函數(shù)波動(dòng)較大等問題。

對(duì)優(yōu)化算法進(jìn)行可視化

圖8: 對(duì)鞍點(diǎn)進(jìn)行SGD優(yōu)化

從上面的動(dòng)畫可以看出,自適應(yīng)算法能很快收斂,并快速找到參數(shù)更新中正確的目標(biāo)方向;而標(biāo)準(zhǔn)的SGD、NAG和動(dòng)量項(xiàng)等方法收斂緩慢,且很難找到正確的方向。

結(jié)論

我們應(yīng)該使用哪種優(yōu)化器?

在構(gòu)建神經(jīng)網(wǎng)絡(luò)模型時(shí),選擇出最佳的優(yōu)化器,以便快速收斂并正確學(xué)習(xí),同時(shí)調(diào)整內(nèi)部參數(shù),最大程度地最小化損失函數(shù)。

Adam在實(shí)際應(yīng)用中效果良好,超過了其他的自適應(yīng)技術(shù)。

如果輸入數(shù)據(jù)集比較稀疏,SGD、NAG和動(dòng)量項(xiàng)等方法可能效果不好。 因此對(duì)于稀疏數(shù)據(jù)集,應(yīng)該使用某種自適應(yīng)學(xué)習(xí)率的方法,且另一好處為不需要人為調(diào)整學(xué)習(xí)率,使用默認(rèn)參數(shù)就可能獲得最優(yōu)值。

如果想使訓(xùn)練深層網(wǎng)絡(luò)模型快速收斂或所構(gòu)建的神經(jīng)網(wǎng)絡(luò)較為復(fù)雜,則應(yīng)該使用Adam或其他自適應(yīng)學(xué)習(xí)速率的方法 ,因?yàn)檫@些方法的實(shí)際效果更優(yōu)。

希望你能通過這篇文章,很好地理解不同優(yōu)化算法間的特性差異。

 

責(zé)任編輯:張燕妮 來源: 量子位
相關(guān)推薦

2017-04-17 13:10:09

神經(jīng)網(wǎng)絡(luò)人工智能網(wǎng)絡(luò)

2017-03-13 09:48:04

神經(jīng)網(wǎng)絡(luò)算法函數(shù)

2018-07-20 14:58:16

深度學(xué)習(xí)梯度下降損失函數(shù)

2019-11-19 08:00:00

神經(jīng)網(wǎng)絡(luò)AI人工智能

2019-03-26 19:00:02

神經(jīng)網(wǎng)絡(luò)AI人工智能

2018-07-29 06:46:07

神經(jīng)網(wǎng)絡(luò)RNN循環(huán)神經(jīng)網(wǎng)絡(luò)

2023-05-17 11:33:45

梯度下降機(jī)器學(xué)習(xí)

2023-09-17 23:09:24

Transforme深度學(xué)習(xí)

2025-03-31 08:50:00

模型量化神經(jīng)網(wǎng)絡(luò)AI

2020-12-08 20:20:15

神經(jīng)網(wǎng)絡(luò)深度學(xué)習(xí)機(jī)器學(xué)習(xí)

2017-07-06 17:03:45

BP算法Python神經(jīng)網(wǎng)絡(luò)

2016-08-18 00:21:12

網(wǎng)絡(luò)爬蟲抓取網(wǎng)絡(luò)

2018-11-26 07:04:59

神經(jīng)網(wǎng)絡(luò)優(yōu)化函數(shù)

2020-08-14 10:20:49

神經(jīng)網(wǎng)絡(luò)人工智能池化層

2020-08-03 11:43:01

神經(jīng)網(wǎng)絡(luò)優(yōu)化機(jī)器學(xué)習(xí)

2017-11-29 13:55:55

神經(jīng)網(wǎng)絡(luò)循環(huán)神經(jīng)網(wǎng)絡(luò)RNN

2020-03-31 14:40:24

HashMap源碼Java

2019-08-29 10:10:52

神經(jīng)網(wǎng)絡(luò)激活函數(shù)人工智能

2019-11-06 17:00:51

深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)人工智能

2016-11-28 09:24:08

Python內(nèi)存技巧
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)