pytorch梯度下降函数_Pytorch中常用的四种优化器SGD、Momentum、RMSProp、Adam
編輯: ShuYini
校稿: ShuYini
時(shí)間: 2019-8-16
引言
????很多人在使用pytorch的時(shí)候都會(huì)遇到優(yōu)化器選擇的問題,今天就給大家介紹對比一下pytorch中常用的四種優(yōu)化器。SGD、Momentum、RMSProp、Adam。
隨機(jī)梯度下降法(SGD)
算法介紹
????對比批量梯度下降法,假設(shè)從一批訓(xùn)練樣本
中隨機(jī)選取一個(gè)樣本 。模型參數(shù)為 ,代價(jià)函數(shù)為 ,梯度為 ,學(xué)習(xí)率為 ,則使用隨機(jī)梯度下降法更新參數(shù)表達(dá)式為:???其中,
, 表示隨機(jī)選擇的一個(gè)梯度方向, 表示t時(shí)刻的模型參數(shù)。 ,這里雖然引入了隨機(jī)性和噪聲,但期望仍然等于正確的梯度下降。????基本策略可以理解為隨機(jī)梯度下降像是一個(gè)盲人下山,不用每走一步計(jì)算一次梯度,但是他總能下到山底,只不過過程會(huì)顯得扭扭曲曲。
算法評價(jià)
優(yōu)點(diǎn):
????雖然SGD需要走很多步的樣子,但是對梯度的要求很低(計(jì)算梯度快)。而對于引入噪聲,大量的理論和實(shí)踐工作證明,只要噪聲不是特別大,SGD都能很好地收斂。應(yīng)用大型數(shù)據(jù)集時(shí),訓(xùn)練速度很快。比如每次從百萬數(shù)據(jù)樣本中,取幾百個(gè)數(shù)據(jù)點(diǎn),算一個(gè)SGD梯度,更新一下模型參數(shù)。相比于標(biāo)準(zhǔn)梯度下降法的遍歷全部樣本,每輸入一個(gè)樣本更新一次參數(shù),要快得多。
缺點(diǎn):
????SGD在隨機(jī)選擇梯度的同時(shí)會(huì)引入噪聲,使得權(quán)值更新的方向不一定正確。此外,SGD也沒能單獨(dú)克服局部最優(yōu)解的問題。
標(biāo)準(zhǔn)動(dòng)量優(yōu)化算法(Momentum)
算法介紹
????使用動(dòng)量(Momentum)的隨機(jī)梯度下降法(SGD),主要思想是引入一個(gè)積攢歷史梯度信息動(dòng)量來加速SGD。從訓(xùn)練集中取一個(gè)大小為n的小批量
樣本,對應(yīng)的真實(shí)值分別為 ,則Momentum優(yōu)化表達(dá)式為:其中,
表示t時(shí)刻積攢的加速度。α表示動(dòng)力的大小,一般取值為0.9(表示最大速度10倍于SGD)。 含義見SGD算法。 表示t時(shí)刻模型參數(shù)。算法的理解
????動(dòng)量主要解決SGD的兩個(gè)問題:一是隨機(jī)梯度的方法(引入的噪聲);二是Hessian矩陣病態(tài)問題(可以理解為SGD在收斂過程中和正確梯度相比來回?cái)[動(dòng)比較大的問題)。
????簡單理解:由于當(dāng)前權(quán)值的改變會(huì)受到上一次權(quán)值改變的影響,類似于小球向下滾動(dòng)的時(shí)候帶上了慣性。這樣可以加快小球向下滾動(dòng)的速度。
RMSProp算法
算法介紹
????與動(dòng)量梯度下降一樣,都是消除梯度下降過程中的擺動(dòng)來加速梯度下降的方法。 梯度更新公式:
????更新權(quán)重的時(shí)候,使用除根號的方法,可以使較大的梯度大幅度變小,而較小的梯度小幅度變小,這樣就可以使較大梯度方向上的波動(dòng)小下來,那么整個(gè)梯度下降的過程中擺動(dòng)就會(huì)比較小,就能設(shè)置較大的learning-rate,使得學(xué)習(xí)步子變大,達(dá)到加快學(xué)習(xí)的目的。
????在實(shí)際的應(yīng)用中,權(quán)重W或者b往往是很多維度權(quán)重集合,就是多維的,在進(jìn)行除根號操作中,會(huì)將其中大的維度的梯度大幅降低,不是說權(quán)重W變化趨勢一樣。
????RMSProp算法在經(jīng)驗(yàn)上已經(jīng)被證明是一種有效且實(shí)用的深度神經(jīng)網(wǎng)絡(luò)優(yōu)化算法。目前它是深度學(xué)習(xí)從業(yè)者經(jīng)常采用的優(yōu)化方法之一。
Adam算法
算法介紹
????Adam中動(dòng)量直接并入了梯度一階矩(指數(shù)加權(quán))的估計(jì)。其次,相比于缺少修正因子導(dǎo)致二階矩估計(jì)可能在訓(xùn)練初期具有很高偏置的RMSProp,Adam包括偏置修正,修正從原點(diǎn)初始化的一階矩(動(dòng)量項(xiàng))和(非中心的)二階矩估計(jì)。Adam算法策略可以表示為:
????其中,
和 分別為一階動(dòng)量項(xiàng)和二階動(dòng)量項(xiàng)。 為動(dòng)力值大小通常分別取0.9和0.999; , 分別為各自的修正值。 表示t時(shí)刻即第t迭代模型的參數(shù), 表示t次迭代代價(jià)函數(shù)關(guān)于W的梯度大小;?是一個(gè)取值很小的數(shù)(一般為1e-8)為了避免分母為0。算法分析
????該方法和RMSProp很像,除了使用的是平滑版的梯度m,而不是原始梯度dx。推薦參數(shù)值eps=1e-8, beta1=0.9, beta2=0.999。在實(shí)際操作中,推薦Adam作為默認(rèn)算法,一般比RMSProp要好一點(diǎn)。
算法比較
????為了驗(yàn)證四種算法的性能,在pytorch中的對同一個(gè)網(wǎng)絡(luò)進(jìn)行優(yōu)化,比較四種算法損失函數(shù)隨著時(shí)間的變化情況。代碼如下:
opt_SGD=torch.optim.SGD(net_SGD.parameters(),lr=LR) opt_Momentum=torch.optim.SGD(net_Momentum.parameters(),lr=LR,momentum=0.8) opt_RMSprop=torch.optim.RMSprop(net_RMSprop.parameters(),lr=LR,alpha=0.9) opt_Adam=torch.optim.Adam(net_Adam.parameters(),lr=LR,betas=(0.9,0.99))????SGD 是最普通的優(yōu)化器, 也可以說沒有加速效果, 而 Momentum 是 SGD 的改良版, 它加入了動(dòng)量原則. 后面的 RMSprop 又是 Momentum 的升級版. 而 Adam 又是 RMSprop 的升級版. 不過從這個(gè)結(jié)果中我們看到, Adam 的效果似乎比 RMSprop 要差一點(diǎn). 所以說并不是越先進(jìn)的優(yōu)化器, 結(jié)果越佳。
參考:
https://blog.csdn.net/weixin_40170902/article/details/80092628
Attention
更多自然語言處理相關(guān)知識,還請關(guān)注AINLPer公眾號,極品干貨即刻送達(dá)。
總結(jié)
以上是生活随笔為你收集整理的pytorch梯度下降函数_Pytorch中常用的四种优化器SGD、Momentum、RMSProp、Adam的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: keras中文文档_【DL项目实战02】
- 下一篇: php 参数 只用一次,php中,用函数