pytorch中的out.backward()详解

如果out是个标量的话backward()里面就不用写了,也就是默认是1,大部分的loss都是这样的,这个比较简单了就不详解了。

以下博客内容部分参考自博客https://sherlockliao.github.io/2017/07/10/backward/

定义m=(m1,m2)=(2,3),k=({m_{1}}^{2}+3m_{2},m_{2}^{2}+2m_{1}),记为k=(k1,k2)

计算k对于m1和m2的梯度:(m1,m2对应下图的x1,x2)

接下来使用代码来实现k对m1和m2的梯度

from torch.autograd import Variable as v
import torch
j = torch.zeros(2 ,3)
k = v(torch.zeros(1, 2))
m.grad.data.zero_()
k[0, 0] = m[0, 0] ** 2 + 3 * m[0 ,1]
k[0, 1] = m[0, 1] ** 2 + 2 * m[0, 0]
k.backward(torch.FloatTensor([[1, 1]]), retain_graph =True) # 需要san次反向求导
j[:,0]=m.grad.data
m.grad.data.zero_()
# [1, 0] dk0/dm0, dk1/dm0
k.backward(torch.FloatTensor([[1, 0]]), retain_graph =True) # 需要两次反向求导
j[:, 1] = m.grad.data
m.grad.data.zero_()
# [0, 1] dk0/dm1, dk1/dm1
k.backward(torch.FloatTensor([[0, 1]]))
j[:, 2] = m.grad.data
print('jacobian matrix is')
print(j)

输出:

分析一下:

ki对mi求导的jacobian矩阵是:

pytorch中的out.backward()详解_第1张图片

而backward函数的参数FloatTensor([1/0,1/0]),其实是:

pytorch中的out.backward()详解_第2张图片的值。

而具体计算各个梯度的方式为:

pytorch中的out.backward()详解_第3张图片

所以对backward的参数不同取值相当于决定每个偏导数的系数是多少,也就是k对ki的导数的值。

(有帮助点个赞再走呀)

你可能感兴趣的:(Pytorch)