本文是对http://pytorch.org/tutorials/beginner/blitz/autograd_tutorial.html的部分翻译以及自己理解的部分,如有错误,欢迎指正。
对于pytorch中的所有神经网络(nn)而言最重要的是autograd包。对tensor的所有运算autograd包提供了自动求导机制。它遵循了按定义运行的框架,即你的代码如何运行定义了你的反向传播。下面是具体例子:
张量(tensor)
torch.Tensor是包里重要的类。如果你将这个类的属性.requires_grad赋为True,它就会跟踪该张量上的所有操作。当你完成了运算可以调用.backward()来自动计算所有的梯度(gradient)。该张量的梯度会累积记录于.grad属性中。
为了停止一个张量跟踪历史,可以调用.detach()从而切断跟踪历史的操作,这样未来的运算就不会被跟踪了。
为了防止跟踪历史(占用内存),可以将代码包裹在with torch.no_grad():的代码块里。这种做法在评估模型时非常有用,因为此时模型包含可训练的参数其requires_grad=True,但是我们不需要梯度。
还有一个重要的类是Function
每个变量都有一个.grad_fn属性。如果你想计算导数,可以调用tensor的.backward()。如果tensor是一个标量,不用为backward()指定参数。如果tensor有多个元素,需要指定gradient的变量。
创建一个张量,并设置requires_grad=True 去跟踪运算
对张量运算:
y是一个运算的结果。所以它有grad_fn属性。
接下来对y进行更多的运算:
.requires_grad_(...)可以原址修改已存在张量的requires_grad标志。该函数的参数默认是True
梯度
接下来演示反向传播,因为上面例子中out包含一个标量,所以out.backward()和out.backward(torch.tensor(1))等价。
打印梯度d(out)/dx
得到了元素为4.5的2*2的矩阵。将out张量记为o。我们有
,并且.因此, ,且
可以用autograd做很多疯狂且酷的事情