2.8 计算图的导数计算-深度学习-Stanford吴恩达教授


←上一篇↓↑下一篇→
2.7 计算图回到目录2.9 Logistic 回归的梯度下降法

计算图的导数计算 (Derivatives with a Computation Graph)

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

下面用到的公式:

d J d u = d J d v d v d u ,   d J d b = d J d u d u d b ,   d J d a = d J d u d u d a \frac{dJ}{du}=\frac{dJ}{dv}\frac{dv}{du},\ \frac{dJ}{db}=\frac{dJ}{du}\frac{du}{db},\ \frac{dJ}{da}=\frac{dJ}{du}\frac{du}{da} dudJ=dvdJdudv, dbdJ=dudJdbdu, dadJ=dudJdadu

这是一个流程图:

在这里插入图片描述

假设你要计算 d J d v \frac{dJ}{dv} dvdJ ,那要怎么算呢?好,比如说,我们要把这个 v v v 值拿过来,改变一下,那么 J J J 值会怎么变呢?

所以定义上 J = 3 v J=3v J=3v ,现在 v = 11 v=11 v=11 ,所以如果你让 v v v 增加一点点,比如到11.001,那么 J = 3 v = 33.003 J=3v=33.003 J=3v=33.003 ,所以我这里 v v v 增加了0.001,然后最终结果是 J J J 上升到原来的3倍,所以 d J d v = 3 \frac{dJ}{dv}=3 dvdJ=3 ,因为对于任何 v v v 的增量 J J J 都会有3倍增量,而且这类似于我们在上一个视频中的例子,我们有 f ( a ) = 3 a f(a)=3a f(a)=3a ,然后我们推导出 d f ( a ) d a = 3 \frac{df(a)}{da}=3 dadf(a)=3 ,所以这里我们有 J = 3 v J=3v J=3v ,所以 d J d v = 3 \frac{dJ}{dv}=3 dvdJ=3 ,这里 J J J 扮演了 f f f 的角色,在之前的视频里的例子。

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

在这里插入图片描述
我们来看另一个例子, d J d a \frac{dJ}{da} dadJ 是多少呢?换句话说,如果我们提高 a a a 的数值,对 J J J 的数值有什么影响?

好,我们看看这个例子。变量 a = 5 a=5 a=5,我们让它增加到5.001,那么对 v v v 的影响就是 a + u a+u a+u ,之前 v = 11 v=11 v=11 ,现在变成11.001,我们从上面看到现在 J J J 就变成33.003了,所以我们看到的是,如果你让 a a a 增加0.001, J J J 增加0.003。那么增加 a a a ,我是说如果你把这个5换成某个新值,那么 a a a 的改变量就会传播到流程图的最右,所以 J J J 最后是33.003。所以 J J J 的增量是3乘以 a a a 的增量,意味着这个导数是3。

在这里插入图片描述

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

在这里插入图片描述

首先 a a a 增加了, v v v 也会增加, v v v 增加多少呢?这取决于 d v d a \frac{dv}{da} dadv ,然后 v v v 的变化导致 J J J 也在增加,所以这在微积分里实际上叫链式法则,如果 a a a 影响到 v v v v v v 影响到 J J J ,那么当你让 a a a 变大时, J J J 的变化量就是当你改变 a a a 时, v v v 的变化量乘以改变 v v v J J J 的变化量,在微积分里这叫链式法则

在这里插入图片描述

我们从这个计算中看到,如果你让 a a a 增加0.001, v v v 也会变化相同的大小,所以 d v d a = 1 \frac{dv}{da}=1 dadv=1 。事实上,如果你代入进去,我们之前算过 d J d v = 3 \frac{dJ}{dv}=3 dvdJ=3 d v d a = 1 \frac{dv}{da}=1 dadv=1 ,所以这个乘积 3 ∗ 1 3*1 31 ,实际上就给出了正确答案, d J d a = 3 \frac{dJ}{da}=3 dadJ=3

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

在这里插入图片描述

现在我想介绍一个新的符号约定,当你编程实现反向传播时,通常会有一个最终输出值是你要关心的,最终的输出变量,你真正想要关心或者说优化的。在这种情况下最终的输出变量是 J J J ,就是流程图里最后一个符号,所以有很多计算尝试计算输出变量的导数,所以输出变量对某个变量的导数,我们就用 d v a r dvar dvar 命名,所以在很多计算中你需要计算最终输出结果的导数,在这个例子里是 J J J ,还有各种中间变量,比如 a 、 b 、 c 、 u 、 v a、b、c、u、v abcuv ,当你在软件里实现的时候,变量名叫什么?你可以做的一件事是,在python中,你可以写一个很长的变量名,比如 d F i n a l O u t p u t v a r _ d v a r dFinalOutputvar\_dvar dFinalOutputvar_dvar ,但这个变量名有点长,我们就用 d J _ d v a r dJ\_dvar dJ_dvar ,但因为你一直对 d J dJ dJ 求导,对这个最终输出变量求导。我这里要介绍一个新符号,在程序里,当你编程的时候,在代码里,我们就使用变量名 d v a r dvar dvar ,来表示那个量。

在这里插入图片描述

好,所以在程序里是 d v a r dvar dvar 表示导数,你关心的最终变量 J J J 的导数,有时最后是 L L L ,对代码中各种中间量的导数,所以代码里这个东西,你用 d v dv dv 表示这个值,所以 d v = 3 dv=3 dv=3 ,你的代码表示就是 d a = 3 da=3 da=3

在这里插入图片描述

好,所以我们通过这个流程图完成部分的后向传播算法。我们在下一张幻灯片看看这个例子剩下的部分。

