上一节中,看了一个例子,使用流程图来计算函数J,现在我们清理一下流程图的描述,看看如何利用它计算出函数J的导数。

下图是一个流程图,假设要计算J对v的导数,怎么计算呢?把v值拿过来,改变一下,那么J的值会怎么变呢?定义上,J=3vJ=3v,现在v=11,如果让v增加一点点,如果到11.001,那么J的值就变为33.003,。当v增加0.001,最终结果是J上升到原来的三倍,所以J对v的导数就等于3,因为对于任何v的增量,J都会有3倍增量,而且这类似于在上一节中的例子,有f(a)=3af(a)=3a
吴恩达深度学习 —— 2.8 计算图的导数计算
在反向传播算法中的术语,可以看到,如果想计算最后输出变量的导数使用你最关心的变量,对v的导数,那么我们就做完了一步反向传播。在这个流程图中是一个反向步。
吴恩达深度学习 —— 2.8 计算图的导数计算
看一下另外的例子,dJda\frac{dJ}{da}怎么计算呢?换句话说,如果我们提高a的数值,对J的数值有什么影响?我们看一下这个例子,变量a=5,让它增加到5.001,那么对v的影响就是a+U,之前是11,现在变为11.001,J就变成33.003了。所以可以看到的是,如果让a增加0.001,J增加0.003,那么增加啊,也就是把这个5换成某个新值,那么a的该变量就会传播到流程图的最右,所以J最后是33.003,所以J的增量是3乘于a的增量,意味着这个导数是3。

要解释这个计算过程其中一种方法是,就是如果你改变了啊,那也会改变v,通过改变v,也会改变J。所以J值的净变化量,当你提升这个值,当把a值提高一点点,这就是J的变化量。

首先a增加了,v也会增加,v增加多少呢?增加了一个量,这取决于dvda\frac{dv}{da},然后v的变化导致J也在增加,在微积分中这叫链式法则。如果a影响到v影响到J,当你让a变大时,J的变化量就是当你改变a时v的变化量乘于改变v时J的变化量,在微积分中这叫链式法则。

我们从计算中可以看到,如果让a增加0.001,v也会变化相同的大小,所以dvda=1\frac{dv}{da}=1。事实上,KaTeX parse error: Expected '}', got 'EOF' at end of input: \frac{dJ}{dv3dvda=1\frac{dv}{da}=1,所以这个乘积为3,也就是dJda=3\frac{dJ}{da}=3

这张小图展示了dJdv\frac{dJ}{dv}就是这个对这个变量的导数,这可以帮助你计算dJda\frac{dJ}{da},所以这是另一步反向传播计算。
吴恩达深度学习 —— 2.8 计算图的导数计算
现在介绍一些新的符号约定,当你编程实现反向传播时,通常会有一个最终输出值是你需要关心的,所以有很多计算尝试计算输出变量的导数。所以d(输出变量)\d(某个变量)的导数就用d(var)命名。在很多计算中你需要计算最终输出结果的导数,还有各种中间变量,比如a,b,c,u,v,当在软件里实现的时候,变量名叫什么?可以做的一件事是,在python中可以写一个很长的变量名,但变量名太长也不好,我们用d(J)/d(var),但因为你一直对d(J)求导,对这个最终输出变量求导,这里要介绍一个新符号。在程序里,当在编程的时候,在代码里,我们就使用变量名dvar来表示那个量,所以dvar在程序中表示导数。我们关心的最终变量J的导数有时候是L对代码中各种中间值的导数。

我们通过这个流程图部分完成的反向传播算法,在下面我们会看看这个例子剩下的部分。使用一张新的流程图,回顾一下,到目前为止,我们一直在往回传播,并计算出d(J)/d(v)=3,同理,可有d(J)/d(a)=3。
吴恩达深度学习 —— 2.8 计算图的导数计算
我们继续计算导数,我们看一下值u,dJdu\frac{dJ}{du}是多少呢?通过和之前类似的计算,从u=6出发,令u增加到6.001,那么v之前是11,现在变成11.001了,J就从33变成33.003。所以J的增量是3倍,所以这就等于dJdu=dJdvdvdu=3\frac{dJ}{du}=\frac{dJ}{dv}*\frac{dv}{du}=3
吴恩达深度学习 —— 2.8 计算图的导数计算
现在仔细看最后一个例子dJdb\frac{dJ}{db},使用微积分的链式法则,这可以写成两者的乘积,dJdb=dJdududb\frac{dJ}{db}=\frac{dJ}{du}*\frac{du}{db},理由是,如果将b改变一点点,比如改为3.001,它影响J的方式是,首先影响u,它对u的影响有多大呢?u的定义是u=bcu=b*c,所以当b=3时u的值为6,现在u的值变为6.002,所以这告诉我们dudb=2\frac{du}{db}=2,当b增加0.001时,u就增加2倍。所以dJdb=dJdududb=6\frac{dJ}{db}=\frac{dJ}{du}*\frac{du}{db}=6。同理,可以推导得到dJdc=dJdududc=9\frac{dJ}{dc}=\frac{dJ}{du}*\frac{du}{dc}=9

本节的要点是,对于那些例子,当计算所有这些导数时,最有效率的办法是从右到左计算,跟着这个红色箭头走,特别是当我们第一次计算对v的导数时,之后在计算对a的导数时就可以用到,然后对u的导数,可以帮助计算对b的导数,然后对c的导数。
吴恩达深度学习 —— 2.8 计算图的导数计算
所以这是一个计算流程图,就是正向或者说从左到右的计算来计算成本函数,可能需要优化参数,然后反向从右到左计算导数。

相关文章: