2016-06-20 358 views
14

文档对此不太清楚。我想通过opt.compute_gradients(E, [v])可以获得的梯度包含∂E/∂x = g(x),对于v存储的张量的每个元素xopt.apply_gradients(grads_and_vars)本质上是执行x ← -η·g(x),其中η是学习率?这意味着如果我想为变量添加一个正的附加变量p,我需要更改g(x) ← g(x) - (1/η)p,例如,像这样:什么是opt.apply_gradients()在TensorFlow中做什么?

opt = tf.train.GradientDescentOptimizer(learning_rate=l) 
grads_and_vars = opt.compute_gradients(loss, var_list) 

for l, gv in enumerate(grads_and_vars): 
    grads_and_vars[l] = (gv[0] - (1/l) * p, gv[1]) 

train_op = opt.apply_gradients(grads_and_vars) 

有没有更好的方法来做到这一点?

回答

8

apply_gradients方法实际应用的更新规则取决于特定的优化器。看看apply_gradientstf.train.Optimizerhere的实现。它依赖于在方法_apply_dense_apply_spares中实施更新规则的派生类。您所指的更新规则由GradientDescentOptimizer执行。

关于你想要的正极添加更新:如果你在呼唤optGradientDescentOptimizer一个实例,那么你确实可以达到你想要的

grads_and_vars = opt.compute_gradients(E, [v]) 
eta = opt._learning_rate 
my_grads_and_vars = [(g-(1/eta)*p, v) for g, v in grads_and_vars] 
opt.apply_gradients(my_grads_and_vars) 

更优雅的方式来做到这一点做的可能是编写一个新的优化器(继承自tf.train.Optimizer),直接实现您所需的更新规则。

+0

对不起,我在您提供的代码片段中忽略了'opt = tf.train.GradientDescentOptimizer(learning_rate = l)'这一行,这使我的答案的第一段无关紧要。尽管如此,仍然将它留在上下文中。 – lballes

+0

谢谢。其他梯度优化器可以计算例如基于我更新的渐变的动画,或者为什么它们与这种方法不兼容? –

+0

其他优化器实现更新规则,如动量梯度下降,AdaGrad等。当然,为更新步骤添加一个常量值与任何更新规则都是兼容的(它是一个单独的问题有多明智)。 – lballes

相关问题