为什么Pytorch自动求导需要标量?

5

我正在学习《使用fastai和PyTorch进行编码的深度学习》一书,第四章介绍了PyTorch库中的自动微分函数在一个简单的例子中的使用。

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个无关数字相加有助于获得任何梯度。我理解有所欠缺吗?
这里我不需要博士级别的解释。我使用的书的副标题是“没有博士学位的AI应用”。我的梯度经验是从学校开始的,我应该得到一个函数,但我知道Autograd不是这种情况。这个简短示例的图表会很有帮助,但我在网上看到的图表通常包含太多参数或权重和偏差,以至于没法使用,我的思维会迷失在路径中。
1个回答

4

TLDR; 函数和的导数是各函数导数之和

假设x是由x_i(其中i[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的梯度时,这就是您在x.grad中获得的结果:

y = f(x)
y.backward()

或者是每个组件的梯度x 分别
y = x**2
y.backward(torch.ones_like(x))

1
这个练习中遗漏了一个关键的观察点。我没有将其与求和规则联系起来,但这是我的问题,因为我忘记了微积分。感谢您的解释! - Mack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接