Pytorch: обратный переход от суммы матричных элементов к листовой переменной - PullRequest
2 голосов
/ 01 мая 2019

Я пытаюсь немного лучше понять обратное распространение в pytorch. У меня есть фрагмент кода, который успешно выполняет обратное распространение из вывода d в ​​листовую переменную a, но затем, если я добавлю в шаге изменения формы, обратное распространение больше не дает входной градиент.

Я знаю, что изменение формы неуместно, но я все еще не уверен, как это контекстуализировать.

Есть мысли?

Спасибо.

#Works
a = torch.tensor([1.])
a.requires_grad = True
b = torch.tensor([1.])
c = torch.cat([a,b])
d = torch.sum(c)
d.backward()

print('a gradient is')
print(a.grad) #=> Tensor([1.])

#Doesn't work
a = torch.tensor([1.])
a.requires_grad = True
a = a.reshape(a.shape)
b = torch.tensor([1.])
c = torch.cat([a,b])
d = torch.sum(c)
d.backward()

print('a gradient is')
print(a.grad) #=> None

1 Ответ

2 голосов
/ 02 мая 2019

Edit:

Вот подробное объяснение того, что происходит («само по себе это не ошибка, но это определенно источник путаницы»): https://github.com/pytorch/pytorch/issues/19778

Таким образом, одно из решений состоит в том, чтобы специально попросить оставить града на данный момент не-лист a:

a = torch.tensor([1.])
a.requires_grad = True
a = a.reshape(a.shape)
a.retain_grad()
b = torch.tensor([1.])
c = torch.cat([a,b])
d = torch.sum(c)
d.backward()

Старый ответ:

Если вы переместите a.requires_grad = True после изменения формы, это сработает:

a = torch.tensor([1.])
a = a.reshape(a.shape)
a.requires_grad = True
b = torch.tensor([1.])
c = torch.cat([a,b])
d = torch.sum(c)
d.backward()

Похоже, ошибка в PyTorch, потому что после этого a.requires_grad все еще верно.

a = torch.tensor([1.])
a.requires_grad = True
a = a.reshape(a.shape)

Похоже, это связано с тем фактом, что a больше не является листом в вашем примере "Не работает", но все же является листом в других случаях (напечатайте a.is_leaf для проверки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...