Idée
Quand on calcule la sortie, le programme note silencieusement la suite des opérations sur un carnet. Quand on demande la dérivée, il relit le carnet a l'envers en appliquant la règle de la chaîne.
Outil
Règle de la chaîne $(f \circ g)' = f'(g) \cdot g'$ vue en spé MPSI : ici elle s'appliqué recursivement le long du graphe, mais c'est exactement la même règle.
Formule
Dans la boucle d'apprentissage (cellule 18), on trouve loss.backward(); optimizer.step(); optimizer.zero_grad(). Le commentaire signale : 'sinon ils sont cumules'. Decrire ce qui se passe si l'on retire zero_grad() : qu'arrive-t-il a parametres['W1'].grad après deux itérations ? Pourquoi ce comportement par defaut de pytorch (cumul plutot que remise a zero automatique) est-il en fait utile dans certaines situations ?
Piège
Par défaut, Pytorch libère le graphe après le premier backward(). Appeler une 2e fois lève RuntimeError: Trying to backward through the graph a second time. Pour le faire, il faut loss.backward(retain_graph=True). Cas typique : on veut analyser plusieurs gradients dérivés de la même loss, on oublie le flag.