我说神经网络的计算是按正向传递或前向传播步骤组织的,我们计算神经网络的输出,然后是反向传递或反向传播步骤,我们用于计算梯度或计算导数。计算图解释了为什么它以这种方式组织。我们将通过一个例子说明计算图(比对数概率回归或完整的神经网络更简单的例子)。
假设我们正在尝试计算一个函数
J=3(a+bc)
J
=
3
(
a
+
b
c
)
,我们令
u=bc
u
=
b
c
,
v=a+u
v
=
a
+
u
,
J=3v
J
=
3
v
,并在计算图中绘制它们如下。
当有一些特殊的输出变量(例如在这种情况下为
J
J
)你想要优化时,计算图就派上用场了。在对数概率回归的情况下,当然是我们试图最小化的成本函数。我们在这个小例子中看到的是,通过从左到右的传递,你可以计算出
J
J
的值。
如果我们将的数值稍微改变一下, J J 的值会如何变化?在这里,我们将增加了0.001。最终的结果是 J J 增加了0.003。所以。因为 J J 的增加是的增加的3倍。
现在让我们看另一个例子。 ∂J∂a=? ∂ J ∂ a = ? ,换句话说,如果我们改变a的值,那么这对J的值有何影响?
在代码中,当你在你编写的代码中计算这个东西时,我们只是使用变量名dvar来表示 ∂J∂var ∂ J ∂ v a r 。
从这个例子来看,利用计算图计算导数的关键点是,当计算微分时,最有效的方法是按照反向进行从右到左的计算。特别是,我们首先计算 ∂J∂v ∂ J ∂ v 。然后,这对于计算关于 ∂J∂a ∂ J ∂ a 和 ∂J∂u ∂ J ∂ u 是有用的。再往下传播,这些对于计算关于 ∂J∂b ∂ J ∂ b 和 ∂J∂c ∂ J ∂ c 也是有用的。