4 votes

Pourquoi Pytorch autograd a besoin d'un autre vecteur pour reculer au lieu de calculer le Jacobien ?

Pour réaliser backward dans Pytorch, nous pouvons utiliser un paramètre optionnel y.backward(v) pour calculer la matrice jacobienne multipliée par v :

x = torch.randn(3, requires_grad=True)
y = x * 2

v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward(v)

print(x.grad)

Je pense que le coût du calcul de la matrice jacobienne est le même, car chaque nœud du graphe AD nécessaire au calcul de la matrice jacobienne est toujours calculé. Alors pourquoi Pytorch ne veut pas nous donner la matrice jacobienne ?

2voto

Gil Pinsky Points 1908

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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X