Pytorch中的vector-Jacobian product

2,671 阅读2分钟

   autograd是pytorch中自动计算微分的模块,官网文档在介绍中称为为 

an engine for computing vector-Jacobian product

但是给的例子却解释的不是很清楚,下文通过一个例子进行进一步解释,解释之前了解一下什么是雅可比矩阵

Jacobian matrix(雅可比矩阵)

Y = G(X) Y是一个向量,X是一个向量,Y对X求导结果就是雅可比矩阵,即 雅可比矩阵

是一阶偏导数以一定方式排列成的矩阵,长这个样子

         

                                     

输出是向量(U1,U2......Un)    输入是(X1,X2......Xn)

例子



求得的雅可比矩阵是



重点来了,问Y对X1的偏导数是多少?

这里面很显然就是第一列,(2x1,0,0)这一列,此时这个向量每个值代表分量函数对下X1的求导结果,而且此时三个分量函数求导结果的权重都是1。

如果,每个分量函数对X1的求导结果权重不是1,改成,y1是2,y2是1,y3是1,则问题Y对X1的偏导数是多少?的结果是(4x1,0,0),此时向量(2,1,1)理解成求导结果权重表达,此向量就是我们今天探讨的vector-Jacobian product中的vector,Jacobian自然指的是雅可比矩阵,

Torch代码验证

>>> x1=torch.tensor(1, requires_grad=True, dtype = torch.float)
>>> x2=torch.tensor(2, requires_grad=True, dtype = torch.float)
>>> x3=torch.tensor(3, requires_grad=True, dtype = torch.float)
>>> y=torch.randn(3) # produce a random vector for vector function define
>>> y[0]=x1**2+2*x2+x3 # define each vector function
>>> y[1]=x1+x2**3+x3**2
>>> y[2]=2*x1+x2**2+x3**3
>>> y.backward(torch.ones(3))
>>> x1.grad
tensor(5.)
>>> x2.grad
tensor(18.)
>>> x3.grad
tensor(34.)


各分量函数梯度的权重是v = (1,1,1)

则vector-Jacobian product 为 

J*v =   

与代码实验结果相符