PyTorch torch.optim

2020-09-15 10:55 更新

原文: PyTorch torch.optim

torch.optim 是實(shí)現(xiàn)各種優(yōu)化算法的軟件包。 已經(jīng)支持最常用的方法,并且接口足夠通用,因此將來也可以輕松集成更復(fù)雜的方法。

如何使用優(yōu)化器

要使用 torch.optim ,您必須構(gòu)造一個(gè)優(yōu)化器對象,該對象將保持當(dāng)前狀態(tài)并根據(jù)計(jì)算出的梯度更新參數(shù)。

構(gòu)造它

要構(gòu)建 Optimizer ,您必須為其提供一個(gè)包含參數(shù)的可迭代項(xiàng)(所有參數(shù)應(yīng)為Variable)以進(jìn)行優(yōu)化。 然后,您可以指定優(yōu)化器特定的選項(xiàng),例如學(xué)習(xí)率,權(quán)重衰減等。

注意

如果您需要通過.cuda()將模型移至 GPU,請?jiān)跒槠錁?gòu)建優(yōu)化器之前執(zhí)行此操作。 .cuda()之后的模型參數(shù)將與調(diào)用之前的參數(shù)不同。

通常,在構(gòu)造和使用優(yōu)化器時(shí),應(yīng)確保優(yōu)化的參數(shù)位于一致的位置。

例:

optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
optimizer = optim.Adam([var1, var2], lr=0.0001)

每個(gè)參數(shù)選項(xiàng)

Optimizer 也支持指定每個(gè)參數(shù)選項(xiàng)。 為此,不要傳遞Variable的迭代器,而是傳遞dict的迭代器。 它們每個(gè)都將定義一個(gè)單獨(dú)的參數(shù)組,并且應(yīng)包含一個(gè)params鍵,其中包含屬于它的參數(shù)列表。 其他鍵應(yīng)與優(yōu)化器接受的關(guān)鍵字參數(shù)匹配,并將用作該組的優(yōu)化選項(xiàng)。

Note

您仍然可以將選項(xiàng)作為關(guān)鍵字參數(shù)傳遞。 在未覆蓋它們的組中,它們將用作默認(rèn)值。 當(dāng)您只想改變一個(gè)選項(xiàng),同時(shí)使所有其他參數(shù)組保持一致時(shí),這很有用。

例如,當(dāng)要指定每層學(xué)習(xí)率時(shí),這非常有用:

optim.SGD([
                {'params': model.base.parameters()},
                {'params': model.classifier.parameters(), 'lr': 1e-3}
            ], lr=1e-2, momentum=0.9)

這意味著model.base的參數(shù)將使用默認(rèn)的學(xué)習(xí)率1e-2,model.classifier的參數(shù)將使用1e-3的學(xué)習(xí)率,并且動(dòng)量0.9會(huì)用于所有參數(shù)。

采取優(yōu)化步驟

所有優(yōu)化器均實(shí)現(xiàn) step() 方法,該方法可更新參數(shù)。 它可以以兩種方式使用:

optimizer.step()

這是大多數(shù)優(yōu)化程序支持的簡化版本。 一旦使用例如計(jì)算出梯度,就可以調(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ù),因此您必須傳遞閉包以允許它們重新計(jì)算模型。 閉合應(yīng)清除梯度,計(jì)算損耗,然后將其返回。

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ù)指定為具有確定性順序的集合,這些順序在兩次運(yùn)行之間是一致的。 不滿足這些屬性的對象的示例是字典值的集合和迭代器。

參數(shù)

  • 參數(shù)(迭代)– torch.Tensordict s 的迭代。 指定應(yīng)優(yōu)化哪些張量。
  • 默認(rèn)值為 –(dict):包含優(yōu)化選項(xiàng)默認(rèn)值的 dict(在參數(shù)組未指定優(yōu)化選項(xiàng)時(shí)使用)。

add_param_group(param_group)?

將參數(shù)組添加到 Optimizer 的 <cite>param_groups</cite> 中。

當(dāng)對預(yù)訓(xùn)練的網(wǎng)絡(luò)進(jìn)行微調(diào)時(shí),這很有用,因?yàn)榭梢允箖鼋Y(jié)層成為可訓(xùn)練的,并隨著訓(xùn)練的進(jìn)行而添加到 Optimizer 中。

Parameters

  • param_group (dict )–指定應(yīng)與組一起優(yōu)化哪些張量
  • 優(yōu)化選項(xiàng)。 (特定于)–

