【深度学习】图解 9 种PyTorch中常用的学习率调整策略
learning rate scheduling?學習率調(diào)整策略
01 LAMBDA LR
將每個參數(shù)組的學習率設置為初始lr乘以給定函數(shù)。當last_epoch=-1時,將初始lr設置為初始值。
torch.optim.lr_scheduler.LambdaLR(optimizer,lr_lambda,last_epoch=-1,verbose=False,)參數(shù)
lr_lambda(函數(shù)或列表):一個函數(shù),給定一個整數(shù)形參epoch計算乘法因子,或一個這樣的函數(shù)列表,optimizer.param_groups中的每組一個。
last_epoch (int):最后一個epoch的索引。默認值:1。
verbose (bool):如果為 True,則在每次更新時向標準輸出輸出一條消息。默認值: False。
02 MultiplicativeLR
將每個參數(shù)組的學習率乘以指定函數(shù)中給定的因子。當last_epoch=-1時,將初始lr設置為初始值。
torch.optim.lr_scheduler.MultiplicativeLR(optimizer,lr_lambda,last_epoch=-1,verbose=False,)參數(shù)同上。
model?=?torch.nn.Linear(2,?1) optimizer?=?torch.optim.SGD(model.parameters(),?lr=100) lmbda?=?lambda?epoch:?0.65?**?epoch scheduler?=?torch.optim.lr_scheduler.MultiplicativeLR(optimizer,?lr_lambda=lmbda) lrs?=?[]for?i?in?range(10):optimizer.step()lrs.append(optimizer.param_groups[0]["lr"]) #?????print("Factor?=?",0.95,"?,?Learning?Rate?=?",optimizer.param_groups[0]["lr"])scheduler.step()plt.plot(range(10),lrs)03 StepLR
每一個步長時期,每個參數(shù)組的學習速率以伽馬衰減。請注意,這種衰減可能與這個調(diào)度程序外部對學習速率的其他改變同時發(fā)生。
402 Payment Required
torch.optim.lr_scheduler.StepLR(optimizer,?step_size,gamma=0.1,?last_epoch=-1,verbose=False)等間隔調(diào)整學習率,每次調(diào)整為 lr*gamma,調(diào)整間隔為step_size。
參數(shù)
step_size (int):學習率調(diào)整步長,每經(jīng)過step_size,學習率更新一次。
gamma (float):學習率調(diào)整倍數(shù)。
last_epoch (int):上一個epoch數(shù),這個變量用于指示學習率是否需要調(diào)整。當last_epoch符合設定的間隔時就會調(diào)整學習率。當設置為-1時,學習率設置為初始值。
04 MultiStepLR
當前epoch數(shù)滿足設定值時,調(diào)整學習率。這個方法適合后期調(diào)試使用,觀察loss曲線,為每個實驗制定學習率調(diào)整時期[1]。
參數(shù):
milestones (list):一個包含epoch索引的list,列表中的每個索引代表調(diào)整學習率的epoch。list中的值必須是遞增的。如 [20, 50, 100] 表示在epoch為20, 50,100時調(diào)整學習率。
gamma (float):學習率調(diào)整倍數(shù)。
last_epoch (int):上一個epoch數(shù),這個變量用于指示學習率是否需要調(diào)整。當last_epoch符合設定的間隔時就會調(diào)整學習率。當設置為-1時,學習率設置為初始值。
05 ExponentialLR
按指數(shù)衰減調(diào)整學習率。每一個epoch以伽馬衰減每個參數(shù)組的學習速率。
torch.optim.lr_scheduler.ExponentialLR(optimizer,gamma,last_epoch=-1,verbose=False,)參數(shù):
gamma (float):學習率調(diào)整倍數(shù)。
last_epoch (int):上一個epoch數(shù),這個變量用于指示學習率是否需要調(diào)整。當last_epoch符合設定的間隔時就會調(diào)整學習率。當設置為-1時,學習率設置為初始值。
06 CosineAnnealingLR
模擬余弦退火曲線調(diào)整學習率。
使用余弦退火計劃設置每個參數(shù)組的學習速率。
注意,因為調(diào)度是遞歸定義的,所以學習速率可以在這個調(diào)度程序之外被其他操作符同時修改。如果學習速率由該調(diào)度器單獨設置,則每一步的學習速率為:
402 Payment Required
該方法已在SGDR被提出:帶溫重啟的隨機梯度下降中提出。請注意,這只實現(xiàn)了SGDR的余弦退火部分,而不是重啟。
https://arxiv.org/abs/1608.03983
07 CyclicLR
Cyclical Learning Rates for Training Neural Networks 學習率周期性變化。
參數(shù)
base_lr (float or list):循環(huán)中學習率的下邊界。
max_lr (floatorlist):循環(huán)中學習率的上邊界。
tep_size_up (int):學習率上升的步數(shù)。
step_size_down (int):學習率下降的步數(shù)。
mode (str):{triangular, triangular2, exp_range}中的一個。默認: 'triangular'。
gamma (float):在mode='exp_range'時,gamma**(cycle iterations), 默認:1.0。
scale_fn:自定義的scaling policy,通過只包含有1個參數(shù)的lambda函數(shù)定義。0 <= scale_fn(x) <= 1 for all x >= 0. 默認:None。如果定義了scale_fn, 則忽略 mode參數(shù)
last_epoch (int):上一個epoch數(shù),這個變量用于指示學習率是否需要調(diào)整。當last_epoch符合設定的間隔時就會調(diào)整學習率。當設置為-1時,學習率設置為初始值。
CyclicLR - triangular
model?=?torch.nn.Linear(2,?1) optimizer?=?torch.optim.SGD(model.parameters(),?lr=0.1) scheduler?=?torch.optim.lr_scheduler.CyclicLR(optimizer,?base_lr=0.001,?max_lr=0.1,step_size_up=5,mode="triangular") lrs?=?[]for?i?in?range(100):optimizer.step()lrs.append(optimizer.param_groups[0]["lr"]) #?????print("Factor?=?",i,"?,?Learning?Rate?=?",optimizer.param_groups[0]["lr"])scheduler.step()plt.plot(lrs)CyclicLR - triangular2
model?=?torch.nn.Linear(2,?1) optimizer?=?torch.optim.SGD(model.parameters(),?lr=0.1) scheduler?=?torch.optim.lr_scheduler.CyclicLR(optimizer,?base_lr=0.001,?max_lr=0.1,step_size_up=5,mode="triangular2") lrs?=?[]for?i?in?range(100):optimizer.step()lrs.append(optimizer.param_groups[0]["lr"]) #?????print("Factor?=?",i,"?,?Learning?Rate?=?",optimizer.param_groups[0]["lr"])scheduler.step()plt.plot(lrs)CyclicLR - exp_range
model?=?torch.nn.Linear(2,?1) optimizer?=?torch.optim.SGD(model.parameters(),?lr=100) scheduler?=?torch.optim.lr_scheduler.CyclicLR(optimizer,?base_lr=0.001,max_lr=0.1,step_size_up=5,mode="exp_range",gamma=0.85) lrs?=?[]for?i?in?range(100):optimizer.step()lrs.append(optimizer.param_groups[0]["lr"]) #?????print("Factor?=?",i,"?,?Learning?Rate?=?",optimizer.param_groups[0]["lr"])scheduler.step()plt.plot(lrs)08 OneCycleLR
CLR(如上圖所示)不是單調(diào)地降低訓練過程中的學習率,而是讓學習率在設定好地最大值與最小值之間往復變化,文中提出CLR能夠work的原因在于兩點:
CLR里面增大學習率的過程可以幫助損失函數(shù)值逃離鞍點;
最優(yōu)的學習率會在設定好的最大值與最小值之間,最優(yōu)學習率附近的值在整個訓練過程中會被一直使用到。stepsize一般設置為
402 Payment Required
的2-10倍,一個cycle包括2個stepsize;base_lr一般設置為max_lr的1/3或者1/4。一般當學習率回到base_lr時使訓練結(jié)束。在CLR的基礎(chǔ)上,"1cycle"是在整個訓練過程中只有一個cycle,學習率首先從初始值上升至max_lr,之后從max_lr下降至低于初始值的大小。和CosineAnnealingLR不同,OneCycleLR一般每個batch后調(diào)用一次
根據(jù) "1cycle學習速率策略" 設置各參數(shù)組的學習速率。1cycle策略將學習率從初始學習率調(diào)整到最大學習率,然后從最大學習率調(diào)整到遠低于初始學習率的最小學習率。這種策略最初是在論文《Convergence: Very Fast Training of Neural Networks Using Large Learning Rates.超收斂:使用大學習速率的神經(jīng)網(wǎng)絡的快速訓練》中描述的。
"1cycle學習速率策略" 在每批學習后會改變學習速率。Step應該在一個批處理被用于培訓之后調(diào)用。
torch.optim.lr_scheduler.OneCycleLR(optimizer,?#?優(yōu)化器max_lr,?#?學習率最大值total_steps=None,?epochs=None,?steps_per_epoch=None,?#?總step次數(shù)pct_start=0.3,?anneal_strategy='cos',?#?學習率上升的部分step數(shù)量的占比cycle_momentum=True,?base_momentum=0.85,?max_momentum=0.95,div_factor=25.0,?#?初始學習率?=?max_lr?/?div_factorfinal_div_factor=10000.0,?#?最終學習率?=?初始學習率?/?final_div_factorthree_phase=False,?last_epoch=-1,?verbose=False)需要設置的參數(shù)
max_lr:最大學習率
total_steps:迭代次數(shù)
div_factor:初始學習率= max_lr / div_factor
final_div_factor:最終學習率= 初始學習率 / final_div_factor
OneCycleLR - cos
model?=?torch.nn.Linear(2,?1) optimizer?=?torch.optim.SGD(model.parameters(),?lr=0.1) scheduler?=?torch.optim.?\lr_scheduler.OneCycleLR(optimizer,?max_lr=0.1,?steps_per_epoch=10,?epochs=10) lrs?=?[]for?i?in?range(100):optimizer.step()lrs.append(optimizer.param_groups[0]["lr"]) #?????print("Factor?=?",i,"?,?Learning?Rate?=?",optimizer.param_groups[0]["lr"])scheduler.step()plt.plot(lrs)OneCycleLR - linear
model?=?torch.nn.Linear(2,?1) optimizer?=?torch.optim.SGD(model.parameters(),?lr=0.1) scheduler?=?torch.optim.?\lr_scheduler.OneCycleLR(optimizer,?max_lr=0.1,steps_per_epoch=10,?epochs=10,anneal_strategy='linear') lrs?=?[] for?i?in?range(100):optimizer.step()lrs.append(optimizer.param_groups[0]["lr"]) #?????print("Factor?=?",i,"?,?Learning?Rate?=?",optimizer.param_groups[0]["lr"])scheduler.step()plt.plot(lrs)09 CosineAnnealingWarmRestarts
Warm restart的模擬退火學習率調(diào)整曲線 使用余弦退火計劃設置每個參數(shù)組的學習速率,并在 Ti epoch 后重啟。
參數(shù)
T_0 (int):第一次restart時epoch的數(shù)值。
T_mult (int):每次restart后,學習率restart周期增加因子。。
eta_min (float):最小的學習率,默認值為0。
last_epoch (int):上一個epoch數(shù),這個變量用于指示學習率是否需要調(diào)整。當last_epoch符合設定的間隔時就會調(diào)整學習率。當設置為-1時,學習率設置為初始值。
T_0=10, T_mult=1, eta_min=0.001,
import?torch import?matplotlib.pyplot?as?pltmodel?=?torch.nn.Linear(2,?1) optimizer?=?torch.optim.SGD(model.parameters(),?lr=0.1) lr_sched?=?torch.optim.?\lr_scheduler.CosineAnnealingWarmRestarts(optimizer,?T_0=10,T_mult=1,eta_min=0.001,last_epoch=-1)lrs?=?[]for?i?in?range(100):lr_sched.step()lrs.append(optimizer.param_groups[0]["lr"])plt.plot(lrs)T_0=10, T_mult=2, eta_min=0.01,
import?torch import?matplotlib.pyplot?as?pltmodel?=?torch.nn.Linear(2,?1) optimizer?=?torch.optim.SGD(model.parameters(),?lr=0.1) lr_sched?=?torch.optim.?\lr_scheduler.CosineAnnealingWarmRestarts(optimizer,T_0=10,?T_mult=2,eta_min=0.01,last_epoch=-1)lrs?=?[]for?i?in?range(300):lr_sched.step()lrs.append(optimizer.param_groups[0]["lr"])plt.plot(lrs)參考資料
[1]
pytorch: https://pytorch.org/docs/stable/optim.html
[2]參考: https://www.kaggle.com/code/isbhargav/guide-to-pytorch-learning-rate-scheduling/notebook
往期精彩回顧適合初學者入門人工智能的路線及資料下載(圖文+視頻)機器學習入門系列下載中國大學慕課《機器學習》(黃海廣主講)機器學習及深度學習筆記等資料打印《統(tǒng)計學習方法》的代碼復現(xiàn)專輯 AI基礎(chǔ)下載機器學習交流qq群955171419,加入微信群請掃碼:總結(jié)
以上是生活随笔為你收集整理的【深度学习】图解 9 种PyTorch中常用的学习率调整策略的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java包装类中的equals方法
- 下一篇: 【深度学习】显卡价格一夜闪崩35%!30