Pytorch梯度计算
Pytorch gradient computation
我想弄清楚函数 grad
的工作原理。
这是我的代码:
A = torch.Tensor(2, 3).uniform_(-1, 1).requires_grad_()
B = torch.Tensor(3, 1).uniform_(-1, 1).requires_grad_()
o = torch.matmul(A,B)
print("A : ", A)
print("B : ", B)
do_dinput = torch.autograd.grad(o, A, grad_outputs=torch.ones(2, 1))
print('Size do/dA :', (do_dinput[0].size()))
我期待 torch.Size([1, 3])
被打印出来,因为 AB
w.r.t A
的导数是 B^T
。但是,我得到了torch.Size([2, 3])
。
我的代码有问题吗,还是我遗漏了什么?
你得到的是从 o 开始的梯度通过计算图反向传播到 A。最后你得到了 A 中每个值的梯度。
和下面的操作一样
A = torch.Tensor(2, 3).uniform_(-1, 1).requires_grad_()
B = torch.Tensor(3, 1).uniform_(-1, 1).requires_grad_()
o = torch.matmul(A,B).sum()
o.backward()
print("A : ", A)
print("B : ", B)
print(A.grad)
本例中的A.grad
与do_dinput
相同。如果您查看梯度张量,它在两行中都是 B^T
。
让它更直观一点。我们有 A 和 B 作为输入,一些函数 f(...) 将 A 和 B 的所有值作为输入并计算一些值。在这种情况下,函数是 sum(AB).
注意:求和不会以任何方式改变梯度。
A = x_1 x_2 x_3
x_4 x_5 x_6
B = y_1
y_2
y_3
o = x_1 * y_1 + x_2 * y_2 + x_3 * y_3
x_4 * y_1 + x_5 * y_2 + x_6 * y_3
f(x_1,...,x_6, y_1, y_2, y_3) = x_1 * y_1 + x_2 * y_2 + x_3 * y_3 + x_4 * y_1 + x_5 * y_2 + x_6 * y_3
如果您现在计算梯度,您将导出关于所有变量的 f(...)。所以对于 x_1 它将是
df/dx_1 = y_1
因此 x_1 在 A 中的梯度值等于 y_1。这是为所有其他值完成的。所以最后你会得到 A 和 B 中所有条目的梯度值。
在你的例子中它的工作原理是一样的,你只是跳过了张量的求和。
我想弄清楚函数 grad
的工作原理。
这是我的代码:
A = torch.Tensor(2, 3).uniform_(-1, 1).requires_grad_()
B = torch.Tensor(3, 1).uniform_(-1, 1).requires_grad_()
o = torch.matmul(A,B)
print("A : ", A)
print("B : ", B)
do_dinput = torch.autograd.grad(o, A, grad_outputs=torch.ones(2, 1))
print('Size do/dA :', (do_dinput[0].size()))
我期待 torch.Size([1, 3])
被打印出来,因为 AB
w.r.t A
的导数是 B^T
。但是,我得到了torch.Size([2, 3])
。
我的代码有问题吗,还是我遗漏了什么?
你得到的是从 o 开始的梯度通过计算图反向传播到 A。最后你得到了 A 中每个值的梯度。
和下面的操作一样
A = torch.Tensor(2, 3).uniform_(-1, 1).requires_grad_()
B = torch.Tensor(3, 1).uniform_(-1, 1).requires_grad_()
o = torch.matmul(A,B).sum()
o.backward()
print("A : ", A)
print("B : ", B)
print(A.grad)
本例中的A.grad
与do_dinput
相同。如果您查看梯度张量,它在两行中都是 B^T
。
让它更直观一点。我们有 A 和 B 作为输入,一些函数 f(...) 将 A 和 B 的所有值作为输入并计算一些值。在这种情况下,函数是 sum(AB).
注意:求和不会以任何方式改变梯度。
A = x_1 x_2 x_3
x_4 x_5 x_6
B = y_1
y_2
y_3
o = x_1 * y_1 + x_2 * y_2 + x_3 * y_3
x_4 * y_1 + x_5 * y_2 + x_6 * y_3
f(x_1,...,x_6, y_1, y_2, y_3) = x_1 * y_1 + x_2 * y_2 + x_3 * y_3 + x_4 * y_1 + x_5 * y_2 + x_6 * y_3
如果您现在计算梯度,您将导出关于所有变量的 f(...)。所以对于 x_1 它将是
df/dx_1 = y_1
因此 x_1 在 A 中的梯度值等于 y_1。这是为所有其他值完成的。所以最后你会得到 A 和 B 中所有条目的梯度值。
在你的例子中它的工作原理是一样的,你只是跳过了张量的求和。