华为MindSpore深度学习框架应用开发实战
上QQ阅读APP看书,第一时间看更新

1.3.2 计算图的概念

在TensorFlow、PyTorch和Theano等深度学习框架中,反向传播算法是通过使用计算图来实现的。

1.什么是计算图

计算图是一个有向无环图,用于表现和评估数学表达式。下面介绍一个计算图的简单实例。假设有一个函数F,公式如下。

在上面的公式中,最先计算的是 b×c,这里假设 u=b×c。因此,函数 F的描述如下。

再假设v= a+ u,函数F可以描述如下。

综合以上过程,函数F可以使用图1-15所示的计算图来描述。

图1-15 函数F的计算图

如果给输入参数赋初值,则每个节点都会得到一个值,最终得到函数F的值,具体如图1-16所示。

图1-16 函数F的最终值

图1-15和图1-16只是计算图的演示,不同框架实现计算图的方式不同。计算图通常有两个主要元素:节点(Node)和边(Edge)。节点用于表示数据,例如标量、向量、矩阵、张量;边用于表示运算,例如加、减、乘、除和卷积等。

计算图可以用于以下两种类型的计算。

① 前向计算:图1-15和图1-16演示的计算过程就是前向计算。

② 反向计算:利用计算图求出函数F对应每个变量的导数。例如,计算Fv的导数(求dF/dv)的过程如下。

已知F= 3×v,当v=7时,F=21;当v=7.001时,F=21.003。

F的增量除以v的增量等于3,即dF/dv=3。

2.深度学习中的计算图

神经网络的计算可以按照前向传播(前向传递)和反向传播(反向传递)两个步骤进行组织。首先执行前向传播步骤,用于计算神经网络的输出。然后执行反向传播步骤,用于计算梯度和导数。计算图可以解释为什么按这种方式进行组织。

如果想理解计算图中求导数的方法,则要理解一个变量变化后如何造成依赖它的变量发生变化。如果A直接影响C,那么就需要了解A是如何影响C的。如果对A的值做微小的改变,C会如何改变?这就是CA求偏导数。

图 1-17 演示了反向传播的计算图求导数的过程。

在图1-17所示的计算图中,有abc这3个输入参数,其输出结果为Y。在计算图的相关位置标记了相邻节点数据计算偏导数的结果,具体说明如下。

d=a+b,当a增加一个很小的数值(例如0.001)时,d也会增加同样的数值(0.001),因此da的偏导数∂d/∂a=1。

② 同理,db的偏导数∂d/∂b=1。

e=bc,当b增加一个很小的数值(例如0.001)时,e也会增加同样的数值(0.001),因此ea的偏导数∂e/∂b=1。

图1-17 反向传播的计算图求导数的过程

e= bc,当c增加一个很小的数值(例如0.001)时,e会减少同样的数值(增加−0.001),因此ec的偏导数∂e/∂c=−1。

Y= d×e,当 d增加一个很小的数值(例如 0.001)时,Y会增加该数值的 e倍(e×0.001),因此Yd的偏导数∂Y/∂d=e

⑥ 同理,Ye的偏导数∂Y/∂e=d

我们可以按照以下方法计算最终的输出结果Y对输入参数abc的偏导数。

Ya的偏导数∂Y/∂a=∂Y/∂d×∂d/∂a= e× 1 = e

Yb的偏导数∂Y/∂b=∂Y/∂d×∂d/∂b= e× 1 = e

Yc的偏导数∂Y/∂c=∂Y/∂e×∂e/∂c= d× (−1) = −d

因此计算图能使通过反向传播来求偏导数很容易得到结果。

3.静态图

在 1.3.1 小节中介绍了静态图和动态图在开源深度学习框架中的应用。静态图和动态图是计算图的两种类型。

静态图包含以下2个阶段。

① 阶段1:为模型的体系结构制定方案。

② 阶段2:训练模型并生成预测,为模型提供大量数据。

静态图的优点是可以提供强大的离线图优化和调度。因此,静态图比动态图运行得快。静态图的缺点是处理结构化数据及可变大小的数据时效果不好,而且需要先构建模型的结构才能执行计算,操作比较烦琐。

4.动态图

当执行前向计算时会默认定义动态图。动态图的构建和计算同时发生,这种机制可以实时得到中间结果,使调试更容易。动态图对于编程实现更加友好。但是由于每次执行时都会构建计算图,因此执行的效率较低。

5.MindSpore的执行模式

MindSpore 提供了动态图和静态图统一的编码方式,增加了静态图和动态图的可兼容性,用户无须开发多套代码,只要变更一行代码便可切换动态图/静态图模式,用户可在开发时选择静态图模式,这样便于开发调试;在运行时再切换至动态图模式,这样可以获得更好的性能体验。