Pytorch梯度计算

问题描述 投票:0回答:1

我试图弄清楚函数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])

我的代码是否有问题,或者我缺少什么?

python pytorch gradient
1个回答
0
投票

[得到的是从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

因此,A中x_1的grad值等于y_1。这是针对所有其他值完成的。因此最后,您将获得A和B中所有条目的grad值。

在您的示例中,它的工作原理相同,只是跳过了张量的求和。

© www.soinside.com 2019 - 2024. All rights reserved.