load_state_dict(state_dict)?

加載優(yōu)化器狀態(tài)。

Parameters

state_dict (dict )–優(yōu)化器狀態(tài)。 應(yīng)該是從對 state_dict() 的調(diào)用返回的對象。

state_dict()?

dict的形式返回優(yōu)化器的狀態(tài)。

它包含兩個(gè)條目:

  • state - a dict holding current optimization state. Its content
    
    
    
    

優(yōu)化器類之間有所不同。

  • param_groups-包含所有參數(shù)組的字典

step(closure)?

執(zhí)行單個(gè)優(yōu)化步驟(參數(shù)更新)。

Parameters

閉合(可調(diào)用)–重新評估模型并返回?fù)p失的閉合。 對于大多數(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)?

實(shí)現(xiàn) Adadelta 算法。

ADADELTA 中提出了一種:自適應(yīng)學(xué)習(xí)率方法。

Parameters

  • 參數(shù)(可迭代)–參數(shù)可迭代以優(yōu)化或命令定義參數(shù)組
  • rho (python:float 可選)–用于計(jì)算平方梯度的移動(dòng)平均值的系數(shù)(默認(rèn)值:0.9)
  • eps (python:float , 可選)–分母添加到分母以提高數(shù)值穩(wěn)定性(默認(rèn)值:1e-6)
  • lr (python:float 可選)–在將增量應(yīng)用于參數(shù)之前對其進(jìn)行縮放的系數(shù)(默認(rèn)值:1.0)
  • weight_decay (python:float , 可選)–權(quán)重衰減(L2 懲罰)(默認(rèn)值:0)

step(closure=None)?

執(zhí)行一個(gè)優(yōu)化步驟。

Parameters

閉合(可調(diào)用的, 可選)–重新評估模型并返回?fù)p失的閉合。

class torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0, initial_accumulator_value=0, eps=1e-10)?

實(shí)現(xiàn) Adagrad 算法。

它已在在線學(xué)習(xí)和隨機(jī)優(yōu)化的自適應(yīng)次梯度方法中提出。

Parameters

  • params (iterable) – iterable of parameters to optimize or dicts defining parameter groups
  • lr (python:float , 可選)–學(xué)習(xí)率(默認(rèn)值:1e-2)
  • lr_decay (python:float , 可選)–學(xué)習(xí)速率衰減(默認(rèn)值:0)
  • weight_decay (python:float__, optional) – weight decay (L2 penalty) (default: 0)
  • eps (python:float , 可選)–分母添加到分母以提高數(shù)值穩(wěn)定性(默認(rèn)值:1e-10)

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)?

實(shí)現(xiàn)亞當(dāng)算法。

Adam 中提出了一種隨機(jī)優(yōu)化方法。

Parameters

  • params (iterable) – iterable of parameters to optimize or dicts defining parameter groups
  • lr (python:float 可選)–學(xué)習(xí)率(默認(rèn)值:1e-3)
  • Betas (Tuple [ python:float , python:float ] 可選)–用于計(jì)算梯度及其平方的移動(dòng)平均值的系數(shù)(默認(rèn)值:(0.9,0.999))
  • eps (python:float , 可選)–分母添加到分母以提高數(shù)值穩(wěn)定性(默認(rèn)值:1e-8)
  • weight_decay (python:float__, optional) – weight decay (L2 penalty) (default: 0)
  • amsgrad (布爾值 可選)–是否使用論文上該算法的 AMSGrad 變體 Adam and Beyond (默認(rèn)值:False)

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)?

實(shí)現(xiàn) AdamW 算法。

最初的 Adam 算法是在 Adam:隨機(jī)優(yōu)化方法中提出的。 AdamW 變體在去耦權(quán)重衰減正則化中提出。

Parameters

  • params (iterable) – iterable of parameters to optimize or dicts defining parameter groups
  • lr (python:float__, optional) – learning rate (default: 1e-3)
  • betas (Tuple[python:float__, python:float], optional) – coefficients used for computing running averages of gradient and its square (default: (0.9, 0.999))
  • eps (python:float__, optional) – term added to the denominator to improve numerical stability (default: 1e-8)
  • weight_decay (python:float , 可選)–權(quán)重衰減系數(shù)(默認(rèn)值:1e-2)
  • amsgrad (boolean__, optional) – whether to use the AMSGrad variant of this algorithm from the paper On the Convergence of Adam and Beyond (default: False)

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)?

