opt.apply_gradients()在TensorFlow中做了什么?

时间:2016-06-20 11:48:45

标签: tensorflow

文档对此并不十分清楚。我认为opt.compute_gradients(E, [v])可以获得的渐变包含∂E/∂x = g(x)存储的张量的每个元素x vopt.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)

有更好的方法吗?

2 个答案:

答案 0 :(得分:12)

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),直接实现所需的更新规则。

答案 1 :(得分:0)

您还可以使用渴望执行的API。

import tensorflow as tf
tf.enable_eager_execution()
tfe = tf.contrib.eager
optimizer = tf.train.GradientDescentOptimizer(learning_rate)
grad = tfe.implicit_gradients(loss)
optimizer.apply_gradients(grad(model_fn, val_list))

我将为其创建一个实例,如下所示:

import tensorflow as tf
tf.enable_eager_exeuction()
tfe = tf.contrib.eager

W = tfe.Variable(np.random.randn())
b = tfe.Variable(np.random.randn())

def linear_regression(inputs):
    return inputs * W + b;

def MSE(model_fn, inputs, labels):
    return tf.reduce_sum(tf.pow(model_fn(inputs) - labels, 2)) / (2 * n_samples)

optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.001)
grad = tfe.implicit_gradients(MSE)
optimizer.apply_gradients(grad(linear_regression, train_X, train_Y)) # train_X and train_Y are your input data and label