为什么在执行 .backward() 之前 torch.sum()?
Why torch.sum() before doing .backward()?
我可以看到下面这段来自 this video 的代码试图做什么。但是 y=torch.sum(x**2)
中的 sum
让我很困惑。通过 sum
操作,y
成为具有一个单值的张量。据我了解 .backward()
是计算导数,为什么我们要使用 sum
并将 y
减少为一个值?
import pytorch
import matplotlib.pyplot as plt
x = torch.linspace(-10.0,10.0,10, requires_grad=True)
Y = x**2
y = torch.sum(x**2)
y.backward()
plt.plot(x.detach().numpy(), Y.detach().numpy(), label="Y")
plt.plot(x.detach().numpy(), x.grad.detach().numpy(), label="derivatives")
plt.legend()
您只能计算 标量 函数的偏导数。 backwards()
给你的是 d loss/d parameter
,你期望每个 parameter/variable.
有一个 单个 梯度值
如果你的损失函数是一个 vector 函数,即从多个输入映射到 multiple 输出,你最终会得到每个 parameter/variable。
请参阅了解更多信息。
您有一个张量 Y
,它是直接或间接从张量 X
计算得到的。
Y.backward()
将计算 Y w.r.t 的每个元素的导数。 X 的每个元素。这给了我们 N_out(Y 中的元素数)形状为 X.shape
.
的掩码
然而,torch.backward()
默认强制将存储在 X.grad
中的梯度与 X
的形状相同。如果N_out=1,没有问题,因为我们只有一个面具。这就是为什么要将 Y 减少到一个值。
如果 N_out>1,Pytorch 想要对 N_out 梯度掩码 进行加权求和。但是您需要为这个加权和提供权重!您可以使用渐变参数执行此操作:
Y.backward(gradient=weights_shaped_like_Y)
如果您为 Y 的每个元素赋予权重 1,您将获得与使用 torch.sum(Y).backward()
相同的行为。
因此,下面两个程序是等价的:
x = torch.linspace(-10.0,10.0,10, requires_grad=True)
Y = x**2
y = torch.sum(x**2)
y.backward()
和
x = torch.linspace(-10.0,10.0,10, requires_grad=True)
Y = x**2
y.backward(gradient=torch.ones_like(Y))
我可以看到下面这段来自 this video 的代码试图做什么。但是 y=torch.sum(x**2)
中的 sum
让我很困惑。通过 sum
操作,y
成为具有一个单值的张量。据我了解 .backward()
是计算导数,为什么我们要使用 sum
并将 y
减少为一个值?
import pytorch
import matplotlib.pyplot as plt
x = torch.linspace(-10.0,10.0,10, requires_grad=True)
Y = x**2
y = torch.sum(x**2)
y.backward()
plt.plot(x.detach().numpy(), Y.detach().numpy(), label="Y")
plt.plot(x.detach().numpy(), x.grad.detach().numpy(), label="derivatives")
plt.legend()
您只能计算 标量 函数的偏导数。 backwards()
给你的是 d loss/d parameter
,你期望每个 parameter/variable.
有一个 单个 梯度值
如果你的损失函数是一个 vector 函数,即从多个输入映射到 multiple 输出,你最终会得到每个 parameter/variable。
请参阅
您有一个张量 Y
,它是直接或间接从张量 X
计算得到的。
Y.backward()
将计算 Y w.r.t 的每个元素的导数。 X 的每个元素。这给了我们 N_out(Y 中的元素数)形状为 X.shape
.
然而,torch.backward()
默认强制将存储在 X.grad
中的梯度与 X
的形状相同。如果N_out=1,没有问题,因为我们只有一个面具。这就是为什么要将 Y 减少到一个值。
如果 N_out>1,Pytorch 想要对 N_out 梯度掩码 进行加权求和。但是您需要为这个加权和提供权重!您可以使用渐变参数执行此操作:
Y.backward(gradient=weights_shaped_like_Y)
如果您为 Y 的每个元素赋予权重 1,您将获得与使用 torch.sum(Y).backward()
相同的行为。
因此,下面两个程序是等价的:
x = torch.linspace(-10.0,10.0,10, requires_grad=True)
Y = x**2
y = torch.sum(x**2)
y.backward()
和
x = torch.linspace(-10.0,10.0,10, requires_grad=True)
Y = x**2
y.backward(gradient=torch.ones_like(Y))