梯度下降优化算法-RMSProp
RMSProp 的核心思想:通过指数加权移动平均计算历史梯度平方和,自适应调整学习率。RMSProp 的更新公式Eg2tγ⋅Eg2t−11−γ⋅gt2Eg2tγ⋅Eg2t−11−γ⋅gt2θt1θt−ηEg2tϵ⋅gtθt1θt−Eg2tϵη⋅gtPyTorch 实现:使用,设置lralphaeps等参数。优缺点。
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=Gt−1+gt2
θt+1=θt−ηGt+ϵ⋅gt \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{G_t + \epsilon}} \cdot g_t θt+1=θt−Gt+ϵη⋅gt
其中:
- GtG_tGt 是历史梯度平方和的累积值。
- η\etaη 是全局学习率。
- ϵ\epsilonϵ 是一个很小的常数,用于避免分母为零。
AdaGrad 的问题是:
- 学习率单调递减:由于 GtG_tGt 是单调递增的,学习率会逐渐减小,可能导致训练后期学习率过小,收敛缓慢。
- 内存开销较大:需要存储每个参数的历史梯度平方和。
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]t−1+(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}10−8),用于避免分母为零。
- 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=θt−E[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\gamma < 1γ<1,最近的梯度平方 gt2g_t^2gt2 对 E[g2]tE[g^2]_tE[g2]t 的影响更大。
- 历史梯度的影响逐渐衰减:较早的梯度平方会随着时间步的增加而逐渐衰减。
这种机制使得 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}10−2。 |
alpha |
衰减系数(decay rate),即 γ\gammaγ,默认值为 0.99。 |
eps |
分母中的小常数 ϵ\epsilonϵ,用于避免除零,默认值为 10−810^{-8}10−8。 |
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 参数设置说明
-
学习率 (
lr):- 学习率 η\etaη 控制每次参数更新的步长。
- 在 RMSProp 中,学习率会自适应调整,因此初始学习率可以设置得稍大一些。
-
衰减系数 (
alpha):- 衰减系数 γ\gammaγ 控制历史梯度平方和的衰减速度,通常取值在 [0.9,0.99)[0.9, 0.99)[0.9,0.99) 之间。
-
小常数 (
eps):- 小常数 ϵ\epsilonϵ 用于避免分母为零,通常设置为 10−810^{-8}10−8。
-
权重衰减 (
weight_decay):- 权重衰减系数用于 L2 正则化,防止过拟合。
-
动量 (
momentum):- 如果大于 0,则使用动量法,进一步加速收敛。
-
中心化 (
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]t−1+(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=θt−E[g2]t+ϵη⋅gt - PyTorch 实现:使用
torch.optim.RMSprop,设置lr、alpha、eps等参数。 - 优缺点:
- 优点:自适应学习率,适合非凸优化问题。
- 缺点:需要手动调整衰减系数 γ\gammaγ。
更多推荐


所有评论(0)