autograd是pytorch之中的一个核心计算,提供了自动计算微分、跟踪微分过程、反向传播的方法,可以让我们在建立好神经网络之后,直接调用反向传播等autograd中包含的方法,高效训练神经网络。本文中只简单介绍一些常用的autograd方法,在后续的机器学习实战中,小鱼将展现给你autograd的用法。
设置tensor的requires_grad属性为True,代表记录tensor进行的运算操作。对于编程员自己声明的tensor,默认requires_grad=False,而对于计算得到的tensor,默认requires_grad=True
import torch x=torch.ones(9,5,requires_grad=True) y=x+2 print(x) print(y) tensor([[1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.]], requires_grad=True) tensor([[3., 3., 3., 3., 3.], [3., 3., 3., 3., 3.], [3., 3., 3., 3., 3.], [3., 3., 3., 3., 3.], [3., 3., 3., 3., 3.], [3., 3., 3., 3., 3.], [3., 3., 3., 3., 3.], [3., 3., 3., 3., 3.], [3., 3., 3., 3., 3.]], grad_fn=<AddBackward0>)grad_fn则记录了tensor的计算方法。
为了计算某个out对于值x的微分,需要先将out进行反向传播,再运算x.grad即out对于x的微分值。
z=3*y*y out=z.mean() print(z) print(out) out.backward(retain_graph=True) print(x.grad) v=torch.ones(9,5) z.backward(v) print(x.grad) tensor([[27., 27., 27., 27., 27.], [27., 27., 27., 27., 27.], [27., 27., 27., 27., 27.], [27., 27., 27., 27., 27.], [27., 27., 27., 27., 27.], [27., 27., 27., 27., 27.], [27., 27., 27., 27., 27.], [27., 27., 27., 27., 27.], [27., 27., 27., 27., 27.]], grad_fn=<MulBackward0>) tensor(27., grad_fn=<MeanBackward0>) tensor([[0.4000, 0.4000, 0.4000, 0.4000, 0.4000], [0.4000, 0.4000, 0.4000, 0.4000, 0.4000], [0.4000, 0.4000, 0.4000, 0.4000, 0.4000], [0.4000, 0.4000, 0.4000, 0.4000, 0.4000], [0.4000, 0.4000, 0.4000, 0.4000, 0.4000], [0.4000, 0.4000, 0.4000, 0.4000, 0.4000], [0.4000, 0.4000, 0.4000, 0.4000, 0.4000], [0.4000, 0.4000, 0.4000, 0.4000, 0.4000], [0.4000, 0.4000, 0.4000, 0.4000, 0.4000]]) tensor([[18.4000, 18.4000, 18.4000, 18.4000, 18.4000], [18.4000, 18.4000, 18.4000, 18.4000, 18.4000], [18.4000, 18.4000, 18.4000, 18.4000, 18.4000], [18.4000, 18.4000, 18.4000, 18.4000, 18.4000], [18.4000, 18.4000, 18.4000, 18.4000, 18.4000], [18.4000, 18.4000, 18.4000, 18.4000, 18.4000], [18.4000, 18.4000, 18.4000, 18.4000, 18.4000], [18.4000, 18.4000, 18.4000, 18.4000, 18.4000], [18.4000, 18.4000, 18.4000, 18.4000, 18.4000]])由于out是一个值,x则是 9 × 5 9\times5 9×5矩阵,所以out对x的微分用矩阵表示,矩阵中每个值,即out对该位置的值的微分。而且由于out是一个值,所以out.backward不需要填写参数,默认参数为torch.tensor(1.)。文中还设置了retain_graph=True,是为了下文再进行backward操作,否则后续backward操作会报错。而反向传播矩阵z时,我们则需要设置一个同规模的简单矩阵,以之为参数进行反向传播。 关于原理可以参考官方文档中的这部分内容。从x到out的计算过程相同,区别在于官方文档的x规模为 2 × 2 2\times2 2×2:
神经网络中常用的即tensor.backward()方法和tensor.grad()方法,熟练使用可以高效编写神经网络代码。 PyTorch官方教程中文版:http://pytorch123.com/