Pytorch基礎(十)——優化器(SGD,Adagrad,RMSprop,Adam,LBFGS等)

一、概念

Pytorch中優化器的目的:將損失函數計算出的差值Loss減小。
優化過程:優化器計算網絡參數的梯度,然后使用一定的算法策略來對參數進行計算,用新的參數來重新進行訓練,最終降低Loss。
其中官網提供了13種優化算法,其中主要的有5種:SGD(stochastic gradient descent 隨機梯度下降),Adagrad(自適應梯度算法),Adam(Adaptive Moment Estimation 自適應矩估計),RMSprop(Root Mean Square Prop 均方根),LBFGS(Limited-memory Broyden–Fletcher–Goldfarb–Shanno 有限內存中進行BFGS算法),其他均為改進算法,比如Adadelta是Adagrad的改進算法。
其中還有很多算法細節可能后續會慢慢補充。

二、介紹和示例

2.1 SGD算法

SGD算法可實現隨機梯度下降(可選動量)。
torch.optim.SGD(params, lr=, momentum=0, dampening=0, weight_decay=0, nesterov=False)
params:可迭代參數以優化或定義參數組。
lr:初始學習率,可隨著訓練過程不斷調整學習率。
momentum:動量,通常設置為0.9,0.8。momentum又稱為動量梯度下降。
dampening:動量阻尼,默認為0。
weight_decay:權值衰減系數,即L2正則化。
nesterov:啟用牛頓動量。Nesterov是Momentum的變種,就是梯度的計算方法有所不同,先用當前的速度v更新一遍權重θ,然后用更新參數p計算梯度g。
動量法:
在這里插入圖片描述
nesterov:
在這里插入圖片描述

learning_rate = 1e-2
optim = torch.optim.SGD(wzh.parameters(), lr=learning_rate, momentum=0.9, weight_decay=1e-2)# 優化器調優
optim.zero_grad()
loss.backward()
optim.step()

2.2、Adagrad

Adagrad算法可以自適應的給所有的參數分配學習率,學習率的大小與梯度的大小成反比。
torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0, initial_accumulator_value=0, eps=1e-10)
lr_decay:學習率衰減因子,默認為0。
eps :將其添加到分母以提高數值穩定性,默認值為1e-10,其主要的作用是避免分母為0.
在這里插入圖片描述

optim1 = torch.optim.Adagrad(wzh.parameters(), lr=learning_rate, lr_decay=0, weight_decay=0.01,initial_accumulator_value=0, eps=1e-10)

2.3 RMSprop

RMSprop算法是Adagrad的改進形式,特點是使用指數衰減滑動平均來更新梯度平方,以避免Adagrad累計梯度平方導致學習率過小的缺點。
torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)
alpha:平滑常數,默認為0.99。
centered:如果為真,計算中心 RMSProp,梯度通過其方差的估計進行歸一化。
在這里插入圖片描述

由官網給出的公式可以看出,用α的值來更新梯度平方。

optim2 = torch.optim.RMSprop(wzh.parameters(), lr=learning_rate, alpha=0.99, eps=1e-8, weight_decay=0.01,momentum=0, centered=False)

2.4 Adam

Adam算法結合了RMSProp和Momentum的算法思路,由公式可以看出,分別用m和v兩個動量來對梯度進行計算,可以說是目前應用相當廣泛的優化器算法。
betas:用于計算梯度及其平方的運行平均值的系數,默認值為(0.9, 0.999)。
amsgrad:是否使用論文 On the Convergence of Adam and Beyond 中該算法的 AMSGrad 變體,默認值為false。
在這里插入圖片描述

optim3 = torch.optim.Adam(wzh.parameters(), lr=learning_rate, betas=(0.9, 0.999), eps=1e-8, weight_decay=0.01,amsgrad=False)

2.5 LBFGS

