- 深度学习与MindSpore实践
- 陈雷
- 1604字
- 2025-02-21 16:16:07
4.4 自适应学习率
介绍完如何提升深度学习模型的性能效果后,本节将着重介绍如何优化深度学习系统的训练过程。在第2章介绍的优化算法中,无论是基本的梯度下降法还是其他优化算法,训练过程的学习率都是一个很大的问题。不可变的学习率在一定程度上影响了模型的收敛速度,使得训练时长变大,计算开销居高不下。如果在训练过程中学习率可变,那么模型收敛速度会明显提升。本节将介绍3种常用的自适应学习率算法:AdaGrad、RMSProp和Adam。首先回顾梯度下降公式,即:

式中,α——学习率;
▽J(wt-1)——方向。
4.4.1 AdaGrad
在应用梯度下降算法的过程中,每个参数更新方向和幅度是不一样的。在某个时间段,某些变量已经到达极小值附近。然而,可能有些变量仍然在初始位置不远处。此时不变的学习率可能会导致一些问题。如果学习率偏大,那么处于极小值附近的参数很容易不稳定。如果学习率偏小,那么更新不多的参数收敛得还是很慢。AdaGrad的思想是对于不同的参数去设置不同的学习率以解决这个问题。学习率一开始设置得比较大,用以快速进行梯度下降。随着优化过程的进行,减小那些已经下降很多的参数的学习率。对于还没怎么下降的参数,则继续保持一个较大的学习率。
AdaGrad先计算梯度,然后累计梯度的二次方,计算公式如下:


根据累积的梯度二次方,计算更新公式如下:

式中,δ——一个极小值,为了防止分母为0;
ε——全局学习率。
随着训练过程的进行,梯度的累积会越来越大,使得整体的学习率会越来越小。AdaGrad可以自动地根据迭代来更改学习率。但AdaGrad有一个很明显的缺点在于其分母项的累积总和总在不断地增长,这会导致学习率缩小并变得无限小,致使算法不能再更新权重。AdaGrad算法如算法4.1所示。
算法4.1 AdaGrad算法
输入:全局学习率ε,极小值δ(一般设置为10-7),累积梯度变量r=0
输出:收敛的参数wT
(1) 初始化参数w0
(2) 当不满足停止条件时执行:
(3) 从数据{(x(i), y(i))}均匀随机选取样本m个样本
(4) 计算梯度:

(5) 计算梯度累积:

(6) 计算更新:

4.4.2 RMSProp
AdaGrad的问题就是学习率最终会无限小,为了解决这个问题,RMSProp作为AdaGrad的扩展,提出通过求当前状态下平方梯度的对数平均值来解决上述问题。时刻t的平方梯度平均值定义公式如下:

式中,rt——t-1时刻的平方梯度平均值;
γ——对数平均值的比例系数。
相应的梯度更新如下:

式中,δ和ε的设定都是和AdaGrad一样。采用求平均值而非像AdaGrad那样求和的方式,可以有效地避免学习率无限低问题。
RMSProp算法总结如算法4.2所示。
算法4.2 RMSProp算法
输入:全局学习率ε,极小值δ(一般设置为10-7),比例系数γ(一般设置为0.9)
输出:收敛的参数wT
(1) 初始化参数w0
(2) 当不满足停止条件时执行
(3) 从数据{(x(i), y(i))}均匀随机选取m个样本
(4) 计算梯度:

(5) 计算时刻t的平方梯度平均值:

(6) 计算更新:

相比于AdaGrad,RMSProp算法通过将梯度累积变为加权平均值,使其在非凸设置中表现更好。AdaGrad在应用于凸函数时可以快速收敛。而神经网络训练多数是非凸函数,由于AdaGrad缩小了学习速率,可能在达到极小值前使学习速率过小。RMSProp使用加权平均值来丢弃很远的信息,以便快速收敛。经过大量的深度学习实验,RMSProp算法是一种有效并且实用的神经网络优化算法。
4.4.3 Adam
Adam(Adaptive Moment)算法也是目前比较常用的自适应学习率算法,其可视为对RMSProp的一种优化。与RMSProp不同的是,Adam在模型训练早期偏差较小。通常Adam对超参数的选择相当稳定,只是有时可能会需要更改学习速率。首先Adam计算一阶梯度偏差公式如下:

式中,gt——时刻t的梯度;
γ1——一阶梯度累积系数。
类似于RMSProp,Adam计算平方梯度累积系数公式如下:

式中,γ2——平方梯度累积系数。
在计算st和rt之后,Adam计算一阶和二阶修正公式如下:


随后,Adam根据一阶和二阶修正更新权重公式如下:

Adam算法总结如算法4.3所示。
算法4.3 Adam算法
输入:全局学习率ε(一般设置为0.001)、极小值δ(一般设置为10-7)、一阶系数γ1(一般设置为0.9)、二阶系数γ2(一般设置成0.999)
输出:收敛的参数wT
(1) 初始化参数w0
(2) 当不满足停止条件时执行:
(3) 从数据{(x(i), y(i))}均匀随机选取m个样本
(4) 计算梯度:

(5) 计算一阶梯度偏差:

(6) 计算二阶梯度偏差:

(7) 计算一阶修正:

(8) 计算二阶修正:

(9) 计算更新:
