本文是從網(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.SGD的momentum參數(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)上的: