实现 RMSProp,但发现参考版本之间的差异

数据挖掘 神经网络 梯度下降
2021-10-13 05:31:19

我正在研究在我正在编写的神经网络项目中实现 RMSProp。

我还没有找到任何已发表的论文来参考规范版本 - 我首先从Geoffrey Hinton 提出的 Coursera 课程中偶然发现了这个想法(我认为是第 6 讲)。尽管许多梯度下降优化库都有一个名为“RMSProp”的选项,但我认为该方法从未正式发布过。此外,我的搜索显示了原始想法的一些变体,目前尚不清楚它们为什么不同,或者是否有明确的理由使用一个版本而不是另一个版本。

RMSProp 背后的总体思路是通过当前梯度幅度的移动平均值来缩放学习率。在每个更新步骤中,现有的平方梯度被平均为一个运行平均值(它“衰减”一个因子),当网络权重参数更新时,更新除以这些平均平方梯度的平方根。这似乎是通过随机“感受”成本函数的二阶导数来实现的。

天真地,我将按如下方式实现:

参数:

  • γ [0,1] 中平均的几何速率
  • 防止被零除的数值稳定性/平滑项,通常很小,例如 1e-6
  • ε 学习率

条款:

  • W 网络权重
  • Δ 权重梯度,即 W 对于特定的小批量
  • R 运行平均平方权重的 RMSProp 矩阵

初始化:

  • R1 (即所有矩阵单元设置为 1)

对于每个小批量:

  • R(1-γ)R+γΔ2 (按元素平方,而不是矩阵相乘)
  • W=W-εΔR+ (所有元素方面)

我之前已经实现并使用了与此类似的版本,但那次我做了一些不同的事情。而不是更新R 与单 Δ2从小批量(即小批量的梯度求和,然后平方),我总结了小批量中每个单独的示例梯度的平方。再读一遍,我猜那是错误的。但它运作得相当好,比简单的动力要好。虽然可能不是一个好主意,因为需要所有这些额外的元素平方和总和,如果不需要,它的效率会降低。

所以现在我发现了似乎有效的进一步变化。他们称自己为 RMSProp,除了“这行得通”之外,似乎没有人有太多理由。例如,Pythonclimin似乎实现了我上面的建议,但随后建议进一步结合动量与预告片“在某些情况下,添加动量项 β 是有益的”,并部分解释了可适应的步率 - 我猜在完全理解它们是什么之前,我需要更多地参与该库。在另一个例子中,下坡库的 RMSProp 实现结合了两个移动平均线——一个与上面相同,但另一个,

我真的很想了解更多关于这些替代 RMSProp 版本的信息。它们来自哪里,提出替代公式的理论或直觉在哪里,为什么这些库使用它们?有没有更好的表现的证据?

1个回答

RMSProp 确实是一种未发表的方法,在讲座中,Geoffrey Hinton 仅给出了 RMSProp 背后的一般思想——将梯度除以梯度幅度的移动平均值。该讲座已从 YouTube 上消失,但您可以在此 PDF 的末尾找到幻灯片:

https://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf

当这个原理应用到随机梯度下降时,就得到了你展示的更新规则。由于 Hinton 没有提出精确的算法,因此该原理已应用于不同的优化方法。我同意所有这些自称为 RMSProp 的方法都令人困惑。

climin用 Nesterov 动量实现 RMSProp。动量方法试图通过缓慢改变当前更新方向来避免 SGD 经常发生的振荡。文档中给出的算法climin介绍了β控制保留多少先前更新方向的参数。Nesterov 动量是通过首先朝着之前的更新方向迈出一步来实现的v,计算那个位置的梯度,利用梯度得到新的更新方向 v+1,最后更新参数。climin实现还包括平滑项 即使在文档中没有提到,在平方根内以保持稳定性 (1e-8)。

Downhill 库中的实现基于A. Graves 的论文中描述的算法。在文章(方程 38-40)中,平均梯度的平方从平均梯度的平方中减去。显然,这个想法是近似梯度的方差而不是其幅度(回想一下,随机变量的方差等于平方的均值减去均值的平方)。