参考
torch.optim.lr_scheduler:调整学习率
torch.optim.lr_scheduler模块提供了一些根据epoch训练次数来调整学习率的方法。
torch.optim.lr_scheduler.ReduceLROnPlateau则提供了基于训练中某些测量值来调整学习率的方法。
PyTorch 1.1.0及之后的版本中,学习率的调整应该放在optimizer更新之后,即 scheduler.step()的调用位置在 optimizer.step()之后,optimizer.step()在train函数中使用:
>>> scheduler = ...
>>> for epoch in range(100):
>>> train(...)
>>> validate(...)
>>> scheduler.step()
在PyTorch 1.1.0之前的版本,学习率的调整应该被放在optimizer更新之前。
Adam:本身是梯度下降算法,但是有自适应更新学习率的能力。具体使用时,通常将其使用为梯度下降工具optimizer,可结合学习率调整工具lr_scheduler帮助Adam算法更快收敛。
class torch.optim.Adam(params,
lr=0.001, betas=(0.9, 0.999), eps=1e-08,
weight_decay=0, amsgrad=False)
# 参数解释
params (iterable):需要优化的网络参数。参数指神经网络中各层的线性变换矩阵和偏置。通常的形参书写方式为net.parameters()
lr (float, optional):基础学习率η;
betas (Tuple[float, float], optional) (default: (0.9, 0.999)):β1,β2
weight_decay:不在Adam更新算法中,是用来实现L2正则化的参数。
需注意的点,下面所有Lr_scheduler的学习率更新式中的学习率初值参数,皆来源于它的optimizer参数,即学习率初值参数来源于梯度下降优化器,而不需要显式作为Lr_scheduler的形参。
LambdaLR
lr=λ×initial_lr
class torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1)
# 可让λ为epoch的函数,从而实现令学习率更新与epoch有关。例:
scheduler = LambdaLR(optimizer_1, lr_lambda=lambda epoch: 1/(epoch+1))
StepLR
lr=initial_lr×γ^(epoch/step_size)
class torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)
ExponentialLR
lr=initial_lr×γ^epoch
class torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma, last_epoch=-1)
MultiStepLR
class torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1)
milestones(list):递增的list,存放要更新lr的epoch;
每次遇到milestones中的epoch,lr乘以gamma更新
例:
Milestones = [1,10] 表示当epoch=1,lr =lr×γ= initial_ lr×γ
当epoch=10,lr = lr×γ
CosineAnnealingLR,余弦退火调整
学习率变化周期为2T,当前epoch轮数=0、2T时,学习率为最大值,当前epoch轮数=T时,学习率为最小值。
一个周期内,学习率先减小再增大,目的是为了先达到局部极值,然后尝试离开当前的局部极值点。
class torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=-1)
# eta_min对应 η_min,最小学习率,T_max对应周期半周期T