opt.apply_gradients() 在 TensorFlow 中做什么?
What does opt.apply_gradients() do in TensorFlow?
文档对此不是很清楚。我想通过 opt.compute_gradients(E, [v])
可以获得的梯度包含 v
存储的张量的每个元素 x
的 ∂E/∂x = g(x)
。 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
在 tf.train.Optimizer
class here 中的实现。它依赖派生的 classes 在方法 _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
)直接实现您想要的更新规则。
您也可以使用急切执行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
文档对此不是很清楚。我想通过 opt.compute_gradients(E, [v])
可以获得的梯度包含 v
存储的张量的每个元素 x
的 ∂E/∂x = g(x)
。 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
在 tf.train.Optimizer
class here 中的实现。它依赖派生的 classes 在方法 _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
)直接实现您想要的更新规则。
您也可以使用急切执行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