梯度下降优化算法-RMSProp
RMSProp(Root Mean Square Propagation)是一种自适应学习率的优化算法,旨在解决 AdaGrad 学习率单调递减的问题。RMSProp 通过引入衰减系数(decay rate),使得历史梯度平方和不会无限增长,从而更好地适应非凸优化问题。
1. RMSProp 的数学原理
1.1 AdaGrad 的问题回顾
AdaGrad 的核心思想是为每个参数分配自适应的学习率,其更新公式为:
G t = G t − 1 + g t 2 G_t = G_{t-1} + g_t^2 Gt=Gt−1+gt2
θ t + 1 = θ t − η G t + ϵ ⋅ g t \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{G_t + \epsilon}} \cdot g_t θt+1=θt−Gt+ϵη⋅gt
其中:
- G t G_t Gt 是历史梯度平方和的累积值。
- η \eta η 是全局学习率。
- ϵ \epsilon ϵ 是一个很小的常数,用于避免分母为零。
AdaGrad 的问题是:
- 学习率单调递减:由于 G t G_t Gt 是单调递增的,学习率会逐渐减小,可能导致训练后期学习率过小,收敛缓慢。
- 内存开销较大:需要存储每个参数的历史梯度平方和。
1.2 RMSProp 的引入
RMSProp 通过引入衰减系数 γ \gamma γ,解决了 AdaGrad 学习率单调递减的问题。其核心思想是对历史梯度平方和进行指数加权移动平均(Exponential Moving Average, EMA),而不是简单累加。
1.3 RMSProp 的更新规则
RMSProp 的更新规则分为以下几个步骤:
1.3.1 梯度计算
首先,计算当前时刻的梯度:
g t = ∇ θ J ( θ t ) g_t = \nabla_\theta J(\theta_t) gt=∇θJ(θt)
其中:
- g t g_t gt 是当前时刻的梯度向量,形状与参数 θ t \theta_t θt 相同。
1.3.2 历史梯度平方和的指数加权平均
RMSProp 使用指数加权移动平均来计算历史梯度平方和:
E [ g 2 ] t = γ ⋅ E [ g 2 ] t − 1 + ( 1 − γ ) ⋅ g t 2 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 [ g 2 ] t E[g^2]_t E[g2]t 是历史梯度平方和的指数加权平均值。
- γ \gamma γ 是衰减系数(decay rate),通常取值在 [ 0.9 , 0.99 ) [0.9, 0.99) [0.9,0.99) 之间。
- g t 2 g_t^2 gt2 表示对梯度向量 g t g_t gt 逐元素平方。
注意:
- 初始时, E [ g 2 ] 0 E[g^2]_0 E[g2]0 通常设置为 0。
1.3.3 自适应学习率的计算
RMSProp 使用历史梯度平方和的指数加权平均值 E [ g 2 ] t E[g^2]_t E[g2]t 来调整学习率。具体来说,学习率被调整为:
学习率 = η E [ g 2 ] t + ϵ \text{学习率} = \frac{\eta}{\sqrt{E[g^2]_t + \epsilon}} 学习率=E[g2]t+ϵη
其中:
- η \eta η 是全局学习率。
- ϵ \epsilon ϵ 是一个很小的常数(通常为 1 0 − 8 10^{-8} 10−8),用于避免分母为零。
- E [ g 2 ] t + ϵ \sqrt{E[g^2]_t + \epsilon} E[g2]t+ϵ 是对历史梯度平方和的指数加权平均值逐元素开平方。
1.3.4 参数更新
最后,RMSProp 的参数更新公式为:
θ t + 1 = θ t − η E [ g 2 ] t + ϵ ⋅ g t \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{E[g^2]_t + \epsilon}} \cdot g_t θt+1=θt−E[g2]t+ϵη⋅gt
其中:
- η E [ g 2 ] t + ϵ \frac{\eta}{\sqrt{E[g^2]_t + \epsilon}} E[g2]t+ϵη 是自适应学习率。
- g t g_t gt 是当前时刻的梯度。
2. RMSProp 的详细推导
2.1 指数加权移动平均的意义
RMSProp 使用指数加权移动平均(EMA)来计算历史梯度平方和,其意义在于:
- 最近梯度的影响更大:由于 γ < 1 \gamma < 1 γ<1,最近的梯度平方 g t 2 g_t^2 gt2 对 E [ g 2 ] t E[g^2]_t E[g2]t 的影响更大。
- 历史梯度的影响逐渐衰减:较早的梯度平方会随着时间步的增加而逐渐衰减。
这种机制使得 RMSProp 能够更好地适应非平稳目标函数(如非凸优化问题)。
2.2 衰减系数 γ \gamma γ 的作用
衰减系数 γ \gamma γ 控制历史梯度平方和的衰减速度:
- 当 γ \gamma γ 较大时(如 0.99),历史梯度平方和的变化较慢,学习率调整较为平滑。
- 当 γ \gamma γ 较小时(如 0.9),历史梯度平方和的变化较快,学习率调整较为敏感。
2.3 小常数 ϵ \epsilon ϵ 的作用
小常数 ϵ \epsilon ϵ 的作用是避免分母为零。具体来说:
- 当 E [ g 2 ] t E[g^2]_t E[g2]t 很小时, E [ g 2 ] t + ϵ \sqrt{E[g^2]_t + \epsilon} E[g2]t+ϵ 接近于 ϵ \sqrt{\epsilon} ϵ,避免学习率过大。
- 当 E [ g 2 ] t E[g^2]_t E[g2]t 很大时, ϵ \epsilon ϵ 的影响可以忽略不计。
3. PyTorch 中的 RMSProp 实现
在 PyTorch 中,RMSProp 通过 torch.optim.RMSprop
实现。以下是 torch.optim.RMSprop
的主要参数:
参数名 | 含义 |
---|---|
params | 需要优化的参数(通常是模型的参数)。 |
lr | 全局学习率(learning rate),即 η \eta η,默认值为 1 0 − 2 10^{-2} 10−2。 |
alpha | 衰减系数(decay rate),即 γ \gamma γ,默认值为 0.99。 |
eps | 分母中的小常数 ϵ \epsilon ϵ,用于避免除零,默认值为 1 0 − 8 10^{-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 ϵ 用于避免分母为零,通常设置为 1 0 − 8 10^{-8} 10−8。
-
权重衰减 (
weight_decay
):- 权重衰减系数用于 L2 正则化,防止过拟合。
-
动量 (
momentum
):- 如果大于 0,则使用动量法,进一步加速收敛。
-
中心化 (
centered
):- 如果设置为
True
,则使用中心化的 RMSProp,计算梯度平方的均值。
- 如果设置为
4. 总结
- RMSProp 的核心思想:通过指数加权移动平均计算历史梯度平方和,自适应调整学习率。
- RMSProp 的更新公式:
E [ g 2 ] t = γ ⋅ E [ g 2 ] t − 1 + ( 1 − γ ) ⋅ g t 2 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 [ g 2 ] t + ϵ ⋅ g t \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 γ。