вопрос, касающийся обратной аргументации, используемой в уроке по блицу - PullRequest
0 голосов
/ 28 октября 2019

Вопрос к вопросу о backward(). В скопированном и вставленном ниже учебнике по блике *1002* они передаются вектором [0.1, 1.0, 0.0001] в backward(). Я могу интуитивно догадаться, почему переданная форма вектора [0.1, 1.0, 0.0001] имеет значение [3], но я не понимаю, откуда берутся значения 0,1, 1,0, 0,0001. В другом уроке я рассмотрел проходы в одном таком, что задом наперед на векторе делается так: L.backward(torch.ones(L.shape))

# copied from blitz tutorial
Now in this case y is no longer a scalar. torch.autograd could not compute the full Jacobian directly, but if we just want the vector-Jacobian product, simply pass the vector to backward as argument:

v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward(v)

print(x.grad)

Если кто-то может объяснить причины [0,1, 1,0, 0,0001], я был бы признателен.

1 Ответ

1 голос
/ 28 октября 2019

Как говорится в документе, неявно, grad не может быть создан для нескалярных выходных данных. y - нескалярный тензор, и вы не можете y.backward() напрямую. Но вы можете передать вектор назад, чтобы получить vector-Jacobian product. Если вы не хотите менять грады, вы можете передать вектор со всеми элементами.

x = torch.tensor([2.,3.,4.], requires_grad=True)
y = x**2

y.backward() # error

y.backward(torch.tensor([1.,1.,1.])) # work
x.grad # tensor([4.,6.,8.])

# y.backward(torch.tensor([2.,2.,2.])) # change the passed vector. 
# x.grad # tensor([8.,12.,16])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...