计算图



反向传播在像Tensorflow、Torch、Theano等深度学习框架中是通过使用计算图来实现的。更重要的是,理解计算图上的反向传播结合了若干不同的算法及其变体,例如通过时间的反向传播和具有共享权重的反向传播。一旦所有内容都被转换为计算图,它们仍然是相同的算法——仅仅是在计算图上的反向传播。

什么是计算图

计算图被定义为一个有向图,其中节点对应于数学运算。计算图是表达和评估数学表达式的途径。

例如,这里有一个简单的数学方程:

$$p = x+y$$

我们可以绘制上述方程的计算图如下所示。

Computational Graph Equation1

上述计算图有一个加法节点(带有“+”符号的节点),有两个输入变量x和y,以及一个输出q。

让我们再举一个例子,稍微复杂一点。我们有以下方程:

$$g = \left (x+y \right ) \ast z $$

上述方程由以下计算图表示。

Computational Graph Equation2

计算图和反向传播

计算图和反向传播都是深度学习中训练神经网络的重要核心概念。

前向传播

前向传播是评估由计算图表示的数学表达式值的程序。进行前向传播意味着我们正在将值从变量向前方向从左侧(输入)传递到右侧,输出位于右侧。

让我们通过给所有输入赋予一些值来举个例子。假设所有输入都被赋予以下值:

$$x=1, y=3, z=−3$$

通过将这些值赋予输入,我们可以执行前向传播并在每个节点上获得以下输出值。

首先,我们使用x = 1和y = 3的值,得到p = 4。

Forward Pass

然后我们使用p = 4和z = -3得到g = -12。我们从左到右,向前进行。

Forward Pass Equation

反向传播的目标

在反向传播中,我们的目的是计算每个输入相对于最终输出的梯度。这些梯度对于使用梯度下降训练神经网络至关重要。

例如,我们希望得到以下梯度:

所需梯度

$$\frac{\partial x}{\partial f}, \frac{\partial y}{\partial f}, \frac{\partial z}{\partial f}$$

反向传播(反向传播)

我们从找到最终输出相对于最终输出(自身!)的导数开始反向传播。因此,它将产生恒等导数,其值为1。

$$\frac{\partial g}{\partial g} = 1$$

我们的计算图现在看起来如下所示:

Backward Pass

接下来,我们将通过“*”操作进行反向传播。我们将计算p和z处的梯度。由于g = p*z,我们知道:

$$\frac{\partial g}{\partial z} = p$$

$$\frac{\partial g}{\partial p} = z$$

我们已经从前向传播中知道了z和p的值。因此,我们得到:

$$\frac{\partial g}{\partial z} = p = 4$$

$$\frac{\partial g}{\partial p} = z = -3$$

我们想要计算x和y处的梯度:

$$\frac{\partial g}{\partial x}, \frac{\partial g}{\partial y}$$

然而,我们希望有效地做到这一点(尽管x和g在这个图中只有两跳远,想象一下它们彼此之间非常遥远)。为了有效地计算这些值,我们将使用微分的链式法则。根据链式法则,我们有:

$$\frac{\partial g}{\partial x}=\frac{\partial g}{\partial p}\ast \frac{\partial p}{\partial x}$$

$$\frac{\partial g}{\partial y}=\frac{\partial g}{\partial p}\ast \frac{\partial p}{\partial y}$$

但我们已经知道dg/dp = -3,dp/dx和dp/dy很容易,因为p直接依赖于x和y。我们有:

$$p=x+y\Rightarrow \frac{\partial x}{\partial p} = 1, \frac{\partial y}{\partial p} = 1$$

因此,我们得到:

$$\frac{\partial g} {\partial f} = \frac{\partial g} {\partial p}\ast \frac{\partial p} {\partial x} = \left ( -3 \right ).1 = -3$$

此外,对于输入y:

$$\frac{\partial g} {\partial y} = \frac{\partial g} {\partial p}\ast \frac{\partial p} {\partial y} = \left ( -3 \right ).1 = -3$$

这样向后计算的主要原因是,当我们需要计算x处的梯度时,我们只使用了已经计算过的值,以及dq/dx(节点输出相对于同一节点输入的导数)。我们使用局部信息来计算全局值。

训练神经网络的步骤

按照以下步骤训练神经网络:

  • 对于数据集中的数据点x,我们使用x作为输入进行前向传播,并计算成本c作为输出。

  • 我们从c开始进行反向传播,并计算图中所有节点的梯度。这包括表示神经网络权重的节点。

  • 然后我们通过W = W - 学习率 * 梯度来更新权重。

  • 我们重复此过程,直到满足停止条件。

广告