學(xué)習(xí)率走廊
lr_scheduler.LambdaLR(optimizer,lr_lamda,last_epoch=-1,verbose=False)
optimizer: 優(yōu)化器
lr_lambda:函數(shù)或者函數(shù)列表
last_epoch:默認(rèn)為-1,學(xué)習(xí)率更新次數(shù)計(jì)數(shù);注意斷點(diǎn)訓(xùn)練時(shí)last_epoch不為-1
當(dāng)last_epoch 是-1的時(shí)候禀苦,base_lr 就是optimizer中的lr牲距。
新的學(xué)習(xí)率new_lr=lr_lambda(last_epoch)*base_lr
lr_lambda=lambda epoch:epoch/10
lr_lambda=lambda epoch: epoch/2-0.001
每次執(zhí)行scheduler.step()蛛株,last_epoch=last_epoch+1
lr_scheduler.MultiplicativeLR(optimizer,?lr_lambda,?last_epoch=-?1,?verbose=False)
optimizer: 優(yōu)化器
lr_lambda:函數(shù)或者函數(shù)列表
last_epoch:默認(rèn)為-1睡互,學(xué)習(xí)率更新次數(shù)計(jì)數(shù);注意斷點(diǎn)訓(xùn)練時(shí)last_epoch不為-1
當(dāng)last_epoch 是-1的時(shí)候截碴,base_lr 就是optimizer中的lr孔庭。
新的學(xué)習(xí)率new_lr=lr_lambda(last_epoch)*base_lr
lr_lambda=lambda epoch:epoch/10 函數(shù)只能是乘性因子尺上。
每次執(zhí)行scheduler.step(),last_epoch=last_epoch+1
lr_scheduler.StepLR(optimizer,?step_size,?gamma=0.1,?last_epoch=-?1,?verbose=False)
optimizer: 優(yōu)化器
lr_lambda:函數(shù)或者函數(shù)列表
gamma: 每一次更新學(xué)習(xí)率的乘性因子
last_epoch:默認(rèn)為-1圆到,學(xué)習(xí)率更新次數(shù)計(jì)數(shù)怎抛;注意斷點(diǎn)訓(xùn)練時(shí)last_epoch不為-1
當(dāng)last_epoch 是-1的時(shí)候,base_lr 就是optimizer中的lr芽淡。
新的學(xué)習(xí)率new_lr=gamma*base_lr
每step_size個(gè)epoch马绝,學(xué)習(xí)率更新一次
每次執(zhí)行scheduler.step(),last_epoch=last_epoch+1
lr_scheduler.MultiStepLR(optimizer,?milestones,?gamma=0.1,?last_epoch=-?1,?verbose=False)
milestones 存儲(chǔ)需要更新學(xué)習(xí)率的epoch挣菲,是一個(gè)list
gamma: 每次更新學(xué)習(xí)率的乘性因子
# Assuming optimizer uses lr = 0.05 for all groups>
milestones=[30,80]
>> # lr = 0.05 if epoch < 30
>>> # lr = 0.005 if 30 <= epoch < 80
>>> # lr = 0.0005 if epoch >= 80
lr_scheduler.ExponentialLR(optimizer,?gamma,?last_epoch=-?1,?verbose=False)
new_lr = base_lr*exp(gamma)
學(xué)習(xí)率是每個(gè)epoch都更新富稻。
lr_scheduler.ConstantLR(optimizer,?factor=0.3333333333333333,?total_iters=5,?last_epoch=-?1,?verbose=False)
當(dāng)epoch不大于total_iters時(shí),學(xué)習(xí)率更新 公式為 new_lr = base_lr*factor
當(dāng)epoch大于total_iters 時(shí)候白胀,學(xué)習(xí)率重新恢復(fù)為base_lr
>>> # Assuming optimizer uses lr = 0.05 for all groups
>>> # lr = 0.025 if epoch == 0
>>> # lr = 0.025 if epoch == 1
>>> # lr = 0.025 if epoch == 2
>>> # lr = 0.025 if epoch == 3>>> # lr = 0.05 if epoch >= 4
>>> scheduler=ConstantLR(self.opt,factor=0.5,total_iters=4)
>>> for epoch in range(100):
>>> train(...)
>>> validate(...)
>>> scheduler.step()
lr_scheduler.ReduceLROnPlateau(optimizer,?mode='min',?factor=0.1,?patience=10,?threshold=0.0001,?threshold_mode='rel',?cooldown=0,?min_lr=0,?eps=1e-08,?verbose=False)mode: 判斷metric 降低還是升高的時(shí)候椭赋,對(duì)學(xué)習(xí)率更新更新,默認(rèn)是metric降低的時(shí)候或杠。mode='min'
學(xué)習(xí)率更新的公式: new_lr = base_lr *factor
patience: 當(dāng)metric 超出多少個(gè)epoch(patience)以后哪怔,還是沒有顯著的降低的話,對(duì)學(xué)習(xí)率進(jìn)行調(diào)整向抢。
如果verbose是True的話认境。那么標(biāo)準(zhǔn)打印出更新的學(xué)習(xí)率信息。
min_lr: 最小學(xué)習(xí)率下限挟鸠。
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,?verbose=False)
base_lr:基礎(chǔ)學(xué)習(xí)率
max_lr:學(xué)習(xí)率上限?
step_size_up:學(xué)習(xí)率上升的步數(shù)?
step_size_down:學(xué)習(xí)率下降的步數(shù)?
mode:共三種模式分別為triangular叉信,triangular2和exp_range?
gamma:exp_range中的常量gamma**(cycle iterations)?
scale_fn:自定義縮放策略保證所有x ≥ 0 x\geq 0x≥0的情況下s c a l e _ f n ( x ) scale\_fn(x)scale_fn(x)的值域?yàn)閇 0 , 1 ] [0,1][0,1]?
scale_mode:兩種模式cycle和iterations cycle_momentum:如果為True,則動(dòng)量與’base_momentum’和’max_momentum之間的學(xué)習(xí)率成反比?
base_momentum:初始動(dòng)量兄猩,即每個(gè)參數(shù)組的循環(huán)中的下邊界茉盏。?
max_momentum:每個(gè)參數(shù)組的循環(huán)中的上動(dòng)量邊界鉴未。
lr 是每一個(gè)更新的步長(zhǎng)是按照batch來劃分的枢冤。
小結(jié)
一般地,在實(shí)際應(yīng)用中經(jīng)常會(huì)使用lr_scheduler.ReduceLROnPlateau 用于監(jiān)控validation loss 有無降低铜秆,從而優(yōu)化學(xué)習(xí)率淹真,對(duì)于其他的優(yōu)化scheduler,并無根據(jù)metric來調(diào)整學(xué)習(xí)率的機(jī)制连茧,主要采用步長(zhǎng)的方式來判斷是否需要來更新學(xué)習(xí)率核蘸。
更新學(xué)習(xí)率的注意事項(xiàng):
optimizer.step() 在scheduler.step() 之前巍糯,不然會(huì)導(dǎo)致學(xué)習(xí)率混亂的狀態(tài)。一般是以下面的形式出現(xiàn)客扎,更新學(xué)習(xí)率祟峦。
>>> for epoch in range(100):
>>> train(...)
>>> validate(...)
>>> scheduler.step()