Rprop 与 RMSprop 优化器

https://www.cnblogs.com/setdong/p/16508415.html

1. Rprop

在 full-batch optimization 中, 一些梯度可能很小, 而另一些梯度可能很大, 故难以寻找一个 global 学习率.

可以使用梯度的 sign 解决这个问题, 保证所有权重更新相同的大小. Rprop 在此基础上又考虑为每个权重单独调整步长, 且这些步长随时间变化而调整, 算法如下:

  1. 设置权重变化的加速因子(increase factor)和减速因子(decrease factor).
  2. 设置权重变化的 max 限制和 min 限制, 它们的取值取决于模型和数据集, 默认值是 50 和 10[^-5].
  3. 首先, 对于一个权重, 观察其 the last two 梯度.
  4. 如果它们的 sign 相同, 说明我们正朝着正确的方向更新梯度, 并且可以增加步长; 如果它们的 sign 值不同, 说明我们的步长太大并且跳过了局部最小值, 因此可以减小步长.
  5. 按权重变化限制对权重进行更新

有不同版本的 Rprop 算法, 这里介绍的是最简单的一个. 简单的代码如下:

```
for t in range(num_interations):
    dw[t] = compute_gradient(x, y)
    
    if dw[t] * dw[t - 1] > 0:
        step_size = min(step_size * incFactor, step_size_max)
    elif dw[t] * dw[t - 1] < 0:
        step_size = max(step_size * decFactor, step_size_min)
    
    w[t] = w[t - 1] - sign(dw[t]) * step_size
```

2. Rprop to RMSprop

当我们的数据集规模很大并使用 mini-batch 时, Rprop 就无法起作用了. 例如, 考虑权重的 10 个 mini-batches, 其中它在 9 个 mini-batches 上得到了梯度 0.1, 在一个 mini-batch 上得到了梯度 -0.9, 我们想要的是这些梯度的变化大致抵消 (averaging), 但使用 Rprop 的话, 我们将权重增加 9 次, 减少 1 次, 因此权重变得更大.

RMSprop 中的 RMS 表示的是均方根 (root mean square). Rprop 的主要思想是使用梯度, 同时除以梯度的大小 (sign), RMSprop 的主要思想是将梯度除以均方根的平方, 并且还考虑相邻的 mini-batch. 数学公式如下:

\[E[g^2]_t = \beta E[g^2]_{t-1} + (1-\beta)(\frac{\delta C}{\delta w})^2 \\ w_t = w_{t-1} - \frac{\eta}{\sqrt{E[g^2]_t}}\frac{\delta C}{\delta w} \]

\(E\) 为梯度平方的 moving average, \(C\) 为损失函数, \(\eta\) 为学习率, \(\beta\) 为 moving average 的参数(默认值 0.9). 代码如下:

drad_squared = 0
for _ in num_iterations:
    dw = compute_gradients(x, y)
    grad_squared = 0.9 * grads_squared + 0.1 * dx * dx
    w = w - (lr / np.sqrt(grad_squared)) * dw

Pytorch 中的 RMSprop: https://pytorch.org/docs/stable/generated/torch.optim.RMSprop.html

img

source: https://imgur.com/a/Hqolp#NKsFHJb

posted @ 2022-07-23 03:27  李斯赛特  阅读(1230)  评论(0编辑  收藏  举报