Differentiation automatique Pytorch (`requires_grad=True`)

Idée

On demande à un objet de retenir l'arbre des opérations effectuees sur lui ; quand on dit 'remonte', il calcule mecaniquement les dérivées en remontant cet arbre.

Outil

Règle de la chaîne $\dfrac{d(f \circ g)}{dx} = f'(g(x)) \cdot g'(x)$ de l'analyse de spé, appliquée mecaniquement sur un graphe d'opérations.

Formule

Le notebook montre la séquence forward_t → log_loss_t → loss.backward(). Sans regarder, expliquer ce que fait précisément backward() au moment où on l'appelle, et où les gradients sont stockés ensuite (quel attribut de quel objet).

Piège

Pytorch cumule les gradients dans .grad d'une itération a l'autre. Si on oublie l'appel optimizer.zero_grad() après chaque optimizer.step(), les gradients se somment de boucle en boucle, ce qui mene a des pas effectifs incoherents et fait diverger l'apprentissage. Le PDF p7 (apprentissage_t) et p10 (apprentissage 2-couches) le rappelle systematiquement par le commentaire # remise a zero des gradients (sinon ils sont cumules). Erreur frequente d'un MPSI débutant en Pytorch.