Die Methode zero_grad()
muss während des Trainings aufgerufen werden. Die Dokumentation ist jedoch nicht sehr hilfreich
| zero_grad(self)
| Sets gradients of all model parameters to zero.
Warum müssen wir diese Methode aufrufen?
Die Methode zero_grad()
muss während des Trainings aufgerufen werden. Die Dokumentation ist jedoch nicht sehr hilfreich
| zero_grad(self)
| Sets gradients of all model parameters to zero.
Warum müssen wir diese Methode aufrufen?
Antworten:
In PyTorch
müssen wir die Gradienten auf Null setzen, bevor wir mit der Backpropragation beginnen, da PyTorch die Gradienten bei nachfolgenden Rückwärtsdurchläufen akkumuliert . Dies ist praktisch beim Training von RNNs. Die Standardaktion besteht also darin, die Farbverläufe bei jedem loss.backward()
Anruf zu akkumulieren (dh zu summieren) .
Wenn Sie Ihre Trainingsschleife starten, sollten zero out the gradients
Sie dies daher idealerweise so tun, dass Sie die Parameteraktualisierung korrekt durchführen. Andernfalls würde der Gradient in eine andere Richtung als die beabsichtigte Richtung zum Minimum (oder zum Maximum bei Maximierungszielen) zeigen.
Hier ist ein einfaches Beispiel:
import torch
from torch.autograd import Variable
import torch.optim as optim
def linear_model(x, W, b):
return torch.matmul(x, W) + b
data, targets = ...
W = Variable(torch.randn(4, 3), requires_grad=True)
b = Variable(torch.randn(3), requires_grad=True)
optimizer = optim.Adam([W, b])
for sample, target in zip(data, targets):
# clear out the gradients of all Variables
# in this optimizer (i.e. W, b)
optimizer.zero_grad()
output = linear_model(sample, W, b)
loss = (output - target) ** 2
loss.backward()
optimizer.step()
Wenn Sie alternativ einen Vanille-Gefälle-Abstieg machen , dann:
W = Variable(torch.randn(4, 3), requires_grad=True)
b = Variable(torch.randn(3), requires_grad=True)
for sample, target in zip(data, targets):
# clear out the gradients of Variables
# (i.e. W, b)
W.grad.data.zero_()
b.grad.data.zero_()
output = linear_model(sample, W, b)
loss = (output - target) ** 2
loss.backward()
W -= learning_rate * W.grad.data
b -= learning_rate * b.grad.data
Hinweis : Die Akkumulation (dh Summe ) von Gradienten erfolgt, wenn .backward()
der loss
Tensor aufgerufen wird .
zero_grad () startet die Schleife ohne Verluste aus dem letzten Schritt neu, wenn Sie die Gradientenmethode zum Verringern des Fehlers (oder der Verluste) verwenden.
Wenn Sie zero_grad () nicht verwenden, wird der Verlust verringert und nicht nach Bedarf erhöht
Wenn Sie beispielsweise zero_grad () verwenden, finden Sie folgende Ausgabe:
model training loss is 1.5
model training loss is 1.4
model training loss is 1.3
model training loss is 1.2
Wenn Sie zero_grad () nicht verwenden, finden Sie folgende Ausgabe:
model training loss is 1.4
model training loss is 1.9
model training loss is 2
model training loss is 2.8
model training loss is 3.5