pytorch中梯度是如何计算的

How the gradient is calculated in pytorch

我有一个示例代码。当我手动计算 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)

我认为你只是失算了。 loss = (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

因此:损失(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)) 并且比继续应用链式规则向后传递(每一层都需要应用一次链式法则)。