Пример дифференцирования автограда в PyTorch - должно быть 9/8? - PullRequest
0 голосов
/ 11 января 2020

В примере для учебника Torch для Python они используют следующий график:

x = [[1, 1], [1, 1]]
y = x + 2
z = 3y^2
o = mean( z )  # 1/4 * x.sum()

Таким образом, прямой проход дает нам следующее:

x_i = 1, y_i = 3, z_i = 27, o = 27

В коде это выглядит следующим образом:

import torch

# define graph
x = torch.ones(2, 2, requires_grad=True)
y = x + 2
z = y * y * 3
out = z.mean()

# if we don't do this, torch will only retain gradients for leaf nodes, ie: x
y.retain_grad()
z.retain_grad()

# does a forward pass
print(z, out)

однако я запутался в вычисленных градиентах:

# now let's run our backward prop & get gradients
out.backward()
print(f'do/dz = {z.grad[0,0]}')

, которые выдают:

do/dx = 4.5

По правилу цепочки, do/dx = do/dz * dz/dy * dy/dx, где:

dy/dx = 1
dz/dy = 9/2 given x_i=1
do/dz = 1/4 given x_i=1

, что означает:

do/dx = 1/4 * 9/2 * 1 = 9/8

Однако это не соответствует градиентам, возвращаемым Torch (9/2 = 4,5). Возможно, у меня математическая ошибка (что-то с термином do / dz = 1/4?), Или я не понимаю autograd в Torch.

Есть указатели?

1 Ответ

2 голосов
/ 11 января 2020
do/dz = 1 / 4
dz/dy = 6y = 6 * 3 = 18
dy/dx = 1

следовательно, do / dx = 9/2

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