LBFGS是BFGS四位大佬一起開發的一個算法,可以有效節省系統內存,縮小BFGS算法迭代產生的n維D矩陣,只保留部分步數。
pytorch中也可以使用改算法,但需要注意:
1:此優化器不支持每個參數選項和參數組(只能有一個)。
2:現在所有參數都必須在一個設備上。
3:這是一個非常占用內存的優化器(它需要額外的 param_bytes * (history_size + 1) 字節)。 如果它不適合內存嘗試減少歷史記錄大小,或使用不同的算法。
torch.optim.LBFGS(params, lr=1, max_iter=20, max_eval=None, tolerance_grad=1e-07, tolerance_change=1e-09, history_size=100, line_search_fn=None)
max_iter:每個優化步驟的最大迭代次數,默認值20。
max_eval:每個優化步驟的最大函數評估次數,默認值max_iter * 1.25.
tolerance_grad:一階最優性的終止容限,默認值1e-5。
tolerance_change:函數值/參數更改的終止容差,默認值1e-9。
history_size:更新歷史大小 。
line_search_fn:“strong_wolfe”或“None” 。
詳細原理部分可見:
一文讀懂L-BFGS算法

optim3 = torch.optim.LBFGS(wzh.parameters(), lr=1, max_iter=20, max_eval=None, tolerance_grad=1e-07, tolerance_change=1e-09, history_size=100, line_search_fn=None)

三、參考文章

通俗易懂理解(梯度下降)優化算法:Momentum、AdaGrad、RMSProp、Adam

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256175.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256175.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256175.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【圖像處理】——改變圖像的大小(降采樣重采樣)下采樣和上采樣

轉載自:https://jingyan.baidu.com/article/a3a3f81139be1f8da2eb8ade.html 上采樣、下采樣和金字塔加速參考:https://blog.csdn.net/Eastmount/article/details/89341077 目錄 1、拉伸圖片——重采樣 2、縮小圖片 1)三次插值法cv2.INTER_CUBIC

一段代碼到可執行程序所有經歷

如果你寫的代碼是hello.c,你的程序將經歷下面的步驟到達硬盤或者內存成為可執行文件。 第一步:hello.c(文本)經過預編譯生成hello.i(文本) 第二步:hello.i(文本)經過編譯…

js獲取url參數值

今天碰到要在一個頁面獲取另外一個頁面url傳過來的參數,一開始很本能的想到了用 split("?")這樣一步步的分解出需要的參數。 后來想了一下,肯定會有更加簡單的方法的!所以在網上找到了兩個很又簡單實用的方法,mark下 方…

[PyCharm]unindent does not match any outer indentation level解決方法

轉載:https://www.jianshu.com/p/b34f30717eb2 問題出現原因 1、代碼前后縮進量不一致 2、tab和space混用(如果一段代碼既使用space又使用tab進行縮進,會發生錯誤,這個時候PyCharm會自動進行判斷,根據設置的預先縮進…

為什么要選擇Apache Pulsar(二)

這是介紹Apache Pulsar關鍵特性系列文章的第二篇。Pulsar是由Yahoo開發并開源的下一代發布訂閱消息系統。在第一篇文章里,我們介紹了Pulsar對消息模型的靈活支持、多租戶、多地域復制和持久性。在這一篇文章里,我們將繼續介紹Pulsar的IO隔離機制、伸縮性…

Yolov5目標檢測模型運行遇到的相關問題匯總

一、yolov5-5.0常見錯誤 1. pycocotools工具包無法安裝 具體報錯如下: requirements: pycocotools>2.0 not found and is required by YOLOv5 pkg_resources.DistributionNotFound: The pycocotools>2.0 distribution was not found and is required by th…

PHP反射之類的反射

