Расчет градиента PyTorch дает неожиданные результаты - PullRequest
1 голос
/ 07 апреля 2020

Следующий код предназначен для объяснения того, как работает расчет градиента PyTorch, и должен, IMO, возвращать матрицу весов, но это не так:

# the code calculates T x W + B ---> K1
# compute the mean of K1 --> km
# compute the gradient of km relative to T
#
import torch
torch.manual_seed(0)
t = torch.rand(2,3)
w = torch.rand(3,4)
b = torch.rand(1,4)
#
k1 = torch.mm(t, w) + b
#
#torch.set_grad_enabled(True)
print('k1_grad_fn ',k1.grad_fn)
#
print('t grad ',t.grad)
#
#
km = k1.mean()
km.requires_grad_(True)
print('k1 mean=',km)
km.backward()
print('t grad ',t.grad)
print('k1 grad ',k1.grad_fn)

Результаты:

t grad  None
k1 mean= tensor(1.0396, requires_grad=True)
t grad  None
k1 grad  None```

1 Ответ

0 голосов
/ 07 апреля 2020

Это не странно, ожидается, что указано Autograd Mechanics в документации PyTorch :

Обратные вычисления никогда не выполняются в подграфах, где не нужны все тензоры градиенты.

Установка km.required_grad_(True) создает подграф (с одной только средней операцией, равной k1 тензор), поэтому вы получаете k1_mean.grad. Обратите внимание, что k1 grad также будет None в этом случае, поскольку для него не требуется градиент.

По умолчанию tensor имеет required_grad, установленное на False, поэтому график не должен выполнять ненужные операции. Чтобы получить желаемое поведение, измените t на:

t = torch.rand((2, 3), requires_grad=True)

(каждая тензорная функция имеет аргумент requires_grad). Это дает вам, как вы, вероятно, ожидали:

k1_grad_fn  <AddBackward0 object at 0x7fe3454d6100>
t grad  None
k1 mean= tensor(1.0396, grad_fn=<MeanBackward0>)
t grad  tensor([[0.3093, 0.1177, 0.2888],
        [0.3093, 0.1177, 0.2888]])
k1 grad  <AddBackward0 object at 0x7fe3454d6100>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...