Nesterov的加速梯度下降如何在Tensorflow中实施?

什么时候:

的文档tf.train.MomentumOptimizer提供了use_nesterov利用Nesterov的加速梯度(NAG)方法的参数。

但是,NAG要求计算除当前变量以外的其他位置处的梯度,并且apply_gradients界面仅允许传递当前梯度。因此,我不太了解如何使用此接口实现NAG算法。

该文档说明了有关实现的以下内容:

use_nesterov:如果为True,请使用Nesterov动量。参见Sutskever等,2013此实现始终以传递给优化器的变量的值来计算梯度。使用Nesterov Momentum可使变量跟踪theta_t + mu*v_t本文中调用的值

阅读了链接中的论文后,我不确定该说明是否回答了我的问题。当接口不需要提供梯度函数时,如何实现NAG算法?

P-Gn:

TL; DR

TF对Nesterov的实现确实是原始公式的近似值,适用于高动量值。

细节

这是一个很好的问题。在本文中,NAG更新定义为

vt+1 = μ.vt - λ.∇f(θt + μ.vt)
θt+1 = θt + vt+1

f我们的成本函数,时间参数动量,学习率哪里是NAG的内部累加器。θttμλvt

与标准的势头的主要区别是在使用了渐变的没有但是正如您所说,tensorflow仅在使用梯度那么诀窍是什么?θt + μ.vtθtθt

您所引用的文档部分实际上提到了部分技巧:算法是跟踪而不是另一部分来自对高动量值有效的近似值。θt + μ.vt θt

让我们从纸张上稍微更改一下表示法,以使累加器遵循张量流的定义。让我们定义更新规则随着at = vt / λ

at+1 = μ.at - ∇f(θt + μ.λ.at)
θt+1 = θt + λ.at+1

(导致TF发生这种变化的动机是,现在a是纯梯度动量,与学习速率无关。这使得更新过程对于变化很鲁棒λ,这在实践中很常见,但本文没有考虑。)

如果我们注意的ψt = θt + μ.λ.at

at+1 = μ.at - ∇f(ψt)
ψt+1 = θt+1 + μ.λ.at+1
    = θt + λ.at+1 + μ.λ.at+1
    = ψt + λ.at+1 + μ.λ.(at+1 - at)
    = ψt + λ.at+1 + μ.λ.[(μ-1)at - ∇f(ψt)]
    ≈ ψt + λ.at+1

最后的近似值适用于动量大的值,该μ值接近1,因此μ-1接近零,并且与以下值相比较小—实际上,这个最后的近似值更具争议性,并且对于频繁切换梯度的方向更无效。∇f(ψt)a

现在,我们进行了更新,该更新使用当前位置的梯度,并且规则非常简单-实际上它们是标准动量的规则。

但是,我们想要的不是这就是为什么我们在返回之前就减去然后在下一次调用时再次添加它以恢复它的原因。θtψtμ.λ.at+1ψt+1ψ

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章