Pytorch的優(yōu)化器總結(jié)

本文是從網(wǎng)上的資料加上自己的總結(jié)而來的,要感謝

PyTorch 學(xué)習(xí)筆記(七):PyTorch的十個優(yōu)化器: https://blog.csdn.net/u011995719/article/details/88988420

Pytorch中常用的四種優(yōu)化器SGD、Momentum武翎、RMSProp、Adam:https://zhuanlan.zhihu.com/p/78622301

機(jī)器學(xué)習(xí):各種優(yōu)化器Optimizer的總結(jié)與比較:https://blog.csdn.net/weixin_40170902/article/details/80092628

PyTorch中文文檔:https://pytorch-cn.readthedocs.io/zh/latest/

PyTorch英文文檔:https://pytorch.org/docs/stable/index.html


從最新(1.2.0)版本的Pytorch文檔中可以知道溶锭,pytorch一共有11個優(yōu)化器(當(dāng)然宝恶,可實現(xiàn)的算法不止11種),分別是

SGD

ASGD

Adagrad

Adadelta

Rprop

RMSprop

Adam

Adamax

SparseAdam

AdamW

L-BFGS

下面分析加粗的常用優(yōu)化器:

1趴捅、SGD (實現(xiàn)隨機(jī)梯度下降算法(momentum垫毙、nesterov可選))

torch.optim.SGD(params,lr=<required parameter>,momentum=0,dampening=0,weight_decay=0,nesterov=False)

參數(shù):

--params (iterable) – 待優(yōu)化參數(shù)的iterable或者是定義了參數(shù)組的dict

--lr (float) – 學(xué)習(xí)率

--momentum (float, 可選) – 動量因子(默認(rèn):0,通常設(shè)置為0.9拱绑,0.8)

--weight_decay (float, 可選) – 權(quán)重衰減(L2懲罰)(默認(rèn):0)

--dampening (float, 可選) – 動量的抑制因子(默認(rèn):0)

--nesterov (bool, 可選) – 使用Nesterov動量(默認(rèn):False)論文:http://www.cs.toronto.edu/~hinton/absps/momentum.pdf

例子:
>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)

>>> optimizer.zero_grad()

>>> loss_fn(model(input), target).backward()

>>> optimizer.step()

優(yōu)點:①使用mini-batch的時候综芥,可以收斂得很快

缺點:①在隨機(jī)選擇梯度的同時會引入噪聲,使得權(quán)值更新的方向不一定正確

?????????? ②不能解決局部最優(yōu)解的問題

推薦程度:不推薦猎拨!


1.1膀藐、使用動量(Momentum)的隨機(jī)梯度下降法(SGD)

更新的時候在一定程度上保留之前更新的方向屠阻,用法為在torch.optim.SGDmomentum參數(shù)不為零,

優(yōu)點:加快收斂速度额各,有一定擺脫局部最優(yōu)的能力国觉,一定程度上緩解了沒有動量的時候的問題

缺點:仍然繼承了一部分SGD的缺點

推薦程度:可以一試

1.2、使用牛頓加速度(NAG, Nesterov accelerated gradient)的隨機(jī)梯度下降法(SGD)

可以理解為往標(biāo)準(zhǔn)動量中添加了一個校正因子

理解策略:在Momentun中小球會盲目地跟從下坡的梯度虾啦,容易發(fā)生錯誤麻诀。所以需要一個更聰明的小球,能提前知道它要去哪里傲醉,還要知道走到坡底的時候速度慢下來而不是又沖上另一個坡

優(yōu)點:梯度下降方向更加準(zhǔn)確

缺點:對收斂率的作用卻不是很大

推薦程度:不如不試


2蝇闭、ASGD(隨機(jī)平均梯度下降(Averaged Stochastic Gradient Descent))

簡單地說ASGD就是用空間換時間的一種SGD,詳細(xì)可參看論文:http://riejohnson.com/rie/stograd_nips.pdf

torch.optim.ASGD(params, lr=0.01, lambd=0.0001, alpha=0.75, t0=1000000.0, weight_decay=0)

參數(shù):

--params (iterable) – 待優(yōu)化參數(shù)的iterable或者是定義了參數(shù)組的dict

--lr (float, 可選) – 學(xué)習(xí)率(默認(rèn):1e-2)

