需要帮助理解PyTorch中的梯度函数

以下代码

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张量,我的理解是

  1. w.grad表示yw的导数,结果是b

  2. x.grad表示yx的导数,结果是b

  3. b.grad表示yb的导数,结果是全1。

在这三点中,只有第三点的答案与我的预期结果相符。有人能帮我理解前两个答案吗?我认为我理解了累积部分,但在这里似乎没有发生这种情况。


回答:

要在本例中找到正确的导数,我们需要考虑求和规则和乘积规则。

求和规则:

求和规则

乘积规则:

乘积规则

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

关于x的导数:

关于x的导数

关于w的导数:

关于w的导数

关于b的导数:

关于b的导数

梯度完全反映了这些结果:

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

Related Posts

给定多个预测向量,如何高效地获得票数最多的标签(在numpy/pytorch中)?

我有3个向量,代表同一数据的3个不同标签预测: P1=…

使用train_test_split()返回的值列表作为训练数据

我正在尝试对一些数据进行线性回归。这就是数据的外观。 …

如何在Python中逐一计算每个预测值的准确性?

已关闭。此问题需要详细信息或清晰度。目前不接受回答。 …

调用PyTorch神经网络的forward()函数时出现错误“mat1和mat2的形状无法相乘”

我有以下代码,定义了一个简单的多层感知机神经网络: c…

独热编码增加了目标数据的尺寸

我有多类别数据,标签或y列包含以下数据: print(…

ValueError: 形状 (240000,28,28) 和 (2,512) 不匹配:28 (维度 2) != 2 (维度 0)

我正在构建一个卷积神经网络(CNN),遇到了矩阵不匹配…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注