如何在pytorch中计算梯度

时间:2020-06-24 15:47:29

标签: python pytorch gradient

我有一个示例代码。当我手动计算dloss / dw时,得到的结果为8,但是下面的代码给了我16。请告诉我渐变是16。

import torch
x = torch.tensor(2.0)
y = torch.tensor(2.0)
w = torch.tensor(3.0, requires_grad=True)
# forward
y_hat = w * x
s = y_hat - y
loss = s**2
#backward
loss.backward()
print(w.grad)

1 个答案:

答案 0 :(得分:1)

我认为您只是误算了。 损耗的推导=(w * x-y)^ 2为:

dloss / dw = 2 *(w * x-y)* x = 2 *(3 * 2-2)* 2 = 16

请记住,神经网络中的反向传播是通过应用链式规则完成的:我认为您在推导结束时忘记了* x

具体来说: 推导链规则说df(g(x))/ dx = f'(g(x))* g'(x)(相对于x推导)

您的情况下的整个损失函数是这样构建的: 损失(y_hat)=(y_hat-y)^ 2 y_hat(x)= w * x

因此:loss(y_hat(x))=(y_hat(x)-y)^ 2 此推导是根据链规则: dloss(y_hat(x))/ dw =损失'(y_hat(x))* dy_hat(x)/ dw

对于任何z: 损失'(z)= 2 *(z-y)* 1和dy_hat(z)/ dw = z

因此:dloss((y_hat(x))/ dw = dloss(y_hat(x))/ dw = loss'(y_hat(x))* y_hat'(x)= 2 *(y_hat(x)-z )* dy_hat(x)/ dw = 2 *(y_hat(x)-z)* x = 2 *(w * x-z)* x = 16

pytorch知道,在您的前向传递中,每一层都会对其输入应用某种功能,并且您的前向传递为1 * loss(y_hat(x)),然后继续对后向传递应用链式规则(每一层都需要链式规则的一种应用)。