Pytorch

Pytorch中常见学习率调整函数

学习率作为超参数,训练过程中其实是可以动态调整的,这个很多深度学习框架都予以支持,Pytorch框架在这个方面接口化做的非常符合开发者愿意。Pytorch的可调节学习率的方式主要是借助于Pytorch优化器包中几个学习率动态调节函数,相关的学习率调整。torch.optim.lr_scheduler提供了几种基于epoch的动态学习率调整函数。它们的解释与使用方法分别如下:

1、函数一

该函数表示在发现loss不再降低或者acc不再提高之后,降低学习率。

  1. torch.optim.lr_scheduler.ReduceLROnPlateau(
  2. optimizer,
  3. mode='min',
  4. factor=0.1,
  5. patience=10,
  6. threshold=0.0001,
  7. threshold_mode='rel',
  8. cooldown=0,
  9. min_lr=0,
  10. eps=1e-08,
  11. verbose=False
  12. )

2、函数二

设置学习率为上一次的学习率乘以给定lr_lambda函数的值

  1. torch.optim.lr_scheduler.MultiplicativeLR(
  2. optimizer, // 优化器
  3. lr_lambda, // 函数
  4. last_epoch=-1, // 学习率最后一个epoch,计数
  5. verbose=False
  6. )

3、函数三

周期性的学习率调整函数,指定多个epoch调整一次学习率,学习率每次调整由gamma参数决定,step_size表示epoch的周期大小

  1. torch.optim.lr_scheduler.StepLR(optimizer,step_size,gamma=0.1,last_epoch=-1,verbose=False)

代码演示如下:

  1. # Assuming optimizer uses lr = 0.05 for all groups
  2. # lr = 0.05 if epoch < 30
  3. # lr = 0.005 if 30 <= epoch < 60
  4. # lr = 0.0005 if 60 <= epoch < 90
  5. # ...
  6. scheduler = StepLR(optimizer, step_size=30, gamma=0.1)
  7. for epoch in range(100):
  8. train(...)
  9. validate(...)
  10. scheduler.step()

主要:必须最后完成学习率更新!

4、函数四

该函数跟StepLR的区别是为StepLR是周期性改变学习率,而该函数可以用户自定义epoch的里程碑,根据自定义的里程碑来调整学习率。

  1. torch.optim.lr_scheduler.MultiStepLR(
  2. optimizer, // 优化器
  3. milestones, // 表示定义epoch里程碑
  4. gamma=0.1,
  5. last_epoch=-1,
  6. verbose=False
  7. )

代码演示如下:

  1. # Assuming optimizer uses lr = 0.05 for all groups
  2. # lr = 0.05 if epoch < 30
  3. # lr = 0.005 if 30 <= epoch < 80
  4. # lr = 0.0005 if epoch >= 80
  5. scheduler = MultiStepLR(optimizer, milestones=[30,80], gamma=0.1)
  6. for epoch in range(100):
  7. train(...)
  8. validate(...)
  9. scheduler.step()

5、函数五

使用指数衰减模型来调整学习率

  1. torch.optim.lr_scheduler.ExponentialLR(optimizer,gamma,last_epoch=-1,verbose=False)

6、函数六

基于余弦退火函数实现学习率调整的

  1. torch.optim.lr_scheduler.CosineAnnealingLR(
  2. optimizer,
  3. T_max,
  4. eta_min=0,
  5. last_epoch=-1,
  6. verbose=False
  7. )

每个epoch的学习率表达式如下:

7、函数七

上述的函数都是每个epoch之后调整学习率,该函数支持每个step/batch调整学习率。函数与参数表示如下:

  1. torch.optim.lr_scheduler.CyclicLR(
  2. optimizer,
  3. base_lr,
  4. max_lr,
  5. step_size_up=2000,
  6. step_size_down=None,
  7. mode='triangular',
  8. gamma=1.0,
  9. scale_fn=None,
  10. scale_mode='cycle',
  11. cycle_momentum=True,
  12. base_momentum=0.8,
  13. max_momentum=0.9,
  14. last_epoch=-1,
  15. verbose=False
  16. )

代码演示如下:

  1. optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
  2. scheduler = torch.optim.lr_scheduler.CyclicLR(optimizer, base_lr=0.01, max_lr=0.1)
  3. data_loader = torch.utils.data.DataLoader(...)
  4. for epoch in range(10):
  5. for batch in data_loader:
  6. train_batch(...)
  7. scheduler.step()