Certaines réponses ont bien expliqué, mais j'aimerais donner un exemple précis pour expliquer le mécanisme.
Supposons que nous ayons une fonction : z = 3 x^2 + y^3.
La formule de mise à jour du gradient de z en fonction de x et y est la suivante :
Les valeurs initiales sont x=1 et y=2.
x = torch.tensor([1.0], requires_grad=True)
y = torch.tensor([2.0], requires_grad=True)
z = 3*x**2+y**3
print("x.grad: ", x.grad)
print("y.grad: ", y.grad)
print("z.grad: ", z.grad)
# print result should be:
x.grad: None
y.grad: None
z.grad: None
Calculer ensuite le gradient de x et y en valeur courante (x=1, y=2)
# calculate the gradient
z.backward()
print("x.grad: ", x.grad)
print("y.grad: ", y.grad)
print("z.grad: ", z.grad)
# print result should be:
x.grad: tensor([6.])
y.grad: tensor([12.])
z.grad: None
Enfin, l'optimiseur SGD est utilisé pour mettre à jour les valeurs de x et y selon la formule :
# create an optimizer, pass x,y as the paramaters to be update, setting the learning rate lr=0.1
optimizer = optim.SGD([x, y], lr=0.1)
# executing an update step
optimizer.step()
# print the updated values of x and y
print("x:", x)
print("y:", y)
# print result should be:
x: tensor([0.4000], requires_grad=True)
y: tensor([0.8000], requires_grad=True)