實(shí)現(xiàn)適用于稀疏張量的 Adam 算法的惰性版本。

在此變體中,僅顯示出現(xiàn)在漸變中的力矩,并且僅將漸變的那些部分應(yīng)用于參數(shù)。

Parameters

  • params (iterable) – iterable of parameters to optimize or dicts defining parameter groups
  • lr (python:float__, optional) – learning rate (default: 1e-3)
  • betas (Tuple[python:float__, python:float], optional) – coefficients used for computing running averages of gradient and its square (default: (0.9, 0.999))
  • eps (python:float__, optional) – term added to the denominator to improve numerical stability (default: 1e-8)

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)?

實(shí)現(xiàn) Adamax 算法(基于無窮范數(shù)的 Adam 的變體)。

It has been proposed in Adam: A Method for Stochastic Optimization.

Parameters

  • params (iterable) – iterable of parameters to optimize or dicts defining parameter groups
  • lr (python:float , 可選)–學(xué)習(xí)率(默認(rèn)值:2e-3)
  • Betas (Tuple [ python:float python:float ] , 可選)–用于計(jì)算梯度及其平方的移動(dòng)平均值的系數(shù)
  • eps (python:float__, optional) – term added to the denominator to improve numerical stability (default: 1e-8)
  • weight_decay (python:float__, optional) – weight decay (L2 penalty) (default: 0)

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)?

實(shí)施平均隨機(jī)梯度下降。

在通過平均對隨機(jī)逼近的加速中提出。

Parameters

  • params (iterable) – iterable of parameters to optimize or dicts defining parameter groups
  • lr (python:float__, optional) – learning rate (default: 1e-2)
  • lambd (python:float , 可選)–衰減項(xiàng)(默認(rèn)值:1e-4)
  • alpha (python:float 可選)– eta 更新的電源(默認(rèn)值:0.75)
  • t0 (python:float , 可選)–開始平均的點(diǎn)(默認(rèn)值:1e6)
  • weight_decay (python:float__, optional) – weight decay (L2 penalty) (default: 0)

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)?

實(shí)現(xiàn) L-BFGS 算法,該算法受到 <cite>minFunc < https://www.cs.ubc.ca/~schmidtm/Software/minFunc.html ></cite> 的啟發(fā)。

Warning

此優(yōu)化器不支持每個(gè)參數(shù)的選項(xiàng)和參數(shù)組(只能有一個(gè))。

Warning

現(xiàn)在,所有參數(shù)都必須在單個(gè)設(shè)備上。 將來會(huì)有所改善。

Note

這是一個(gè)非常占用內(nèi)存的優(yōu)化器(它需要額外的param_bytes * (history_size + 1)字節(jié))。 如果內(nèi)存不足,請嘗試減小歷史記錄的大小,或使用其他算法。

Parameters

  • lr (python:float )–學(xué)習(xí)率(默認(rèn)值:1)
  • max_iter (python:int )–每個(gè)優(yōu)化步驟的最大迭代次數(shù)(默認(rèn)值:20)
  • max_eval (python:int )–每個(gè)優(yōu)化步驟的最大函數(shù)求值數(shù)(默認(rèn)值:max_iter * 1.25)。
  • tolerance_grad (python:float )–一階最優(yōu)的終止公差(默認(rèn)值:1e-5)。
  • tolerance_change (python:float )–函數(shù)值/參數(shù)更改的終止公差(默認(rèn)值:1e-9)。
  • history_size (python:int )–更新歷史記錄大小(默認(rèn)值:100)。
  • line_search_fn (str )–“ strong_wolfe”或“無”(默認(rèn)值:無)。

step(closure)?

Performs a single optimization step.

Parameters

閉合(可調(diào)用)–重新評估模型并返回?fù)p失的閉合。

class torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)?

實(shí)現(xiàn) RMSprop 算法。

由 G. Hinton 在他的課程中提出。

居中版本首先出現(xiàn)在中,并使用遞歸神經(jīng)網(wǎng)絡(luò)生成序列。

這里的實(shí)現(xiàn)在添加 epsilon 之前取梯度平均值的平方根(請注意,TensorFlow 會(huì)互換這兩個(gè)操作)。 因此,有效學(xué)習(xí)率是img,其中img是計(jì)劃的學(xué)習(xí)率,img是平方梯度的加權(quán)移動(dòng)平均值。

