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

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)

有一个更好的方法吗?

最佳答案

apply_gradients方法实际应用的更新规则取决于特定的优化器。看一看apply_gradientsheretf.train.Optimizer的实现。它依赖于在_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继承),该优化器直接实现所需的更新规则。

关于tensorflow - opt.apply_gradients()在TensorFlow中做什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37921781/

10-12 23:05