入门学习pytorch,在查看pytorch代码时对autograd的backard函数的使用和具体原理有些疑惑,在查看相关文章和学习后,简单说下我自身的理解:
backward函数属于torch.autograd函数库,在深度学习过程中对函数进行反向传播,计算输出变量关于输入变量的梯度。其输入变量自然应满足autograd 的要求,为Variable类型而不是tensor类型。
常见的使用方法为:
y.backward()
此时分为两种情况,当y为标量时,对y进行反向传播则不需要任何输入变量,个人理解是即默认此时y为网络输出的最后一层,其再没有上一层变量关于其的梯度了(因为为标量)。当y为非标量Variable类型时,根据pytorch中文官网的介绍,“backward的输入参数是 此operation的输出的值的梯度,backward的返回值是此operation输入值的梯度。”,对于这句话,我个人的理解是因为输出仍未非标量,所以其还在传播过程中,pytorch需要知道该变量上一级关于其的梯度,我们不妨设上一级的变量为L,我们神经网络的链式法则为:
可见,最终x的梯度即又上面的公式得出,dL/dy即是我们需要给定的backward函数的输入,dy/dx可由函数直接算出。
ok,举个简单的例子:
运行结果:
由提到的公式可以得到,
x.grads 为 dL/dy*dy/dx = [1,2,3,4,5]*2*x, 结果正如所料。
PS:
1.关于求梯度,只有我们定义的Variable的梯度会被放在 .grad 属性中,其余 Variable 的梯度不会被保存在 .grad 属性中
2.自己定义Variable的时候,记得Variable(Tensor, requires_grad = True),这样才会被求梯度,不然的话,是不会求梯度的