Parameters

  • params (iterable) – iterable of parameters to optimize or dicts defining parameter groups
  • lr (python:float__, optional) – learning rate (default: 1e-2)
  • 動(dòng)量 (python:float 可選)–動(dòng)量因子(默認(rèn)值:0)
  • alpha (python:float , 可選)–平滑常數(shù)(默認(rèn)值:0.99)
  • eps (python:float__, optional) – term added to the denominator to improve numerical stability (default: 1e-8)
  • 為中心的 (bool 可選)–如果True來計(jì)算居中的 RMSProp,則通過對其斜率的估計(jì)對其進(jìn)行歸一化 方差
  • weight_decay (python:float__, optional) – weight decay (L2 penalty) (default: 0)

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))?

實(shí)現(xiàn)彈性反向傳播算法。

Parameters

  • params (iterable) – iterable of parameters to optimize or dicts defining parameter groups
  • lr (python:float__, optional) – learning rate (default: 1e-2)
  • etas (元組 [ python:float , python:float ] , 可選)–對(增加,減少)(增加,減少)(默認(rèn)值:(0.5,1.2))
  • step_sizes (元組 [ python:float , python:float ] , 可選)–一對最小和最大允許步長(默認(rèn)值:(1e-6,50))

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)?

實(shí)現(xiàn)隨機(jī)梯度下降(可選帶動(dòng)量)。

Nesterov 動(dòng)量基于中關(guān)于初始化和動(dòng)量在深度學(xué)習(xí)中的重要性的公式。

Parameters

  • params (iterable) – iterable of parameters to optimize or dicts defining parameter groups
  • lr (python:float )–學(xué)習(xí)率
  • momentum (python:float__, optional) – momentum factor (default: 0)
  • weight_decay (python:float__, optional) – weight decay (L2 penalty) (default: 0)
  • 衰減 (python:float , 可選)–衰減動(dòng)量(默認(rèn)值:0)
  • nesterov (bool , 可選)–啟用 Nesterov 動(dòng)量(默認(rèn):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

用 Momentum / Nesterov 實(shí)施 SGD 與 Sutskever 等人的方法有所不同。 等 以及其他一些框架中的實(shí)現(xiàn)。

考慮到動(dòng)量的具體情況,可以將更新寫為

img

其中,p,g,v 和img分別表示參數(shù),梯度,速度和動(dòng)量。

這與 Sutskever 等人相反。 等 和其他使用表格更新的框架

img

Nesterov 版本進(jìn)行了類似的修改。

step(closure=None)?

Performs a single optimization step.

Parameters

closure (callable__, optional) – A closure that reevaluates the model and returns the loss.

如何調(diào)整學(xué)習(xí)率

torch.optim.lr_scheduler提供了幾種根據(jù)時(shí)期數(shù)來調(diào)整學(xué)習(xí)率的方法。 torch.optim.lr_scheduler.ReduceLROnPlateau 允許基于某些驗(yàn)證度量來降低動(dòng)態(tài)學(xué)習(xí)率。

優(yōu)化器更新后應(yīng)應(yīng)用學(xué)習(xí)率安排; 例如,您應(yīng)該以這種方式編寫代碼:

>>> scheduler = ...
>>> for epoch in range(100):
>>>     train(...)
>>>     validate(...)
>>>     scheduler.step()

Warning

在 PyTorch 1.1.0 之前,學(xué)習(xí)率調(diào)度程序應(yīng)在優(yōu)化程序更新之前調(diào)用; 1.1.0 改變了這種行為,打破了 BC。 如果您在優(yōu)化程序更新之前(調(diào)用optimizer.step())使用學(xué)習(xí)率計(jì)劃程序(調(diào)用scheduler.step()),則會(huì)跳過學(xué)習(xí)率計(jì)劃的第一個(gè)值。 如果升級到 PyTorch 1.1.0 后無法重現(xiàn)結(jié)果,請檢查是否在錯(cuò)誤的時(shí)間調(diào)用了scheduler.step()。

class torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1)?

將每個(gè)參數(shù)組的學(xué)習(xí)率設(shè)置為給定函數(shù)的初始 lr 倍。 當(dāng) last_epoch = -1 時(shí),將初始 lr 設(shè)置為 lr。

