import torch.optim as optim
optimizer = optim.Adam(net.parameters(), lr=1e-3, betas=(0.9, 0.99))
在使用PyTorch训练神经网络时,可能需要根据情况调整学习率(learning rate)这个在梯度下降中的重要参数。PyTorch提供了scheduler工具包帮助实现这一功能。
最原始也是最灵活的定义方式:
CLASS torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1, verbose=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发挥作用的语法
学习率每次的变化只是乘上一个系数,在学习率的表达式中只需指出这个系数:
CLASS torch.optim.lr_scheduler.MultiplicativeLR(optimizer, lr_lambda, last_epoch=-1, verbose=False)
参数
lambdaa = lambda epoch : 0.5
scheduler = optim.lr_scheduler.MultiplicativeLR(optimizer, lambdaa)
for epoch in _ :
train(...)
validate(...)
scheduler.step()
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()
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()
CLASS torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma, last_epoch=-1, verbose=False)
迭代在last_epoch之后的每一轮都变为原来的gamma倍。
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次训练就降低学习率。
上面那个根据准确率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)
还有其它更为复杂的改变学习率的方式,如CosineAnnealingLR按cos曲线方式降低学习率,以及CyclicLR使学习率在一个给定的范围内变化而非单调递减。
参考资料:
GitHub torch/optim/lr_scheduler.py