【问题标题】:Why does Pytorch autograd need a scalar?为什么 Pytorch autograd 需要一个标量?
【发布时间】:2021-10-02 18:40:07
【问题描述】:

我正在研究“使用 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 个不相关数字相加有助于获得任何东西的渐变。我不明白什么?

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

【问题讨论】:

    标签: python pytorch gradient-descent fast-ai


    【解决方案1】:

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

    让x 成为由x_i(其中i 在[0,n])、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))
    

    【讨论】:

    • 练习中遗漏了一个重要的观察结果。我没有与求和规则建立联系,但那是因为我忘记了我的微积分。谢谢你的解释!
    猜你喜欢
    • 2020-12-28
    • 2011-04-21
    • 2023-01-01
    • 2014-10-05
    • 2018-09-06
    • 2019-02-18
    • 2021-02-27
    • 1970-01-01
    • 2020-05-12
    相关资源
    最近更新 更多