web-dev-qa-db-fra.com

Quel est le but de la bande à gradient Tensorflow?

J'ai visionné la vidéo du sommet du développeur Tensorflow sur Eager Execution dans Tensorflow, et le présentateur a présenté une introduction à "Gradient Tape". Je comprends maintenant que la bande à gradient permet de suivre la différenciation automatique qui se produit dans un modèle TF.

J'essayais de comprendre pourquoi j'utiliserais du ruban à gradient? Quelqu'un peut-il expliquer comment Gradient Tape est utilisé comme outil de diagnostic? Pourquoi quelqu'un utiliserait-il le ruban à gradient par rapport à la simple visualisation des poids par Tensorboard?.

Je comprends donc que la différenciation automatique qui se produit avec un modèle consiste à calculer les gradients de chaque nœud, c'est-à-dire l'ajustement des poids et des biais à chaque nœud, en fonction d'un lot de données. Voilà donc le processus d'apprentissage. Mais j’avais l’impression que je pouvais réellement utiliser un appel tf.keras.callback.TensorBoard() pour voir la visualisation de la formation par le tensorboard - afin que je puisse regarder les poids sur chaque nœud et déterminer s’il y avait des nœuds morts ou sursaturés.

Est-ce que l'utilisation de la bande à gradient uniquement pour voir si certains dégradés vont à zéro ou deviennent vraiment gros, etc.? Ou existe-t-il une autre utilisation de la bande à gradient?

19
krishnab

Lorsque l'exécution anticipée est activée, Tensorflow calculera les valeurs des tenseurs telles qu'elles apparaissent dans votre code. Cela signifie qu'il ne précalculera pas un graphique statique pour lequel des entrées sont alimentées via des espaces réservés. Cela signifie que pour propager les erreurs, vous devez garder une trace des gradients de votre calcul, puis appliquer ces gradients à un optimiseur.

Ceci est très différent d’exécuter sans exécution, dans laquelle vous construisez un graphique et utilisez simplement sess.run pour évaluer votre perte et ensuite la transmettre directement à un optimiseur.

Fondamentalement, comme les tenseurs sont évalués immédiatement, vous n’avez pas de graphique pour calculer les gradients et vous avez donc besoin d’une bande de gradient. Ce n'est pas tellement qu'il est simplement utilisé pour la visualisation, mais bien plus que vous ne pouvez pas implémenter une descente de gradient en mode rapide sans cela.

De toute évidence, Tensorflow pourrait simplement garder une trace de chaque gradient pour chaque calcul sur chaque tf.Variable. Cependant, cela pourrait être un énorme goulot d'étranglement en termes de performances. Ils exposent une bande de dégradé afin que vous puissiez contrôler les zones de votre code qui ont besoin des informations de dégradé. Notez qu'en mode non enthousiaste, cela sera déterminé de manière statique en fonction des branches de calcul qui sont les descendants de votre perte, mais en mode enthousiaste, il n'y a pas de graphe statique et donc aucun moyen de le savoir.

20
iyop45

Après avoir travaillé pendant un certain temps, après avoir posé la question initiale, j'ai une meilleure idée de l’utilité de Gradient Tape. L’application la plus utile de Gradient Tap semble être lorsque vous concevez un calque personnalisé dans votre modèle keras par exemple - ou que vous concevez de manière équivalente une boucle d’entraînement personnalisée pour votre modèle.

Si vous avez un calque personnalisé, vous pouvez définir exactement le déroulement des opérations au sein de ce calque, y compris les gradients calculés, ainsi que le calcul du montant des pertes accumulées.

Ainsi, la bande de dégradé vous donnera simplement un accès direct aux gradients individuels contenus dans la couche.

Voici un exemple tiré de la deuxième édition du livre de Aurensien Geron sur Tensorflow.

Supposons que vous ayez une fonction que vous souhaitez activer.

 def f(w1, w2):
     return 3 * w1 ** 2 + 2 * w1 * w2

Maintenant, si vous voulez prendre des dérivées de cette fonction avec respec dans w1 et w2:

w1, w2 = tf.Variable(5.), tf.Variable(3.)
with tf.GradientTape() as tape:
    z = f(w1, w2)

gradients = tape.gradient(z, [w1, w2])

L’optimiseur calculera donc le gradient et vous donnera accès à ces valeurs. Ensuite, vous pouvez les doubler, les mettre en carré, les tripler, etc., à votre guise. Quoi que vous choisissiez de faire, vous pouvez alors ajouter ces gradients ajustés au calcul de perte pour l’étape de rétropropagation, etc.

3
krishnab