RMSProp(Root Mean Square Propagation)是一种自适应学习率的优化算法,旨在解决 AdaGrad 学习率单调递减的问题。RMSProp 通过引入衰减系数(decay rate),使得历史梯度平方和不会无限增长,从而更好地适应非凸优化问题。


1. RMSProp 的数学原理

1.1 AdaGrad 的问题回顾

AdaGrad 的核心思想是为每个参数分配自适应的学习率,其更新公式为:

Gt=Gt−1+gt2 G_t = G_{t-1} + g_t^2 Gt=Gt1+gt2

θt+1=θt−ηGt+ϵ⋅gt \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{G_t + \epsilon}} \cdot g_t θt+1=θtGt+ϵ ηgt

其中:

  • GtG_tGt 是历史梯度平方和的累积值。
  • η\etaη 是全局学习率。
  • ϵ\epsilonϵ 是一个很小的常数,用于避免分母为零。

AdaGrad 的问题是:

  1. 学习率单调递减:由于 GtG_tGt 是单调递增的,学习率会逐渐减小,可能导致训练后期学习率过小,收敛缓慢。
  2. 内存开销较大:需要存储每个参数的历史梯度平方和。

1.2 RMSProp 的引入

RMSProp 通过引入衰减系数 γ\gammaγ,解决了 AdaGrad 学习率单调递减的问题。其核心思想是对历史梯度平方和进行指数加权移动平均(Exponential Moving Average, EMA),而不是简单累加。


1.3 RMSProp 的更新规则

RMSProp 的更新规则分为以下几个步骤:

1.3.1 梯度计算

首先,计算当前时刻的梯度:

gt=∇θJ(θt) g_t = \nabla_\theta J(\theta_t) gt=θJ(θt)

其中:

  • gtg_tgt 是当前时刻的梯度向量,形状与参数 θt\theta_tθt 相同。

1.3.2 历史梯度平方和的指数加权平均

RMSProp 使用指数加权移动平均来计算历史梯度平方和:

E[g2]t=γ⋅E[g2]t−1+(1−γ)⋅gt2 E[g^2]_t = \gamma \cdot E[g^2]_{t-1} + (1 - \gamma) \cdot g_t^2 E[g2]t=γE[g2]t1+(1γ)gt2

其中:

  • E[g2]tE[g^2]_tE[g2]t 是历史梯度平方和的指数加权平均值。
  • γ\gammaγ 是衰减系数(decay rate),通常取值在 [0.9,0.99)[0.9, 0.99)[0.9,0.99) 之间。
  • gt2g_t^2gt2 表示对梯度向量 gtg_tgt 逐元素平方。

注意:

  • 初始时,E[g2]0E[g^2]_0E[g2]0 通常设置为 0。

1.3.3 自适应学习率的计算

RMSProp 使用历史梯度平方和的指数加权平均值 E[g2]tE[g^2]_tE[g2]t 来调整学习率。具体来说,学习率被调整为:

学习率=ηE[g2]t+ϵ \text{学习率} = \frac{\eta}{\sqrt{E[g^2]_t + \epsilon}} 学习率=E[g2]t+ϵ η

其中:

  • η\etaη 是全局学习率。
  • ϵ\epsilonϵ 是一个很小的常数(通常为 10−810^{-8}108),用于避免分母为零。
  • E[g2]t+ϵ\sqrt{E[g^2]_t + \epsilon}E[g2]t+ϵ 是对历史梯度平方和的指数加权平均值逐元素开平方。

1.3.4 参数更新

最后,RMSProp 的参数更新公式为:

θt+1=θt−ηE[g2]t+ϵ⋅gt \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{E[g^2]_t + \epsilon}} \cdot g_t θt+1=θtE[g2]t+ϵ ηgt

其中:

  • ηE[g2]t+ϵ\frac{\eta}{\sqrt{E[g^2]_t + \epsilon}}E[g2]t+ϵ η 是自适应学习率。
  • gtg_tgt 是当前时刻的梯度。

2. RMSProp 的详细推导

2.1 指数加权移动平均的意义

RMSProp 使用指数加权移动平均(EMA)来计算历史梯度平方和,其意义在于:

  1. 最近梯度的影响更大:由于 γ<1\gamma < 1γ<1,最近的梯度平方 gt2g_t^2gt2E[g2]tE[g^2]_tE[g2]t 的影响更大。
  2. 历史梯度的影响逐渐衰减:较早的梯度平方会随着时间步的增加而逐渐衰减。

这种机制使得 RMSProp 能够更好地适应非平稳目标函数(如非凸优化问题)。


2.2 衰减系数 γ\gammaγ 的作用

