torch.optim
torch.optim
是一個實現了各種優化算法的庫。大部分常用的方法得到支持,並且接口具備足夠的通用性,使得未來能夠集成更加復雜的方法。
如何使用optimizer
為了使用torch.optim
,你需要構建一個optimizer對象。這個對象能夠保持當前參數狀態並基於計算得到的梯度進行參數更新。
構建
為了構建一個Optimizer
,你需要給它一個包含了需要優化的參數(必須都是Variable
對象)的iterable。然后,你可以設置optimizer的參 數選項,比如學習率,權重衰減,等等。
例子:
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所接受的其他參數的關鍵字相匹配,並且會被用於對這組參數的 優化。
注意:
你仍然能夠傳遞選項作為關鍵字參數。在未重寫這些選項的組中,它們會被用作默認值。當你只想改動一個參數組的選項,但其他參數組的選項不變時,這是 非常有用的。
例如,當我們想指定每一層的學習率時,這是非常有用的:
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將會被用於所 有的參數。
進行單次優化
所有的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的閉包,對於大多數參數來說是可選的。