文章目录
一、什么是调整学习率?
-
调整学习率(Adjusting Learning Rate)是在机器学习,特别是在深度学习中,对优化算法中的一个关键超参数进行动态调整的过程。学习率决定了在每一次参数更新时,参数变化的幅度大小。它是控制模型学习速度的一个重要因素。
-
在训练神经网络时,学习率的选择至关重要。过高的学习率可能会导致模型在训练过程中产生震荡,甚至发散,无法收敛到最优解;而过低的学习率则会导致训练过程非常缓慢,需要更多的迭代次数才能达到较好的效果。
-
因此,调整学习率的目标是在训练过程中找到一个合适的学习率,使得模型能够稳定且快速地收敛到最优解。这通常需要根据模型的训练情况、数据集的特性以及所使用的优化算法来动态调整学习率。
二、使用PyTorch中的库函数进行调整学习率
-
Pytorch学习率调整策略通过 torch.optim.lr_sheduler 接口实现。并提供3种调整方法:
- 有序调整:等间隔调整(Step),多间隔调整(MultiStep),指数衰减(Exponential),余弦退火(CosineAnnealing);
- 自适应调整:依训练状况伺机而变,通过监测某个指标的变化情况(loss、accuracy),当该指标不怎么变化时,就是调整学习率的时机(ReduceLROnPlateau);
- 自定义调整:通过自定义关于epoch的lambda函数调整学习率(LambdaLR)
-
在 torch.optim.lr_sheduler 中有如下多种调整学习率的方法:
import torch scheduler = torch.optim.lr_scheduler # 鼠标放在 lr_scheduler 上,按 CTRL 键可进入查看 __all__ = ['LambdaLR', 'MultiplicativeLR', 'StepLR', 'MultiStepLR', 'ConstantLR', 'LinearLR', 'ExponentialLR', 'SequentialLR', 'CosineAnnealingLR', 'ChainedScheduler', 'ReduceLROnPlateau', 'CyclicLR', 'CosineAnnealingWarmRestarts', 'OneCycleLR', 'PolynomialLR']
三种常用的方法
1. StepLR
StepLR
是一种等间隔调整学习率的方法。它按照预设的间隔(以epoch为单位)调整学习率,每次调整时将学习率乘以一个衰减因子(gamma)。
主要参数:
step_size
(int):学习率下降间隔数,即每经过多少个epoch后调整一次学习率。gamma
(float):学习率调整倍数,默认为0.1,即每次调整学习率时,新的学习率为lr = lr * gamma
。last_epoch
(int):上一个epoch数,用于指示学习率是否需要调整。当为-1时,学习率设置为初始值。
示例代码:
import torch
import torch.optim as optim
from torch.optim.lr_scheduler import StepLR
optimizer = optim.SGD(model.parameters(), lr=0.1)
scheduler = StepLR(optimizer, step_size=30, gamma=0.1)
for epoch in range(num_epochs):
train(...) # 训练模型
test(...) # 测试模型
scheduler.step() # 更新学习率
2. MultiStepLR
MultiStepLR
允许用户按照给定的间隔列表(milestones)调整学习率。与StepLR
不同,这里的间隔不是固定的,而是由用户自定义的一系列epoch值。
主要参数:
milestones
(list):一个列表,包含需要调整学习率的epoch数。gamma
(float):学习率调整倍数,与StepLR
相同。last_epoch
(int):同上。
示例代码:
scheduler = MultiStepLR(optimizer, milestones=[30, 80, 120], gamma=0.1)
3. CosineAnnealingLR
CosineAnnealingLR
采用余弦退火策略来调整学习率。学习率按照余弦函数周期性变化,在每个周期结束时重置为初始学习率,并在下一个周期中继续变化。
主要参数:
T_max
(int):学习率下降到最小值时的epoch数,即余弦函数周期的一半。eta_min
(float):学习率的最小值,默认为0。last_epoch
(int):同上。
示例代码:
scheduler = CosineAnnealingLR(optimizer, T_max=100, eta_min=0)
以上三种方法各有特点,适用于不同的训练场景。StepLR
和MultiStepLR
适用于需要固定或自定义间隔调整学习率的场景,而CosineAnnealingLR
则提供了一种更为平滑的学习率调整方式,有助于模型在训练过程中更好地探索参数空间。在实际应用中,可以根据具体任务和模型情况选择合适的方法。