最近在琢磨如何用PHP實現站點的插件功能,需要用到反射,于是現學了一下,筆記如下: class Person {public $name Lily;public $gender male;public $age 20;public function eat(){echo Lily is eating!;}public function run(){…

數據結構(復習)--------關于平衡二叉樹(轉載)

在上一個專題中,我們在談論二叉查找樹的效率的時候。不同結構的二叉查找樹,查找效率有很大的不同(單支樹結構的查找效率退化成了順序查找)。如何解決這個問題呢?關鍵在于如何最大限度的減小樹的深度。正是基于這個想法…

mysql外鍵

效果 a,b,c 如果c設置到a的外鍵,那么只能在刪除c的記錄后,才能刪除a的記錄。 https://stackoverflow.com/questions/1905470/cannot-delete-or-update-a-parent-row-a-foreign-key-constraint-fails CREATE TABLE IF NOT EXISTS advertisers ( adverti…

C++總結筆記(一)—— 基礎知識匯總

很長時間沒有再復習C的基礎知識&#xff0c;現在將一些容易遺忘的知識點做一個簡單的匯總。 1、注釋 ??分為單行注釋和多行注釋 //cout<<endl;/*int i1;cout<<i<<endl;*/2、常量 ??宏常量&#xff1a;#define &#xff0c;宏常量沒有類型&#xff0c;…

微軟自帶iscsi客戶端對iqn的要求

節點名稱&#xff1a;Microsoft iSCSI 發起程序嚴格遵守為 iSCSI 節點名稱指定的規則。這些規則也適用于 Microsoft iSCSI 發起程序節點名稱以及發現的任何目標節點名稱。構建 iSCSI 節點名稱的規則&#xff08;如 iSCSI 規范以及“iSCSI 名稱的字符串配置文件”Internet 草稿中…

【Python數據結構】——鏈表

僅僅為了記錄 # 定義一個類&#xff0c;用于創建鏈表的結點 class LNode():def __init__(self,elem,next_ None):# 類的初始化方法,在實例化類的時候會自動調用self.elem elemself.next next_list1 LNode(1)# 類的實例化&#xff0c;LNode(1)為第一個鏈表結點&#xff0c;…

天貓雙11憑什么達到1682億?這些支撐技術或許可以告訴你

歷年「雙 11」都會掀起一股買買買的購物熱潮 阿里巴巴將這個原本普通的日子賦予了非凡的意義 今年&#xff0c;天貓以 1682 億的成交額再破記錄 而在這一系列瘋狂“秒殺”動作的背后 有一個叫云化架構的技術體系支撐著十幾億人的消費狂歡 12 月 8 日 ArchSummit 阿里技術專場 來…

PageLayoutControl的基本操作

整理了下對PageLayoutControl的基本功能操作 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071…

C++總結筆記(二)——指針

一、概念 1.1 指針的原理 找到一個比較精練的概述指針原理的句子&#xff1a; 指針變量就是在內存中保存變量的地址&#xff0c;然后通過地址來訪問數據。 int a 1; int* p &a; cout << p << endl;009DFEB4可以知道變量p在內存中的值就是a的地址&#xff…

Content的startActivity方法需添加FLAG_ACTIVITY_NEW_TASK flag

Content的startActivity方法需添加FLAG_ACTIVITY_NEW_TASK flag轉載于:https://www.cnblogs.com/zhujiabin/p/5085688.html

【圖像處理】——圖像內插法

參考:https://blog.csdn.net/lovexlsforever/article/details/79508602 cv2.resize函數 當我們縮小影像時,使用CV_INTER_AREA會有比較好的效果,當我們放大影像,CV_INTER_CUBIC會有最好的效果 void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, dou…

while read line 用法詳細介紹

循環中的重定向 或許你應該在其他腳本中見過下面的這種寫法&#xff1a; while read line do … done < file 剛開始看到這種結構時&#xff0c;很難理解< file是如何與循環配合在一起工作的。因為循環內有很多條命令&#xff0c;而我們之前接觸的重定向都是為一條命令工…

C++總結筆記(三)—— 結構體

一、概念 結構體是一種可以自定義數據類型的類型格式&#xff0c;一般用struct關鍵字進行定義。 //創建食物的結構體 struct Food {//屬性名string name; //名字int Price; //價格 };結構體有三種定義變量的方法。 1.1 定義結構體后再聲明變量&#xff0c;然后在對變量的…