计算图
反向传播是通过使用计算图在 Tensorflow、Torch、Theano 等深度学习框架中实现的。更重要的是,理解计算图上的反向传播结合了几种不同的算法及其变体,例如随时间的反向传播和具有共享权重的反向传播。一旦所有内容都转换为计算图,它们仍然是相同的算法 - 只是计算图上的反向传播。
什么是计算图
计算图被定义为有向图,其中节点对应于数学运算。计算图是表达和评估数学表达式的一种方式。
例如,这是一个简单的数学方程 -
$$p = x+y$$
我们可以画出上述方程的计算图如下。
上面的计算图有一个加法节点(带“+”号的节点),有两个输入变量 x 和 y 以及一个输出 q。
让我们再举一个稍微复杂一点的例子。我们有以下等式。
$$g = \left (x+y \right ) \ast z $$
上述方程由以下计算图表示。
计算图和反向传播
计算图和反向传播都是深度学习训练神经网络的重要核心概念。
前向传球
前向传递是评估计算图表示的数学表达式的值的过程。进行前向传递意味着我们将变量的值从左侧(输入)向前传递到输出所在的右侧。
让我们考虑一个为所有输入赋予一些值的示例。假设为所有输入赋予以下值。
$$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{\部分g}{\部分g} = 1$$
我们的计算图现在如下所示 -
接下来,我们将通过“*”操作进行向后传递。我们将计算 p 和 z 处的梯度。由于 g = p*z,我们知道 -
$$\frac{\部分g}{\部分z} = p$$
$$\frac{\部分g}{\部分p} = z$$
我们已经从前向传播中知道了 z 和 p 的值。因此,我们得到 -
$$\frac{\部分g}{\部分z} = p = 4$$
和
$$\frac{\部分g}{\部分p} = z = -3$$
我们想要计算 x 和 y 处的梯度 -
$$\frac{\部分g}{\部分x}, \frac{\部分g}{\部分y}$$
然而,我们希望有效地做到这一点(尽管 x 和 g 在此图中仅相距两跳,想象一下它们彼此相距甚远)。为了有效地计算这些值,我们将使用微分链式法则。根据链式法则,我们有 -
$$\frac{\部分g}{\部分x}=\frac{\部分g}{\部分p}\ast \frac{\部分p}{\部分x}$$
$$\frac{\部分g}{\部分y}=\frac{\部分g}{\部分p}\ast \frac{\部分p}{\部分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 - 学习率 * 梯度来更新权重。
我们重复此过程,直到满足停止标准。