--lambd (float, 可選) – 衰減項(默認(rèn):1e-4)

--alpha (float, 可選) – eta更新的指數(shù)(默認(rèn):0.75)

--t0 (float, 可選) – 指明在哪一次開始平均化(默認(rèn):1e6)

--weight_decay (float, 可選) – 權(quán)重衰減(L2懲罰)(默認(rèn): 0)

推薦程度:很少見


3硬毕、AdaGrad算法

獨立地適應(yīng)所有模型參數(shù)的學(xué)習(xí)率呻引,梯度越大,學(xué)習(xí)率越型驴取逻悠;梯度越小,學(xué)習(xí)率越大

Adagrad適用于數(shù)據(jù)稀疏或者分布不平衡的數(shù)據(jù)集

論文:http://www.jmlr.org/papers/volume12/duchi11a/duchi11a.pdf

class torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0)

參數(shù):

--params (iterable) – 待優(yōu)化參數(shù)的iterable或者是定義了參數(shù)組的dict

--lr (float, 可選) – 學(xué)習(xí)率(默認(rèn): 1e-2)

--lr_decay (float, 可選) – 學(xué)習(xí)率衰減(默認(rèn): 0)

--weight_decay (float, 可選) – 權(quán)重衰減(L2懲罰)(默認(rèn): 0)

優(yōu)點:它可以自動調(diào)節(jié)學(xué)習(xí)率挪丢,不需要人為調(diào)節(jié)

缺點:仍依賴于人工設(shè)置一個全局學(xué)習(xí)率蹂风,隨著迭代次數(shù)增多,學(xué)習(xí)率會越來越小乾蓬,最終會趨近于0

推薦程度:不推薦


4惠啄、AdaDelta算法

是Adagard的改進(jìn)版,對學(xué)習(xí)率進(jìn)行自適應(yīng)約束任内,但是進(jìn)行了計算上的簡化撵渡,加速效果不錯,訓(xùn)練速度快

論文:https://arxiv.org/pdf/1212.5701.pdf

torch.optim.Adadelta(params, lr=1.0, rho=0.9, eps=1e-06, weight_decay=0)

參數(shù):

--params (iterable) – 待優(yōu)化參數(shù)的iterable或者是定義了參數(shù)組的dict

--rho (float, 可選) – 用于計算平方梯度的運(yùn)行平均值的系數(shù)(默認(rèn):0.9)

--eps (float, 可選) – 為了增加數(shù)值計算的穩(wěn)定性而加到分母里的項(默認(rèn):1e-6)

--lr (float, 可選) – 在delta被應(yīng)用到參數(shù)更新之前對它縮放的系數(shù)(默認(rèn):1.0)

--weight_decay (float, 可選) – 權(quán)重衰減(L2懲罰)(默認(rèn): 0)

優(yōu)點:避免在訓(xùn)練后期死嗦,學(xué)習(xí)率過星骶唷;初期和中期越除,加速效果不錯节腐,訓(xùn)練速度快

缺點:還是需要自己手動指定初始學(xué)習(xí)率,初始梯度很大的話摘盆,會導(dǎo)致整個訓(xùn)練過程的學(xué)習(xí)率一直很小翼雀,在模型訓(xùn)練的后期,模型會反復(fù)地在局部最小值附近抖動孩擂,從而導(dǎo)致學(xué)習(xí)時間變長

在論文中提到AdaDelta有兩個改進(jìn)方法:

Accumulate Over Window

Correct Units with Hessian Approximation

推薦程度:可以試一試更好的


5狼渊、Rprop(彈性反向傳播)

1、首先為各權(quán)重變化賦一個初始值类垦,設(shè)定權(quán)重變化加速因子與減速因子狈邑。

2城须、在網(wǎng)絡(luò)前饋迭代中當(dāng)連續(xù)誤差梯度符號不變時,采用加速策略米苹,加快訓(xùn)練速度糕伐;當(dāng)連續(xù)誤差梯度符號變化時,采用減速策略驱入,以期穩(wěn)定收斂赤炒。

3氯析、網(wǎng)絡(luò)結(jié)合當(dāng)前誤差梯度符號與變化步長實現(xiàn)BP亏较,同時,為了避免網(wǎng)絡(luò)學(xué)習(xí)發(fā)生振蕩或下溢掩缓,算法要求設(shè)定權(quán)重變化的上下限雪情。

