在上一节的优化器中有很多超参数,例如学习率和动量等,其中一个重要的参数是学习率,它控制着参数更新步伐的大小,在模型的训练过程中,学习率不是一成不变的,可以调整和变化。
一、为什么要调整学习率
在模型训练时,一般开始的时候会设置大一点的学习率,这样可以较快的达到最优点附近,然后降低学习率,缓慢的去收敛到最优值。举个栗子:
参数更新公式:
w i + 1 = w i − L R ∗ g r a d ( w i ) w_{i+1}=w_{i}-LR*grad(w_{i}) wi+1=wi−LR∗grad(wi)
如果设置过大的学习率,有可能会跳过最优值,或者在最优值附近震荡。所以设置学习率小一点,来达到最优值,这时就需要一个学习率调整策略来控制学习率。下面就来学习一下pytorch中学习率的调整策略。
二、pytorch中的学习率调整策略
1、StepLR
功能:等间隔调整学习率
step_size表示调整间隔数,gamma表示调整系数,调整方式就是lr*gamma,gamma一般是0.1-0.5,last_epoch保证能够从断点处继续训练。pytorch中的实现为:
if (self.last_epoch == 0) or (self.last_epoch % self.step_size != 0):
return [group['lr'] for group in self.optimizer.param_groups]
return [group['lr'] * self.gamma
for group in self.optimizer.param_groups]
可以发现通过当前epoch是否能够被整除来调整学习率。例如设置step_size=50,那么就是每50个epoch调整一次学习率,调整方式是lr*gamma,下面从代码来看一下这种学习率的调整策略:
# 设置每50个epoch调整学习率,lr=0.1*lr
scheduler_lr = optim.lr_scheduler.StepLR(optimizer, step_size=50, gamma=0.1) # 设置学习率下降策略
lr_list, epoch_list = list()