Quand vous appelez backward(), PyTorch met à jour le fichier grad
de chaque paramètre apprenable avec le gradient d'une certaine fonction de perte L
par rapport à ce paramètre. Il a été conçu en tenant compte de la descente par gradient [GD] (et ses variantes). Une fois que le gradient a été calculé, vous pouvez mettre à jour chaque paramètre avec x = x - learning_rate * x.grad
. En effet, en arrière-plan, le jacobien doit être calculé mais ce n'est pas ce dont on a besoin (généralement) lorsqu'on applique l'optimisation GD. Le vecteur [0.1, 1.0, 0.0001]
vous permet de réduire la sortie à un scalaire de sorte que x.grad sera un vecteur (et non une matrice, dans le cas où vous ne réduisez pas), et donc GD est bien défini. Vous pourriez, cependant, obtenir le Jacobien en utilisant la réduction avec des vecteurs à un coup. Par exemple, dans ce cas :
x = torch.randn(3, requires_grad=True)
y = x * 2
J = torch.zeros(x.shape[0],x.shape[0])
for i in range(x.shape[0]):
v = torch.tensor([1 if j==i else 0 for j in range(x.shape[0])], dtype=torch.float)
y.backward(v, retain_graph=True)
J[:,i] = x.grad
x.grad.zero_()
print(J)