天天看点

吴恩达深度学习 —— 2.8 计算图的导数计算

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

下图是一个流程图,假设要计算J对v的导数,怎么计算呢?把v值拿过来,改变一下,那么J的值会怎么变呢?定义上, J = 3 v J=3v J=3v,现在v=11,如果让v增加一点点,如果到11.001,那么J的值就变为33.003,。当v增加0.001,最终结果是J上升到原来的三倍,所以J对v的导数就等于3,因为对于任何v的增量,J都会有3倍增量,而且这类似于在上一节中的例子,有 f ( a ) = 3 a f(a)=3a f(a)=3a。

吴恩达深度学习 —— 2.8 计算图的导数计算

在反向传播算法中的术语,可以看到,如果想计算最后输出变量的导数使用你最关心的变量,对v的导数,那么我们就做完了一步反向传播。在这个流程图中是一个反向步。

吴恩达深度学习 —— 2.8 计算图的导数计算

看一下另外的例子, d J d a \frac{dJ}{da} dadJ​怎么计算呢?换句话说,如果我们提高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增加多少呢?增加了一个量,这取决于 d v d a \frac{dv}{da} dadv​,然后v的变化导致J也在增加,在微积分中这叫链式法则。如果a影响到v影响到J,当你让a变大时,J的变化量就是当你改变a时v的变化量乘于改变v时J的变化量,在微积分中这叫链式法则。

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

这张小图展示了 d J d v \frac{dJ}{dv} dvdJ​就是这个对这个变量的导数,这可以帮助你计算 d J d a \frac{dJ}{da} dadJ​,所以这是另一步反向传播计算。

吴恩达深度学习 —— 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, d J d u \frac{dJ}{du} dudJ​是多少呢?通过和之前类似的计算,从u=6出发,令u增加到6.001,那么v之前是11,现在变成11.001了,J就从33变成33.003。所以J的增量是3倍,所以这就等于 d J d u = d J d v ∗ d v d u = 3 \frac{dJ}{du}=\frac{dJ}{dv}*\frac{dv}{du}=3 dudJ​=dvdJ​∗dudv​=3。

吴恩达深度学习 —— 2.8 计算图的导数计算

现在仔细看最后一个例子 d J d b \frac{dJ}{db} dbdJ​,使用微积分的链式法则,这可以写成两者的乘积, d J d b = d J d u ∗ d u d b \frac{dJ}{db}=\frac{dJ}{du}*\frac{du}{db} dbdJ​=dudJ​∗dbdu​,理由是,如果将b改变一点点,比如改为3.001,它影响J的方式是,首先影响u,它对u的影响有多大呢?u的定义是 u = b ∗ c u=b*c u=b∗c,所以当b=3时u的值为6,现在u的值变为6.002,所以这告诉我们 d u d b = 2 \frac{du}{db}=2 dbdu​=2,当b增加0.001时,u就增加2倍。所以 d J d b = d J d u ∗ d u d b = 6 \frac{dJ}{db}=\frac{dJ}{du}*\frac{du}{db}=6 dbdJ​=dudJ​∗dbdu​=6。同理,可以推导得到 d J d c = d J d u ∗ d u d c = 9 \frac{dJ}{dc}=\frac{dJ}{du}*\frac{du}{dc}=9 dcdJ​=dudJ​∗dcdu​=9。

本节的要点是,对于那些例子,当计算所有这些导数时,最有效率的办法是从右到左计算,跟着这个红色箭头走,特别是当我们第一次计算对v的导数时,之后在计算对a的导数时就可以用到,然后对u的导数,可以帮助计算对b的导数,然后对c的导数。

吴恩达深度学习 —— 2.8 计算图的导数计算

所以这是一个计算流程图,就是正向或者说从左到右的计算来计算成本函数,可能需要优化参数,然后反向从右到左计算导数。

继续阅读