Parameters

  • 優(yōu)化器 (優(yōu)化器)–包裝的優(yōu)化器。
  • lr_lambda (函數(shù) 列表)–一個(gè)給定整數(shù)參數(shù)紀(jì)元的乘法因子或此類函數(shù)列表的函數(shù) ,對于 optimizer.param_groups 中的每個(gè)組一個(gè)。
  • last_epoch (python:int )–最后一個(gè)紀(jì)元的索引。 默認(rèn)值:-1。

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)。 應(yīng)該是從對 state_dict() 的調(diào)用返回的對象。

state_dict()?

返回調(diào)度程序的狀態(tài)為dict。

它包含 self . dict 中不是優(yōu)化程序的每個(gè)變量的條目。 學(xué)習(xí)率 lambda 函數(shù)僅在它們是可調(diào)用對象時(shí)才被保存,而在它們是函數(shù)或 lambda 時(shí)才被保存。

class torch.optim.lr_scheduler.MultiplicativeLR(optimizer, lr_lambda, last_epoch=-1)?

將每個(gè)參數(shù)組的學(xué)習(xí)率乘以指定函數(shù)中給定的因子。 當(dāng) last_epoch = -1 時(shí),將初始 lr 設(shè)置為 lr。

Parameters

  • optimizer (Optimizer) – Wrapped optimizer.
  • lr_lambda (function or list) – A function which computes a multiplicative factor given an integer parameter epoch, or a list of such functions, one for each group in optimizer.param_groups.
  • last_epoch (python:int) – The index of last epoch. Default: -1.

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)。 應(yīng)該是從對 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)?

在每個(gè) step_size 時(shí)期,通過 gamma 降低每個(gè)參數(shù)組的學(xué)習(xí)率。 注意,這種衰減可能與此調(diào)度程序外部的學(xué)習(xí)速率的其他更改同時(shí)發(fā)生。 當(dāng) last_epoch = -1 時(shí),將初始 lr 設(shè)置為 lr。

Parameters

  • optimizer (Optimizer) – Wrapped optimizer.
  • step_size (python:int )–學(xué)習(xí)率衰減的周期。
  • 伽瑪 (python:float )–學(xué)習(xí)率衰減的乘法因子。 默認(rèn)值:0.1
  • last_epoch (python:int) – The index of last epoch. Default: -1.

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ù)達(dá)到其中一個(gè)里程碑,則通過伽馬衰減每個(gè)參數(shù)組的學(xué)習(xí)率。 注意,這種衰減可能與此調(diào)度程序外部的學(xué)習(xí)速率的其他更改同時(shí)發(fā)生。 當(dāng) last_epoch = -1 時(shí),將初始 lr 設(shè)置為 lr。

Parameters

  • optimizer (Optimizer) – Wrapped optimizer.
  • 里程碑(列表)–時(shí)期索引列表。 必須增加。
  • gamma (python:float) – Multiplicative factor of learning rate decay. Default: 0.1.
  • last_epoch (python:int) – The index of last epoch. Default: -1.

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)?

在每個(gè)時(shí)期以伽馬衰減每個(gè)參數(shù)組的學(xué)習(xí)率。 當(dāng) last_epoch = -1 時(shí),將初始 lr 設(shè)置為 lr。

Parameters

  • optimizer (Optimizer) – Wrapped optimizer.
  • 伽瑪 (python:float )–學(xué)習(xí)率衰減的乘法因子。
  • last_epoch (python:int) – The index of last epoch. Default: -1.

class torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=-1)?

使用余弦退火進(jìn)度表設(shè)置每個(gè)參數(shù)組的學(xué)習(xí)率,其中img設(shè)置為初始 lr,img是自 SGDR 上次重新啟動(dòng)以來的時(shí)期數(shù):

img

當(dāng) last_epoch = -1 時(shí),將初始 lr 設(shè)置為 lr。 注意,由于調(diào)度是遞歸定義的,因此其他操作員可以在此調(diào)度器外部同時(shí)修改學(xué)習(xí)率。 如果學(xué)習(xí)率僅由此調(diào)度程序設(shè)置,則每個(gè)步驟的學(xué)習(xí)率變?yōu)椋?/p>

img

它已在 SGDR:具有暖重啟的隨機(jī)梯度下降中提出。 請注意,這僅實(shí)現(xiàn) SGDR 的余弦退火部分,而不實(shí)現(xiàn)重新啟動(dòng)。

Parameters

  • optimizer (Optimizer) – Wrapped optimizer.
  • T_max (python:int )–最大迭代次數(shù)。
  • eta_min (python:float )–最低學(xué)習(xí)率。 默認(rèn)值:0
  • last_epoch (python:int) – The index of last epoch. Default: -1.

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)?

