若是关于计算图中的leaves变量求导的输出变量是一个标量,那么gradient默认为None,或者指定为“torch.Tensor([1.0])”
若是关于计算图中的leaves求导的输出变量是一个向量,那么gradient是不能缺省的,gradient是和该输出向量同维度的tensor。
假设计算图为:x-->y-->z(矢量)-->L(标量)
若输出z不是一个标量,那么就先构造一个标量的值:L = torch.sum(z*gradient),再关于L对各个leaf Variable计算梯度。
可以令gradient=torch.FloatTensor(z.size()).fill_(1)
gradient也可以将其理解为:各个分量函数关于 偏导的权重。
这篇文章讲得比较清晰,特地备份一下: pytorch中backward函数的gradient参数作用
参数gradient能解决什么问题,有什么实际的作用呢?说实话,因为我才接触到pytorch,还真没有见过现实中怎么用gradient参数.但是目前可以通过数学意义来理解,就是可以忽略复合函数某个位置之前的所有函数 的具体形式,直接给定一个梯度来求得对各个自变量的偏导.
假设 x 经过一番计算得到 y,那么 y.backward(w) 求的不是 y 对 x 的导数,而是 l = torch.sum(y*w) 对 x 的导数。w 可以视为 y 的各分量的权重,也可以视为遥远的损失函数 l 对 y 的偏导数。也就是说,不一定需要从计算图最后的节点 y 往前反向传播,从中间某个节点 n 开始传也可以,只要你能把损失函数 l 关于这个节点的导数 dl/dn 记录下来,n.backward(dl/dn) 照样能往前回传,正确地计算出损失函数 l 对于节点 n 之前的节点的导数。特别地,若 y 为标量,w 取默认值 1.0,才是按照我们通常理解的那样,求 y 对 x 的导数。
参考下面的博文: