train sgd optimizer gradientdescentoptimizer tensorflow

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.