Градиент промежуточного тензора в PyTorch
Промежуточный тензор в цепочке
не является листом графа. После
обратного прохода его поле
grad обычно остаётся
пустым, хотя производная по нему
была посчитана.
Метод retain_grad просит
автоград сохранить этот градиент
в поле тензора. Это не отрезает
звено от графа, в отличие от
отделения копии без истории.
Соберём цепочку: квадрат аргумента, затем квадрат результата. На промежуточном звене включим сохранение и выполним обратный проход от финального значения:
import torch
x = torch.tensor(2.0, requires_grad=True)
y = x * x
y.retain_grad()
z = y * y
z.backward()
print(x.grad) # выведет tensor(32.)
print(y.grad) # выведет tensor(8.)
Для дробного 3.0 с записью
возведите его в квадрат,
на промежуточном результате
включите сохранение градиента,
умножьте его на себя и выполните
обратный проход. Выведите
градиент аргумента и градиент
промежуточного тензора.
Для дробного 1.5 с записью
удвоьте значение, сохраните
градиент на удвоенном звене,
прибавьте единицу и найдите
обратный проход от суммы.
Выведите содержимое поля
градиента у промежуточного
тензора.
Постройте цепочку квадрат
и ещё раз квадрат для
4.0 с записью, но
не включайте сохранение
на середине. После обратного
прохода выведите поле
градиента промежуточного
тензора.