web-dev-qa-db-fra.com

pytorch - connexion entre loss.backward () et optimizer.step ()

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
22
Aerin

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.

21
Shai

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

10
Ganesh