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

什么是计算图

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

例如,这是一个简单的数学方程式 –

p = x + y

 

我们可以画出上述等式的计算图如下。

computational_graph_equation1

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

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

G= ( x + y) * 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

向后传递的目标

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

例如,我们需要以下梯度。

所需的梯度

∂x/∂f,∂y/∂f,∂z/∂f

向后传播(反向传播)

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

∂G/∂G= 1

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

backward_pass

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

∂G/∂z= p
∂G/∂p= z

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

∂G/∂z= p = 4

∂G/∂p= z= - 3

我们要计算 x 和 y 的梯度 –

∂g/∂x,∂g/∂y

然而,我们想要高效地做到这一点(虽然 x 和 g 在这个图中只有两跳远,想象一下它们彼此真的很远)。为了有效地计算这些值,我们将使用微分链式法则。从链式规则,我们有 –

∂G/∂X=∂G/∂p*∂p/∂X
∂g/∂y=∂g/∂p∗∂p/∂y

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

p=x+y⇒∂x/∂p=1,∂y/∂p=1

因此,我们得到 –

∂G/∂F=∂G/∂p*∂p/∂X= ( − 3 ) .1 = − 3

此外,对于输入 y –

∂g/∂y=∂g/∂p∗∂p/∂y=(−3).1=−3

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

训练神经网络的步骤

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

  • 对于数据集中的数据点 x,我们以 x 作为输入进行前向传播,并计算成本 c 作为输出。
  • 我们从 c 开始向后传递,并计算图中所有节点的梯度。这包括代表神经网络权重的节点。
  • 然后我们通过 W = W – 学习率 * 梯度来更新权重。
  • 我们重复这个过程,直到满足停止标准。

Python深度学习计算图 推荐阅读

最好用的Python代码编辑器

了解Python正则表达式函数

领券有优惠