Прежде всего, учитывая z = torch.linspace(-1, 1, steps=5, requires_grad=True)
и y = z
, функция является вектор-функцией, поэтому производная от y
по z
не так проста, как 1
, но является матрицей Якоби.На самом деле в вашем случае z = [z1, z2, z3, z4, z5]T
, верхний регистр T
означает, что z
- это вектор строки.Вот что говорит официальный документ:
![enter image description here](https://i.stack.imgur.com/WOeSf.jpg)
Во-вторых, обратите внимание, что официальный документ говорит: Теперь в этом случае y больше не является скаляром,torch.autograd не может вычислить полный якобиан напрямую, но если мы просто хотим получить вектор-якобиан, просто передайте вектор назад в качестве аргумента link .В этом случае x.grad
- это не фактическое значение градиента (матрица), а вектор-якобианское произведение .
РЕДАКТИРОВАТЬ: x.grad
является фактическим градиентом, если ваш вывод y
равенскалярСмотрите пример здесь:
z = torch.linspace(-1, 1, steps=5, requires_grad=True)
y = torch.sum(z)
y.backward()
z.grad
Это выдаст:
tensor([1., 1., 1., 1., 1.])
Как видите, это градиент.Обратите внимание, единственное отличие состоит в том, что y
является скалярным значением здесь, а векторным значением в вашем примере. grad может быть неявно создан только для скалярных выходных данных
Вам может быть интересно, что если градиент не является константой, например, зависит от ввода z
, как в этом случае
z = torch.linspace(-1, 1, steps=5, requires_grad=True)
y = torch.sum(torch.pow(z,2))
y.backward()
z.grad
Вывод:
tensor([-2., -1., 0., 1., 2.])
Это то же самое, что и
z = torch.linspace(-1, 1, steps=5, requires_grad=True)
y = torch.sum(torch.pow(z,2))
y.backward(torch.tensor(1.))
z.grad
Учебное пособие по блицу довольно короткое, поэтому его довольно сложно понять для начинающих.