Pytorch 常用学习率变化方式小结

学习率走廊

lr_scheduler.LambdaLR(optimizer,lr_lamda,last_epoch=-1,verbose=False)

optimizer: 优化器

lr_lambda:函数或者函数列表

last_epoch:默认为-1,学习率更新次数计数;注意断点训练时last_epoch不为-1

当last_epoch 是-1的时候,base_lr 就是optimizer中的lr。

新的学习率new_lr=lr_lambda(last_epoch)*base_lr

lr_lambda=lambda epoch:epoch/10

lr_lambda=lambda epoch: epoch/2-0.001

每次执行scheduler.step(),last_epoch=last_epoch+1



lr_scheduler.MultiplicativeLR(optimizerlr_lambdalast_epoch=- 1verbose=False)

optimizer: 优化器

lr_lambda:函数或者函数列表

last_epoch:默认为-1,学习率更新次数计数;注意断点训练时last_epoch不为-1

当last_epoch 是-1的时候,base_lr 就是optimizer中的lr。

新的学习率new_lr=lr_lambda(last_epoch)*base_lr

lr_lambda=lambda epoch:epoch/10 函数只能是乘性因子。

每次执行scheduler.step(),last_epoch=last_epoch+1


lr_scheduler.StepLR(optimizerstep_sizegamma=0.1last_epoch=- 1verbose=False)

optimizer: 优化器

lr_lambda:函数或者函数列表

gamma: 每一次更新学习率的乘性因子

last_epoch:默认为-1,学习率更新次数计数;注意断点训练时last_epoch不为-1

当last_epoch 是-1的时候,base_lr 就是optimizer中的lr。

新的学习率new_lr=gamma*base_lr

每step_size个epoch,学习率更新一次

每次执行scheduler.step(),last_epoch=last_epoch+1


lr_scheduler.MultiStepLR(optimizermilestonesgamma=0.1last_epoch=- 1verbose=False)

milestones 存储需要更新学习率的epoch,是一个list

gamma: 每次更新学习率的乘性因子

# 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(optimizergammalast_epoch=- 1verbose=False)

new_lr = base_lr*exp(gamma)

学习率是每个epoch都更新。


lr_scheduler.ConstantLR(optimizerfactor=0.3333333333333333total_iters=5last_epoch=- 1verbose=False)

当epoch不大于total_iters时,学习率更新 公式为 new_lr = base_lr*factor

当epoch大于total_iters 时候,学习率重新恢复为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(optimizermode='min'factor=0.1patience=10threshold=0.0001threshold_mode='rel'cooldown=0min_lr=0eps=1e-08verbose=False)

mode: 判断metric 降低还是升高的时候,对学习率更新更新,默认是metric降低的时候。mode='min'

学习率更新的公式: new_lr = base_lr *factor

patience: 当metric 超出多少个epoch(patience)以后,还是没有显著的降低的话,对学习率进行调整。

如果verbose是True的话。那么标准打印出更新的学习率信息。

min_lr: 最小学习率下限。


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:基础学习率

max_lr:学习率上限 

step_size_up:学习率上升的步数 

step_size_down:学习率下降的步数 

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)的值域为[ 0 , 1 ] [0,1][0,1] 

scale_mode:两种模式cycle和iterations cycle_momentum:如果为True,则动量与’base_momentum’和’max_momentum之间的学习率成反比 

base_momentum:初始动量,即每个参数组的循环中的下边界。 

max_momentum:每个参数组的循环中的上动量边界。

lr 是每一个更新的步长是按照batch来划分的。

小结

一般地,在实际应用中经常会使用lr_scheduler.ReduceLROnPlateau 用于监控validation loss 有无降低,从而优化学习率,对于其他的优化scheduler,并无根据metric来调整学习率的机制,主要采用步长的方式来判断是否需要来更新学习率。

更新学习率的注意事项:

optimizer.step() 在scheduler.step() 之前,不然会导致学习率混乱的状态。一般是以下面的形式出现,更新学习率。

>>> for epoch in range(100):

>>> train(...)

>>> validate(...)

>>> scheduler.step()

你可能感兴趣的:(Pytorch 常用学习率变化方式小结)