一、参考链接
https://blog.51cto.com/u_15047489/2619287
https://zhuanlan.zhihu.com/p/83172023
二、叶子节点与结果节点
pytorch用计算图(动态图,tensorflow是静态图)来描述计算,计算图分为节点和边两要素,节点为张量(分为叶子节点和结果节点,可以通过tensor.is_leaf查看,用户自己创建的都是叶子节点),计算(卷积、加乘)为边。叶子节点和结果节点的意义在于反向传播时叶子结点的梯度会保存可以通过tensor.grad保存,而结果节点的梯度因为节约内存会释放,查看时结果为None,所以如果想要保存结果节点的梯度可以使参数retain_grad=True。
三、torch.autograd.backward
torch.autograd.backward()等同于tensor.backward(),功能是对所有叶子节点求梯度,参数grad_tensors是计算梯度时用到,因为只有标量才可以求梯度,所以如果tensor是向量或者矩阵时,需要利用grad_tensors将其转换为标量,所以grad_tensors相当于各个元素的权重,形状与tensor相同。另外,张量求导之后,计算图会自动销毁即不能再次backward求导,此时需要利用参数retain_graph来保存计算图以再次求导。
四、torch.autograd.grad
求输出对输入的导数,可以指定对每个输入求导,也可以对所有叶子节点求导(通过only_inputs,默认是True)。