Расчет градиентов - PullRequest
       4

Расчет градиентов

0 голосов
/ 23 октября 2019

Я хочу вычислить градиент в следующем сценарии: y = w_0x + w_1 и z = w_2x + (dy / dx) ^ 2

    w = torch.tensor([2.,1.,3.], requires_grad=True)
    x = torch.tensor([0.5], requires_grad=True)
    y = w[0]*x + w[1]
    y.backward()
    l = x.grad
    l.requires_grad=True
    w.grad.zero_()
    z = w[2]*x + l**2
    z.backward()

Я ожидаю [4, 0, 0.5] вместоЯ получаю [0, 0, 0,5]. Я знаю, что в этом случае я могу заменить l на w_0, но l может быть сложной функцией от x, и в этом случае важно, чтобы я вычислял градиенты численно вместо изменения выражения для z. Пожалуйста, дайте мне знать, какие изменения мне нужно сделать, чтобы получить правильный градиент относительно w

1 Ответ

0 голосов
/ 23 октября 2019

Вы должны напечатать ваши градиенты по пути, так будет проще. Я прокомментирую, что происходит в коде:

import torch

w = torch.tensor([2.0, 1.0, 3.0], requires_grad=True)
x = torch.tensor([0.5], requires_grad=True)
y = w[0] * x + w[1]
y.backward()
l = x.grad
l.requires_grad = True
print(w.grad) # [0.5000, 1.0000, 0.0000] as expected
w.grad.zero_()
print(w.grad) # [0., 0., 0.] as you cleared the gradient
z = w[2] * x + l ** 2
z.backward()
print(w.grad) # [0., 0., 0.5] - see below

Last print(w.grad) работает так, потому что вы используете последний элемент тензора, и это единственное участие в уравнении z, оно умножается на x, что 0.5, следовательно, градиент 0.5. Вы очистили градиент раньше, выдав w.grad_zero_(). Я не вижу, как ты мог получить [4., 0., 0.5]. Если вы не очистите градиент, вы получите: tensor([0.5000, 1.0000, 0.5000]), первые два из первого y уравнения, второе и последнее из z уравнения.

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