torch.optim
torch.optim
是一個實現了各類優化算法的庫。大部分經常使用的方法獲得支持,而且接口具有足夠的通用性,使得將來可以集成更加複雜的方法。php
如何使用optimizer
爲了使用torch.optim
,你須要構建一個optimizer對象。這個對象可以保持當前參數狀態並基於計算獲得的梯度進行參數更新。html
構建
爲了構建一個Optimizer
,你須要給它一個包含了須要優化的參數(必須都是Variable
對象)的iterable。而後,你能夠設置optimizer的參
數選項,好比學習率,權重衰減,等等。python
例子:算法
optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum=0.9)
optimizer = optim.Adam([var1, var2], lr = 0.0001)
爲每一個參數單獨設置選項
Optimizer
也支持爲每一個參數單獨設置選項。若想這麼作,不要直接傳入Variable
的iterable,而是傳入dict
的iterable。每個dict都分別定
義了一組參數,而且包含一個param
鍵,這個鍵對應參數的列表。其餘的鍵應該optimizer所接受的其餘參數的關鍵字相匹配,而且會被用於對這組參數的
優化。數組
注意:
閉包
你仍然可以傳遞選項做爲關鍵字參數。在未重寫這些選項的組中,它們會被用做默認值。當你只想改動一個參數組的選項,但其餘參數組的選項不變時,這是
很是有用的。app
例如,當咱們想指定每一層的學習率時,這是很是有用的:框架
optim.SGD([
{'params': model.base.parameters()},
{'params': model.classifier.parameters(), 'lr': 1e-3}
], lr=1e-2, momentum=0.9)
這意味着model.base
的參數將會使用1e-2
的學習率,model.classifier
的參數將會使用1e-3
的學習率,而且0.9
的momentum將會被用於所
有的參數。ide
進行單次優化
全部的optimizer都實現了step()
方法,這個方法會更新全部的參數。它能按兩種方式來使用:函數
optimizer.step()
這是大多數optimizer所支持的簡化版本。一旦梯度被如backward()
之類的函數計算好後,咱們就能夠調用這個函數。
例子
for input, target in dataset:
optimizer.zero_grad()
output = model(input)
loss = loss_fn(output, target)
loss.backward()
optimizer.step()
optimizer.step(closure)
一些優化算法例如Conjugate Gradient和LBFGS須要重複屢次計算函數,所以你須要傳入一個閉包去容許它們從新計算你的模型。這個閉包應當清空梯度,
計算損失,而後返回。
例子:
for input, target in dataset:
def closure():
optimizer.zero_grad()
output = model(input)
loss = loss_fn(output, target)
loss.backward()
return loss
optimizer.step(closure)
算法
class torch.optim.Optimizer(params, defaults) [source]
Base class for all optimizers.
參數:
- params (iterable) ——
Variable
或者dict
的iterable。指定了什麼參數應當被優化。
- defaults —— (dict):包含了優化選項默認值的字典(一個參數組沒有指定的參數選項將會使用默認值)。
load_state_dict(state_dict) [source]
加載optimizer狀態
參數:
state_dict (dict
) —— optimizer的狀態。應當是一個調用state_dict()
所返回的對象。
state_dict() [source]
以dict
返回optimizer的狀態。
它包含兩項。
- state – 一個保存了當前優化狀態的dict。optimizer的類別不一樣,state的內容也會不一樣。
- param_groups – 一個包含了所有參數組的dict。
step(closure) [source]
進行單次優化 (參數更新).
參數:
- closure (
callable
) – 一個從新評價模型並返回loss的閉包,對於大多數參數來講是可選的。
zero_grad() [source]
清空全部被優化過的Variable的梯度.
class torch.optim.Adadelta(params, lr=1.0, rho=0.9, eps=1e-06, weight_decay=0)[source]
實現Adadelta算法。
它在ADADELTA: An Adaptive Learning Rate Method.中被提出。
參數:
- params (iterable) – 待優化參數的iterable或者是定義了參數組的dict
- rho (
float
, 可選) – 用於計算平方梯度的運行平均值的係數(默認:0.9)
- eps (
float
, 可選) – 爲了增長數值計算的穩定性而加到分母裏的項(默認:1e-6)
- lr (
float
, 可選) – 在delta被應用到參數更新以前對它縮放的係數(默認:1.0)
- weight_decay (
float
, 可選) – 權重衰減(L2懲罰)(默認: 0)
step(closure) [source]
進行單次優化 (參數更新).
參數:
- closure (
callable
) – 一個從新評價模型並返回loss的閉包,對於大多數參數來講是可選的。
class torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0)[source]
實現Adagrad算法。
它在 Adaptive Subgradient Methods for Online Learning and Stochastic Optimization中被提出。
參數:
- params (iterable) – 待優化參數的iterable或者是定義了參數組的dict
- lr (
float
, 可選) – 學習率(默認: 1e-2)
- lr_decay (
float
, 可選) – 學習率衰減(默認: 0)
- weight_decay (
float
, 可選) – 權重衰減(L2懲罰)(默認: 0)
step(closure) [source]
進行單次優化 (參數更新).
參數:
- closure (
callable
) – 一個從新評價模型並返回loss的閉包,對於大多數參數來講是可選的。
class torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)[source]
實現Adam算法。
它在Adam: A Method for Stochastic Optimization中被提出。
參數:
- params (iterable) – 待優化參數的iterable或者是定義了參數組的dict
- lr (
float
, 可選) – 學習率(默認:1e-3)
- betas (Tuple[
float
,float
], 可選) – 用於計算梯度以及梯度平方的運行平均值的係數(默認:0.9,0.999)
- eps (
float
, 可選) – 爲了增長數值計算的穩定性而加到分母裏的項(默認:1e-8)
- weight_decay (
float
, 可選) – 權重衰減(L2懲罰)(默認: 0)
step(closure) [source]
進行單次優化 (參數更新).
參數:
- closure (
callable
) – 一個從新評價模型並返回loss的閉包,對於大多數參數來講是可選的。
class torch.optim.Adamax(params, lr=0.002, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)[source]
實現Adamax算法(Adam的一種基於無窮範數的變種)。
它在Adam: A Method for Stochastic Optimization中被提出。
參數:
- params (iterable) – 待優化參數的iterable或者是定義了參數組的dict
- lr (
float
, 可選) – 學習率(默認:2e-3)
- betas (Tuple[
float
,float
], 可選) – 用於計算梯度以及梯度平方的運行平均值的係數
- eps (
float
, 可選) – 爲了增長數值計算的穩定性而加到分母裏的項(默認:1e-8)
- weight_decay (
float
, 可選) – 權重衰減(L2懲罰)(默認: 0)
step(closure) [source]
進行單次優化 (參數更新).
參數:
- closure (
callable
) – 一個從新評價模型並返回loss的閉包,對於大多數參數來講是可選的。
class torch.optim.ASGD(params, lr=0.01, lambd=0.0001, alpha=0.75, t0=1000000.0, weight_decay=0)[source]
實現平均隨機梯度降低算法。
它在Acceleration of stochastic approximation by averaging中被提出。
參數:
- params (iterable) – 待優化參數的iterable或者是定義了參數組的dict
- lr (
float
, 可選) – 學習率(默認:1e-2)
- lambd (
float
, 可選) – 衰減項(默認:1e-4)
- alpha (
float
, 可選) – eta更新的指數(默認:0.75)
- t0 (
float
, 可選) – 指明在哪一次開始平均化(默認:1e6)
- weight_decay (
float
, 可選) – 權重衰減(L2懲罰)(默認: 0)
step(closure) [source]
進行單次優化 (參數更新).
參數:
- closure (
callable
) – 一個從新評價模型並返回loss的閉包,對於大多數參數來講是可選的。
class 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)[source]
實現L-BFGS算法。
警告
這個optimizer不支持爲每一個參數單獨設置選項以及不支持參數組(只能有一個)
警告
目前全部的參數不得不都在同一設備上。在未來這會獲得改進。
注意
這是一個內存高度密集的optimizer(它要求額外的param_bytes * (history_size + 1)
個字節)。若是它不適應內存,嘗試減少history size,或者使用不一樣的算法。
參數:
- lr (
float
) – 學習率(默認:1)
- max_iter (
int
) – 每一步優化的最大迭代次數(默認:20))
- max_eval (
int
) – 每一步優化的最大函數評價次數(默認:max * 1.25)
- tolerance_grad (
float
) – 一階最優的終止容忍度(默認:1e-5)
- tolerance_change (
float
) – 在函數值/參數變化量上的終止容忍度(默認:1e-9)
- history_size (
int
) – 更新歷史的大小(默認:100)
step(closure) [source]
進行單次優化 (參數更新).
參數:
- closure (
callable
) – 一個從新評價模型並返回loss的閉包,對於大多數參數來講是可選的。
class torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)[source]
實現RMSprop算法。
由G. Hint
on在他的課程中提出.
中心版本首次出如今Generating Sequences With Recurrent Neural Networks.
參數:
- params (iterable) – 待優化參數的iterable或者是定義了參數組的dict
- lr (
float
, 可選) – 學習率(默認:1e-2)
- momentum (
float
, 可選) – 動量因子(默認:0)
- alpha (
float
, 可選) – 平滑常數(默認:0.99)
- eps (
float
, 可選) – 爲了增長數值計算的穩定性而加到分母裏的項(默認:1e-8)
- centered (
bool
, 可選) – 若是爲True,計算中心化的RMSProp,而且用它的方差預測值對梯度進行歸一化
- weight_decay (
float
, 可選) – 權重衰減(L2懲罰)(默認: 0)
step(closure) [source]
進行單次優化 (參數更新).
參數:
- closure (
callable
) – 一個從新評價模型並返回loss的閉包,對於大多數參數來講是可選的。
class torch.optim.Rprop(params, lr=0.01, etas=(0.5, 1.2), step_sizes=(1e-06, 50))[source]
實現彈性反向傳播算法。
參數:
- params (iterable) – 待優化參數的iterable或者是定義了參數組的dict
- lr (
float
, 可選) – 學習率(默認:1e-2)
- etas (Tuple[
float
,float
], 可選) – 一對(etaminus,etaplis), 它們分別是乘法的增長和減少的因子(默認:0.5,1.2)
- step_sizes (Tuple[
float
,float
], 可選) – 容許的一對最小和最大的步長(默認:1e-6,50)
step(closure) [source]
進行單次優化 (參數更新).
參數:
- closure (
callable
) – 一個從新評價模型並返回loss的閉包,對於大多數參數來講是可選的。
class torch.optim.SGD(params, lr=, momentum=0, dampening=0, weight_decay=0, nesterov=False)[source]
實現隨機梯度降低算法(momentum可選)。
Nesterov動量基於On the importance of initialization and momentum in deep learning中的公式.
參數:
- params (iterable) – 待優化參數的iterable或者是定義了參數組的dict
- lr (
float
) – 學習率
- momentum (
float
, 可選) – 動量因子(默認:0)
- weight_decay (
float
, 可選) – 權重衰減(L2懲罰)(默認:0)
- dampening (
float
, 可選) – 動量的抑制因子(默認:0)
- nesterov (
bool
, 可選) – 使用Nesterov動量(默認:False)
例子:
>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
>>> optimizer.zero_grad()
>>> loss_fn(model(input), target).backward()
>>> optimizer.step()
Note
帶有動量/Nesterov的SGD的實現稍微不一樣於Sutskever等人以及其餘框架中的實現。
考慮動量的具體狀況,更新能夠寫成
v=ρ∗v+g
p=p−lr∗v
其中,p、g、v和ρ分別是參數、梯度、速度和動量。
這跟Sutskever等人以及其餘框架的實現是相反的,它們採用這樣的更新
v=ρ∗v+lr∗g
p=p−v
Nesterov的版本也相似地被修改了。
step(closure) [source]
進行單次優化 (參數更新).
參數:
- closure (
callable
) – 一個從新評價模型並返回loss的閉包,對於大多數參數來講是可選的。
艾伯特(http://www.aibbt.com/)國內第一家人工智能門戶