文档对此不太清楚。我想可以通过opt.compute_gradients(E, [v])
获得的渐变包含∂E/∂x = g(x)
存储的张量的每个元素x
的v
。 opt.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_gradients
类here中tf.train.Optimizer
的实现。它依赖于在_apply_dense
和_apply_spares
方法中实现更新规则的派生类。您引用的更新规则由GradientDescentOptimizer
实现。
关于所需的积极附加更新:如果您所称的opt
是GradientDescentOptimizer
的实例化,那么您确实可以通过以下方式实现您想要的功能
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/