torch.optim.Rprop(params, lr=0.01, etas=(0.5, 1.2), step_sizes=(1e-06, 50))

參數(shù)

--params (iterable) – 待優(yōu)化參數(shù)的iterable或者是定義了參數(shù)組的dict

--lr (float, 可選) – 學(xué)習(xí)率(默認(rèn):1e-2)

--etas (Tuple[float,float], 可選) – 一對(etaminus,etaplis), 它們分別是乘法的增加和減小的因子(默認(rèn):0.5你辣,1.2)

--step_sizes (Tuple[float,float], 可選) – 允許的一對最小和最大的步長(默認(rèn):1e-6巡通,50)

缺點:優(yōu)化方法適用于full-batch,不適用于mini-batch舍哄,因此基本上沒什么用

推薦程度:不推薦宴凉!不能用在mini-batch,想不到在什么時候能用


6表悬、RMSProp(Root Mean Square Prop弥锄,均方根傳遞)

RProp的改進(jìn)版,也是Adagard的改進(jìn)版

思想:梯度震動較大的項蟆沫,在下降時籽暇,減小其下降速度;對于震動幅度小的項饭庞,在下降時戒悠,加速其下降速度

RMSprop采用均方根作為分母,可緩解Adagrad學(xué)習(xí)率下降較快的問題

論文:https://arxiv.org/pdf/1308.0850v5.pdf? http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf

對于RNN有很好的效果

torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)

參數(shù)

--params (iterable) – 待優(yōu)化參數(shù)的iterable或者是定義了參數(shù)組的dict

--lr (float, 可選) – 學(xué)習(xí)率(默認(rèn):1e-2)

--momentum (float, 可選) – 動量因子(默認(rèn):0)

--alpha (float, 可選) – 平滑常數(shù)(默認(rèn):0.99)

--eps (float, 可選) – 為了增加數(shù)值計算的穩(wěn)定性而加到分母里的項(默認(rèn):1e-8)

--centered (bool, 可選) – 如果為True舟山,計算中心化的RMSProp绸狐,并且用它的方差預(yù)測值對梯度進(jìn)行歸一化

--weight_decay (float, 可選) – 權(quán)重衰減(L2懲罰)(默認(rèn): 0)

優(yōu)點:可緩解Adagrad學(xué)習(xí)率下降較快的問題,并且引入均方根累盗,可以減少擺動寒矿,適合處理非平穩(wěn)目標(biāo),對于RNN效果很好

缺點:依然依賴于全局學(xué)習(xí)率

推薦程度:推薦幅骄!RMSProp算法在經(jīng)驗上已經(jīng)被證明是一種有效且實用的深度神經(jīng)網(wǎng)絡(luò)優(yōu)化算法劫窒。目前它是深度學(xué)習(xí)從業(yè)者經(jīng)常采用的優(yōu)化方法之一


7、Adam(AMSGrad)

將Momentum算法和RMSProp算法結(jié)合起來使用的一種算法拆座,既用動量來累積梯度主巍,又使得收斂速度更快同時使得波動的幅度更小冠息,并進(jìn)行了偏差修正

論文:https://arxiv.org/pdf/1412.6980.pdf

torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)

參數(shù)

--params (iterable) – 待優(yōu)化參數(shù)的iterable或者是定義了參數(shù)組的dict

--lr (float, 可選) – 學(xué)習(xí)率(默認(rèn):1e-3)

--betas (Tuple[float,float], 可選) – 用于計算梯度以及梯度平方的運(yùn)行平均值的系數(shù)(默認(rèn):0.9,0.999)

--eps (float, 可選) – 為了增加數(shù)值計算的穩(wěn)定性而加到分母里的項(默認(rèn):1e-8)

--weight_decay (float, 可選) – 權(quán)重衰減(L2懲罰)(默認(rèn): 0)

優(yōu)點:

1孕索、對目標(biāo)函數(shù)沒有平穩(wěn)要求逛艰,即loss function可以隨著時間變化

2、參數(shù)的更新不受梯度的伸縮變換影響

3搞旭、更新步長和梯度大小無關(guān)散怖,只和alpha、beta_1肄渗、beta_2有關(guān)系镇眷。并且由它們決定步長的理論上限

