文章目录
0.前言
在深度神经网络训练中,学习率(Learning Rate)是一个重要的超参数,它决定了优化算法在每次更新模型参数时的步长大小。学习率对模型的训练过程和最终性能具有深远的影响。
本文主要介绍学习率的基本概念,以及在使用PyTorch训练神经网络模型时常用的学习率调度策略。
1.学习率的概念
学习率是控制每次迭代更新中梯度下降步幅大小的参数。在反向传播过程中,模型通过计算损失函数的梯度来更新参数,而学习率决定了沿梯度方向迈出多大的一步。
数学上,学习率通常用符号 η \eta η表示,更新公式为: θ = θ − η ⋅ ∇ J ( θ ) \theta = \theta - \eta \cdot \nabla J(\theta) θ=θ−η⋅∇J(θ)其中:
- θ \theta θ是模型参数。
- ∇ J ( θ ) \nabla J(\theta) ∇J(θ)是损失函数 J J J相对于参数 θ \theta θ的梯度。
2.学习率的作用
- 收敛速度:
- 大学习率:能够加快收敛速度,但可能导致错过最优点(overshooting)或震荡。
- 小学习率:增加了到达最优点的机会,但可能导致收敛过慢并增加训练时间。
- 优化效果:
- 适当的学习率有助于更快地达到模型的全局最优解或其附近,从而提升模型的性能。
- 稳定性:
- 学习率过大可能导致训练不稳定,模型发散。
- 学习率过小可能使训练停滞,容易陷入局部最优。
3.学习率调度策略
在PyTorch中,torch.optim.lr_scheduler._LRScheduler
是所有学习率调度器的基类。学习率调度器用于在训练过程中动态调整优化器的学习率,以改善模型的训练效果。
3.1. StepLR
逐步衰减学习率
StepLR(Step Learning Rate)是一种用于调节神经网络训练过程中学习率的策略。通过在训练过程中逐步降低学习率,StepLR有助于提高模型的稳定性和最终的收敛效果。
原理
StepLR策略的核心思想是在训练的过程中,每隔一段固定的时期(epoch),将学习率减少一个恒定的比例。这个过程形成了一个阶梯状的变化曲线,故称为“Step”(阶梯)学习率。
参数
- 初始学习率(initial learning rate):开始训练时的学习率。
- 步长(step size):每隔多少个epoch降低一次学习率。
- 下降因子(gamma):每次降低学习率的比例,通常小于1。例如,gamma=0.1意味着每次学习率变为原来的10%。
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)
# step_size: 每经过多少个epoch调整一次学习率。
# gamma: 学习率调整的比例。新学习率 = 旧学习率 * gamma。
优势
- 简单明了:StepLR调度策略简单易用,仅需少量参数配置。
- 稳定收敛:在训练后期降低学习率可以帮助模型更接近全局最优并提升精度。
适用场景
StepLR特别适合于在模型训练后期希望降低步长进行精细调整的场景。不过,由于它是一个非常简单的调度策略,不适用于所有任务,尤其是在一些更复杂的训练需求下,可能需要更自适应的学习率调度策略(例如基于性能监控的ReduceLROnPlateau策略)。
3.2. MultiStepLR
在预定义的时间点逐步衰减学习率
MultiStepLR是一种学习率调度策略,它是StepLR的推广版本,用于在神经网络训练过程中更灵活地调整学习率。MultiStepLR允许用户在指定的多个epochs上调整学习率,而不是像StepLR那样每隔固定步长调整一次。这在需要对不同训练阶段采取不同学习率时尤其有用。
原理
MultiStepLR的原理与StepLR类似,都是通过在训练过程中降低学习率来帮助模型更稳定地收敛。不同之处在于,MultiStepLR允许用户指定多个epoch,当训练达到这些指定的epochs时,学习率将按照定义的因子进行缩减。
参数
- 初始学习率(initial learning rate):训练开始时的学习率。
- 里程碑(milestones):一个列表,包含了在训练过程中学习率要降低的epoch编号。例如,[30, 80]表示在第30和第80个epoch时降低学习率。
- 下降因子(gamma):学习率减少的比例,通常小于1,例如0.1表示每次减少到原来的10%。
scheduler = torch