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
?
fuente
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
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.
fuente