scheduler:pytorch训练过程中自动调整learning rate

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

你可能感兴趣的:(pytorch,python,深度学习,神经网络)