當(dāng)指標(biāo)停止改善時(shí),降低學(xué)習(xí)率。 一旦學(xué)習(xí)停滯,模型通常會(huì)受益于將學(xué)習(xí)率降低 2-10 倍。 該調(diào)度程序讀取一個(gè)指標(biāo)數(shù)量,如果在“耐心”時(shí)期沒有看到改善,則學(xué)習(xí)速度會(huì)降低。

Parameters

  • optimizer (Optimizer) – Wrapped optimizer.
  • 模式 (str )– <cite>min</cite> , <cite>max</cite> 中的一種。 在 <cite>min</cite> 模式下,當(dāng)監(jiān)視的數(shù)量停止減少時(shí),lr 將減??; 在 <cite>max</cite> 模式下,當(dāng)監(jiān)視的數(shù)量停止增加時(shí),它將減少。 默認(rèn)值:“分鐘”。
  • 因子 (python:float )–將降低學(xué)習(xí)率的因子。 new_lr = lr *因子。 默認(rèn)值:0.1
  • 耐心 (python:int )–沒有改善的時(shí)期數(shù),之后學(xué)習(xí)率將降低。 例如,如果<cite>耐心= 2</cite> ,那么我們將忽略前兩個(gè)時(shí)期,而沒有改善,并且如果損失仍然沒有改善,則只會(huì)在第三個(gè)時(shí)期之后降低 LR。 默認(rèn)值:10
  • 詳細(xì) (bool )–如果True,則為每次更新向 stdout 打印一條消息。 默認(rèn)值:False。
  • 閾值 (python:float )–用于測量新最優(yōu)值的閾值,僅關(guān)注重大變化。 默認(rèn)值:1e-4。
  • threshold_mode?(str?)– <cite>相對</cite>, <cite>abs</cite> 之一。 在<cite>相對于</cite>模式下,dynamic_threshold =最佳(1 +閾值)在“最大”模式下,最佳(1-閾值)在 <cite>min</cite> 模式下。 在<cite>絕對</cite>模式下,dynamic_threshold =最佳+ <cite>max</cite> 模式下的閾值,或 best-閾值 <cite>min</cite> 模式下的閾值。 默認(rèn)值:“ rel”。
  • 冷卻時(shí)間 (python:int )–減少 lr 后恢復(fù)正常運(yùn)行之前要等待的時(shí)期數(shù)。 默認(rèn)值:0
  • min_lr (python:float 列表)–標(biāo)量或標(biāo)量列表。 所有參數(shù)組或每個(gè)組的學(xué)習(xí)率的下限。 默認(rèn)值:0
  • eps (python:float )–應(yīng)用于 lr 的最小衰減。 如果新舊 lr 之間的差異小于 eps,則忽略該更新。 默認(rèn)值:1e-8。

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ù)周期學(xué)習(xí)率策略(CLR)設(shè)置每個(gè)參數(shù)組的學(xué)習(xí)率。 該策略以恒定的頻率在兩個(gè)邊界之間循環(huán)學(xué)習(xí)率,如論文訓(xùn)練神經(jīng)網(wǎng)絡(luò)的循環(huán)學(xué)習(xí)率中所述。 兩個(gè)邊界之間的距離可以在每個(gè)迭代或每個(gè)周期的基礎(chǔ)上縮放。

周期性學(xué)習(xí)率策略會(huì)在每批之后更改學(xué)習(xí)率。 在將一批用于訓(xùn)練之后,應(yīng)調(diào)用<cite>步驟</cite>。

如本文所述,該類具有三個(gè)內(nèi)置策略:

  • “三角形”:沒有幅度縮放的基本三角形周期。
  • “ triangular2”:一個(gè)基本的三角形周期,它將每個(gè)周期的初始幅度縮放一半。
  • “ exp_range”:一個(gè)在每次循環(huán)迭代中按img縮放初始幅度的循環(huán)。

此實(shí)現(xiàn)改編自 github 存儲(chǔ)庫: bckenstler / CLR

