标准梯度下降 (SGD) 及其动量变体在更新所有参数时使用相同的学习率(可能受动量影响而缩放),但这可能不是最理想的。设想一个损失函数,它在一个方向上非常陡峭,但在另一个方向上却相当平坦。单一的学习率可能会在陡峭方向上引起震荡,或者在平坦方向上移动过慢。我们需要一种方法来为每个参数单独调整学习率。RMSprop(均方根传播)是一种优化算法,旨在通过保持每个参数各自的学习率来解决这个问题。它通过跟踪每个参数梯度平方的移动平均值来实现这一点。核心思想是将特定权重的学习率除以该权重近期梯度幅度的运行平均值。RMSprop 机制RMSprop 修改了梯度下降的更新规则。对于每个参数(以权重 $w$ 为例),它计算梯度平方的指数衰减平均值。设 $S_{dw}$ 为权重 $w$ 在给定迭代中的此移动平均值。$S_{dw}$ 的更新规则是:$$ S_{dw} = \beta S_{dw} + (1 - \beta) \left( \frac{\partial L}{\partial w} \right)^2 $$这里:$\frac{\partial L}{\partial w}$ 是损失函数 $L$ 对权重 $w$ 的梯度。$(\frac{\partial L}{\partial w})^2$ 是梯度的逐元素平方。$\beta$ 是一个超参数,即衰减率,通常设置为 0.9、0.99 或类似的值。它控制过去梯度平方与当前梯度的权重分配。较高的 $\beta$ 意味着平均值包含更长的历史信息。$S_{dw}$ 累积梯度平方信息。如果 $w$ 的近期梯度很大,$S_{dw}$ 也会很大,反之亦然。参数更新规则随后使用此移动平均值来缩放学习率 $\alpha$:$$ w = w - \alpha \frac{\frac{\partial L}{\partial w}}{\sqrt{S_{dw} + \epsilon}} $$类似地,对于偏置参数 $b$:$$ S_{db} = \beta S_{db} + (1 - \beta) \left( \frac{\partial L}{\partial b} \right)^2 $$$$ b = b - \alpha \frac{\frac{\partial L}{\partial b}}{\sqrt{S_{db} + \epsilon}} $$项 $\sqrt{S_{dw} + \epsilon}$(或 $\sqrt{S_{db} + \epsilon}$)是近期梯度的均方根 (RMS),算法因此得名。添加小值 $\epsilon$(epsilon,例如 $10^{-8}$)是为了数值稳定性,以防止在 $S_{dw}$ 可能变得非常接近零的情况下发生除以零的错误。直观解释这如何提供帮助?调整学习率: 如果特定权重 $w$ 的梯度持续较大,$S_{dw}$ 将会变大。除以 $\sqrt{S_{dw} + \epsilon}$ 有效地降低了该特定权重的学习率,从而避免大步长并抑制损失函数陡峭区域的震荡。加速平坦方向: 反之,如果 $w$ 的梯度较小或正在减小,$S_{dw}$ 将会较小。除以一个小的 $\sqrt{S_{dw} + \epsilon}$ 提高了该权重的有效学习率,从而允许更大的步长并在标准 SGD 可能缓慢前进的平坦区域中取得更快进展。本质上,RMSprop 根据每个参数梯度的历史幅度自动调整其步长。优点与考量优点:自适应学习率: 自动基于每个参数调整学习率,通常比 SGD 或 Momentum 在某些问题上收敛更快。隐式学习率调整: 相比 SGD,降低了对全局学习率 $\alpha$ 选择的敏感性,尽管 $\alpha$ 仍需设置。考量:超参数: 引入了衰减率 $\beta$ 和稳定性项 $\epsilon$ 作为超参数,尽管它们的默认值(如 $\beta = 0.99$, $\epsilon = 10^{-8}$)通常效果良好。并非万能: 虽然有效,但 RMSprop 在某些复杂的优化场景中可能仍然表现不佳。RMSprop 是优化算法中的一个重要进展。它通过引入基于近期梯度大小的、针对每个参数的调整,解决了单一全局学习率的局限性。在 PyTorch 中使用 RMSprop在 PyTorch 这样的框架中实现 RMSprop 简单明了。配置优化器时,只需从 torch.optim 模块中选择 RMSprop 即可。import torch import torch.nn as nn import torch.optim as optim # 假设您已定义模型,例如: # model = nn.Sequential(nn.Linear(10, 5), nn.ReLU(), nn.Linear(5, 1)) # 定义输入数据和目标标签 # inputs = torch.randn(64, 10) # labels = torch.randn(64, 1) # loss_fn = nn.MSELoss() # 示例:定义一个简单的线性模型用于演示 model = nn.Linear(10, 1) # 定义超参数 learning_rate = 0.001 # 注意:PyTorch 使用 'alpha' 作为平滑常数(即我们符号中的 beta) beta_rms = 0.99 epsilon = 1e-8 # 实例化 RMSprop 优化器 optimizer = optim.RMSprop(model.parameters(), lr=learning_rate, alpha=beta_rms, # 这是衰减率 beta eps=epsilon, momentum=0) # 标准 RMSprop 在此处没有动量项 # --- 训练步骤示例 --- # 假设输入和标签可用 # optimizer.zero_grad() # 清除之前的梯度 # outputs = model(inputs) # 前向传播 # loss = loss_fn(outputs, labels) # 计算损失 # loss.backward() # 反向传播 # optimizer.step() # 使用 RMSprop 更新权重 # ----------------------------- print(f"已创建优化器: {optimizer}") 一个简单的例子,展示了如何在 PyTorch 中实例化 RMSprop 优化器。请注意,optim.RMSprop 中的参数 alpha 对应于算法描述中讨论的衰减率 $\beta$。标准 RMSprop 本身不包含动量项,尽管 PyTorch 的实现允许添加(在此处设置为 0 以获得基本版本)。RMSprop 提供了一种调整训练期间学习率的有效方法。下一节将介绍 Adam 优化器,它将 RMSprop 的自适应学习率方法与我们之前看到的动量原理结合起来,创建了当今深度学习中最广泛使用的优化器之一。