Sobes.tech
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()      # обновяване на параметрите