需要帮助了解pytorch中的梯度函数

user3656142:

以下代码


w = np.array([[2., 2.],[2., 2.]])
x = np.array([[3., 3.],[3., 3.]])
b = np.array([[4., 4.],[4., 4.]])
w = torch.tensor(w, requires_grad=True)
x = torch.tensor(x, requires_grad=True)
b = torch.tensor(b, requires_grad=True)


y = w*x + b 
print(y)
# tensor([[10., 10.],
#         [10., 10.]], dtype=torch.float64, grad_fn=<AddBackward0>)

y.backward(torch.FloatTensor([[1, 1],[ 1, 1]]))

print(w.grad)
# tensor([[3., 3.],
#         [3., 3.]], dtype=torch.float64)

print(x.grad)
# tensor([[2., 2.],
#         [2., 2.]], dtype=torch.float64)

print(b.grad)
# tensor([[1., 1.],
#         [1., 1.]], dtype=torch.float64)

由于函数内部的张量参数gradient是输入张量形状的全张量,我的理解是

  1. w.grad表示ywrt的导数w,并产生b

  2. x.grad表示ywrt的导数x,并产生b

  3. b.grad表示ywrt的导数b,并产生所有的。

其中,只有第3点答案与我的预期结果相符。有人可以帮助我理解前两个答案吗?我想我了解积累部分,但是不要认为这里正在发生。

迈克尔·容格(Michael Jungo):

为了在此示例中找到正确的导数,我们需要考虑总和和乘积规则。

求和规则:

求和规则

产品规则:

产品规则

这意味着方程的导数计算如下。

关于x

关于x的导数

关于w

关于w的导数

关于b

关于b的导数

渐变准确地反映出:

torch.equal(w.grad, x) # => True

torch.equal(x.grad, w) # => True

torch.equal(b.grad, torch.tensor([[1, 1], [1, 1]], dtype=torch.float64)) # => True

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章