Parameters

  • optimizer (Optimizer) – Wrapped optimizer.
  • base_lr (python:float 列表)–初始學(xué)習(xí)速率,它是每個(gè)參數(shù)組循環(huán)的下限。
  • max_lr (python:float 列表)–每個(gè)參數(shù)組在循環(huán)中的較高學(xué)習(xí)率邊界。 從功能上講,它定義了循環(huán)幅度(max_lr-base_lr)。 任何周期的 lr 是 base_lr 與振幅的一定比例之和; 因此,取決于縮放函數(shù),可能實(shí)際上無法達(dá)到 max_lr。
  • step_size_up (python:int )–周期遞增的一半中的訓(xùn)練迭代次數(shù)。 默認(rèn)值:2000
  • step_size_down (python:int )–減少周期的一半內(nèi)的訓(xùn)練迭代次數(shù)。 如果 step_size_down 為 None,則將其設(shè)置為 step_size_up。 默認(rèn)值:無
  • 模式 (str )– {triangle,trial2,exp_range}中的一種。 值與上面詳述的策略相對應(yīng)。 如果 scale_fn 不為 None,則忽略此參數(shù)。 默認(rèn)值:“三角形”
  • 伽瑪 (python:float )–'exp_range'縮放函數(shù)中的常量:gamma **(循環(huán)迭代)默認(rèn)值:1.0
  • scale_fn (函數(shù))–由單個(gè)參數(shù) lambda 函數(shù)定義的自定義縮放策略,其中對于所有 x > = 0 < = scale_fn(x)< = 1 0。如果指定,則忽略“模式”。 默認(rèn)值:無
  • scale_mode (str )– {“周期”,“迭代次數(shù)”}。 定義是否在循環(huán)數(shù)或循環(huán)迭代(自循環(huán)開始后的訓(xùn)練迭代)中評估 scale_fn。 默認(rèn)值:“循環(huán)”
  • cycle_momentum (bool )–如果True,則動(dòng)量與學(xué)習(xí)速率成反比地在“ base_momentum”和“ max_momentum”之間循環(huán)。 默認(rèn)值:True
  • base_momentum (python:float 列表)–每個(gè)參數(shù)組的循環(huán)動(dòng)量邊界較低。 注意,動(dòng)量與學(xué)習(xí)速度成反比。 在一個(gè)周期的最高峰,動(dòng)量為“ base_momentum”,學(xué)習(xí)速率為“ max_lr”。 默認(rèn)值:0.8
  • max_momentum (python:float 列表)–每個(gè)參數(shù)組在循環(huán)中的較高動(dòng)量邊界。 從功能上講,它定義了循環(huán)幅度(max_momentum-base_momentum)。 任何周期的動(dòng)量都是 max_momentum 與振幅的一定比例之差; 因此,取決于縮放功能,實(shí)際上可能無法達(dá)到 base_momentum。 注意,動(dòng)量與學(xué)習(xí)速度成反比。 在周期開始時(shí),動(dòng)量為“ max_momentum”,學(xué)習(xí)率為“ base_lr”默認(rèn)值:0.9
  • last_epoch (python:int )–最后一批的索引。 恢復(fù)訓(xùn)練作業(yè)時(shí)使用此參數(shù)。 由于 <cite>step()</cite>應(yīng)該在每個(gè)批處理之后而不是在每個(gè)時(shí)期之后調(diào)用,因此該數(shù)字表示所計(jì)算的批次的總數(shù),而不是所計(jì)算的時(shí)期總數(shù)。 當(dāng) last_epoch = -1 時(shí),調(diào)度將從頭開始。 默認(rèn)值:-1

Example

>>> 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()?

計(jì)算批次索引的學(xué)習(xí)率。 此函數(shù)將 <cite>self.last_epoch</cite> 視為最后一批索引。

如果 <cite>self.cycle_momentum</cite> 為True,則此功能具有更新優(yōu)化器動(dòng)量的副作用。

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 學(xué)習(xí)率策略設(shè)置每個(gè)參數(shù)組的學(xué)習(xí)率。 1 周期策略將學(xué)習(xí)速率從初始學(xué)習(xí)速率退火到某個(gè)最大學(xué)習(xí)速率,然后從該最大學(xué)習(xí)速率退火到某個(gè)遠(yuǎn)低于初始學(xué)習(xí)速率的最小學(xué)習(xí)速率。 最初在論文超融合:使用大學(xué)習(xí)率的超快速神經(jīng)網(wǎng)絡(luò)訓(xùn)練中描述了此策略。

1 周期學(xué)習(xí)率策略每批更改一次學(xué)習(xí)率。 在將一批用于訓(xùn)練之后,應(yīng)調(diào)用<cite>步驟</cite>。

此調(diào)度程序不可鏈接。

