学习率走廊
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(optimizer, lr_lambda, 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 函数只能是乘性因子。
每次执行scheduler.step(),last_epoch=last_epoch+1
lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=- 1, verbose=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(optimizer, milestones, gamma=0.1, last_epoch=- 1, verbose=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(optimizer, gamma, last_epoch=- 1, verbose=False)
new_lr = base_lr*exp(gamma)
学习率是每个epoch都更新。
lr_scheduler.ConstantLR(optimizer, factor=0.3333333333333333, total_iters=5, last_epoch=- 1, verbose=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(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 降低还是升高的时候,对学习率更新更新,默认是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()