¿Cómo calcula los gradientes `tf.train.Optimizer` de Tensorflow?

10

Estoy siguiendo el tutorial de Tensorflow mnist ( https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_softmax.py ).

El tutorial utiliza tf.train.Optimizer.minimize(específicamente tf.train.GradientDescentOptimizer). No veo ningún argumento que se pase a ningún lado para definir gradientes.

¿El flujo del tensor utiliza la diferenciación numérica por defecto?

¿Hay alguna manera de pasar gradientes como puedes scipy.optimize.minimize?

limscoder
fuente

Respuestas:

16

No es diferenciación numérica, es diferenciación automática . Esta es una de las principales razones de la existencia de tensorflow: al especificar operaciones en un gráfico de tensorflow (con operaciones en Tensorsy etc.), puede seguir automáticamente la regla de la cadena a través del gráfico y, dado que conoce las derivadas de cada operación individual, especifique, puede combinarlos automáticamente.

Si por alguna razón desea anular esa parte, es posible con gradient_override_map.

Dougal
fuente
¿No es la diferenciación automática usando diferenciación numérica?
Aerin
@BYOR No; mira el enlace de Wikipedia arriba. Sin embargo, lo que hace el tensorflow es en algún lugar entre el autodiff "real" en modo inverso y la diferenciación simbólica.
Dougal
@Dougal estoy usando el modo ansioso sin gráfico, sin decorador tf.function, ¿cómo sabe la diferenciación automática la relación entre los tensores?
datdinhquoc
1
@datdinhquoc Es el mismo algoritmo fundamental, solo que una implementación un poco más complicada.
Dougal el
9

Utiliza la diferenciación automática. Donde usa la regla de la cadena y retrocede en el gráfico asignando gradientes.

Digamos que tenemos un tensor C Este tensor C se ha creado después de una serie de operaciones. Digamos agregando, multiplicando, pasando por alguna no linealidad, etc.

Entonces, si esta C depende de un conjunto de tensores llamados Xk, necesitamos obtener los gradientes

Tensorflow siempre rastrea la ruta de las operaciones. Me refiero al comportamiento secuencial de los nodos y cómo fluyen los datos entre ellos. Eso lo hace el gráfico ingrese la descripción de la imagen aquí

Si necesitamos obtener los derivados de las entradas de costo wrt X, lo que esto hará primero es cargar la ruta desde la entrada x al costo extendiendo el gráfico.

Luego comienza en el orden de los ríos. Luego distribuya los gradientes con la regla de la cadena. (Igual que la retropropagación)

De cualquier manera, si lee los códigos fuente que pertenecen a tf.gradients (), puede encontrar que tensorflow ha realizado esta parte de distribución de gradiente de una manera agradable.

Mientras retrocede tf interactúa con el gráfico, en el paso de backword TF encontrará diferentes nodos Dentro de estos nodos hay operaciones que llamamos (ops) matmal, softmax, relu, batch_normalization, etc. Entonces, lo que hacemos es cargar automáticamente estas operaciones en el grafico

Este nuevo nodo compone la derivada parcial de las operaciones. get_gradient ()

Hablemos un poco sobre estos nodos recién agregados

Dentro de estos nodos, agregamos 2 cosas 1. Derivada que calculamos antes) 2. También las entradas al opres correspondiente en el pase directo

Entonces, por la regla de la cadena podemos calcular

Esto es tan parecido a una API de backword

Entonces tensorflow siempre piensa en el orden del gráfico para hacer una diferenciación automática

Entonces, como sabemos que necesitamos variables de paso directo para calcular los gradientes, entonces necesitamos almacenar valores intermedios también en tensores, esto puede reducir la memoria. Para muchas operaciones, saber calcular los gradientes y distribuirlos.

Shamane Siriwardhana
fuente
1
estoy usando el modo ansioso sin gráfico, sin decorador de función tf, ¿cómo sabe la diferenciación automática la relación entre los tensores?
datdinhquoc