import torch.optim as optim
optimizer = optim.Adam(net.parameters(), lr=1e-3, betas=(0.9, 0.99))
在使用PyTorch训练神经网络时,可能需要根据情况调整学习率(learning rate)这个在梯度下降中的重要参数。PyTorch提供了scheduler工具包帮助实现这一功能。
1. 通过写明学习率关于迭代次数的表达式来指定
(1)LambdaLR
最原始也是最灵活的定义方式:
CLASS torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1, verbose=False)
参数
- optimizer:封装好的优化函数
- lr_lambda:计算学习率的函数
- last_epoch:标明学习率变化开始于哪一次迭代之后,默认为-1即从epoch=0开始
- verbose:bool值,是否在标准输出中打印相关信息,默认为False
举个栗子
lambdaa = lambda epoch : 0.5 ** (epoch // 30)
scheduler = optim.lr_scheduler.LambdaLR(optimizer, lambdaa, last_epoch=29)
for epoch in _ :
train(...)
validate(...)
scheduler.step() # scheduler发挥作用的语法
(2)MultiplicativeLR
学习率每次的变化只是乘上一个系数,在学习率的表达式中只需指出这个系数:
CLASS torch.optim.lr_scheduler.MultiplicativeLR(optimizer, lr_lambda, last_epoch=-1, verbose=False)
参数
- optimizer:封装好的优化函数
- lr_lambda:学习率的表达式
- last_epoch:开始起作用的迭代,默认为-1
- verbose:bool值,是否在标准输出中打印相关信息,默认为False
再举个栗子
lambdaa = lambda epoch : 0.5
scheduler = optim.lr_scheduler.MultiplicativeLR(optimizer, lambdaa)
for epoch in _ :
train(...)
validate(...)
scheduler.step()
2. 根据迭代次数和乘子进行调整
(1)StepLR
CLASS torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1, verbose=False)
每次迭代step_size轮之后,学习率变为原来的gamma倍。例如:
scheduler = optim.lr_scheduler.StepLR(optimizer, 30)
for epoch in _ :
train(...)
validate(...)
scheduler.step()
(2)MultiStepLR
CLASS torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1, verbose=False)
这里面milestones是一个列表,每当迭代次数达到列表中的值时,学习率就变为原来的gamma倍。例如:
scheduler = optim.lr_scheduler.MultiStepLR(optimizer, [30, 80])
for epoch in _ :
train(...)
validate(...)
scheduler.step()
(3)ExponentialLR
CLASS torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma, last_epoch=-1, verbose=False)
迭代在last_epoch之后的每一轮都变为原来的gamma倍。
3. 根据指标进行调整
optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10, \
verbose=False, threshold=1e-4, threshold_mode='rel', cooldown=0, min_lr=0, eps=1e-8)
这是一种根据验证过程中某个指标变化趋势进行调整的方法。例如我需要在验证过程中计算模型的准确率,当准确率连续5次没有下降时,第6次训练就降低学习率。
- mode:取值’max’或’min’,被监测的指标需要达到最大or最小值
- factor:当学习率改变时乘上的因子
- patience:降低学习率前容忍指标没有变好的迭代次数
- threshold, threshold_mode:当前结果与上一个学习率达到的最好结果相比较,确认学习率是否要变化
- cooldown:学习率变化后,是否马上对观测指标进行监督,还是忽略刚刚变化的几轮迭代结果,默认是马上进行监督及cooldown=0
- min_lr:学习率下降的最小值
- epsilon:学习率每次变化的阈值
上面那个根据准确率accuracy改变学习率的代码,示例如下:
scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='max', factor=0.5, patience=5, min_lr=1e-6)
for epoch in _ :
train(...)
validate(...)
scheduler.step(accuracy)
4. 其它
还有其它更为复杂的改变学习率的方式,如CosineAnnealingLR按cos曲线方式降低学习率,以及CyclicLR使学习率在一个给定的范围内变化而非单调递减。
参考资料:
GitHub torch/optim/lr_scheduler.py