Middle
Miért hívjuk az optimizer.zero_grad()-t az edzés ciklusának elején?
sobes.tech MI
Válasz az MI-től
A PyTorch-ban a visszaterjes soran a paraméterek gradiens értékei összegződnek, vagyis minden loss.backward() hívás hozzáadja a gradiens értékeket a már meglévőkhöz a .grad tenzorokban. Ha nem nullázod őket az új tanulási lépés előtt, akkor a gradiens értékek összeadódnak, ami helytelen súlyfrissítéshez vezet.
Ezért minden tanulási ciklus elején meghívják a optimizer.zero_grad()-ot, hogy töröljék a régi gradiens értékeket, és helyesen számolják ki az újak értékét az aktuális mini-batch-re.
Példa:
for data, target in dataloader:
optimizer.zero_grad() # nullázza a gradiens értékeket
output = model(data)
loss = loss_fn(output, target)
loss.backward() # kiszámítja az új gradiens értékeket
optimizer.step() # frissíti a paramétereket