還請注意,可以用以下兩種方法之一確定循環(huán)中的步驟總數(shù)(按優(yōu)先順序列出):

  1. 明確提供了 total_steps 的值。
  2. 提供了多個(gè)時(shí)期(epoch)和每個(gè)時(shí)期的步驟數(shù)(steps_per_epoch)。 在這種情況下,總步數(shù)由 total_steps = epochs * steps_per_epoch 推斷

您必須為 total_steps 提供一個(gè)值,或者為紀(jì)元和 steps_per_epoch 提供一個(gè)值。

Parameters

  • optimizer (Optimizer) – Wrapped optimizer.
  • max_lr (python:float 列表)–每個(gè)參數(shù)組在循環(huán)中的較高學(xué)習(xí)率邊界。
  • total_steps (python:int )–循環(huán)中的總步數(shù)。 請注意,如果此處提供了一個(gè)值,則必須通過為 epochs 和 steps_per_epoch 提供一個(gè)值來進(jìn)行推斷。 默認(rèn)值:無
  • 紀(jì)元 (python:int )–要訓(xùn)練的紀(jì)元數(shù)。 如果未提供 total_steps 的值,則將其與 steps_per_epoch 一起使用以推斷循環(huán)中的步驟總數(shù)。 默認(rèn)值:無
  • steps_per_epoch (python:int )–每個(gè)紀(jì)元要訓(xùn)練的步數(shù)。 如果未提供 total_steps 的值,則將其與歷元一起使用以推斷循環(huán)中的總步數(shù)。 默認(rèn)值:無
  • pct_start (python:float )–花費(fèi)的周期百分比(步數(shù))提高了學(xué)習(xí)率。 默認(rèn)值:0.3
  • anneal_strategy (str )– {'cos','linear'}指定退火策略:余弦退火為“ cos”,線性退火為“ linear”。 默認(rèn)值:“ cos”
  • cycle_momentum (bool) – If True, momentum is cycled inversely to learning rate between 'base_momentum' and 'max_momentum'. Default: True
  • base_momentum (python:float 列表)–每個(gè)參數(shù)組的循環(huán)動(dòng)量邊界較低。 注意,動(dòng)量與學(xué)習(xí)速度成反比。 在一個(gè)周期的最高峰,動(dòng)量為“ base_momentum”,學(xué)習(xí)速率為“ max_lr”。 默認(rèn)值:0.85
  • max_momentum (python:float 列表)–每個(gè)參數(shù)組在循環(huán)中的較高動(dòng)量邊界。 從功能上講,它定義了循環(huán)幅度(max_momentum-base_momentum)。 注意,動(dòng)量與學(xué)習(xí)速度成反比。 在周期開始時(shí),動(dòng)量為“ max_momentum”,學(xué)習(xí)率為“ base_lr”默認(rèn)值:0.95
  • div_factor (python:float )–通過 initial_lr = max_lr / div_factor 確定初始學(xué)習(xí)率默認(rèn)值:25
  • final_div_factor (python:float )–通過 min_lr = initial_lr / final_div_factor 確定最小學(xué)習(xí)率默認(rèn)值:1e4
  • last_epoch (python:int) – The index of the last batch. This parameter is used when resuming a training job. Since <cite>step()</cite> should be invoked after each batch instead of after each epoch, this number represents the total number of batches computed, not the total number of epochs computed. When last_epoch=-1, the schedule is started from the beginning. Default: -1

Example

>>> 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)?

使用余弦退火進(jìn)度表設(shè)置每個(gè)參數(shù)組的學(xué)習(xí)率,其中img設(shè)置為初始 lr,img是自上次重啟以來的時(shí)期數(shù),img是兩次暖啟動(dòng)之間的時(shí)期數(shù) 在 SGDR 中:

img

當(dāng)img時(shí),設(shè)置img。 重新啟動(dòng)后img時(shí),設(shè)置img。

它已在 SGDR:具有暖重啟的隨機(jī)梯度下降中提出。

Parameters

  • optimizer (Optimizer) – Wrapped optimizer.
  • T_0 (python:int )–首次重啟的迭代次數(shù)。
  • T_mult (python:int , 可選)–重新啟動(dòng)后,因素會(huì)增加img。 默認(rèn)值:1。
  • eta_min (python:float , 可選)–最低學(xué)習(xí)率。 默認(rèn)值:0
  • last_epoch (python:int , 可選)–最后一個(gè)紀(jì)元的索引。 默認(rèn)值:-1。

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()

可以交錯(cuò)方式調(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)
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號