PyTorch學習之六個學習率調整策略

PyTorch學習率調整策略經過torch.optim.lr_scheduler接口實現。PyTorch提供的學習率調整策略分爲三大類,分別是html

  1. 有序調整:等間隔調整(Step),按需調整學習率(MultiStep),指數衰減調整(Exponential)和 餘弦退火CosineAnnealing。
  2. 自適應調整:自適應調整學習率 ReduceLROnPlateau。
  3. 自定義調整:自定義調整學習率 LambdaLR。

等間隔調整學習率 StepLR

等間隔調整學習率,調整倍數爲 gamma 倍,調整間隔爲 step_size。間隔單位是step。須要注意的是, step 一般是指 epoch,不要弄成 iteration 了。數組

torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)

###參數設置: step_size(int)- 學習率降低間隔數,若爲 30,則會在 30、 60、 90…個 step 時,將學習率調整爲 lr*gamma。 gamma(float)- 學習率調整倍數,默認爲 0.1 倍,即降低 10 倍。 last_epoch(int)- 上一個 epoch 數,這個變量用來指示學習率是否須要調整。當last_epoch 符合設定的間隔時,就會對學習率進行調整。當爲-1 時,學習率設置爲初始值。 ###舉例:函數

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

###注: 學習率調整要放在optimizer更新以後。若是$scheduler.step()$放在$optimizer.update()$的前面,將會調過學習率更新的第一個值。學習

按需調整學習率 MultiStepLR

按設定的間隔調整學習率。這個方法適合後期調試使用,觀察 loss 曲線,爲每一個實驗定製學習率調整時機。url

torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1)

###參數設置: milestones(list)- 一個 list,每個元素表明什麼時候調整學習率, list 元素必須是遞增的。如 milestones=[30,80,120] gamma(float)- 學習率調整倍數,默認爲 0.1 倍,即降低 10 倍。spa

指數衰減調整學習率 ExponentialLR

按指數衰減調整學習率,調整公式:$lr=lr∗gamma^epoch$.net

torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma, last_epoch=-1)

###參數設置: gamma- 學習率調整倍數的底,指數爲 epoch,即$gamma^epoch$調試

餘弦退火調整學習率 CosineAnnealingLR

以餘弦函數爲週期,並在每一個週期最大值時從新設置學習率。以初始學習率爲最大學習率,以 2∗Tmax爲週期,在一個週期內先降低,後上升。code

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

###參數設置: T_max(int)- 一次學習率週期的迭代次數,即 T_max 個 epoch 以後從新設置學習率。 eta_min(float)- 最小學習率,即在一個週期中,學習率最小會降低到 eta_min,默認值爲 0。orm

自適應調整學習率 ReduceLROnPlateau

當某指標再也不變化(降低或升高),調整學習率,這是很是實用的學習率調整策略。 例如,當驗證集的 loss 再也不降低時,進行學習率調整;或者監測驗證集的 accuracy,當accuracy 再也不上升時,則調整學習率。

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)

###參數設置: mode(str)- 模式選擇,有 min 和 max 兩種模式, min 表示當指標再也不下降(如監測loss), max 表示當指標再也不升高(如監測 accuracy)。 factor(float)- 學習率調整倍數(等同於其它方法的 gamma),即學習率更新爲 lr = lr * factor patience(int)- 忍受該指標多少個 step 不變化,當忍無可忍時,調整學習率。 verbose(bool)- 是否打印學習率信息, print(‘Epoch {:5d}: reducing learning rate of group {} to {:.4e}.’.format(epoch, i, new_lr)) threshold_mode(str)- 選擇判斷指標是否達最優的模式,有兩種模式, rel 和 abs。 當 threshold_mode == rel,而且 mode == max 時, dynamic_threshold = best * ( 1 +threshold ); 當 threshold_mode == rel,而且 mode == min 時, dynamic_threshold = best * ( 1 -threshold ); 當 threshold_mode == abs,而且 mode== max 時, dynamic_threshold = best + threshold ; 當 threshold_mode == rel,而且 mode == max 時, dynamic_threshold = best - threshold; threshold(float)- 配合 threshold_mode 使用。 cooldown(int)- 「冷卻時間「,當調整學習率以後,讓學習率調整策略冷靜一下,讓模型再訓練一段時間,再重啓監測模式。 min_lr(float or list)- 學習率下限,可爲 float,或者 list,當有多個參數組時,可用 list 進行設置。 eps(float)- 學習率衰減的最小值,當學習率變化小於 eps 時,則不調整學習率。

自定義調整學習率 LambdaLR

爲不一樣參數組設定不一樣學習率調整策略。將每個參數組的學習率設置爲初始學習率lr的某個函數倍.

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

###參數設置: lr_lambda(是一個函數,或者列表(list))--當是一個函數時,須要給其一個整數參數,使其計算出一個乘數因子,用於調整學習率,一般該輸入參數是epoch數目或者是一組上面的函數組成的列表。 ###舉例:

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

引用:

  1. https://blog.csdn.net/shanglianlm/article/details/85143614
  2. https://pytorch.org/docs/master/optim.html
相關文章
相關標籤/搜索