一、概念
在深度学习中,学习率(Learning Rate,LR)是一个至关重要的超参数,它控制着模型参数在梯度下降过程中的更新步长。在每次训练迭代中,模型参数按照损失函数关于参数的梯度方向进行更新,而学习率决定了更新的幅度。我们可以通过公式更为直观地理解学习率的作用,例如在梯度下降算法中,我们用 α 来表示学习率,则基本公式如下:
其中,θ 表示模型的参数向量,表示损失函数 J(θ) 关于参数 θ 的梯度。这个公式表示在每次迭代中,我们通过计算损失函数关于参数的梯度,然后乘以学习率 α,并从当前参数值中减去这个乘积,来更新参数 θ。很明显,学习率越大,待减的乘积则越大,参数更新的幅度也就越大。
二、影响
学习率对模型训练过程的影响主要是以下两个方向:
- 学习率过高:如果学习率设置得较高,模型参数的更新步长会较大,这可能导致模型在最优解附近“跳跃”,甚至发散,从而减慢收敛速度或导致无法收敛。
- 学习率过低:如果学习率设置得较低,模型参数的更新步长会较小,这可能导致模型训练过程缓慢,需要更多的迭代次数才能收敛。
下面我们通过实例来可视化学习率的影响。这里,我们使用之前的文章《python实战(十一)——情感分析》中的数据集和torch版模型代码来进行演示。首先,我们来看一下学习率设置为0.001的损失下降情况。很明显模型的损失不断地在下降,当然由于Epoch只有20个,所以存在过拟合的情况,这里我们不关注。
接着,我们保持其他配置不动,仅将学习率调整为0.0000001,重新运行代码,结果如下。可以看到,损失也是在单调下降的,但是定睛一看就会发现,训练半小时损失下降的幅度都没有0.1!
下面,我们还是老配方,但是学习率调整到0.05,重新运行代码。这次,我们直接将三次的训练损失情况绘制到同一张图,便于比较。
可以清晰地看到,合适的学习率才能让模型的训练有效,否则模型很难收敛。当然,我们并不需要找出一个确切的取值,只需要根据模型的特点和常规的经验把学习率设置在一个合理的范围内即可。例如,我们不设置任何学习率参数,优化器默认的初始学习率一般是0.001,这个取值能够适用于大部分建模任务了。另外,像Bert之类的预训练模型也有它比较舒适的一个学习率取值范围,对Bert而言一般是3e-5到5e-5之间,这种就需要我们去查阅文献总结经验了。只要学习率的设置能够让模型的损失按照我们预期的速度下降即可,剩下的无非是多几个epoch或者少几个epoch就能够解决的事情。
需要注意的是,我们在这次实验中使用的优化器是Adam,这意味着我们所设置的其实是初始学习率,Adam能够根据历史的梯度信息自动调整训练过程中的学习率。但即便如此,当学习率的取值大大超出合理范围,Adam也束手无策!
三、调整策略
对于学习率的设置,除了在训练的全程固定学习率之外,也有一些动态调整学习率的方法,这里简单列举几个例子。
1. 学习率衰减(Exponential Decay)
这是一种常见的学习率调整策略,其中学习率按照指数函数随时间衰减。这种策略可以帮助模型在训练初期快速收敛,然后在后期逐渐减小步长以细化解。
2. 步进学习率调整(Step Decay)
在这种策略中,学习率会按照设定的步长周期性地减少。例如,可以设置每经过一定数量的epoch后,学习率乘以一个小于1的因子(如0.1),从而实现学习率的逐步降低。
3. 余弦退火(Cosine Annealing)
余弦退火策略根据余弦函数调整学习率,使其在训练过程中先增加后减少,模拟余弦波形的变化。这种方法可以帮助模型在训练后期更细致地逼近最优解。
4. 自适应学习率优化器
一些优化器如Adam、Adagrad等,能够根据每个参数的梯度历史自动调整学习率,从而减少手动调整学习率的需求。