马春杰杰 Exit Reader Mode

深度学习中的学习率衰减

1 为什么要学习率衰减?

  PyTorch中的学习率并不总是一成不变的,而是可以随着epoch或者迭代次数的变化而有规律地更新,称之为scheduler
  在神经网络的训练过程中,当accuracy出现震荡或loss不再下降时,进行适当的学习率衰减是一个行之有效的手段,很多时候能明显提高accuracy
  学习率衰减的大致步骤为:

optimizer = optim.SGD(network.parameters(), lr=0.1)  # 定义优化器
 
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=200, gamma=0.1)  # 定义衰减策略
 
for epoch in range(500):
    print(f'epoch:{epoch + 1}, lr{scheduler.get_lr()}')
    optimizer.step()
    # train
    # eval
    scheduler.step()

2 学习率衰减策略

1.2 Step学习率

  Step学习率以固定间隔乘以一个系数gamma(一般为0.1)。

#!- python
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=200, gamma=0.1)

2.2 Multi-Step学习率

  Multi-Step学习率同样是每次乘以一个系数gamma,不过需要给定学习率衰减的epoch列表。

#!- python
milestones = [50, 100, 250]
scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1)

2.3 指数衰减学习率

  指数衰减学习率的公式为lr = base_lr * gamma ^ epoch。gamma一般为0.99

#!- python
scheduler = optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.99)

2.4 Cos学习率

  Cos学习率在初始学习率base_lr和最小值eta_min之间以余弦形式调整,在MAX_Tepochs时衰减到最小值。

#!- python
scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=50, eta_min=0.05)

2.5 动态周期的Cos学习率

  动态周期的Cos学习率在衰减到最小值以后重新回到最大值,然后以更慢的速度衰减。

#!- python
scheduler = torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(optimizer, T_0=80, T_mult=2, eta_min=0)

2.6 Cyclic学习率

  Cyclic学习率在最大值和最小值之间来回弹跳。

#!- python
scheduler = torch.optim.lr_scheduler.CyclicLR(optimizer, base_lr=0.05, max_lr=0.1, step_size_up=30, step_size_down=70)

2.7 Lambda学习率

  顾名思义,Lambda学习率就是自定义一个学习率关于epoch的函数来调整学习率。定义Lambda函数时给出初始学习率乘以的系数即可。

def lambda_decay(epoch):
    warm_epoch = 40
    if epoch <= warm_epoch:
        return epoch / warm_epoch
    else:
        return 0.99 ** (epoch-warm_epoch)
 
scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lambda_decay)

# 参考资料

https://blog.csdn.net/junqing_wu/article/details/93248190
https://www.jianshu.com/p/26a7dbc15246

 

本文最后更新于2021年5月13日,已超过 1 年没有更新,如果文章内容或图片资源失效,请留言反馈,我们会及时处理,谢谢!