簡介
本文介紹一下機(jī)器學(xué)習(xí)和深度學(xué)習(xí)中常用的優(yōu)化算法和優(yōu)化器以及一些其他我知道的優(yōu)化算法,部分算法我也沒有搞懂,就先記錄下來以后慢慢研究吧.*_*.
1.梯度下降算法(Gradient Descent)
梯度下降法可以參考我另一篇文章機(jī)器學(xué)習(xí)-線性回歸里的講解,這里就不在重復(fù)敘述.這里需要強(qiáng)調(diào)一下,深度學(xué)習(xí)里常用的SGD,翻譯過來是隨機(jī)梯度下降,但是實(shí)質(zhì)是mini-batch梯度下降(mini-batch-gd),或者說是兩者的結(jié)合更準(zhǔn)確一些.
SGD的優(yōu)點(diǎn)是,算法簡單,計(jì)算量小,在函數(shù)為凸函數(shù)時(shí)可以找到全局最優(yōu)解.所以是最常用的優(yōu)化算法.缺點(diǎn)是如果函數(shù)不是凸函數(shù)的話,很容易進(jìn)入到局部最優(yōu)解而無法跳出來.同時(shí)SGD在選擇學(xué)習(xí)率上也是比較困難的.
2.牛頓法
牛頓法和擬牛頓法都是求解無約束最優(yōu)化問題的常用方法,其中牛頓法是迭代算法,每一步需要求解目標(biāo)函數(shù)的海森矩陣的逆矩陣,計(jì)算比較復(fù)雜.
牛頓法在求解方程根的思想:在二維情況下,迭代的尋找某一點(diǎn)x,尋找方法是隨機(jī)一個(gè)初始點(diǎn)x_0,目標(biāo)函數(shù)在該點(diǎn)x_0的切線與x坐標(biāo)軸的交點(diǎn)就是下一個(gè)x點(diǎn),也就是x_1.不斷迭代尋找x.其中切線的斜率為目標(biāo)函數(shù)在點(diǎn)x_0的導(dǎo)數(shù)(梯度),切必過點(diǎn)(x_0,f(x_0)).所以迭代的方程式如圖1,為了求該方程的極值點(diǎn),還需要令其導(dǎo)數(shù)等于0,也就是又求了一次導(dǎo)數(shù),所以需要用到f(x)的二階導(dǎo)數(shù).
在最優(yōu)化的問題中,牛頓法提供了一種求解的辦法. 假設(shè)任務(wù)是優(yōu)化一個(gè)目標(biāo)函數(shù)f, 求函數(shù)ff的極大極小問題, 可以轉(zhuǎn)化為求解函數(shù)f導(dǎo)數(shù)等于0的問題, 這樣求可以把優(yōu)化問題看成方程求解問題(f的導(dǎo)數(shù)等于0). 剩下的問題就和牛頓法求解方程根的思想很相似了.
目標(biāo)函數(shù)的泰勒展開式:
化簡后:
這樣就得到了與圖1相似的公式,這里是二維的,在多維空間上,求二階導(dǎo)數(shù)就是求海森矩陣,因?yàn)槭欠帜?所以還需要求海森矩陣的逆矩陣.
牛頓法和SGD的區(qū)別:
牛頓法是二階求導(dǎo),SGD是一階求導(dǎo),所以牛頓法要收斂的更快一些.SGD只考慮當(dāng)前情況下梯度下降最快的方向,而牛頓法不僅考慮當(dāng)前梯度下降最快,還有考慮下一步下降最快的方向.
牛頓法的優(yōu)點(diǎn)是二階求導(dǎo)下降速度快,但是因?yàn)槭堑惴?每一步都需要求解海森矩陣的逆矩陣,所以計(jì)算復(fù)雜.
3.擬牛頓法(沒搞懂,待定)
考慮到牛頓法計(jì)算海森矩陣比較麻煩,所以它使用正定矩陣來代替海森矩陣的逆矩陣,從而簡化了計(jì)算過程.
常用的擬牛頓法有DFP算法和BFGS算法.
4.共軛梯度法(Conjugate Gradient)
共軛梯度法是介于最速下降法與牛頓法之間的一個(gè)方法,它僅需利用一階導(dǎo)數(shù)信息,但克服了最速下降法收斂慢的缺點(diǎn),又避免了牛頓法計(jì)算海森矩陣并求逆的缺點(diǎn).共軛梯度法不僅是解決大型線性方程組最有用的方法之一,也是解大型非線性最優(yōu)化最有效的算法之一.
5.拉格朗日法
參考SVM里的講解機(jī)器學(xué)習(xí)-SVM
6.動(dòng)量優(yōu)化法(Momentum)
動(dòng)量優(yōu)化法主要是在SGD的基礎(chǔ)上,加入了歷史的梯度更新信息或者說是加入了速度更新.SGD雖然是很流行的優(yōu)化算法,但是其學(xué)習(xí)過程很慢,因?yàn)榭偸且酝瑯拥牟介L沿著梯度下降的方向.所以動(dòng)量是為了加速學(xué)習(xí)的方法.
其中第一行的減號(hào)部分是計(jì)算當(dāng)前的梯度,第一行是根據(jù)梯度更新速度v,而α是新引進(jìn)的參數(shù),在實(shí)踐中,α的一般取值為 0.5,0.9 和 0.99.和學(xué)習(xí)率一樣,α 也會(huì)隨著時(shí)間不斷調(diào)整.一般初始值是一個(gè)較小的值,隨后會(huì)慢慢變大.
7.Nesterov加速梯度(NAG, Nesterov accelerated gradient)
NAG是在動(dòng)量優(yōu)化算法的基礎(chǔ)上又進(jìn)行了改進(jìn).根據(jù)下圖可以看出,Nesterov 動(dòng)量和標(biāo)準(zhǔn)動(dòng)量之間的區(qū)別體現(xiàn)在梯度計(jì)算上, Nesterov 動(dòng)量中,梯度計(jì)算在施加當(dāng)前速度之后.因此,Nesterov 動(dòng)量可以解釋為往標(biāo)準(zhǔn)動(dòng)量方法中添加了一個(gè)校正因子
8.AdaGrad算法
AdaGrad算法,自適應(yīng)優(yōu)化算法的一種,獨(dú)立地適應(yīng)所有模型參數(shù)的學(xué)習(xí)率,縮放每個(gè)參數(shù)反比于其所有梯度歷史平均值總和的平方根.具有代價(jià)函數(shù)最大梯度的參數(shù)相應(yīng)地有個(gè)快速下降的學(xué)習(xí)率,而具有小梯度的參數(shù)在學(xué)習(xí)率上有相對(duì)較小的下降.通俗一點(diǎn)的講,就是根據(jù)實(shí)際情況更改學(xué)習(xí)率,比如模型快要收斂的時(shí)候,學(xué)習(xí)率步長就會(huì)小一點(diǎn),防止跳出最優(yōu)解.
其中g(shù)是梯度,第一行的分母是計(jì)算累計(jì)梯度的平方根,是為了防止分母為0加上的極小常數(shù)項(xiàng),α是學(xué)習(xí)率.
Adagrad的主要優(yōu)點(diǎn)是不需要人為的調(diào)節(jié)學(xué)習(xí)率,它可以自動(dòng)調(diào)節(jié).但是依然需要設(shè)置一個(gè)初始的全局學(xué)習(xí)率.缺點(diǎn)是隨著迭代次數(shù)增多,學(xué)習(xí)率會(huì)越來越小,最終會(huì)趨近于0.
9.RMSProp算法
RMSProp修改 AdaGrad 以在非凸設(shè)定下效果更好,改變梯度積累為指數(shù)加權(quán)的移動(dòng)平均.AdaGrad旨在應(yīng)用于凸問題時(shí)快速收斂.
10.AdaDelta算法
11.Adam算法
Adam是Momentum和RMSprop的結(jié)合體,也就是帶動(dòng)量的自適應(yīng)優(yōu)化算法.
12.Nadam算法
13.模擬退火算法
14.蟻群算法
15.遺傳算法
總結(jié):
動(dòng)量是為了加快學(xué)習(xí)速度,而自適應(yīng)是為了加快收斂速度,注意學(xué)習(xí)速度快不一定收斂速度就快,比如步長大學(xué)習(xí)速度快,但是很容易跳出極值點(diǎn),在極值點(diǎn)附近波動(dòng),很難達(dá)到收斂.
未完待定....
參考:
《統(tǒng)計(jì)學(xué)習(xí)方法》? 李航? ? 著
《深度學(xué)習(xí)》? 花書