记录吴恩达深度学习专项课程笔记,方便之后回顾,共5门课,这是第一门课《神经网络与深度学习》第四周深层神经网络的课程笔记,那我们开始吧。
上节课课程1-3浅层神经网络我们主要介绍了浅层神经网络。首先介绍神经网络的基本结构,包括输入层(input layer),隐藏层(hidden layer)和输出层(output layer)。然后以简单的2层神经网络为例,详细推导了其正向传播过程和反向传播过程,使用梯度下降的方法优化神经网络参数。同时,我们还介绍了不同的激活函数,比较各自优缺点,讨论了激活函数必须是非线性的原因。最后介绍了神经网络参数随机初始化的必要性,特别是权重W,不同神经元的W不能初始化为同一零值。本节课是对上节课的延伸和扩展,讨论更深层的神经网络。
到目前为止,我们已经学习了单隐层神经网络的向前传播和向后传播、logistic回归、向量化和为什么随机初始化比较重要。这周我们将会学习如何把这些理念结合起来,从而实现你自己的深度神经网络。这周的练习题目会更长。这周视频的时间会短一些,然后我们有更多的时间去完成作业。
目录
《4.1深层神经网络》Deep L-layer neural network
《4.2深层网络中的前向传播》Forward Propagation in a Deep Network
《4.3核对矩阵的维数》Getting your matrix dimensions right
《4.4为什么使用深层表示》Why deep representations?
《4.5搭建深层神经网络块》Building blocks of deep neural networks
《4.6正向和反向传播》Forward and Backward Propagation
《4.7参数VS超参数》Parameters vs Hyperparameters
《4.8这和大脑有什么关系》What does this have to do with the brain?
Summary
深层神经网络其实就是包含更多的隐藏层神经网络。首先复习下前三周的课的内容:注意,神经网络的层数是从左到右,由0开始定义,比如下图中x1,x2,x3这层是第0层。
如上图所示,分别列举了左上:逻辑回归(浅层模型shallow model)、右上:1个隐藏层的神经网络(双层神经网络:算上隐藏层和输出层)、左下:2个隐藏层的神经网络和右下:5个隐藏层的神经网络它们的模型结构。严格上来说逻辑回归也是一个一层的神经网络,而上边右图一个深得多的模型,浅与深仅仅是指一种程度。记住以下要点:有一个隐藏层的神经网络,就是一个两层神经网络。记住当我们算神经网络的层数时,我们不算输入层,我们只算隐藏层和输出层。
但是在过去的几年中,DLI(深度学习学院 deep learning institute)已经意识到有一些函数,只有非常深的神经网络能学会,而更浅的模型则办不到。尽管对于任何给定的问题很难去提前预测到底需要多深的神经网络,所以先去尝试逻辑回归,尝试一层然后两层隐含层,然后把隐含层的数量看做是另一个可以自由选择大小的超参数,然后再保留交叉验证数据上评估,或者用你的开发集来评估。下面我们再熟悉一下符号,以一个四层神经网络为例:
上图是一个四层的有三个隐藏层的神经网络,然后隐藏层中的单元数目是5,5,3,然后有一个输出单元。我们用大写的L表示神经网络的总层数,这里L=4,n^[l]表示l层上的单元数(节点数),所以当我们把输入层标为第0层时,则n^[1]表示第一个隐藏层的单元数为5,同样n^[2]=5,n^[3]=3,n^[4]=n^[L]=1,对于输入层n^[0]=n_x=3,表示3个输入特征x1,x2,x3。对于第l层,用a^[l]表示l层的激活函数输出,由a^[l]=g(z^[l])计算得到。用W^[l]来表示在a^[l]中计算z^[l]值的权重,b^[l]也一样。输入特征用x表示,x也是第0层的激活函数,所以x=a^[0]。最后一层的激活函数a^[L]=y帽(预测输出,这个神经网络预测出来的y帽)。
在这个视频中你将看到如何在深度网络中灵活应用正向传播(forward propagation)和反向传播(backward propagation)。仍以上面讲过的4层神经网络为例,先讲正向传播:
先来看对其中一个训练样本x如何应用前向传播,之后讨论向量化的版本。
第一层:
第二层:
第四层:
以此类推,第l层:
综上,对于第l层,其正向传播中的步骤可以写成:
向量化实现过程可以表示为:
其中l为1,2,......,L。
在实现神经网络时,Andrew常用的一个检查代码是否有错的方法是过一遍算法中矩阵的维数。下图标注了各个变量的维数:
总之,w的维度是(下一层的维数,前一层的维数),即
b的维度是(下一层的维数,1),即:
dw和w维度相同,db和b维度相同,且w和b向量化维度不变,z,a和x会变。
按照惯例我们看看向量化的实现过程,这样可以作用于多个样本,即使实现过程已经向量化了。W,b,dw和db的维度始终是一样的,但是Z,A以及X的维度会在向量化之后发生变化。
向量化后:
你在编程时一定要确保矩阵的维数是前后一致的,这样会帮你排除一些bug的来源。
下面我们看几个例子,为什么深度神经网络会很好用。
(提取特征的复杂度)首先,深度网络究竟在计算什么,如果你在建一个人脸识别或者人脸检测系统,深度神经网络所做的事情就是当你输入一张脸部的照片然后你可以把深度神经网络的第一层当成一个特征探测器或者边缘探测器。在这个例子中,创建一个大概有20个隐藏单元的深度神经网络,看如何针对这张图计算的,(1)隐藏单元就是这些图里这些小方块,我们可以把照片里组成边缘的像素们放在一起看,(2)然后它可以把被探测到的边缘组合成面部的不同部分,比如说,可能有一个神经元会去找眼镜,另外还有别的找鼻子的部分,然后把这许多的边缘结合在一起,就可以开始检测人脸的不同部分,(3)最后再把这些部分放在一起,比如眼睛鼻子下巴,就可以识别或探测不同的人脸了。边缘探测器其实相对来说都是针对照片中非常小块的面积,面部探测器呢就会针对大一些的区域,但是主要的概念是一般从小的细节人手(比如边缘),然后再一步步到更大更复杂的区域。
如果你想建立一个语音识别系统时,需要解决如何可视化语音,比如你输入一个音频片段,那么神经网络的第一层可能先开始试着探测比较低层次的音频波形的一些特征,比如音调的高低、分辨白噪声等,然后把这些波形组合在一起,就能去探测声音的基本单元。在语言学中有个概念叫音位(phonemes),像cat中c-a-t都是音位,有了基本声音单元,组合起来就能识别音频中的单词。
(减少神经元的个数从而减少计算量)另外一个关于神经网络为何有效的理论来源于电路理论,它和你能够用电路元件计算哪些函数,有分不开的联系,根据不同的基本逻辑门(与或非),在非正式的情况下,这些函数都可以用相对较小但很深的神经网络来计算(这里小指的是隐藏单元的数量相对较小),但是如果你用浅一些的神经网络计算相同的函数,就是不能用很多隐藏层时需要指数增长的单元数量才能达到同样的计算结果。
深度学习是神经网络的重新包装或是多隐层神经网络的重新包装,激发了大众的想象力。当解决一个问题时,Andrew通常会从logistic回归开始,再试试一到两个隐层,把隐层的数量当做参数、超参数那样去调试,这样去找比较合适的深度。
正向传播和反向传播是神经网络的主要组成部分。
这是一个层数较少的神经网络,从这一层的计算入手。下面用流程块图来解释神经网络正向传播和反向传播过程。如下图所示,对于第l层来说,正向传播过程中:
下面看正向传播和反向传播的流程:
刚才是第l层的流程块图,对于神经网络所有层,整体的流程块图正向传播过程和反向传播过程如下所示:
我们继续接着上一部分流程块图的内容,推导神经网络正向传播过程和反向传播过程的具体表达式。
正向传播(forward propagation):输入a^[l-1],输出a^[l],缓存变量是z^[l];从实现的角度来说我们可以缓存下w^[l]和b^[l],这样更容易在不同的环节中调用函数。
所以正向传播的步骤可以写成:
m个训练样本,向量化实现过程为:
正向传播输入特征X,a^[0]对应于一个训练样本的输入特征,而A^[0]对应于整个训练样本的输入特征,这是第一个正向函数的输入,重复这个步骤就可以从左到右计算正向传播。
下面讲反向传播(backward propagation):输入da^[l],输出是da^[l-1],dw^[l],db^[l]。
所以反向传播的步骤写成:
式子(5)由式子(4)带入式子(1)得到,前四个式子就可实现反向函数。
向量化实现过程可以写成:
想要你的神经网络有很好的效果,你还需要规划好你的参数以及超参数。
什么是超参数?比如算法中的learning rate α(学习率)、iterations N(梯度下降法循环的数量)、L(神经网络层数)、n^[l](各层的神经单元数目)、choice of activation function(激活函数的选择)都需要你来设置,这些数字实际上控制了最后的参数W和b的值,所以它们被称作超参数(hyperparameters)。
实际上深度学习有很多不同的超参数,之后也会讲一些其他的超参数,比如momentum,mini batch的大小,几种不同的正则化参数(regularization parameters)等(课程2会提到)。
如何寻找超参数的最优值?走Idea—Code—Experiment—Idea这个循环,尝试各种不同的参数,实现模型并观察是否成功,然后再迭代。根据经验我们选取了学习率=0.01,但是在开发新的应用时,预先很难确切知道究竟超参数的最优值是什么,所以通常需要尝试不同的值,并走上面的循环,试试各种参数。
近来受深度学习影响,很多领域发生了变化,从计算机视觉到语音识别到自然语言处理到很多结构化的数据应用,比如网络广告、网页搜索、产品推荐等等;有些同一领域设置超参数的直觉可以推广,但有时又不可以,特别是那些刚开始研究新问题的人们应该去尝试一定范围内的结果如何,甚至那些用了很久的模型得学习率或是其他超参数的最优值也有可能会改变。经验规律:如果你开发的项目需要几年的时间,你要经常试试不同的超参数勤于检验结果,看看有没有更好的超参数值。相信你慢慢会得到设定超参数的直觉。这可能是深度学习比较让人不满的地方:你必须尝试很多次不同可能性,但参数设定这个领域深度学习还在研究进步中,也可能由于CPU/GPU网络和数据都在变化,这样的指南指挥长一段时间内起作用。尝试保留交叉检验或类似检验方法。
在下个课程我们会用系统性的方法去尝试各种超参数的取值。
那么,神经网络跟人脑机制到底有什么联系呢?究竟有多少的相似程度?其实关联性不大。当你在实现一个神经网络的时候,那些公式是你在做的东西,你会做前向传播、反向传播、梯度下降法,其实很难表述这些公式具体做了什么,深度学习像大脑这样的类比其实是过度简化了我们的大脑具体在做什么,但因为这种形式很简洁,也能让普通人更愿意公开讨论,也方便新闻报道并且吸引大众眼球,但这个类比是非常不准确的。
一个神经网络的逻辑单元可以看成是对一个生物神经元的过度简化,但它是极其复杂的,单个神经元到底在做什么目前还没有人能够真正可以解释。这是值得生物学家探索的事情。
深度学习的确是个很好的工具来学习各种很灵活很复杂的函数,学习到从x到y的映射,在监督学习中学到输入到输出的映射。
这个类比还是很粗略的,人脑神经元可分为树突、细胞体、轴突三部分。树突接收外界电刺激信号(类比神经网络中神经元输入),传递给细胞体进行处理(类比神经网络中神经元激活函数运算),最后由轴突传递给下一个神经元(类比神经网络中神经元输出)。这是一个过度简化的对比,把一个神经网络的逻辑单元和右边的生物神经元对比。所以虽然深度学习的确是个很好的工具,能学习到各种很灵活很复杂的函数来学到从x到y的映射。在监督学习中,学到输入到输出的映射,但这种和人类大脑的类比,在这个领域的早期也许值得一提。但现在这种类比已经逐渐过时了,Andrew自己也在尽量少用这样的说法。
这就是神经网络和大脑的关系,Andrew相信在计算机视觉,或其他的学科都曾受人类大脑启发,还有其他深度学习的领域也曾受人类大脑启发。但是Andrew用这个人类大脑类比的次数逐渐减少了。
本节课主要介绍了深层神经网络,是上一节浅层神经网络的拓展和归纳。首先,我们介绍了建立神经网络模型一些常用的标准的标记符号。然后,用流程块图的方式详细推导正向传播过程和反向传播过程的输入输出和参数表达式。我们也从提取特征复杂性和计算量的角度分别解释了深层神经网络为什么优于浅层神经网络。接着,我们介绍了超参数的概念,解释了超参数与参数的区别。最后,我们将神经网络与人脑做了类比(这种说法Andrew建议慎重使用)。
至此,Andew深度学习专项课程第一门课《神经网络与深度学习》结束。
《【人工智能行业大师访谈】1.吴恩达采访Geoffrey Hinton》
《【人工智能行业大师访谈】2.吴恩达采访Pieter Abbeel》
《【人工智能行业大师访谈】3.吴恩达采访Ian Goodfellow》
(行业大师访谈如果有时间会补充的。)
说明:记录学习笔记,如果错误欢迎指正!转载请联系我。