前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从零开始深度学习(六):计算图

从零开始深度学习(六):计算图

作者头像
我是管小亮
发布2020-04-20 16:36:58
1.7K0
发布2020-04-20 16:36:58
举报
文章被收录于专栏:程序员管小亮的成长之路

文章首发于本人CSDN账号:https://blog.csdn.net/tefuirnever

由于微信不允许外部链接,你需要点击页尾左下角的“阅读原文”,才能访问文中的链接。

1、计算图

一个神经网络的计算大体上可以看成是,前向或反向传播组合而成的。只有公式描述,确实有一些晦涩,这个时候我们想到了计算图。计算图是什么?

计算图是一种描述方程的语言,既然是图,则有 节点(变量)边(操作)

这么说太官方了,来举一个比逻辑回归更加简单的,或者说不那么正式的神经网络的例子。

我们的目的是计算函数 ,函数 的组成是什么呢?是由三个变量 组成的函数,这个函数是 。计算这个函数实际上有三个不同的步骤,也就是拆分一下,用复合函数的思想去理解。

首先是计算 乘以 ,用一个函数 来表示;然后计算另一个函数 ;最后输出 ,这就是要计算的函数 。这三步可以画成如下的计算图:

先画三个变量 ,第一步就是计算 ,放个矩形框,它的输入是 ;接着还是放个矩形框,进行第二步 ;最后一步还是个矩形框,进行 。

举个例子: , 就是 3 * 2 = 6;而 ,就是 5+6=11; 是 3 倍的 ,因此, = 3 × (5 + 3 × 2)。如果把它算出来,就得到33,实际上就是 的值。

计算图的一个大优势是:当有不同的或者一些特殊的输出变量时,例如上面例子中的 和逻辑回归中准备优化的代价函数 ,用计算图来处理会很方便。从这个小例子中可以看出,通过一个从左向右(蓝色箭头)的过程,可以计算出 的值。而为了计算导数,从右到左(红色箭头,和蓝色箭头的过程相反)的过程是用于计算导数最自然、最直观的方式。

2、使用计算图求导数

如何利用计算图来计算函数 的导数呢?

先不急,来看个例子,下面用到的公式:

这是一个计算图,记录了整个流程:


假设计算 ,那要怎么算呢?如果你会微积分的话,就好说了,直接求导数没啥好说的;那么不会的话呢,也不用着急!这么看,比如要把这个 值拿过来,改变一下,那么 的值会怎么变呢?(是不是用上了上面提到的导数讲解 :))

首先 ,,,这是已知条件。如果让 增加一点点,比如到11.001,那么 ,这里 增加了 0.001,而最终结果是 上升了 0.003,也就是原来的 3 倍,所以 。

为啥这么说?当然是因为对于任何 的增量, 都会有 3 倍增量。所以有 ,推出 。

吴恩达老师的手稿如下:


看另一个例子, 是多少呢?换句话说,如果提高 的值, 的数值有什么影响?

变量 ,增加到了 5.001,那么对 的影响就是 ,之前 ,现在变成 5.001 - 5 + 11 = 11.001, 就变成11.001 * 3 = 33.003,所以 增加 0.001, 增加 0.003。那么增加 , 的改变量会传播到计算图的最右边,所以 最后是 33.003。所以 的增量是 3 乘以 的增量,也就意味着导数是 3,即 。

吴恩达老师的手稿如下:

要解释清楚这个计算过程,就会牵扯出链式法则,名字虽然挺厉害的,其实很简单。

首先 增加了, 也会增加; 增加多少呢?这取决于 ;然后 的增加导致 也会增加。所以这在微积分里实际上叫链式法则,顾名思义,互相之间被链住了,一个变化都会变化。

那么怎么计算一个链式法则的求导呢?

其实不难,前面给了三个公式,这就是答案。通过分解的方法,把整个链式法则分解为几个小的链子,分别求导再相乘,就解出正确答案了。

通过改变一个变量来看另一个变量的变化关系这种方法,我们得到了 、,所以 ,即为所求。

下图表示了整个计算过程:


继续计算另一条线的导数,也就是这个 ,那么 是多少呢?

通过和之前类似的计算,这里简单说一下。从 出发,令 增加到 6.001, 之前是 11,现在变成 6.001 - 6 + 11 = 11.001, 从 33 变成 33 * 3 = 33.003,所以 。

对 的分析很类似对 a 的分析,为啥这么说呢?实际上还是计算,,又因为有 、,最终算出的结果是 ,所以可以看出对 的分析类似对 a 的分析。

吴恩达老师的手稿如下:


现在,来看最后一个例子,那么 呢?

事实上,使用微积分链式法则,这也可以写成乘积的形式,就是 。

当 增加 0.001 变成 3.001 时, 就变成 3.001 * 2 = 6.002, 增加了 6.002 - 6 = 0.002,也就是 的增加量的二倍,所以 。那么 是多少呢?在前面我们已经弄清楚了,等于 3,所以这两部分相乘,可得 。


其实还有另一个例子,不过 和 是比较相似的。经过计算你会发现 ,这个结果是 9。

吴恩达老师的手稿如下:

所以当计算所有这些导数时,最有效率的办法是从右到左计算,跟着这个红色箭头走,充分利用计算图的优势。特别是当第一次计算对 的导数时,之后在计算对 导数时,然后对 的导数,最后是对 和 的导数。

到这里,计算图求导数就完事了。这是一个计算图,也是一个流程图。是不是简单了好多,尤其是对 和 的导数!!!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员管小亮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档