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

qua*_*ant 7 python machine-learning tensorflow

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

但是,NAG要求在不同于当前变量的位置处计算apply_gradients梯度,并且界面仅允许传递当前梯度.所以我不太明白如何用这个接口实现NAG算法.

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

use_nesterov:如果真的使用Nesterov Momentum.见Sutskever等,2013.此实现始终计算传递给优化程序的变量值的渐变.使用Nesterov Momentum使变量跟踪theta_t + mu*v_t论文中调用的值.

通过阅读链接中的论文,我不确定这个描述是否回答了我的问题.当接口不需要提供梯度函数时,如何实现NAG算法?

P-G*_*-Gn 5

TL; 博士

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

细节

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

vt+1 = ?.vt - ?.?f(?t + ?.vt)
?t+1 = ?t + vt+1
Run Code Online (Sandbox Code Playgroud)

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

与标准动量的主要区别是在 处使用梯度,而不是在 处。但是正如你所说,tensorflow 只在 处使用梯度。那么诀窍是什么??t + ?.vt?t?t

您引用的文档部分实际上提到了部分技巧:算法是 tracking ,not。另一部分来自对高动量值有效的近似值。?t + ?.vt ?t

让我们从论文中对累加器的符号稍作更改,以坚持 tensorflow 的定义。让我们定义. 更新规则略有变化at = vt / ?

at+1 = ?.at - ?f(?t + ?.?.at)
?t+1 = ?t + ?.at+1
Run Code Online (Sandbox Code Playgroud)

(在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
Run Code Online (Sandbox Code Playgroud)

最后一个近似值适用于强大的动量值,其中?接近 1,因此?-1接近于零,并且与此相比较小——最后一个近似值实际上更具争议性,并且对于频繁梯度切换的方向不太有效。?f(?t)a

我们现在有一个使用当前位置梯度的更新,规则非常简单——它们实际上是标准动量的规则。

但是,我们想要,而不是。这就是为什么我们在返回之前减去to的原因- 并在下一次调用时再次添加它以恢复它。?t?t?.?.at+1?t+1?