sgd - ¿Qué hace opt.apply_gradients() en TensorFlow?
sgd tensorflow (1)
La documentación no es muy clara al respecto. Supongo que los gradientes que se pueden obtener por opt.compute_gradients(E, [v])
contienen ∂E/∂x = g(x)
para cada elemento x
del tensor que v
almacena. ¿ opt.apply_gradients(grads_and_vars)
esencialmente ejecuta x ← -η·g(x)
, donde η
es la tasa de aprendizaje? Eso implicaría que si quiero agregar un cambio positivo aditivo p
a la variable, necesitaría cambiar g(x) ← g(x) - (1/η)p
, por ejemplo, de esta forma:
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)
¿Hay una mejor manera de hacer esto?
La regla de actualización que el método apply_gradients
aplica realmente depende del optimizador específico. Eche un vistazo a la implementación de apply_gradients
en la clase tf.train.Optimizer
here . Se basa en las clases derivadas que implementan la regla de actualización en los métodos _apply_dense
y _apply_spares
. La regla de actualización a la que se refiere está implementada por GradientDescentOptimizer
.
Con respecto a su actualización aditiva positiva deseada: si lo que está llamando opt
es una creación de instancias de GradientDescentOptimizer
, entonces de hecho podría lograr lo que quiere hacer al
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)
Probablemente, la forma más elegante de hacerlo es escribir un nuevo optimizador (heredado de tf.train.Optimizer
) que implemente la regla de actualización deseada directamente.