为什么 Pytorch autograd 需要标量?

问题描述

我正在研究“使用 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() 是这种情况下 .backward(tensor[1.,1.,1.]) 的简写,但我看不出将列表中的 3 个不相关数字相加如何帮助获得任何东西的梯度。我有什么不明白的?

我不是在这里寻找研究生级别的解释。我正在使用的这本书的副标题是没有博士学位的人工智能应用程序。我在学校的渐变经验是我应该恢复一个功能,但我知道 Autograd 不是这种情况。这个简短示例的图表会有所帮助,但我在网上看到的那些通常包含太多参数或权重和偏差而无用,我的思绪迷失在路径中。

解决方法

TLDR;函数和的导数是它们的导数之和

x 成为由 x_ii 中的 [0,n])、y = x**2L = sum(y_i) 组成的输入向量。您要计算 dL/dx,一个与 x 大小相同的向量,其分量是 dL/dx_j(其中 j[0,n] 中)。

对于 j 中的 [0,n]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.grad 的梯度时在 x 中得到的结果:

y = f(x)
y.backward()

或者x的每个分量的梯度单独

y = x**2
y.backward(torch.ones_like(x))