文章目录
- 一、学习率的定义
- 二、学习率的作用
- 三、学习率的调整方法
- 1.有序调整
- (1).有序调整StepLR(等间隔调整学习率)
- (2).有序调整MultiStepLR(多间隔调整学习率)
- (3).有序调整ExponentialLR (指数衰减调整学习率)
- (4).有序调整CosineAnnealing (余弦退火函数调整学习率)
- 2.自适应调整ReduceLROnPlateau (根据指标调整学习率)
- 3.自定义调整LambdaLR (自定义调整学习率)
- 四、学习率的设置建议
- 五、总结
卷积神经网络(CNN)中的学习率是一个至关重要的超参数,它决定了在训练过程中模型权值和偏置项更新的步长。以下是对学习率的详细解析:
一、学习率的定义
学习率是指在反向传播训练过程中,模型的权值和偏置项的更新步长。它控制着参数更新的幅度,进而影响模型学习的速度和效果。
二、学习率的作用
- 控制学习速度:学习率的大小决定了网络学习速度的快慢。较大的学习率可以加快网络的收敛速度,但也可能导致参数在最优解附近震荡,甚至错过最优解。相反,较小的学习率虽然可以避免错过最优点,但会使网络学习速度变慢。
- 影响收敛性:合适的学习率能够使代价函数以合适的速度收敛到最小值,从而得到最优的模型参数。
三、学习率的调整方法
Pytorch学习率调整策略通过 torch.optim.lr_sheduler 接口实现。并提供3种调整方法:
1.有序调整
(1).有序调整StepLR(等间隔调整学习率)
torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1)
参数:
- optimizer: 神经网络训练中使用的优化器,如optimizer=torch.optim.Adam(…)
- step_size(int): 学习率下降间隔数,单位是epoch,而不是iteration.
- gamma(float):学习率调整倍数,默认为0.1
- 每训练step_size个epoch,学习率调整为lr=lr*gamma.
按照固定的间隔(step_size)调整学习率,每次调整时学习率都会乘以一个给定的衰减因子(gamma)。这种调度器适用于那些希望学习率在训练过程中逐渐降低,但又不想使用更复杂的衰减策略(如指数衰减或多项式衰减)的场景。
(2).有序调整MultiStepLR(多间隔调整学习率)
torch.optim.lr_shceduler.MultiStepLR(optimizer, milestones, gamma=0.1)
参数:
- milestone(list): 一个列表参数,表示多个学习率需要调整的epoch值,如milestones=[10, 30, 80].
允许学习率在达到预设的“里程碑”(milestones)时进行调整。每当训练过程中的某个“里程碑”被触发时,学习率就会乘以一个给定的衰减因子(gamma)。
(3).有序调整ExponentialLR (指数衰减调整学习率)
torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma)
参数:
- gamma (float): 学习率衰减的乘数因子。在每个epoch(或迭代)结束时,学习率会被更新为 lr = lr * gamma。
按照指数衰减的方式调整学习率。这种调度器在每个epoch(或迭代)结束时,将学习率乘以一个给定的衰减因子(gamma),从而实现学习率的指数级下降。
(4).有序调整CosineAnnealing (余弦退火函数调整学习率)
torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0)
参数:
- Tmax(int):学习率下降到最小值时的epoch数,即当epoch=T_max时,学习率下降到余弦函数最小值,当epoch>T_max时,学习率将增大;
- etamin: 学习率调整的最小值,即epoch=Tmax时,lrmin=etamin, 默认为0.
根据余弦退火(cosine annealing)策略调整学习率。在这种策略中,学习率随着每个epoch(或迭代)的增加而按照余弦函数周期性变化,从初始学习率减少到最小值eta_min,然后再增加回初始学习率(或接近初始学习率),如此循环,但周期长度逐渐减小。
2.自适应调整ReduceLROnPlateau (根据指标调整学习率)
torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode=‘min’, factor=0.1,
patience=10,verbose=False, threshold=0.0001, threshold_mode=‘rel’, cooldown=0, min_lr=0, eps=1e-08)
参数:
- mode (str, 可选): 指标是应该最小化还是最大化。‘min’ 表示指标应该被最小化,‘max’ 表示指标应该被最大化。默认为 ‘min’。
- factor (float, 可选): 学习率减少的乘数因子。新的学习率将是旧学习率乘以这个因子。默认为 0.1。
- patience (int, 可选): 观察指标在改善之前应该等待的epoch数(或无改善)。默认为 10。
- verbose (bool, 可选): 如果为 True,则在每次更新学习率时打印一条消息。默认为 False。
- threshold (float, 可选): 衡量指标改善的最小阈值,仅当改善超过这个阈值时,才认为指标真正改善了。默认为 1e-4。
- threshold_mode (str, 可选): ‘rel’ 表示阈值是相对的,‘abs’ 表示阈值是绝对的。默认为 ‘rel’。
- cooldown (int, 可选): 在学习率被减少之后,需要经过多少个epoch才能再次考虑减少学习率。默认为 0。
- min_lr (float 或列表, 可选): 标量或标量列表。每个参数组的学习率不会降低到低于此值。默认为 0。
- eps (float, 可选): 提高数值稳定性的小常数,加到分母中,以避免除以零。默认为 1e-8。
根据验证指标(如损失值或准确率)的改善情况来动态调整学习率。如果验证指标在一段时间内没有改善,则减少学习率。这对于避免在训练过程中陷入局部最小值或平原区域特别有用。
3.自定义调整LambdaLR (自定义调整学习率)
torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda)
参数:
- lr_lambda(function or list):自定义计算学习率调整倍数的函数,通常时epoch的函数,当有多个参数组时,设为list.
允许通过提供一个函数(或一系列函数)来动态调整每个参数组的学习率。这个函数接受一个epoch数(或迭代次数,取决于如何调用scheduler.step()的)作为输入,并输出一个乘数因子,该乘数因子将用于调整当前的学习率。
四、学习率的设置建议
- 初始学习率:在训练初期,可以选择一个相对较大的学习率(如0.01~0.001),以加快网络的收敛速度。
- 动态调整:随着训练的进行,逐渐减小学习率,以避免在最优解附近震荡或陷入局部最优。
- 实验验证:不同的任务和数据集可能需要不同的学习率设置。因此,建议通过实验来找到最适合当前任务的学习率设置。
五、总结
本文对大家介绍了卷积神经网络训练中的一个关键超参数——学习率,通过解释学习率的定义与3种常用的调整方法,为大家说明了其设置和调整对模型的性能有着重要影响。在实际应用中,我们需要根据具体任务和数据集的特点来选择合适的学习率调整方法,并通过实验来验证其有效性。