Как установить градиенты на ноль без оптимизатора? - PullRequest
0 голосов
/ 12 февраля 2019

Между проходами .backward() Я бы хотел установить градиенты на ноль.Прямо сейчас я должен сделать это для каждого компонента отдельно (здесь это x и t), есть ли способ сделать это "глобально" для всех затронутых переменных?(Я представляю что-то вроде z.set_all_gradients_to_zero().)

Я знаю, что есть optimizer.zero_grad(), если вы используете оптимизатор, но есть ли прямой путь без использования оптимизатора?

import torch

x = torch.randn(3, requires_grad = True)
t = torch.randn(3, requires_grad = True)
y = x + t
z = y + y.flip(0)

z.backward(torch.tensor([1., 0., 0.]), retain_graph = True)
print(x.grad)
print(t.grad)
x.grad.data.zero_()  # both gradients need to be set to zero 
t.grad.data.zero_()
z.backward(torch.tensor([0., 1., 0.]), retain_graph = True)
print(x.grad)
print(t.grad)

1 Ответ

0 голосов
/ 12 февраля 2019

Вы также можете использовать nn.Module.zero_grad().Фактически, optim.zero_grad() просто вызывает nn.Module.zero_grad() для всех параметров, которые были переданы ему.

Нет разумного способа сделать это глобально.Вы можете собрать свои переменные в список

grad_vars = [x, t]
for var in grad_vars:
    var.grad.data = None

или создать какую-нибудь хакерскую функцию, основанную на vars().Возможно, также возможно проверить граф вычислений и обнулить градиент всех конечных узлов, но я не знаком с API графа.Короче говоря, вы ожидаете использовать объектно-ориентированный интерфейс torch.nn вместо ручного создания тензорных переменных.

...