第四周:深层神经网络(Deep Neural Networks)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第四周:深层神经网络(Deep Neural Networks)相关的知识,希望对你有一定的参考价值。
第四周:深层神经网络(Deep Neural Networks)
文章目录
- 第四周:深层神经网络(Deep Neural Networks)
- 4.1 深层神经网络(Deep L-layer neural network)
- 4.2 前向传播和反向传播(Forward and backward propagation)
- 4.3 深层网络中的前向传播(Forward propagation in a Deep Network)
- 4.4 核对矩阵的维数(Getting your matrix dimensions right)
- 4.5 为什么使用深层表示?(Why deep representations?)
- 4.6 搭建神经网络块(Building blocks of deep neural networks)
- 4.7 参数VS超参数(Parameters vs Hyperparameters)
- 4.8 深度学习和大脑的关联性(What does this have to do with the brain?)
4.1 深层神经网络(Deep L-layer neural network)
目前为止我们学习了只有一个单独隐藏层的神经网络的正向传播和反向传播,还有逻辑回归,并且你还学到了向量化,这在随机初始化权重时是很重要。
本周所要做的是把这些理念集合起来,就可以执行你自己的深度神经网络。
复习下前三周的课的内容:
1.逻辑回归,结构如下图左边。一个隐藏层的神经网络,结构下图右边:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IxGuaL9P-1611322156249)(…/images/7c1cc04132b946baec5487ba68242362.png)]
注意,神经网络的层数是这么定义的:从左到右,由0开始定义,比如上边右图,、、,这层是第0层,这层左边的隐藏层是第1层,由此类推。如下图左边是两个隐藏层的神经网络,右边是5个隐藏层的神经网络。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fA9pd89I-1611322156252)(…/images/be71cf997759e4aeaa4be1123c6bb6ba.png)]
严格上来说逻辑回归也是一个一层的神经网络,而上边右图一个深得多的模型,浅与深仅仅是指一种程度。记住以下要点:
有一个隐藏层的神经网络,就是一个两层神经网络。记住当我们算神经网络的层数时,我们不算输入层,我们只算隐藏层和输出层。
但是在过去的几年中,DLI(深度学习学院 deep learning institute)已经意识到有一些函数,只有非常深的神经网络能学会,而更浅的模型则办不到。尽管对于任何给定的问题很难去提前预测到底需要多深的神经网络,所以先去尝试逻辑回归,尝试一层然后两层隐含层,然后把隐含层的数量看做是另一个可以自由选择大小的超参数,然后再保留交叉验证数据上评估,或者用你的开发集来评估。
我们再看下深度学习的符号定义:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-whFPL77l-1611322156254)(…/images/9927bcb34e8e5bfe872937fccd693081.png)]
上图是一个四层的神经网络,有三个隐藏层。我们可以看到,第一层(即左边数过去第二层,因为输入层是第0层)有5个神经元数目,第二层5个,第三层3个。
我们用L表示层数,上图:,输入层的索引为“0”,第一个隐藏层,表示有5个隐藏神经元,同理,,=(输出单元为1)。而输入层,。
在不同层所拥有的神经元的数目,对于每层l都用来记作l层激活后结果,我们会在后面看到在正向传播时,最终能你会计算出。
通过用激活函数 计算,激活函数也被索引为层数,然后我们用来记作在l层计算值的权重。类似的,里的方程也一样。
最后总结下符号约定:
输入的特征记作,但是同样也是0层的激活函数,所以。
最后一层的激活函数,所以是等于这个神经网络所预测的输出结果。
但是如果你忘记了某些符号的意义,请看笔记最后的附件:《深度学习符号指南》。
4.2 前向传播和反向传播(Forward and backward propagation)
之前我们学习了构成深度神经网络的基本模块,比如每一层都有前向传播步骤以及一个相反的反向传播步骤,这次视频我们讲讲如何实现这些步骤。
先讲前向传播,输入,输出是,缓存为;从实现的角度来说我们可以缓存下和,这样更容易在不同的环节中调用函数。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BWDpymeK-1611322156259)(…/images/7cfc4b5fe94dcd9fe7130ac52701fed5.png)]
所以前向传播的步骤可以写成:
向量化实现过程可以写成:
前向传播需要喂入也就是,来初始化;初始化的是第一层的输入值。对应于一个训练样本的输入特征,而对应于一整个训练样本的输入特征,所以这就是这条链的第一个前向函数的输入,重复这个步骤就可以从左到右计算前向传播。
下面讲反向传播的步骤:
输入为,输出为,,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-279Yd3f2-1611322156261)(…/images/c13d2a8fa258125a5398030c97101ee1.png)]
所以反向传播的步骤可以写成:
(1)
(2)
(3)
(4)
(5)
式子(5)由式子(4)带入式子(1)得到,前四个式子就可实现反向函数。
向量化实现过程可以写成:
(6)
(7)
(8)
(9)
总结一下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ER79HeqE-1611322156263)(…/images/53a5b4c71c0facfc8145af3b534f8583.png)]
第一层你可能有一个ReLU激活函数,第二层为另一个ReLU激活函数,第三层可能是sigmoid函数(如果你做二分类的话),输出值为,用来计算损失;这样你就可以向后迭代进行反向传播求导来求, , , , ,。在计算的时候,缓存会把 传递过来,然后回传, ,可以用来计算,但我们不会使用它,这里讲述了一个三层网络的前向和反向传播,还有一个细节没讲就是前向递归——用输入数据来初始化,那么反向递归(使用Logistic回归做二分类)——对
忠告:补补微积分和线性代数,多推导,多实践。
4.3 深层网络中的前向传播(Forward propagation in a Deep Network)
跟往常一样,我们先来看对其中一个训练样本如何应用前向传播,之后讨论向量化的版本。
第一层需要计算,(可以看做)
第二层需要计算,
以此类推,
第四层为,
前向传播可以归纳为多次迭代,。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zg1snG7Q-1611322156265)(…/images/faf2d5a697d1bd75aee46865f3a73a25.png)]
向量化实现过程可以写成:
, (
这里只能用一个显式for循环,从1到,然后一层接着一层去计算。下一节讲的是避免代码产生BUG,我所做的其中一件非常重要的工作。
4.4 核对矩阵的维数(Getting your matrix dimensions right)
当实现深度神经网络的时候,其中一个我常用的检查代码是否有错的方法就是拿出一张纸过一遍算法中矩阵的维数。
的维度是(下一层的维数,前一层的维数),即: (,);
的维度是(下一层的维数,1),即:
: (;
,: ;
和维度相同,和维度相同,且和向量化维度不变,但,以及的维度会向量化后发生变化。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X7KNHwvH-1611322156267)(…/images/5ee7a8073518e36a98d4225eaf0f3063.png)]
向量化后:
可以看成由每一个单独的叠加而得到,,
为训练集大小,所以的维度不再是,而是。
:,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YZerT8WL-1611322156268)(…/images/fb680729409dc3912fd5a3d0c13b620a.png)]
在你做深度神经网络的反向传播时,一定要确认所有的矩阵维数是前后一致的,可以大大提高代码通过率。下一节我们讲为什么深层的网络在很多问题上比浅层的好。
4.5 为什么使用深层表示?(Why deep representations?)
我们都知道深度神经网络能解决好多问题,其实并不需要很大的神经网络,但是得有深度,得有比较多的隐藏层,这是为什么呢?我们一起来看几个例子来帮助理解,为什么深度神经网络会很好用。
首先,深度网络在计算什么?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iz4RcqQD-1611322156269)(…/images/563823fb44e05835948366f087f17e5c.png)]
首先,深度网络究竟在计算什么?如果你在建一个人脸识别或是人脸检测系统,深度神经网络所做的事就是,当你输入一张脸部的照片,然后你可以把深度神经网络的第一层,当成一个特征探测器或者边缘探测器。在这个例子里,我会建一个大概有20个隐藏单元的深度神经网络,是怎么针对这张图计算的。隐藏单元就是这些图里这些小方块(第一张大图),举个例子,这个小方块(第一行第一列)就是一个隐藏单元,它会去找这张照片里“|”边缘的方向。那么这个隐藏单元(第四行第四列),可能是在找(“—”)水平向的边缘在哪里。之后的课程里,我们会讲专门做这种识别的卷积神经网络,到时候会细讲,为什么小单元是这么表示的。你可以先把神经网络的第一层当作看图,然后去找这张照片的各个边缘。我们可以把照片里组成边缘的像素们放在一起看,然后它可以把被探测到的边缘组合成面部的不同部分(第二张大图)。比如说,可能有一个神经元会去找眼睛的部分,另外还有别的在找鼻子的部分,然后把这许多的边缘结合在一起,就可以开始检测人脸的不同部分。最后再把这些部分放在一起,比如鼻子眼睛下巴,就可以识别或是探测不同的人脸(第三张大图)。
你可以直觉上把这种神经网络的前几层当作探测简单的函数,比如边缘,之后把它们跟后几层结合在一起,那么总体上就能学习更多复杂的函数。这些图的意义,我们在学习卷积神经网络的时候再深入了解。还有一个技术性的细节需要理解的是,边缘探测器其实相对来说都是针对照片中非常小块的面积。就像这块(第一行第一列),都是很小的区域。面部探测器就会针对于大一些的区域,但是主要的概念是,一般你会从比较小的细节入手,比如边缘,然后再一步步到更大更复杂的区域,比如一只眼睛或是一个鼻子,再把眼睛鼻子装一块组成更复杂的部分。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xK9cym2v-1611322156270)(…/images/595d105074eda2e4a11da9592fd5e444.png)]
这种从简单到复杂的金字塔状表示方法或者组成方法,也可以应用在图像或者人脸识别以外的其他数据上。比如当你想要建一个语音识别系统的时候,需要解决的就是如何可视化语音,比如你输入一个音频片段,那么神经网络的第一层可能就会去先开始试着探测比较低层次的音频波形的一些特征,比如音调是变高了还是低了,分辨白噪音,咝咝咝的声音,或者音调,可以选择这些相对程度比较低的波形特征,然后把这些波形组合在一起就能去探测声音的基本单元。在语言学中有个概念叫做音位,比如说单词ca,c的发音,“嗑”就是一个音位,a的发音“啊”是个音位,t的发音“特”也是个音位,有了基本的声音单元以后,组合起来,你就能识别音频当中的单词,单词再组合起来就能识别词组,再到完整的句子。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wD6JVYPK-1611322156272)(…/images/bbdec09feac2176ad9578e93c1ee8c04.png)]
所以深度神经网络的这许多隐藏层中,较早的前几层能学习一些低层次的简单特征,等到后几层,就能把简单的特征结合起来,去探测更加复杂的东西。比如你录在音频里的单词、词组或是句子,然后就能运行语音识别了。同时我们所计算的之前的几层,也就是相对简单的输入函数,比如图像单元的边缘什么的。到网络中的深层时,你实际上就能做很多复杂的事,比如探测面部或是探测单词、短语或是句子。
有些人喜欢把深度神经网络和人类大脑做类比,这些神经科学家觉得人的大脑也是先探测简单的东西,比如你眼睛看得到的边缘,然后组合起来才能探测复杂的物体,比如脸。这种深度学习和人类大脑的比较,有时候比较危险。但是不可否认的是,我们对大脑运作机制的认识很有价值,有可能大脑就是先从简单的东西,比如边缘着手,再组合成一个完整的复杂物体,这类简单到复杂的过程,同样也是其他一些深度学习的灵感来源,之后的视频我们也会继续聊聊人类或是生物学理解的大脑。
Small:隐藏单元的数量相对较少
Deep:隐藏层数目比较多
深层的网络隐藏单元数量相对较少,隐藏层数目较多,如果浅层的网络想要达到同样的计算结果则需要指数级增长的单元数量才能达到。
另外一个,关于神经网络为何有效的理论,来源于电路理论,它和你能够用电路元件计算哪些函数有着分不开的联系。根据不同的基本逻辑门,譬如与门、或门、非门。在非正式的情况下,这些函数都可以用相对较小,但很深的神经网络来计算,小在这里的意思是隐藏单元的数量相对比较小,但是如果你用浅一些的神经网络计算同样的函数,也就是说在我们不能用很多隐藏层时,你会需要成指数增长的单元数量才能达到同样的计算结果。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wri2lnJu-1611322156273)(…/images/b409b7c0d05217ea37f0036691c891ca.png)]
我再来举个例子,用没那么正式的语言介绍这个概念。假设你想要对输入特征计算异或或是奇偶性,你可以算,假设你有或者个特征,如果你画一个异或的树图,先要计算,的异或,然后是和。技术上来说如果你只用或门,还有非门的话,你可能会需要几层才能计算异或函数,但是用相对小的电路,你应该就可以计算异或了。然后你可以继续建这样的一个异或树图(上图左),那么你最后会得到这样的电路来输出结果,,也就是输入特征的异或,或是奇偶性,要计算异或关系。这种树图对应网络的深度应该是,那么节点的数量和电路部件,或是门的数量并不会很大,你也不需要太多门去计算异或。
但是如果你不能使用多隐层的神经网络的话,在这个例子中隐层数为,比如你被迫只能用单隐藏层来计算的话,这里全部都指向从这些隐藏单元到后面这里,再输出,那么要计算奇偶性,或者异或关系函数就需要这一隐层(上图右方框部分)的单元数呈指数增长才行,因为本质上来说你需要列举耗尽种可能的配置,或是种输入比特的配置。异或运算的最终结果是1或0,那么你最终就会需要一个隐藏层,其中单元数目随输入比特指数上升。精确的说应该是个隐藏单元数,也就是。
我希望这能让你有点概念,意识到有很多数学函数用深度网络计算比浅网络要容易得多,我个人倒是认为这种电路理论,对训练直觉思维没那么有用,但这个结果人们还是经常提到的,用来解释为什么需要更深层的网络。
除了这些原因,说实话,我认为“深度学习”这个名字挺唬人的,这些概念以前都统称为有很多隐藏层的神经网络,但是深度学习听起来多高大上,太深奥了,对么?这个词流传出去以后,这是神经网络的重新包装或是多隐藏层神经网络的重新包装,激发了大众的想象力。抛开这些公关概念重新包装不谈,深度网络确实效果不错,有时候人们还是会按照字面意思钻牛角尖,非要用很多隐层。但是当我开始解决一个新问题时,我通常会从logistic回归开始,再试试一到两个隐层,把隐藏层数量当作参数、超参数一样去调试,这样去找比较合适的深度。但是近几年以来,有一些人会趋向于使用非常非常深邃的神经网络,比如好几打的层数,某些问题中只有这种网络才是最佳模型。
这就是我想讲的,为什么深度学习效果拔群的直觉解释,现在我们来看看除了正向传播以外,反向传播该怎么具体实现。
4.6 搭建神经网络块(Building blocks of deep neural networks)
这周的前几个视频和之前几周的视频里,你已经看到过正向反向传播的基础组成部分了,它们也是深度神经网络的重要组成部分,现在我们来用它们建一个深度神经网络。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aBcoLOYP-1611322156274)(…/images/2922198c51ca18fb64dcc7f4cc46d507.png)]
这是一个层数较少的神经网络,我们选择其中一层(方框部分),从这一层的计算着手。在第层你有参数和,正向传播里有输入的激活函数,输入是前一层,输出是,我们之前讲过,,那么这就是你如何从输入走到输出的。之后你就可以把的值缓存起来,我在这里也会把这包括在缓存中,因为缓存的对以后的正向反向传播的步骤非常有用。
然后是反向步骤或者说反向传播步骤,同样也是第层的计算,你会需要实现一个函数输入为,输出的函数。一个小细节需要注意,输入在这里其实是以及所缓存的值,之前计算好的值,除了输出的值以外,也需要输出你需要的梯度以上是关于第四周:深层神经网络(Deep Neural Networks)的主要内容,如果未能解决你的问题,请参考以下文章
(2012, AlexNet) ImageNet Classification with Deep Convolutional Neural Networks
价值连城 神经网络- 吴恩达Andrew Ng Coursera Neural Networks and Deep Learning
Reading Note「7」Deep Forest: Towards an Alternative to Deep Neural Networks
理解《Deep Forest: Towards An Alternative to Deep Neural Network》