【问题标题】:How the gradient is calculated in pytorchpytorch中梯度是如何计算的
【发布时间】:2020-06-24 15:47:29
【问题描述】:
我有一个示例代码。当我手动计算 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)
【问题讨论】:
标签:
python
pytorch
gradient
【解决方案1】:
我认为你只是误算了。
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 = loss'(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)),然后继续对反向传递应用链式规则(每一层都需要链式法则的一种应用)。