AdaGrad引入了根据每个参数的梯度历史调整学习率的强大思想。然而,AdaGrad的一个主要缺点是在分母中不断累积梯度的平方。随着时间的推移,这个和会持续增大,导致有效学习率单调减小,并最终变得无限小。这种过快的衰减可能会提前停止学习过程,在深度学习中常见的非凸优化场景下,即使经过许多次迭代,可能仍需要持续优化。RMSprop(均方根传播)与AdaGrad大约在同一时间独立开发,旨在解决这种快速衰减问题。RMSprop的核心在于使用梯度的平方的指数衰减移动平均,而不是累加所有过去的梯度平方。这种方法赋予近期梯度信息更大的权重,并能有效地“遗忘”久远的过去。RMSprop的更新机制相对于为每个参数保留所有过去梯度平方的总和 $G_t$,RMSprop保留了梯度均方的估计值,表示为 $E[g^2]_t$。这个值在每个时间步 $t$ 使用衰减率超参数 $\beta$(通常在0.9到0.99之间)进行更新:$$ E[g^2]t = \beta E[g^2]{t-1} + (1 - \beta) g_t^2 $$这里:$g_t$ 是在时间步 $t$ 时损失函数对参数的梯度。$E[g^2]_t$ 是在时间步 $t$ 时梯度平方的移动平均。$\beta$ 是衰减率,用于控制移动平均的记忆周期。值越接近1表示对过去的记忆越久。这种计算方式确保 $E[g^2]_t$ 主要受近期梯度平方的影响。如果近期梯度值较大,$E[g^2]_t$ 也会较大;如果梯度值较小,它就会减小。RMSprop的参数更新规则随后在分母中使用该移动平均的平方根,这与AdaGrad类似,但重要的是,它使用了自适应的 $E[g^2]_t$,而不是不断增大的总和:$$ \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{E[g^2]_t + \epsilon}} g_t $$其中:$\theta_t$ 表示时间步 $t$ 的模型参数。$\eta$ 是全局学习率。$\epsilon$ 是一个很小的常数(例如,$10^{-8}$),用于增加数值稳定性,避免除以零。RMSprop为何优于AdaGrad通过使用指数衰减平均 $E[g^2]_t$,RMSprop阻止了分母项 $\sqrt{E[g^2]_t + \epsilon}$ 在整个训练过程中单调增长。它会适应每个参数近期梯度的量级。如果一个参数的梯度在最初较大后变小,$E[g^2]_t$ 会随时间减小,这使得该参数的有效学习率有可能再次提高,这与AdaGrad中学习率会保持受抑制的情况不同。这种适应性使得RMSprop在长时间训练深度神经网络时更为有效。思考分母可能如何演变:{"data": [{"x": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], "y": [0.1, 1.0, 1.41, 1.73, 2.0, 2.24, 2.45, 2.65, 2.83, 3.0, 3.01, 3.03, 3.05, 3.06, 3.08, 3.10, 3.11, 3.13, 3.14, 3.16, 3.17 ], "mode": "lines", "name": "AdaGrad分母 (平方根总和)", "line": {"color": "#fa5252"}}, {"x": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], "y": [0.1, 0.33, 0.45, 0.56, 0.65, 0.72, 0.78, 0.83, 0.87, 0.90, 0.69, 0.54, 0.44, 0.37, 0.32, 0.29, 0.27, 0.25, 0.24, 0.23, 0.23], "mode": "lines", "name": "RMSprop分母 (平方根移动平均)", "line": {"color": "#228be6"}}], "layout": {"title": "分母行为 (示意)", "xaxis": {"title": "迭代次数 (示意梯度序列)"}, "yaxis": {"title": "分母值 (平方根刻度)"}, "legend": {"yanchor": "top", "y": 0.99, "xanchor": "left", "x": 0.01}}}AdaGrad的分母项因累加所有过去的梯度平方而倾向于持续增长。RMSprop的分母则基于移动平均进行调整,如果近期梯度变小,它会随之减小,从而避免学习率过快衰减。(注意:这是一个假设梯度序列开始时较大,然后变小的示意图)。实际应用RMSprop是一种广泛使用的优化器,在所有主要的深度学习框架中均可使用。使用它时,您通常需要指定学习率 $\eta$,并且常常需要指定衰减因子 $\beta$(在库中通常命名为 alpha 或 rho,默认值约为0.9或0.99)以及 $\epsilon$。尽管与SGD相比,它通常对学习率的调整要求较低,但找到合适的 $\eta$ 和 $\beta$ 值仍然会影响性能。import torch import torch.optim as optim import torch.nn as nn # 假设 'model' 是您定义的神经网络 (nn.Module) # 示例: model = nn.Linear(10, 2) # 初始化RMSprop优化器 # 常用参数:要优化的参数、学习率 (lr)、alpha (衰减因子)、epsilon (eps) optimizer = optim.RMSprop(model.parameters(), lr=0.001, alpha=0.99, eps=1e-08) # --- 在您的训练循环内部 --- # loss.backward() # 计算梯度 # optimizer.step() # 使用RMSprop更新参数 # optimizer.zero_grad() # 为下一次迭代重置梯度 # --- 训练循环结束 ---RMSprop为AdaGrad提供了一种有益的替代方案,为Adam等优化器中出现的后续改进奠定了基础,我们将在接下来讨论Adam。