运行如下代码:
In [3]: import torch
In [4]: from torch.autograd import Variable
In [6]: x=Variable(torch.Tensor([2,3,4,5]),requires_grad=True)
In [7]: y=Variable(torch.zeros(3))
In [8]: y[0]=x[0]*x[1]
In [9]: y[1]=x[1]*x[2]
In [10]: y[2]=x[2]*x[3]
In [13]: y.backward(torch.ones(y.shape))
In [14]: x.grad
Out[14]: tensor([3., 6., 8., 4.])
把x.grad中元素称为 [ g r a d _ x 0 , g r a d _ x 1 , g r a d _ x 2 , g r a d _ x 3 ] [grad\_x_0,grad\_x_1,grad\_x_2,grad\_x_3] [grad_x0,grad_x1,grad_x2,grad_x3],把传入backward的Tensor称为 [ w 0 , w 1 , w 2 ] [w_0,w_1,w_2] [w0,w1,w2],在此处的例子中, w w w的所有元素均为1。我们可以得到下图:
也就是得到如下规律:
g r a d _ x i = ∑ k w k ∂ y k ∂ x i grad\_x_i=\sum_kw_k\frac{\partial y_k}{\partial x_i} grad_xi=∑kwk∂xi∂yk
原本的计算图见上图左侧。但是这个backward的过程,根据我对Auto Grad的理解,pytorch帮我们构建了下面的计算图,也就是对每个 y y y乘以对应的 w w w(可以理解为权重),然后将所有输出求和得到一个标量(这一步可以更细致地展开为多步加法),再如往常一样反向传播。