Adam 优化器中的 epsilon 参数

epsilon parameter in Adam opitmizer

使用pyTorch和tensorflow(TF),好奇Adam优化器是如何实现的,一直在徘徊。我不知道我是不是错了,但在我看来,这两种实现方式不同,pyTorch 是来自 https://arxiv.org/pdf/1412.6980.pdf 的原始实现方式。

我的问题来自 eps 参数。使用 TF 实现似乎会导致此参数的时间和 b2 依赖性,即

q(t+1) = q(t) - \gamma * sqrt[(1-b2^t)]/(1-b1^t) * m(t)/[sqrt[v(t)]+eps]

原来的算法符号可以改写为

 q(t+1) = q(t) - \gamma * mhat(t)/[sqrt[vhat(t)]+ eps/sqrt[(1-b2^t)]]

这指出了 eps 参数的变化,这在原始算法和 pyTorch 实现中都不是这种情况。

我错了吗?或者它是众所周知的? 感谢您的帮助。

确实,您可以查看此 in the docs 的 TF Adam 优化器。引用相关部分:

The default value of 1e-8 for epsilon might not be a good default in general. For example, when training an Inception network on ImageNet a current good choice is 1.0 or 0.1. Note that since AdamOptimizer uses the formulation just before Section 2.1 of the Kingma and Ba paper rather than the formulation in Algorithm 1, the "epsilon" referred to here is "epsilon hat" in the paper.

如果你检查论文中的"the formulation just before section 2.1",它们实际上包括时间依赖性在alpha中,导致时间依赖性"step size" alpha_t但是一个固定的epsilon。请注意,归根结底,这只是 rewriting/interpreting 参数的方式略有不同,不会改变算法的实际工作原理。但是您 需要注意,在 PyTorch 和 TF 实现中选择相同的 epsilon 显然不会导致相同的结果...

您可以从第二个到第一个推导出公式如下。所以在tensorflow实现中,epsilon其实就是这里的epsilon'。另外,在tensorflow实现中,学习率被调整为下式中的alpha'。希望这可以帮助。