【问题标题】: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)),然后继续对反向传递应用链式规则(每一层都需要链式法则的一种应用)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-12
      • 1970-01-01
      • 1970-01-01
      • 2021-09-11
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 2015-11-27
      相关资源
      最近更新 更多