Как сломать автоград на PyTorch с помощью операций на месте - PullRequest
1 голос
/ 31 марта 2020

Я пытаюсь лучше понять роль операций на месте в автограде PyTorch. Насколько я понимаю, они могут вызывать проблемы, поскольку они могут перезаписывать значения, необходимые во время шага назад.

Я пытаюсь создать пример, в котором операция на месте нарушает автоматическое дифференцирование, моя идея состоит в том, чтобы перезаписать некоторое значение, необходимое во время обратного распространения, после того как оно было использовано для вычисления какого-то другого тензора.

Я использую присвоение в качестве операции на месте (я пробовал += с тем же результатом), я удваиваю -проверено, что это операция на месте следующим образом:

x = torch.arange(5, dtype=torch.float, requires_grad=True)
y = x
y[3] = -1
print(x)

печатает:

tensor([ 0.,  1.,  2., -1.,  4.], grad_fn=<CopySlices>)

Это моя попытка сломать автоград:

  1. Без операции на месте:
x = torch.arange(5, dtype=torch.float, requires_grad=True)
out1 = x ** 2
out2 = out1 / 10
# out1[3] += 100  
out2.sum().backward()
print(x.grad)

Печать

tensor([0.0000, 0.2000, 0.4000, 0.6000, 0.8000])
С опцией на месте:
x = torch.arange(5, dtype=torch.float, requires_grad=True)
out1 = x ** 2
out2 = out1 / 10
out1[3] = 0  
out2.sum().backward()
print(x.grad)

Это печатает:

tensor([0.0000, 0.2000, 0.4000, 0.6000, 0.8000])

Я ожидал получить разные градусы.

  • Что делает назначение предмета? Я не получаю grad_fn=<CopySlices>.
  • Почему он возвращает те же грады?
  • Есть ли рабочий пример операций на месте, которые нарушают autograd?
  • Есть ли список несовместимых с PyTorch операций?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...