
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
2.2.3 张量对象的自动梯度
微分和计算梯度在更新神经网络的权重中起着关键的作用。PyTorch的张量对象自带了计算梯度的内置功能。
在本节中,我们将了解如何使用PyTorch计算张量对象的梯度。
下列代码可以从本书的GitHub存储库(https://tinyurl.com/mcvp-packt)Chapter02文件夹中的Auto_gradient_of_tensors.ipynb获得。
1.定义一个张量对象,并指定要为张量对象计算梯度:

在上述代码中,requires_grad参数指定要为张量对象计算梯度。
2.接下来,定义计算输出的方式,在这个特定的例子中,输出是所有输入的平方和:

相应的代码如下:

我们知道前一个函数的梯度是2×x,下面使用PyTorch提供的内置函数来验证这一点。
3.可以通过对某个值调用backward()方法来计算该值的梯度。在这个例子中,计算梯度——对于x(输入)的一个小变化,out(输出)的变化——如下所示:

4.现在可以得到out关于x的梯度,如下所示:


图2-5
结果如图2-5所示。
注意,上述梯度值与直观的梯度值(即x值的2倍)是匹配的。
作为练习,可以试着使用PyTorch重现第1章中chain rule.ipynb的场景。在一次前向传播之后计算梯度,并做出一次权重更新。然后,验证更新的权重与在notebook中计算的值匹配。
到目前为止,我们已经学习了在张量对象上的初始化、运算和梯度计算——它们共同构成了神经网络的基本构建模块。除了计算自动梯度,初始化和数据运算也可以使用NumPy数组完成。这就需要我们理解为什么在构建神经网络的时候,应该使用张量对象而不是使用NumPy数组,这将在下一节进行讨论。