Où est une connexion explicite entre le optimizer
et le loss
?
Comment l'optimiseur sait-il où obtenir les gradients de la perte sans appel aime cette optimizer.step(loss)
?
-Plus de contexte-
Lorsque je minimise la perte, je n'ai pas eu à transmettre les dégradés à l'optimiseur.
loss.backward() # Back Propagation
optimizer.step() # Gardient Descent
Sans plonger trop profondément dans les entrailles du pytorch, je peux proposer une réponse simpliste:
Rappelez-vous que lors de l'initialisation de optimizer
, vous lui indiquez explicitement quels paramètres (tenseurs) du modèle il doit mettre à jour. Les gradients sont "stockés" par les tenseurs eux-mêmes (ils ont un grad
et un requires_grad
attributs) une fois que vous appelez la fonction backward()
sur la perte. Après avoir calculé les gradients pour tous les tenseurs du modèle, l'appel de optimizer.step()
fait que l'optimiseur itère sur tous les paramètres (tenseurs) qu'il est censé mettre à jour et utiliser leurs grad
stockés en interne pour mettre à jour leurs valeurs.
Lorsque vous appelez loss.backward()
, tout ce qu'il fait est de calculer le gradient de perte avec tous les paramètres en perte qui ont requires_grad = True
Et de les stocker dans l'attribut parameter.grad
Pour chaque paramètre.
optimizer.step()
met à jour tous les paramètres en fonction de parameter.grad