Comment Tensorflow `tf.train.Optimizer` calcule-t-il les gradients?

10

Je suis le tutoriel mnist Tensorflow ( https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_softmax.py ).

Le didacticiel utilise tf.train.Optimizer.minimize(spécifiquement tf.train.GradientDescentOptimizer). Je ne vois aucun argument transmis nulle part pour définir des gradients.

Le flux tenseur utilise-t-il la différenciation numérique par défaut?

Existe-t-il un moyen de passer des dégradés comme vous le pouvez avec scipy.optimize.minimize?

limscoder
la source

Réponses:

16

Ce n'est pas une différenciation numérique, c'est une différenciation automatique . C'est l'une des principales raisons de l'existence de tensorflow: en spécifiant les opérations dans un graphique tensorflow (avec des opérations sur Tensors et ainsi de suite), il peut automatiquement suivre la règle de chaîne à travers le graphique et, puisqu'il connaît les dérivées de chaque opération individuelle que vous spécifier, il peut les combiner automatiquement.

Si, pour une raison quelconque, vous souhaitez remplacer cela par morceaux, c'est possible avec gradient_override_map.

Dougal
la source
La différenciation automatique n'est-elle pas une différenciation numérique?
Aerin
@BYOR Non; consultez le lien Wikipedia ci-dessus. Cependant, ce que fait tensorflow se situe quelque part entre la "vraie" modification automatique en mode inverse et la différenciation symbolique.
Dougal
@Dougal im utilisant le mode avide sans graphique, sans décorateur tf.function, comment la différenciation automatique connaît-elle la relation entre les tenseurs?
datdinhquoc
1
@datdinhquoc C'est le même algorithme fondamental, juste un peu plus compliqué d'une implémentation.
Dougal
9

Il utilise la différenciation automatique. Où il utilise la règle de chaîne et retourne dans le graphique en attribuant des dégradés.

Disons que nous avons un tenseur C Ce tenseur C a fait après une série d'opérations Disons en ajoutant, en multipliant, en passant par une certaine non-linéarité, etc.

Donc, si ce C dépend d'un ensemble de tenseurs appelé Xk, nous devons obtenir les gradients

Tensorflow suit toujours le chemin des opérations. Je veux dire le comportement séquentiel des nœuds et la façon dont les données circulent entre eux. Cela se fait par le graphique entrez la description de l'image ici

Si nous devons obtenir les dérivées du coût par rapport aux entrées X, ce que cela fera en premier est de charger le chemin de l'entrée x au coût en étendant le graphique.

Ensuite, cela commence dans l'ordre des rivières. Ensuite, distribuez les dégradés avec la règle de chaîne. (Identique à la rétropropagation)

De toute façon, si vous lisez les codes source appartiennent à tf.gradients (), vous pouvez constater que tensorflow a fait cette partie de distribution de gradient d'une manière agréable.

Alors que le backtracking tf interagit avec le graphique, dans le mot de passe, TF rencontrera différents nœuds. À l'intérieur de ces nœuds, il y a des opérations que nous appelons (ops) matmal, softmax, relu, batch_normalization, etc. graphique

Ce nouveau nœud compose la dérivée partielle des opérations. get_gradient ()

Parlons un peu de ces nœuds nouvellement ajoutés

À l'intérieur de ces nœuds, nous ajoutons 2 choses 1. Dérivée, nous avons calculé plus) 2.Aussi les entrées de l'opp correspondant dans la passe avant

Donc, selon la règle de la chaîne, nous pouvons calculer

C'est donc la même chose qu'une API de backword

Donc tensorflow pense toujours à l'ordre du graphe pour faire une différenciation automatique

Donc, comme nous savons que nous avons besoin de variables de passage direct pour calculer les gradients, nous devons également stocker les valeurs intermidiates également dans les tenseurs, ce qui peut réduire la mémoire Pour de nombreuses opérations, tf sait comment calculer les gradients et les distribuer.

Shamane Siriwardhana
la source
1
im en utilisant le mode avide sans graphique, sans décorateur tf.function, comment la différenciation automatique connaît-elle la relation entre les tenseurs?
datdinhquoc