Middle
Защо извикваме optimizer.zero_grad() в началото на обучителния цикъл?
sobes.tech AI
Отговор от AI
В PyTorch при обратното разпространение градиентите на параметрите се натрупват, то есть всяко извикване на loss.backward() добавя градиентите към вече съществуващите в тензорите .grad. Ако не ги нулирате преди нова стъпка на обучение, градиентите ще се сумират, което ще доведе до неправилно обновяване на теглата.
Затова в началото на всеки цикъл на обучение се извиква optimizer.zero_grad(), за да се изчистят старите градиенти и да се изчислят правилно новите за текущия батч.
Пример:
for data, target in dataloader:
optimizer.zero_grad() # нулиране на градиентите
output = model(data)
loss = loss_fn(output, target)
loss.backward() # изчисляване на новите градиенти
optimizer.step() # обновяване на параметрите