4、更新的步長能夠被限制在大致的范圍內(nèi)(初始學(xué)習(xí)率)

5翎嫡、能較好的處理噪音樣本欠动,能天然地實現(xiàn)步長退火過程(自動調(diào)整學(xué)習(xí)率)

6、很適合應(yīng)用于大規(guī)模的數(shù)據(jù)及參數(shù)的場景惑申、不穩(wěn)定目標(biāo)函數(shù)具伍、梯度稀疏或梯度存在很大噪聲的問題

推薦程度:非常推薦,基本上是最最常用的優(yōu)化方法


8圈驼、Adamax

Adam的改進(jìn)版人芽,對Adam增加了一個學(xué)習(xí)率上限的概念,是Adam的一種基于無窮范數(shù)的變種

論文:https://arxiv.org/pdf/1412.6980.pdf

torch.optim.Adamax(params, lr=0.002, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)

參數(shù):

--params (iterable) – 待優(yōu)化參數(shù)的iterable或者是定義了參數(shù)組的dict

--lr (float, 可選) – 學(xué)習(xí)率(默認(rèn):2e-3)

--betas (Tuple[float,float], 可選) – 用于計算梯度以及梯度平方的運(yùn)行平均值的系數(shù)

--eps (float, 可選) – 為了增加數(shù)值計算的穩(wěn)定性而加到分母里的項(默認(rèn):1e-8)

--weight_decay (float, 可選) – 權(quán)重衰減(L2懲罰)(默認(rèn): 0)

優(yōu)點:對學(xué)習(xí)率的上限提供了一個更簡單的范圍

推薦程度:非常推薦绩脆!其實也就是Adam的一個變種萤厅,差不了多少


9、Nadam

Adam的改進(jìn)版衙伶,類似于帶有Nesterov動量項的Adam祈坠,Nadam對學(xué)習(xí)率有了更強(qiáng)的約束,同時對梯度的更新也有更直接的影響矢劲。一般而言赦拘,在想使用帶動量的RMSprop,或者Adam的地方芬沉,大多可以使用Nadam取得更好的效果躺同。

這里先挖個坑,因為根據(jù)pytorch穩(wěn)定版的文檔好像還沒封裝Nadam函數(shù)丸逸,可是隔壁tensorflow已經(jīng)有了蹋艺,希望可以快點出來吧


10、SparseAdam

針對稀疏張量的一種“閹割版”Adam優(yōu)化方法

torch.optim.SparseAdam(params,lr=0.001,betas=(0.9,0.999),eps=1e-08)

參數(shù)
--params (iterable) – 待優(yōu)化參數(shù)的iterable或者是定義了參數(shù)組的dict

--lr (float, 可選) – 學(xué)習(xí)率(默認(rèn):2e-3)

--betas (Tuple[float,float], 可選) – 用于計算梯度以及梯度平方的運(yùn)行平均值的系數(shù)(默認(rèn):0.9黄刚,0.999)

--eps (float, 可選) – 為了增加數(shù)值計算的穩(wěn)定性而加到分母里的項(默認(rèn):1e-8)

優(yōu)點:相當(dāng)于Adam的稀疏張量專用版本

推薦程度:推薦捎谨,在處理稀疏張量的時候尤其推薦


11、AdamW

Adam的進(jìn)化版,是目前訓(xùn)練神經(jīng)網(wǎng)絡(luò)最快的方式

論文:https://arxiv.org/pdf/1711.05101.pdf

torch.optim.AdamW(params,lr=0.001,betas=(0.9,0.999),eps=1e-08,weight_decay=0.01,amsgrad=False)

參數(shù)
--params (iterable) – 待優(yōu)化參數(shù)的iterable或者是定義了參數(shù)組的dict

--lr (float, 可選) – 學(xué)習(xí)率(默認(rèn):1e-3)

--betas (Tuple[float,float], 可選) – 用于計算梯度以及梯度平方的運(yùn)行平均值的系數(shù)(默認(rèn):0.9涛救,0.999)

--eps (float, 可選) – 為了增加數(shù)值計算的穩(wěn)定性而加到分母里的項(默認(rèn):1e-8)

--weight_decay (float, 可選) – 權(quán)重衰減(L2懲罰)(默認(rèn): 1e-2)

