Почему градиент горелки линейно увеличивается при каждом обратном распространении функции? - PullRequest
1 голос
/ 15 марта 2020

Я пытаюсь понять, как работает обратное распространение PyTorch, используя следующий код:

import torch
import numpy
x = torch.tensor(numpy.e, requires_grad=True)
y = torch.log(x)
y.backward()
print(x.grad)

Результат - tensor(0.3679), как и ожидалось, то есть 1 / x, который является производной от log(x) WRT x с x = numpy.e. Однако, если я снова выполню последние 3 строки, БЕЗ переназначения x, т.е. сделаю

y = torch.log(x)
y.backward()
print(x.grad)

, тогда я получу tensor(0.7358), что вдвое больше предыдущего результата. Почему это происходит?

1 Ответ

1 голос
/ 15 марта 2020

Градиенты накапливаются до очистки. Начиная с документов (выделено мной):

Эта функция накапливает градиенты в листьях - вам может потребоваться обнулить их перед вызовом.

Это обнуление может быть выполнено с помощью x.grad.zero_() или, в случае torch.optim.Optimizer, optim.zero_grad().

...