playground examples descargar course tensorflow

examples - Cómo usar stop_gradient en Tensorflow



tensorflow playground (2)

Me pregunto cómo usar stop_gradient en tensorflow, y la documentación no está clara para mí.

Actualmente estoy usando stop_gradient para producir el gradiente de la función de pérdida con la palabra incrustaciones en un modelo CBOW word2vec. Solo quiero obtener el valor, y no hacer la propagación inversa (ya que estoy generando ejemplos adversarios).

Actualmente, estoy usando el código:

lossGrad = gradients.gradients(loss, embed)[0] real_grad = lossGrad.eval(feed_dict)

Pero cuando ejecuto esto, ¡hace la retropropagación de todos modos! ¿Qué estoy haciendo mal, y lo que es igual de importante, cómo puedo solucionarlo?

ACLARACIÓN: Para aclarar por "retropropagación" me refiero a "calcular los valores y actualizar los parámetros del modelo".

ACTUALIZAR

Si ejecuto las dos líneas de arriba después del primer paso de capacitación, obtengo una pérdida diferente después de 100 pasos de capacitación que cuando no ejecuto esas dos líneas. Es posible que esté fundamentalmente malentendiendo algo sobre Tensorflow.

Intenté configurar usando set_random_seed tanto al principio de la declaración del gráfico como antes de cada paso de entrenamiento. La pérdida total es consistente entre varias ejecuciones, pero no entre incluir / excluir esas dos líneas. Entonces, si no es el RNG el que causa la disparidad, y no es una actualización no anticipada de los parámetros del modelo entre los pasos de capacitación, ¿tiene alguna idea de qué podría causar este comportamiento?

SOLUCIÓN

Welp, es un poco tarde, pero así es como lo resolví. Solo quería optimizar algunas variables, pero no todas. Pensé que la forma de evitar la optimización de algunas variables sería usar stop_grad , pero nunca encontré la manera de hacerlo funcionar. Tal vez haya una manera, pero lo que funcionó para mí fue ajustar mi optimizer para optimizar solo una lista de variables. Entonces, en lugar de:

opt = tf.train.GradientDescentOptimizer(learning_rate=eta) train_op = opt.minimize(loss)

Solía:

opt = tf.train.GradientDescentOptimizer(learning_rate=eta) train_op = opt.minimize(loss, var_list=[variables to optimize over])

Esto impidió que opt actualice las variables que no están en var_list . ¡Espero que también te funcione!


tf.stop_gradient proporciona una forma de no calcular el gradiente con respecto a algunas variables durante la retro-propagación.

Por ejemplo, en el siguiente código, tenemos tres variables, w1, w2, w3 y entrada x. La pérdida es cuadrada ((x1.dot (w1) - x.dot (w2 * w3))). Queremos minimizar esta pérdida wrt a w1, pero queremos mantener w2 y w3 corregidos. Para lograr esto, podemos poner tf.stop_gradient (tf.matmul (x, w2 * w3)).

En la siguiente figura, tracé cómo w1, w2 y w3 a partir de sus valores iniciales como la función de las iteraciones de entrenamiento. Se puede ver que w2 y w3 permanecen fijos mientras que w1 cambia hasta que se convierte en w2 * w3.

Una imagen que muestra que w1 solo aprende, pero no w2 y w3

import tensorflow as tf import numpy as np w1 = tf.get_variable("w1", shape=[5, 1], initializer=tf.truncated_normal_initializer()) w2 = tf.get_variable("w2", shape=[5, 1], initializer=tf.truncated_normal_initializer()) w3 = tf.get_variable("w3", shape=[5, 1], initializer=tf.truncated_normal_initializer()) x = tf.placeholder(tf.float32, shape=[None, 5], name="x") a1 = tf.matmul(x, w1) a2 = tf.matmul(x, w2*w3) a2 = tf.stop_gradient(a2) loss = tf.reduce_mean(tf.square(a1 - a2)) optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1) gradients = optimizer.compute_gradients(loss) train_op = optimizer.apply_gradients(gradients)


tf.gradients(loss, embed) calcula la derivada parcial de la loss del tensor con respecto al embebido del tensor. TensorFlow calcula esta derivada parcial por retropropagación, por lo que es un comportamiento esperado que la evaluación del resultado de tf.gradients(...) realice una retropropagación. Sin embargo, la evaluación de ese tensor no lleva a cabo ninguna actualización de variables, porque la expresión no incluye ninguna operación de asignación .

tf.stop_gradient() es una operación que actúa como la función de identidad en la dirección de avance, pero evita que el gradiente acumulado fluya a través de ese operador hacia atrás. No impide por completo la retropropagación, sino que evita que un tensor individual contribuya a los gradientes que se computan para una expresión. La documentación de la operación contiene más detalles sobre la operación y cuándo usarla.