衰减系数 γ\gammaγ 控制历史梯度平方和的衰减速度:

  • γ\gammaγ 较大时(如 0.99),历史梯度平方和的变化较慢,学习率调整较为平滑。
  • γ\gammaγ 较小时(如 0.9),历史梯度平方和的变化较快,学习率调整较为敏感。

2.3 小常数 ϵ\epsilonϵ 的作用

小常数 ϵ\epsilonϵ 的作用是避免分母为零。具体来说:

  • E[g2]tE[g^2]_tE[g2]t 很小时,E[g2]t+ϵ\sqrt{E[g^2]_t + \epsilon}E[g2]t+ϵ 接近于 ϵ\sqrt{\epsilon}ϵ ,避免学习率过大。
  • E[g2]tE[g^2]_tE[g2]t 很大时,ϵ\epsilonϵ 的影响可以忽略不计。

3. PyTorch 中的 RMSProp 实现

在 PyTorch 中,RMSProp 通过 torch.optim.RMSprop 实现。以下是 torch.optim.RMSprop 的主要参数:

参数名 含义
params 需要优化的参数(通常是模型的参数)。
lr 全局学习率(learning rate),即 η\etaη,默认值为 10−210^{-2}102
alpha 衰减系数(decay rate),即 γ\gammaγ,默认值为 0.99。
eps 分母中的小常数 ϵ\epsilonϵ,用于避免除零,默认值为 10−810^{-8}108
weight_decay 权重衰减(L2 正则化)系数,默认值为 0。
momentum 动量系数,默认值为 0。如果大于 0,则使用动量法。
centered 是否使用中心化的 RMSProp,默认值为 False

3.1 使用 RMSProp 的代码示例

以下是一个使用 RMSProp 的完整代码示例:

import torch
import torch.nn as nn
import torch.optim as optim

# 定义一个简单的线性模型
model = nn.Linear(10, 1)

# 定义损失函数
criterion = nn.MSELoss()

# 定义优化器,使用 RMSProp
optimizer = optim.RMSprop(model.parameters(), lr=0.01, alpha=0.99, eps=1e-8, weight_decay=0.01)

# 模拟输入数据和目标数据
inputs = torch.randn(32, 10)  # 32 个样本,每个样本 10 维
targets = torch.randn(32, 1)  # 32 个目标值

# 训练过程
for epoch in range(100):
    # 前向传播
    outputs = model(inputs)
    loss = criterion(outputs, targets)

    # 反向传播
    optimizer.zero_grad()  # 清空梯度
    loss.backward()        # 计算梯度

    # 更新参数
    optimizer.step()       # 更新参数

    # 打印损失
    if (epoch + 1) % 10 == 0:
        print(f"Epoch [{epoch+1}/100], Loss: {loss.item():.4f}")

3.2 参数设置说明

  1. 学习率 (lr)

    • 学习率 η\etaη 控制每次参数更新的步长。
    • 在 RMSProp 中,学习率会自适应调整,因此初始学习率可以设置得稍大一些。
  2. 衰减系数 (alpha)

    • 衰减系数 γ\gammaγ 控制历史梯度平方和的衰减速度,通常取值在 [0.9,0.99)[0.9, 0.99)[0.9,0.99) 之间。
  3. 小常数 (eps)

    • 小常数 ϵ\epsilonϵ 用于避免分母为零,通常设置为 10−810^{-8}108
  4. 权重衰减 (weight_decay)

    • 权重衰减系数用于 L2 正则化,防止过拟合。
  5. 动量 (momentum)

    • 如果大于 0,则使用动量法,进一步加速收敛。
  6. 中心化 (centered)

    • 如果设置为 True,则使用中心化的 RMSProp,计算梯度平方的均值。

4. 总结

  • RMSProp 的核心思想:通过指数加权移动平均计算历史梯度平方和,自适应调整学习率。
  • RMSProp 的更新公式
    E[g2]t=γ⋅E[g2]t−1+(1−γ)⋅gt2 E[g^2]_t = \gamma \cdot E[g^2]_{t-1} + (1 - \gamma) \cdot g_t^2 E[g2]t=γE[g2]t1+(1γ)gt2
    θt+1=θt−ηE[g2]t+ϵ⋅gt \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{E[g^2]_t + \epsilon}} \cdot g_t θt+1=θtE[g2]t+ϵ ηgt
  • PyTorch 实现:使用 torch.optim.RMSprop,设置 lralphaeps 等参数。
  • 优缺点
    • 优点:自适应学习率,适合非凸优化问题。
    • 缺点:需要手动调整衰减系数 γ\gammaγ
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