文章首发于本人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。
吴恩达老师的手稿如下:
所以当计算所有这些导数时,最有效率的办法是从右到左计算,跟着这个红色箭头走,充分利用计算图的优势。特别是当第一次计算对 的导数时,之后在计算对 导数时,然后对 的导数,最后是对 和 的导数。
到这里,计算图求导数就完事了。这是一个计算图,也是一个流程图。是不是简单了好多,尤其是对 和 的导数!!!