我们清理出一张新的流程图,我们回顾一下,到目前为止,我们一直在往回传播,并计算 d v = 3 dv=3 dv=3 ,再次, d v dv dv 是代码里的变量名,其真正的定义是 d J d v \frac{dJ}{dv} dvdJ 。我发现 d a = 3 da=3 da=3 ,再次, d a da da 是代码里的变量名,其实代表 d J d a \frac{dJ}{da} dadJ 的值。

在这里插入图片描述

大概手算了一下,两条直线怎么计算反向传播。

好,我们继续计算导数,我们看看这个值 u u u ,那么 d J d u \frac{dJ}{du} dudJ 是多少呢?通过和之前类似的计算,现在我们从 u = 6 u=6 u=6 出发,如果你令 u u u 增加到6.001,那么 v v v 之前是11,现在变成11.001了, J J J 就从33变成33.003,所以 J J J 增量是3倍,所以 d J d u = 3 \frac{dJ}{du}=3 dudJ=3 。对 u u u 的分析很类似对 a a a 的分析,实际上这计算起来就是 d J d v ⋅ d v d u \frac{dJ}{dv} \cdot \frac{dv}{du} dvdJdudv ,有了这个,我们可以算出 d J d v = 3 \frac{dJ}{dv}=3 dvdJ=3 d v d u = 1 \frac{dv}{du}=1 dudv=1 ,最终算出结果是 3 ∗ 1 = 3 3*1=3 31=3

在这里插入图片描述

所以我们还有一步反向传播,我们最终计算出 d u = 3 du=3 du=3 ,这里的 d u du du 当然了,就是 d J d u \frac{dJ}{du} dudJ

现在,我们仔细看看最后一个例子,那么 d J d b \frac{dJ}{db} dbdJ 呢?想象一下,如果你改变了 b b b 的值,你想要然后变化一点,让 J J J 值到达最大或最小,那么导数是什么呢?这个 J J J 函数的斜率,当你稍微改变 b b b 值之后。事实上,使用微积分链式法则,这可以写成两者的乘积,就是 d J d u ⋅ d u d b \frac{dJ}{du} \cdot \frac{du}{db} dudJdbdu ,理由是,如果你改变 b b b 一点点,所以 b b b 变化比如说3.001,它影响 J J J 的方式是,首先会影响 u u u ,它对 u u u 的影响有多大?好, u u u 的定义是 b ⋅ c b\cdot c bc ,所以 b = 3 b=3 b=3 时这是6,现在就变成6.002了,对吧,因为在我们的例子中 c = 2 c=2 c=2 ,所以这告诉我们 d u d b = 2 \frac{du}{db}=2 dbdu=2 当你让 b b b 增加0.001时, u u u 就增加两倍。所以 d u d b = 2 \frac{du}{db}=2 dbdu=2 ,现在我想 u u u 的增加量已经是 b b b 的两倍,那么 d J d u \frac{dJ}{du} dudJ 是多少呢?我们已经弄清楚了,这等于3,所以让这两部分相乘,我们发现 d J d u = 6 \frac{dJ}{du}=6 dudJ=6

好,这就是第二部分的推导,其中我们想知道 u u u 增加0.002,会对 J J J 有什么影响。实际上 d J d u = 3 \frac{dJ}{du}=3 dudJ=3 ,这告诉我们 u u u 增加0.002之后, J J J 上升了3倍,那么 J J J 应该上升0.006,对吧。这可以从 d J d u = 3 \frac{dJ}{du}=3 dudJ=3 推导出来。

如果你仔细看看这些数学内容,你会发现,如果 b b b 变成3.001,那么 u u u 就变成6.002, v v v 变成11.002,然后 J = 3 v = 33.006 J=3v=33.006 J=3v=33.006 ,对吧?这就是如何得到 d J d b = 6 \frac{dJ}{db}=6 dbdJ=6

在这里插入图片描述

为了填进去,如果我们反向走的话, d b = 6 db=6 db=6 ,而 d b db db 其实是Python代码中的变量名,表示 d J d b \frac{dJ}{db} dbdJ

在这里插入图片描述

我不会很详细地介绍最后一个例子,但事实上,如果你计算 d J d c = d J d u ⋅ d u d c = 3 ∗ 3 \frac{dJ}{dc}=\frac{dJ}{du}\cdot \frac{du}{dc}=3*3 dcdJ=dudJdcdu=33 ,这个结果是9。

我不会详细说明这个例子,在最后一步,我们可以推出 d c = 9 dc=9 dc=9

在这里插入图片描述

所以这个视频的要点是,对于那个例子,当计算所有这些导数时,最有效率的办法是从右到左计算,跟着这个红色箭头走。特别是当我们第一次计算对 v v v 的导数时,之后在计算对 a a a 导数就可以用到。然后对 u u u 的导数,比如说这个项和这里这个项:

在这里插入图片描述

可以帮助计算对 b b b 的导数,然后对 c c c 的导数。

所以这是一个计算流程图,就是正向或者说从左到右的计算来计算成本函数 J J J ,你可能需要优化的函数,然后反向从右到左计算导数。如果你不熟悉微积分或链式法则,我知道这里有些细节讲的很快,但如果你没有跟上所有细节,也不用怕。在下一个视频中,我会再过一遍。在逻辑回归的背景下过一遍,并给你介绍需要做什么才能编写代码,实现逻辑回归模型中的导数计算。

课程PPT

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


←上一篇↓↑下一篇→
2.7 计算图回到目录2.9 Logistic 回归的梯度下降法

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zhao-Jichao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值