第1章 PyTorch和神经网:1.1 PyTorch和神经网络
第1章 PyTorch和神经网络1.1 PyTorch入门1.1.2 PyTorch张量1.1.3 PyTorch的自动求导机制1.1.4 计算图自动梯度计算看似很神奇,但它其实并不是魔术。它背后的原理很值得深入了解,这些知识将帮助我们构建更大规模的网络。看看下面这个非常简单的网络。它甚至不算一个神经网络,而只是一系列计算。在上图中,我们看到输入x被用于计算y,y再被用于计算输出z。假设y和z的计
第1章 PyTorch和神经网络
1.1 PyTorch入门
1.1.2 PyTorch张量
1.1.3 PyTorch的自动求导机制
1.1.4 计算图
自动梯度计算看似很神奇,但它其实并不是魔术。
它背后的原理很值得深入了解,这些知识将帮助我们构建更大规模的网络。
看看下面这个非常简单的网络。它甚至不算一个神经网络,而只是一系列计算。
在上图中,我们看到输入x被用于计算y,y再被用于计算输出z。
假设y和z的计算过程如下:
如果我们希望知道输出zzz如何随xxx变化,我们需要知道梯度 dy/dxdy/dxdy/dx。下面我们来逐步计算。
第一行是微积分的链式法则(chain rule),对我们非常重要。
我们刚刚算出,zzz随xxx的变化可表示为4x4x4x。如果x=3.5x = 3.5x=3.5,则dz/dx=4×3.5=14dz/dx = 4 × 3.5 = 14dz/dx=4×3.5=14。
当yyy以xxx的形式定义,而zzz以yyy的形式定义时,PyTorch便将这些张量连成一幅图,以展示这些张量是如何连接的。这幅图叫计算图(computation graph)。
在我们的例子中,计算图看起来可能是下面这样的:
我们可以看到yyy是如何从xxx计算得到的,zzz是如何从yyy计算得到的。此外,PyTorch还增加了几个反向箭头,表示yyy如何随着xxx变化,zzz如何随着yyy变化。这些就是梯度,在训练过程中用来更新神经网络。微积分的过程由PyTorch完成,无须我们自己动手计算。
为了计算出zzz如何随着xxx变化,我们合并从zzz经由yyy回到xxx的路径中的所有梯度。这便是微积分的链式法则。
PyTorch先构建一个只有正向连接的计算图。我们需要通过backward()函数,使PyTorch计算出反向的梯度。
梯度dz/dx在张量x中被存储为x.grad。
值得注意的是,张量xxx内部的梯度值与z的变化有关。这是因为我们要求PyTorch使用z.backward ()从zzz反向计算。因此,x.gradx.gradx.grad是dz/dxdz/dxdz/dx,而不是dy/dxdy/dxdy/dx。
大多数有效的神经网络包含多个节点,每个节点有多个连进该节点的链接,以及从该节点出发的链接。让我们来看一个简单的例子,例子中的节点有多个进入的链接。
可见,输入aaa和bbb同时对xxx和yyy有影响,而输出zzz是由xxx和yyy计算出来的。
这些节点之间的关系如下。
我们按同样的方法计算梯度。
接着,把这些信息添加到计算图中。
现在,我们可以轻易地通过z到a的路径计算出梯度dz/da。实际上,从z到a有两条路径,一条通过x,另一条通过y,我们只需要把两条路径的表达式相加即可。这么做是合理的,因为从a到z的两条路径都影响了z的值,这也与我们用微积分的链式法则计算出的dz/da的结果一致。
dz/da=dz/dx+dx/da+dz/dy+dy/dadz/da = dz/dx+dx/da +dz/dy+dy/dadz/da=dz/dx+dx/da+dz/dy+dy/da
第一条路径经过xxx,表示为2×22 × 22×2;第二条路径经过yyy,表示为3×10a3×10a3×10a。所以,zzz随aaa变化的速率是4+30a4 + 30a4+30a。
如果aaa是2,则dz/dadz/dadz/da是4 + 30 × 2 = 64。
我们来检验一下用PyTorch是否也能得出这个值。首先,我们定义PyTorch构建计算图所需要的关系。

接着,我们触发梯度计算并查询张量aaa里面的值。

有效的神经网络通常比这个小型网络规模大得多。但是PyTorch构建计算图的方式以及沿着路径向后计算梯度的过程是一样的。
1.1.5 学习要点
- Colab服务允许我们在谷歌的服务器上运行Python代码。Colab使用Python笔记本,我们只需要一个Web浏览器即可使用。
- PyTorch是一个领先的Python机器学习架构。它与numpy类似,允许我们使用数字数组。同时,它也提供了丰富的工具集和函数,使机器学习更容易上手。
- 在PyTorch中,数据的基本单位是张量(tensor)。张量可以是多维数组、简单的二维矩阵、一维列表,也可以是单值。
- PyTorch的主要特性是能够自动计算函数的梯度(gradient)。梯度的计算是训练神经网络的关键。为此,PyTorch需要构建一张计算图(computationgraph),图中包含多个张量以及它们之间的关系。在代码中,该过程在我们以一个张量定义另一个张量时自动完成。
更多推荐
所有评论(0)