计算图和反向传播

原文链接:https://www.yiibai.com/python_deep_learning/python_deep_learning_computational_graphs.html

什么是计算图

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

例如,这里有一个简单的数学公式 -

p = x + y

Shell

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

上面的计算图具有一个加法节点(具有“+”符号的节点),其具有两个输入变量xy以及一个输出q

让我们再举一个例子,稍微复杂些。如下等式。

g = ( x + y ) ∗ z

Shell

以上等式由以下计算图表示。

计算图和反向传播

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

前进传递

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

让我们考虑一个例子,给所有的投入赋予一些价值。 假设给所有输入赋予下列值。

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

Shell

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

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

然后使用p = 4z = -3来得到g = -12。下面从左到右前进。

后向传递目标

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

例如,我们希望以下渐变。所需的渐变

后退传递

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

计算图现在看起来如下所示 -

接下来,我们将通过“*”操作进行反向传递。将计算pz处的梯度。 由于g = p * z,所以可以知道 -

已经知道正向传递的zp值。 因此得到 -

我们想要计算xy处的梯度 -

然而,我们想要有效地做到这一点(尽管xg在图中只有两跳,想象它们彼此之间真的很远)。 要有效计算这些值,我们将使用差异化的链式规则。 从连锁规则来看,如下 -

但是已经知道dg/dp = -3dp/dxdp/dy很容易,因为p直接取决于xy。如下公式 -

因此,可以得到 -

另外,对于输入y -

这样做的主要原因是,当必须计算x处的梯度时,只使用了已计算的值,而dq/dx(节点输出相对于同一节点的输入的导数)。使用本地信息来计算全局值。

#####

我一直不明白的是,反向传播的时候,节点的值并没有啊,

今天想了想,反向传播之前,是要先进行正想传播的,在正向的过程中,会计算每个节点的值,并保存,所以反向的时候计算偏导数,就可以得到相应的值了。对就是这个丫子。

 


 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值