torch.optim
是實現(xiàn)各種優(yōu)化算法的軟件包。 已經(jīng)支持最常用的方法,并且接口足夠通用,因此將來也可以輕松集成更復雜的方法。
要使用 torch.optim
,您必須構造一個優(yōu)化器對象,該對象將保持當前狀態(tài)并根據(jù)計算出的梯度更新參數(shù)。
要構建 Optimizer
,您必須為其提供一個包含參數(shù)的可迭代項(所有參數(shù)應為Variable
)以進行優(yōu)化。 然后,您可以指定優(yōu)化器特定的選項,例如學習率,權重衰減等。
注意
如果您需要通過.cuda()
將模型移至 GPU,請在為其構建優(yōu)化器之前執(zhí)行此操作。 .cuda()
之后的模型參數(shù)將與調(diào)用之前的參數(shù)不同。
通常,在構造和使用優(yōu)化器時,應確保優(yōu)化的參數(shù)位于一致的位置。
例:
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
optimizer = optim.Adam([var1, var2], lr=0.0001)
Optimizer
也支持指定每個參數(shù)選項。 為此,不要傳遞Variable
的迭代器,而是傳遞dict
的迭代器。 它們每個都將定義一個單獨的參數(shù)組,并且應包含一個params
鍵,其中包含屬于它的參數(shù)列表。 其他鍵應與優(yōu)化器接受的關鍵字參數(shù)匹配,并將用作該組的優(yōu)化選項。
Note
您仍然可以將選項作為關鍵字參數(shù)傳遞。 在未覆蓋它們的組中,它們將用作默認值。 當您只想改變一個選項,同時使所有其他參數(shù)組保持一致時,這很有用。
例如,當要指定每層學習率時,這非常有用:
optim.SGD([
{'params': model.base.parameters()},
{'params': model.classifier.parameters(), 'lr': 1e-3}
], lr=1e-2, momentum=0.9)
這意味著model.base
的參數(shù)將使用默認的學習率1e-2
,model.classifier
的參數(shù)將使用1e-3
的學習率,并且動量0.9
會用于所有參數(shù)。
所有優(yōu)化器均實現(xiàn) step()
方法,該方法可更新參數(shù)。 它可以以兩種方式使用:
optimizer.step()
這是大多數(shù)優(yōu)化程序支持的簡化版本。 一旦使用例如計算出梯度,就可以調(diào)用該函數(shù)。 backward()
。
Example:
for input, target in dataset:
optimizer.zero_grad()
output = model(input)
loss = loss_fn(output, target)
loss.backward()
optimizer.step()
optimizer.step(closure)
某些優(yōu)化算法(例如共軛梯度和 LBFGS)需要多次重新評估函數(shù),因此您必須傳遞閉包以允許它們重新計算模型。 閉合應清除梯度,計算損耗,然后將其返回。
Example:
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)?
所有優(yōu)化程序的基類。
警告
需要將參數(shù)指定為具有確定性順序的集合,這些順序在兩次運行之間是一致的。 不滿足這些屬性的對象的示例是字典值的集合和迭代器。
參數(shù)
torch.Tensor
或dict
s 的迭代。 指定應優(yōu)化哪些張量。add_param_group(param_group)?
將參數(shù)組添加到 Optimizer
的 <cite>param_groups</cite> 中。
當對預訓練的網(wǎng)絡進行微調(diào)時,這很有用,因為可以使凍結層成為可訓練的,并隨著訓練的進行而添加到 Optimizer
中。
Parameters
load_state_dict(state_dict)?
加載優(yōu)化器狀態(tài)。
Parameters
state_dict (dict )–優(yōu)化器狀態(tài)。 應該是從對 state_dict()
的調(diào)用返回的對象。
state_dict()?
以dict
的形式返回優(yōu)化器的狀態(tài)。
它包含兩個條目:
state - a dict holding current optimization state. Its content
優(yōu)化器類之間有所不同。
step(closure)?
執(zhí)行單個優(yōu)化步驟(參數(shù)更新)。
Parameters
閉合(可調(diào)用的)–重新評估模型并返回損失的閉合。 對于大多數(shù)優(yōu)化程序是可選的。
zero_grad()?
清除所有優(yōu)化的 torch.Tensor
的梯度。
class torch.optim.Adadelta(params, lr=1.0, rho=0.9, eps=1e-06, weight_decay=0)?
實現(xiàn) Adadelta 算法。
Parameters
step(closure=None)?
執(zhí)行一個優(yōu)化步驟。
Parameters
閉合(可調(diào)用的, 可選)–重新評估模型并返回損失的閉合。
class torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0, initial_accumulator_value=0, eps=1e-10)?
實現(xiàn) Adagrad 算法。
它已在在線學習和隨機優(yōu)化的自適應次梯度方法中提出。
Parameters
step(closure=None)?
Performs a single optimization step.
Parameters
closure (callable__, optional) – A closure that reevaluates the model and returns the loss.
class torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=False)?
實現(xiàn)亞當算法。
Parameters
step(closure=None)?
Performs a single optimization step.
Parameters
closure (callable__, optional) – A closure that reevaluates the model and returns the loss.
class torch.optim.AdamW(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0.01, amsgrad=False)?
實現(xiàn) AdamW 算法。
最初的 Adam 算法是在 Adam:隨機優(yōu)化方法中提出的。 AdamW 變體在去耦權重衰減正則化中提出。
Parameters
step(closure=None)?
Performs a single optimization step.
Parameters
closure (callable__, optional) – A closure that reevaluates the model and returns the loss.
class torch.optim.SparseAdam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08)?
實現(xiàn)適用于稀疏張量的 Adam 算法的惰性版本。
在此變體中,僅顯示出現(xiàn)在漸變中的力矩,并且僅將漸變的那些部分應用于參數(shù)。
Parameters
step(closure=None)?
Performs a single optimization step.
Parameters
closure (callable__, optional) – A closure that reevaluates the model and returns the loss.
class torch.optim.Adamax(params, lr=0.002, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)?
實現(xiàn) Adamax 算法(基于無窮范數(shù)的 Adam 的變體)。
It has been proposed in Adam: A Method for Stochastic Optimization.
Parameters
step(closure=None)?
Performs a single optimization step.
Parameters
closure (callable__, optional) – A closure that reevaluates the model and returns the loss.
class torch.optim.ASGD(params, lr=0.01, lambd=0.0001, alpha=0.75, t0=1000000.0, weight_decay=0)?
實施平均隨機梯度下降。
在通過平均對隨機逼近的加速中提出。
Parameters
step(closure=None)?
Performs a single optimization step.
Parameters
closure (callable__, optional) – A closure that reevaluates the model and returns the loss.
class 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)?
實現(xiàn) L-BFGS 算法,該算法受到 <cite>minFunc < https://www.cs.ubc.ca/~schmidtm/Software/minFunc.html ></cite> 的啟發(fā)。
Warning
此優(yōu)化器不支持每個參數(shù)的選項和參數(shù)組(只能有一個)。
Warning
現(xiàn)在,所有參數(shù)都必須在單個設備上。 將來會有所改善。
Note
這是一個非常占用內(nèi)存的優(yōu)化器(它需要額外的param_bytes * (history_size + 1)
字節(jié))。 如果內(nèi)存不足,請嘗試減小歷史記錄的大小,或使用其他算法。
Parameters
step(closure)?
Performs a single optimization step.
Parameters
閉合(可調(diào)用的)–重新評估模型并返回損失的閉合。
class torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)?
實現(xiàn) RMSprop 算法。
由 G. Hinton 在他的課程中提出。
居中版本首先出現(xiàn)在中,并使用遞歸神經(jīng)網(wǎng)絡生成序列。
這里的實現(xiàn)在添加 epsilon 之前取梯度平均值的平方根(請注意,TensorFlow 會互換這兩個操作)。 因此,有效學習率是,其中
是計劃的學習率,
是平方梯度的加權移動平均值。
Parameters
True
來計算居中的 RMSProp,則通過對其斜率的估計對其進行歸一化 方差step(closure=None)?
Performs a single optimization step.
Parameters
closure (callable__, optional) – A closure that reevaluates the model and returns the loss.
class torch.optim.Rprop(params, lr=0.01, etas=(0.5, 1.2), step_sizes=(1e-06, 50))?
實現(xiàn)彈性反向傳播算法。
Parameters
step(closure=None)?
Performs a single optimization step.
Parameters
closure (callable__, optional) – A closure that reevaluates the model and returns the loss.
class torch.optim.SGD(params, lr=<required parameter>, momentum=0, dampening=0, weight_decay=0, nesterov=False)?
實現(xiàn)隨機梯度下降(可選帶動量)。
Nesterov 動量基于中關于初始化和動量在深度學習中的重要性的公式。
Parameters
例
>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
>>> optimizer.zero_grad()
>>> loss_fn(model(input), target).backward()
>>> optimizer.step()
Note
用 Momentum / Nesterov 實施 SGD 與 Sutskever 等人的方法有所不同。 等 以及其他一些框架中的實現(xiàn)。
考慮到動量的具體情況,可以將更新寫為
其中,p,g,v 和分別表示參數(shù),梯度,速度和動量。
這與 Sutskever 等人相反。 等 和其他使用表格更新的框架
Nesterov 版本進行了類似的修改。
step(closure=None)?
Performs a single optimization step.
Parameters
closure (callable__, optional) – A closure that reevaluates the model and returns the loss.
torch.optim.lr_scheduler
提供了幾種根據(jù)時期數(shù)來調(diào)整學習率的方法。 torch.optim.lr_scheduler.ReduceLROnPlateau
允許基于某些驗證度量來降低動態(tài)學習率。
優(yōu)化器更新后應應用學習率安排; 例如,您應該以這種方式編寫代碼:
>>> scheduler = ...
>>> for epoch in range(100):
>>> train(...)
>>> validate(...)
>>> scheduler.step()
Warning
在 PyTorch 1.1.0 之前,學習率調(diào)度程序應在優(yōu)化程序更新之前調(diào)用; 1.1.0 改變了這種行為,打破了 BC。 如果您在優(yōu)化程序更新之前(調(diào)用optimizer.step()
)使用學習率計劃程序(調(diào)用scheduler.step()
),則會跳過學習率計劃的第一個值。 如果升級到 PyTorch 1.1.0 后無法重現(xiàn)結果,請檢查是否在錯誤的時間調(diào)用了scheduler.step()
。
class torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1)?
將每個參數(shù)組的學習率設置為給定函數(shù)的初始 lr 倍。 當 last_epoch = -1 時,將初始 lr 設置為 lr。
Parameters
Example
>>> # Assuming optimizer has two groups.
>>> lambda1 = lambda epoch: epoch // 30
>>> lambda2 = lambda epoch: 0.95 ** epoch
>>> scheduler = LambdaLR(optimizer, lr_lambda=[lambda1, lambda2])
>>> for epoch in range(100):
>>> train(...)
>>> validate(...)
>>> scheduler.step()
load_state_dict(state_dict)?
加載調(diào)度程序狀態(tài)。
Parameters
state_dict (dict )–調(diào)度程序狀態(tài)。 應該是從對 state_dict()
的調(diào)用返回的對象。
state_dict()?
返回調(diào)度程序的狀態(tài)為dict
。
它包含 self . dict 中不是優(yōu)化程序的每個變量的條目。 學習率 lambda 函數(shù)僅在它們是可調(diào)用對象時才被保存,而在它們是函數(shù)或 lambda 時才被保存。
class torch.optim.lr_scheduler.MultiplicativeLR(optimizer, lr_lambda, last_epoch=-1)?
將每個參數(shù)組的學習率乘以指定函數(shù)中給定的因子。 當 last_epoch = -1 時,將初始 lr 設置為 lr。
Parameters
Example
>>> # Assuming optimizer has two groups.
>>> lmbda = lambda epoch: 0.95
>>> scheduler = LambdaLR(optimizer, lr_lambda=lmbda)
>>> for epoch in range(100):
>>> train(...)
>>> validate(...)
>>> scheduler.step()
load_state_dict(state_dict)?
Loads the schedulers state.
Parameters
state_dict (dict )–調(diào)度程序狀態(tài)。 應該是從對 state_dict()
的調(diào)用返回的對象。
state_dict()?
Returns the state of the scheduler as a dict
.
It contains an entry for every variable in self.dict which is not the optimizer. The learning rate lambda functions will only be saved if they are callable objects and not if they are functions or lambdas.
class torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)?
在每個 step_size 時期,通過 gamma 降低每個參數(shù)組的學習率。 注意,這種衰減可能與此調(diào)度程序外部的學習速率的其他更改同時發(fā)生。 當 last_epoch = -1 時,將初始 lr 設置為 lr。
Parameters
Example
>>> # Assuming optimizer uses lr = 0.05 for all groups
>>> # lr = 0.05 if epoch < 30
>>> # lr = 0.005 if 30 <= epoch < 60
>>> # lr = 0.0005 if 60 <= epoch < 90
>>> # ...
>>> scheduler = StepLR(optimizer, step_size=30, gamma=0.1)
>>> for epoch in range(100):
>>> train(...)
>>> validate(...)
>>> scheduler.step()
class torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1)?
一旦歷元數(shù)達到其中一個里程碑,則通過伽馬衰減每個參數(shù)組的學習率。 注意,這種衰減可能與此調(diào)度程序外部的學習速率的其他更改同時發(fā)生。 當 last_epoch = -1 時,將初始 lr 設置為 lr。
Parameters
Example
>>> # Assuming optimizer uses lr = 0.05 for all groups
>>> # lr = 0.05 if epoch < 30
>>> # lr = 0.005 if 30 <= epoch < 80
>>> # lr = 0.0005 if epoch >= 80
>>> scheduler = MultiStepLR(optimizer, milestones=[30,80], gamma=0.1)
>>> for epoch in range(100):
>>> train(...)
>>> validate(...)
>>> scheduler.step()
class torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma, last_epoch=-1)?
在每個時期以伽馬衰減每個參數(shù)組的學習率。 當 last_epoch = -1 時,將初始 lr 設置為 lr。
Parameters
class torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=-1)?
使用余弦退火進度表設置每個參數(shù)組的學習率,其中設置為初始 lr,
是自 SGDR 上次重新啟動以來的時期數(shù):
當 last_epoch = -1 時,將初始 lr 設置為 lr。 注意,由于調(diào)度是遞歸定義的,因此其他操作員可以在此調(diào)度器外部同時修改學習率。 如果學習率僅由此調(diào)度程序設置,則每個步驟的學習率變?yōu)椋?/p>
它已在 SGDR:具有暖重啟的隨機梯度下降中提出。 請注意,這僅實現(xiàn) SGDR 的余弦退火部分,而不實現(xiàn)重新啟動。
Parameters
class torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10, verbose=False, threshold=0.0001, threshold_mode='rel', cooldown=0, min_lr=0, eps=1e-08)?
當指標停止改善時,降低學習率。 一旦學習停滯,模型通常會受益于將學習率降低 2-10 倍。 該調(diào)度程序讀取一個指標數(shù)量,如果在“耐心”時期沒有看到改善,則學習速度會降低。
Parameters
True
,則為每次更新向 stdout 打印一條消息。 默認值:False
。Example
>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
>>> scheduler = ReduceLROnPlateau(optimizer, 'min')
>>> for epoch in range(10):
>>> train(...)
>>> val_loss = validate(...)
>>> # Note that step should be called after validate()
>>> scheduler.step(val_loss)
class torch.optim.lr_scheduler.CyclicLR(optimizer, base_lr, max_lr, step_size_up=2000, step_size_down=None, mode='triangular', gamma=1.0, scale_fn=None, scale_mode='cycle', cycle_momentum=True, base_momentum=0.8, max_momentum=0.9, last_epoch=-1)?
根據(jù)周期學習率策略(CLR)設置每個參數(shù)組的學習率。 該策略以恒定的頻率在兩個邊界之間循環(huán)學習率,如論文訓練神經(jīng)網(wǎng)絡的循環(huán)學習率中所述。 兩個邊界之間的距離可以在每個迭代或每個周期的基礎上縮放。
周期性學習率策略會在每批之后更改學習率。 在將一批用于訓練之后,應調(diào)用<cite>步驟</cite>。
如本文所述,該類具有三個內(nèi)置策略:
此實現(xiàn)改編自 github 存儲庫: bckenstler / CLR
Parameters
True
,則動量與學習速率成反比地在“ base_momentum”和“ max_momentum”之間循環(huán)。 默認值:TrueExample
>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
>>> scheduler = torch.optim.lr_scheduler.CyclicLR(optimizer, base_lr=0.01, max_lr=0.1)
>>> data_loader = torch.utils.data.DataLoader(...)
>>> for epoch in range(10):
>>> for batch in data_loader:
>>> train_batch(...)
>>> scheduler.step()
get_lr()?
計算批次索引的學習率。 此函數(shù)將 <cite>self.last_epoch</cite> 視為最后一批索引。
如果 <cite>self.cycle_momentum</cite> 為True
,則此功能具有更新優(yōu)化器動量的副作用。
class torch.optim.lr_scheduler.OneCycleLR(optimizer, max_lr, total_steps=None, epochs=None, steps_per_epoch=None, pct_start=0.3, anneal_strategy='cos', cycle_momentum=True, base_momentum=0.85, max_momentum=0.95, div_factor=25.0, final_div_factor=10000.0, last_epoch=-1)?
根據(jù) 1cycle 學習率策略設置每個參數(shù)組的學習率。 1 周期策略將學習速率從初始學習速率退火到某個最大學習速率,然后從該最大學習速率退火到某個遠低于初始學習速率的最小學習速率。 最初在論文超融合:使用大學習率的超快速神經(jīng)網(wǎng)絡訓練中描述了此策略。
1 周期學習率策略每批更改一次學習率。 在將一批用于訓練之后,應調(diào)用<cite>步驟</cite>。
此調(diào)度程序不可鏈接。
還請注意,可以用以下兩種方法之一確定循環(huán)中的步驟總數(shù)(按優(yōu)先順序列出):
您必須為 total_steps 提供一個值,或者為紀元和 steps_per_epoch 提供一個值。
Parameters
True
, momentum is cycled inversely to learning rate between 'base_momentum' and 'max_momentum'. Default: TrueExample
>>> data_loader = torch.utils.data.DataLoader(...)
>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
>>> scheduler = torch.optim.lr_scheduler.OneCycleLR(optimizer, max_lr=0.01, steps_per_epoch=len(data_loader), epochs=10)
>>> for epoch in range(10):
>>> for batch in data_loader:
>>> train_batch(...)
>>> scheduler.step()
class torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(optimizer, T_0, T_mult=1, eta_min=0, last_epoch=-1)?
使用余弦退火進度表設置每個參數(shù)組的學習率,其中設置為初始 lr,
是自上次重啟以來的時期數(shù),
是兩次暖啟動之間的時期數(shù) 在 SGDR 中:
當時,設置
。 重新啟動后
時,設置
。
它已在 SGDR:具有暖重啟的隨機梯度下降中提出。
Parameters
step(epoch=None)?
每次批量更新后都可以調(diào)用該步驟
Example
>>> scheduler = CosineAnnealingWarmRestarts(optimizer, T_0, T_mult)
>>> iters = len(dataloader)
>>> for epoch in range(20):
>>> for i, sample in enumerate(dataloader):
>>> inputs, labels = sample['inputs'], sample['labels']
>>> scheduler.step(epoch + i / iters)
>>> optimizer.zero_grad()
>>> outputs = net(inputs)
>>> loss = criterion(outputs, labels)
>>> loss.backward()
>>> optimizer.step()
可以交錯方式調(diào)用此函數(shù)。
Example
>>> scheduler = CosineAnnealingWarmRestarts(optimizer, T_0, T_mult)
>>> for epoch in range(20):
>>> scheduler.step()
>>> scheduler.step(26)
>>> scheduler.step() # scheduler.step(27), instead of scheduler(20)
更多建議: