为什么 Pytorch autograd 需要标量?
Why does Pytorch autograd need a scalar?
我正在研究“使用 fastai 和 Pytorch 的编码器深度学习”。第 4 章通过一个简单的示例介绍了 PyTorch 库中的 autograd 函数。
x = tensor([3.,4.,10.]).requires_grad_()
def f(q): return sum(q**2)
y = f(x)
y.backward()
我的问题归结为:y = f(x)
的结果是 tensor(125., grad_fn=AddBackward0)
,但这到底是什么意思?为什么我要对三个完全不同的输入值求和?
我知道在这种情况下使用 .backward()
是 shorthand 用于 .backward(tensor[1.,1.,1.])
,但我看不到列表中 3 个不相关数字的总和如何帮助获得任何东西的渐变。我有什么不明白的?
我不是要在这里寻找 grad-level 解释。我正在使用的书的副标题是 AI Applications Without a Ph.D。我在学校使用渐变的经验是我应该恢复 FUNCTION,但我知道 Autograd 并非如此。这个简短示例的图表会很有帮助,但我在网上看到的那些通常包含太多参数或权重和偏差而没有用,我的思绪迷失在路径中。
TLDR;函数之和的导数是它们的导数之和
设 x
为由 x_i
(其中 [0,n]
中的 i
)、y = x**2
和 L = sum(y_i)
组成的输入向量。您要计算 dL/dx
,一个与 x
大小相同的向量,其分量是 dL/dx_j
(其中 j
在 [0,n]
中)。
对于[0,n]
中的j
,dL/dx_j
就是dy_j/dx_j
(和的导数是导数的和,只有一个不为零) ,即d(x_j**2)/dx_j
,即 2*x_j
。因此,dL/dx = [2*x_j where j in [0,n]]
.
这是您在计算 x
的梯度时在 x.grad
中得到的结果:
y = f(x)
y.backward()
或者x
各分量的梯度分别:
y = x**2
y.backward(torch.ones_like(x))
我正在研究“使用 fastai 和 Pytorch 的编码器深度学习”。第 4 章通过一个简单的示例介绍了 PyTorch 库中的 autograd 函数。
x = tensor([3.,4.,10.]).requires_grad_()
def f(q): return sum(q**2)
y = f(x)
y.backward()
我的问题归结为:y = f(x)
的结果是 tensor(125., grad_fn=AddBackward0)
,但这到底是什么意思?为什么我要对三个完全不同的输入值求和?
我知道在这种情况下使用 .backward()
是 shorthand 用于 .backward(tensor[1.,1.,1.])
,但我看不到列表中 3 个不相关数字的总和如何帮助获得任何东西的渐变。我有什么不明白的?
我不是要在这里寻找 grad-level 解释。我正在使用的书的副标题是 AI Applications Without a Ph.D。我在学校使用渐变的经验是我应该恢复 FUNCTION,但我知道 Autograd 并非如此。这个简短示例的图表会很有帮助,但我在网上看到的那些通常包含太多参数或权重和偏差而没有用,我的思绪迷失在路径中。
TLDR;函数之和的导数是它们的导数之和
设 x
为由 x_i
(其中 [0,n]
中的 i
)、y = x**2
和 L = sum(y_i)
组成的输入向量。您要计算 dL/dx
,一个与 x
大小相同的向量,其分量是 dL/dx_j
(其中 j
在 [0,n]
中)。
对于[0,n]
中的j
,dL/dx_j
就是dy_j/dx_j
(和的导数是导数的和,只有一个不为零) ,即d(x_j**2)/dx_j
,即 2*x_j
。因此,dL/dx = [2*x_j where j in [0,n]]
.
这是您在计算 x
的梯度时在 x.grad
中得到的结果:
y = f(x)
y.backward()
或者x
各分量的梯度分别:
y = x**2
y.backward(torch.ones_like(x))