吴恩达深度学习笔记(11)-烧脑神经网络前向传播和后向传播计算

计算图(Computation Graph)

可以说,一个神经网络的计算,都是按照前向或反向传播过程组织的。

首先我们计算出一个新的网络的输出(前向过程),紧接着进行一个反向传输操作。

后者我们用来计算出对应的梯度或导数。计算图解释了为什么我们用这种方式组织这些计算过程。在这篇笔记中中,我们将举一个例子说明计算图是什么。让我们举一个比逻辑回归更加简单的,或者说不那么正式的神经网络的例子。

我们尝试计算函数J,J是由三个变量a,b,c组成的函数,这个函数是3(a+bc) 。计算这个函数实际上有三个不同的步骤,首先是计算 b 乘以 c,我们把它储存在变量u中,因此u=bc; 然后计算v=a+u;最后输出J=3v,这就是要计算的函数J。

我们可以把这三步画成如下的计算图,我先在这画三个变量a,b,c,第一步就是计算u=bc,我在这周围放个矩形框,它的输入是b,c,接着第二步v=a+u,最后一步J=3v。

举个例子: a=5,b=3,c=2 ,u=bc就是6,就是5+6=11。J是3倍的 ,因此。即3×(5+3×2)。如果你把它算出来,实际上得到33就是J的值。 当有不同的或者一些特殊的输出变量时,例如本例中的J和逻辑回归中你想优化的代价函数J,因此计算图用来处理这些计算会很方便。从这个小例子中我们可以看出,通过一个从左向右的过程,你可以计算出J的值。为了计算导数,从右到左(红色箭头,和蓝色箭头的过程相反)的过程是用于计算导数最自然的方式。

概括一下:计算图组织计算的形式是用蓝色箭头从左到右的计算,让我们看看如何进行反向红色箭头(也就是从右到左)的导数计算

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

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

下面用到的公式:

这是一个流程图:

假设你要计算dJ/dv,那要怎么算呢?

好,比如说,我们要把这个v值拿过来,改变一下,那么J的值会怎么变呢?

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

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

我们来看另一个例子,dJ/da是多少呢?换句话说,如果我们提高a的数值,对J的数值有什么影响?

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

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

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

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

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

现在我想介绍一个新的符号约定,当你编程实现反向传播时,通常会有一个最终输出值是你要关心的,最终的输出变量,你真正想要关心或者说优化的。在这种情况下最终的输出变量是J,就是流程图里最后一个符号,所以有很多计算尝试计算输出变量的导数,所以输出变量对某个变量的导数,我们就用dvar命名,所以在很多计算中你需要计算最终输出结果的导数,在这个例子里是J,还有各种中间变量,比如a、b、c、u、v。

当你在软件里实现的时候,变量名叫什么?

你可以做的一件事是,在python中,你可以写一个很长的变量名,比如dFinalOutputvar_dvar,但这个变量名有点长,我们就用dJ_dvar,但因为你一直对dJ求导,对这个最终输出变量求导。我这里要介绍一个新符号,在程序里,当你编程的时候,在代码里,我们就使用变量名dvar,来表示那个量。

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

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

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

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

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

所以我们还有一步反向传播,我们最终计算出du=3,这里的du当然了,就是dJ/du。

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

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

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

为了填进去,如果我们反向走的话,db=6,而db其实是Python代码中的变量名,表示dJ/db。

我不会很详细地介绍最后一个例子,但事实上,如果你计算dJ/dc=dJ/du⋅du/dc=3×3,这个结果是9。

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

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

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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355

推荐阅读更多精彩内容

  • 1. 正向传播 对于成本函数J(a,b,c) = 3(a + bc),设u=bc,v = a+ bc 故: u...
    __流云阅读 971评论 0 1
  • 续前一节 1.2 神经网络基础2 7. 计算图(Computation Graph) 神经网络的计算都是按照前向传...
    MaggieCh阅读 1,134评论 0 1
  • seven.nine的夜晚 我翻来覆去彻夜不眠 左右刷着你曾经的图片 第一次的见面在脑海浮现 组建着我破碎的记忆 ...
    蔡徐坤的女人阅读 167评论 0 1
  • 就像墨染的黑夜里少了繁星 孤独 ,黯淡 就像三月的阳春中少了笑脸 空洞,默然 就像路旁的小酒馆少了烟 左顾,右盼 ...
    空耳妹妹阅读 236评论 0 4
  • 我是你的伞 愿为你遮挡炙烈的太阳 清凉的依恋,炙烈的爱 你的笑在阳光下最灿烂 在雨季来临的时候 我缠绵在你的身旁 ...
    淘猴侯孙行阅读 576评论 3 5