Machine learning 在Pytork中,反向方法的第一个参数(梯度)是什么?

Machine learning 在Pytork中,反向方法的第一个参数(梯度)是什么?,machine-learning,pytorch,Machine Learning,Pytorch,我们从pytorch文档中获得以下代码: x=torch.randn(3) x=变量(x,需要_grad=True) y=x*2 当y.data.norm()小于1000时: y=y*2 梯度=火炬.浮标张量([0.1,1.0,0.0001]) y、 向后(梯度) 我们传递到backward方法中的gradients参数究竟是什么,我们根据什么初始化它? 要完全回答你的问题,需要一个更长的解释,围绕如何工作的细节,或者更基本地说,工作原理 简短的编程答案是变量的向后函数计算附加到该变量的计算图

我们从pytorch文档中获得以下代码:

x=torch.randn(3)
x=变量(x,需要_grad=True)
y=x*2
当y.data.norm()小于1000时:
y=y*2
梯度=火炬.浮标张量([0.1,1.0,0.0001])
y、 向后(梯度)
我们传递到backward方法中的gradients参数究竟是什么,我们根据什么初始化它?

要完全回答你的问题,需要一个更长的解释,围绕如何工作的细节,或者更基本地说,工作原理

简短的编程答案是
变量的向后函数
计算附加到该
变量
的计算图中所有变量的梯度。(为了澄清:如果您有
a=b+c
,则计算图(递归)首先指向
b
,然后指向
c
,然后指向如何计算,等等)并将这些梯度累积存储(求和)在这些变量的
.grad
属性中。然后调用
opt.step()
,即优化器的一个步骤时,它会将该梯度的一小部分添加到这些变量的值中

也就是说,从概念上看,有两个答案:如果你想训练一个机器学习模型,你通常希望有关于损失函数的梯度。在这种情况下,计算的梯度将使得在应用阶跃函数时整体损失(标量值)将减小。在这种特殊情况下,我们希望计算一个特定值的梯度,即单位长度步长(这样学习率将计算我们想要的梯度分数)。这意味着,如果您有一个loss函数,并调用
loss.backward()
,则计算结果将与
loss.backward(torch.FloatTensor([1.]))
相同

虽然这是DNNs中backprop的常见用例,但它只是函数一般微分的一个特例。更一般地说,符号微分包(本例中为autograd,作为pytorch的一部分)可用于计算计算图早期部分相对于所选子图根处任何梯度的梯度。此时,关键字参数
gradient
非常有用,因为您可以在此处提供此“根级别”渐变,即使对于非标量函数也是如此

为了说明这一点,这里有一个小例子:

a=nn.Parameter(torch.FloatTensor([[1,1],[2,2]]))
b=nn.参数(火炬.浮标张量([[1,2],[1,2]]))
c=火炬总数(a-b)
c、 向后(无)#可以是c.backward(torch.FloatTensor([1.]),以获得相同的结果
打印(a.grad,b.grad)
印刷品:

变量包含:
1  1
1  1
[火炬.尺寸为2x2的浮标张量]
变量包含:
-1 -1
-1 -1
[火炬.尺寸为2x2的浮标张量]

a=nn.Parameter(torch.FloatTensor([[1,1],[2,2]]))
b=nn.参数(火炬.浮标张量([[1,2],[1,2]]))
c=火炬总数(a-b)
c、 向后(torch.FloatTensor([[1,2],[3,4]]))
打印(a.grad,b.grad)
印刷品:

变量包含:
1  2
3  4
[火炬.尺寸为2x2的浮标张量]
变量包含:
-1 -2
-3 -4
[火炬.尺寸为2x2的浮标张量]

a=nn.Parameter(torch.FloatTensor([[0,0],[2,2]]))
b=nn.参数(火炬.浮标张量([[1,2],[1,2]]))
c=火炬。matmul(a,b)
c、 向后(torch.FloatTensor([[1,1],[1,1]])#我们计算w.r.t.一个非标量变量,因此提供的梯度也不能是标量!
打印(a.grad,b.grad)
印刷品

变量包含:
3  3
3  3
[火炬.尺寸为2x2的浮标张量]
变量包含:
2  2
2  2
[火炬.尺寸为2x2的浮标张量]

a=nn.Parameter(torch.FloatTensor([[0,0],[2,2]]))
b=nn.参数(火炬.浮标张量([[1,2],[1,2]]))
c=火炬。matmul(a,b)
c、 向后(torch.FloatTensor([[1,2],[3,4]])#我们计算w.r.t.一个非标量变量,因此提供的梯度也不能是标量!
打印(a.grad,b.grad)
印刷品:

变量包含:
5   5
11  11
[火炬.尺寸为2x2的浮标张量]
变量包含:
6  8
6  8
[火炬.尺寸为2x2的浮标张量]