美文网首页
Pytorch 常用学习率变化方式小结

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

作者: 十年磨剑_莫回首 | 来源:发表于2021-11-16 15:01 被阅读0次

    学习率走廊

    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 常用学习率变化方式小结

          本文链接:https://www.haomeiwen.com/subject/vashtrtx.html