1. 统一学习率的困境
所有参数共用一个学习率:
| 参数类型 | 问题 |
|---|---|
| 梯度大的参数 | 学习率稍大就在最优值附近振荡,收敛不了 |
| 梯度小的参数 | 学习率稍小就几乎不动,学不到东西 |
你找不到一个学习率能同时适配所有参数。
2. RMSProp 的核心思想:自适应学习率
让每个参数有自己的”有效学习率”。
| 参数类型 | 历史梯度 | 除数 | 有效学习率 |
|---|---|---|---|
| 梯度大的参数 | 历史都很大 | 除以大数 | 变小,抑制振荡 |
| 梯度小的参数 | 历史都很小 | 除以小数 | 变大,加速学习 |
一句话:历史梯度大 → 慢下来;历史梯度小 → 快起来。训练既稳定又高效。
3. 计算过程
以参数 为例:
第一步:计算梯度
第二步:更新历史梯度平方的指数加权平均
- 记录的是 的历史平滑值,反映”这个参数的梯度一直有多大”
- 取平方是为了:消除正负号影响 + 放大大小差异
第三步:用 来缩放学习率
| 符号 | 含义 | 典型值 |
|---|---|---|
| 控制历史窗口的衰减系数 | 0.9 | |
| 防止除零的小常数 | 1e-8 | |
| 开方是因为 存的是平方值,需还原到梯度的量级 | — |
4. 对比
| 标准 SGD | Momentum | RMSProp | |
|---|---|---|---|
| 更新方向来源 | 当前梯度 | 梯度的指数加权平均 | 当前梯度 |
| 学习率 | 全局统一 | 全局统一 | 每个参数自适应 |
| 解决什么 | — | 振荡 + 局部最优 | 不同参数梯度量级不匹配 |
| 核心机制 |
5. PyTorch 中使用
optimizer = optim.RMSprop(model.parameters(), lr=0.001, alpha=0.9, eps=1e-8)
# alpha 对应 β(PyTorch 中参数名不同)
6. 总结
问题:所有参数共享一个学习率 → 大的振荡、小的停滞
RMSProp 解法:
S = β·S + (1-β)·g² ← 追踪梯度平方的历史
w = w - lr/(√S+ε) · g ← 历史大的除得多,历史小的除得少
效果:
├── 每个参数自适应学习率
├── 训练更稳定(大梯度被压制)
└── 收敛更快(小梯度被放大)
预演:RMSProp + Momentum = Adam(下一节)