利用scheduler实现learning-rate学习率动态变化
记录一下schedule设置学习率变化过程的使用和方法
pytorch提供数种优化器的实现,优化器根据计算图的结构,进行梯度计算,根据loss信息实现自动的BP过程。常用的就是,将网络参数传入,设置初始的学习率即可:
在训练中:
即可实现BP环节。
提供了随着训练的迭代次数对optimizer的学习率进行修改的类和方法,通过在循环过程中调用:
每次调用step方法,类中内置的计数器就会+1,即轮次数增加。根据不同的当前,scheduler类会对optimizer中的learning-rate进行修改。利用可查看当前的学习率大小。
这边整理三个常用的类:LambdaLR,StepLR和MultiStepLR。个人觉得这三种就能应对大部分的调整需求了。
LambdaLR
完整的类包为。该类实现的学习率变化策略为当前学习率乘以值,的大小由一个自定函数确定,该函数输入为epoch,即类中的循环次数计数(也就是调用的次数)。
learing-rate = λ * learing-rate
其中为λ的计算函数。
给个使用例子:
计算函数:
在循环中使用:
输出:
当scheduler调用step之后,就能修改对应的optimizer的lr参数,从而改变整体训练的学习率。
StepLR
完整的类包为。该类的学习策略为设定某个间隔,在经过间隔次数的循环之后,就将学习率乘以γ得到新的学习率。
learning_rate = learning_rate * (γ ^ (epoch//step_size))
给个使用例子:
输出:
设定间隔和γ值即可。
MultiStepLR
完整的类包为。这个类更新策略和step差不多,但其不一定为等间隔更新,有里程碑参数,用来传入更新的轮次list,每次迭代次数到达中的某值,即进行学习率的更新。
需要顺序排列。
给个使用例子:
输出:
last_epoch
scheduler初始化的时候都有个的参数,当训练中止保存后,重开的时候就会调用作为当前epoch,以继续训练,默认为-1从头开始。
参考文档
lr_scheduler文档:https://pytorch.org/docs/stable/_modules/torch/optim/lr_scheduler.html