--amsgrad(boolean, optional) – 是否使用從論文On the Convergence of Adam and Beyond中提到的算法的AMSGrad變體(默認(rèn):False)

優(yōu)點:比Adam收斂得更快

缺點:只有fastai使用畏邢,缺乏廣泛的框架,而且也具有很大的爭議性

推薦程度:觀望检吆!希望之后能成為主流


12舒萎、L-BFGS(Limited-memory Broyden–Fletcher–Goldfarb–Shanno)

是一種在牛頓法基礎(chǔ)上提出的一種求解函數(shù)根的算法,簡單來說蹭沛,L-BFGS和梯度下降臂寝、SGD干的同樣的事情,但大多數(shù)情況下收斂速度更快

L-BFGS是對BFGS的改進(jìn)摊灭,特點就是節(jié)省內(nèi)存

是解無約束非線性規(guī)劃問題最常用的方法

torch.optim.LBFGS(params, lr=1, max_iter=20, max_eval=None, tolerance_grad=1e-05, tolerance_change=1e-09, history_size=100,line_search_fn=None)

警告

這個optimizer不支持為每個參數(shù)單獨設(shè)置選項以及不支持參數(shù)組(只能有一個)

目前所有的參數(shù)不得不都在同一設(shè)備上咆贬。在將來這會得到改進(jìn)。

注意

這是一個內(nèi)存高度密集的optimizer(它要求額外的param_bytes * (history_size + 1)個字節(jié))斟或。內(nèi)存不符合要求素征,嘗試減小history size集嵌,或者使用不同的算法萝挤。

參數(shù)

--lr (float) – 學(xué)習(xí)率(默認(rèn):1)

--max_iter (int) – 每一步優(yōu)化的最大迭代次數(shù)(默認(rèn):20))

--max_eval (int) – 每一步優(yōu)化的最大函數(shù)評價次數(shù)(默認(rèn):max * 1.25)

--tolerance_grad (float) – 一階最優(yōu)的終止容忍度(默認(rèn):1e-5)

--tolerance_change (float) – 在函數(shù)值/參數(shù)變化量上的終止容忍度(默認(rèn):1e-9)

--history_size (int) – 更新歷史的大小(默認(rèn):100)

優(yōu)點:收斂速度快根欧、內(nèi)存開銷少怜珍,是解無約束非線性規(guī)劃問題最常用的方法

缺點:使用條件嚴(yán)苛

推薦程度:酌情選擇,根據(jù)自己的需要考慮是否真的需要使用這個算法


下面是一些算法的對比gif凤粗,都是摘自網(wǎng)上的:


四種常用優(yōu)化器對比
收斂的可視化對比
有鞍點收斂的對比


收斂速度對比
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酥泛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嫌拣,更是在濱河造成了極大的恐慌柔袁,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件异逐,死亡現(xiàn)場離奇詭異捶索,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)灰瞻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門腥例,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人酝润,你說我怎么就攤上這事燎竖。” “怎么了要销?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵构回,是天一觀的道長。 經(jīng)常有香客問我,道長纤掸,這世上最難降的妖魔是什么拨扶? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮茁肠,結(jié)果婚禮上患民,老公的妹妹穿的比我還像新娘。我一直安慰自己垦梆,他們只是感情好匹颤,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著托猩,像睡著了一般印蓖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上京腥,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天赦肃,我揣著相機(jī)與錄音,去河邊找鬼公浪。 笑死他宛,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的欠气。 我是一名探鬼主播厅各,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼预柒!你這毒婦竟也來了队塘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤宜鸯,失蹤者是張志新(化名)和其女友劉穎憔古,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體淋袖,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡鸿市,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了适贸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灸芳。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拜姿,靈堂內(nèi)的尸體忽然破棺而出烙样,到底是詐尸還是另有隱情,我是刑警寧澤蕊肥,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布谒获,位于F島的核電站蛤肌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏批狱。R本人自食惡果不足惜裸准,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赔硫。 院中可真熱鬧炒俱,春花似錦、人聲如沸爪膊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽推盛。三九已至峦阁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耘成,已是汗流浹背榔昔。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留瘪菌,地道東北人撒会。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像控嗜,于是被迫代替她去往敵國和親茧彤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

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