计算图

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

什么是计算图

计算图被定义为节点对应于数学运算的有向图。计算图是一种表达和评估数学表达式的方式。

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

$$p = x+y$$

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

Computational Graph Equation1

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

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

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

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

计算图方程式2

计算图和反向传播

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

前向传递

前向传递是评估计算图所表示的数学表达式的值的过程。进行前向传递意味着我们将变量的值从左侧(输入)向前传递到右侧(输出)。

让我们考虑一个例子,为所有输入赋予一些值。假设,为所有输入赋予以下值。

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

通过将这些值赋给输入,我们可以执行前向传递并为每个节点上的输出获取以下值。

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

前向传递

然后我们使用 p = 4 和 z = -3 来获得 g = -12。我们从左到右向前传递。

前向传递方程

后向传递的目标

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

例如,我们希望获得以下梯度。

所需梯度

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

反向传递(反向传播)

我们通过找到最终输出相对于最终输出(本身!)的导数来开始反向传递。因此,它将导致恒等推导,并且值等于一。

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

我们的计算图现在如下所示 −

向后传递

接下来,我们将通过"*"操作进行向后传递。 我们将计算 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 ight ).1 = -3$$

此外,对于输入 y −

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

反向执行的主要原因是,当我们必须计算 x 处的梯度时,我们只使用已经计算出的值和 dq/dx(节点输出相对于同一节点输入的导数)。我们使用本地信息来计算全局值。

训练神经网络的步骤

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

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

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

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

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