【问题标题】:Pytorch gradient computation [duplicate]Pytorch梯度计算[重复]
【发布时间】:2020-05-12 10:21:39
【问题描述】:

我正试图弄清楚函数 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】:

    你得到的是从 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.graddo_dinput 相同。如果您查看 grad 张量,则两行中都只有 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 中的 grad 值等于 y_1。这是为所有其他值完成的。所以最后你会得到 A 和 B 中所有条目的 grad 值。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-11
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多