1.视频网站:mooc慕课https://mooc.study.163.com/university/deeplearning_ai#/c
2.详细笔记网站(中文):http://www.ai-start.com/dl2017/
3.github课件+作业+答案:https://github.com/stormstone/deeplearning.ai
4.3 核对矩阵的维数 Getting your matrix dimensions right
当实现深度NN的时候,一个常用的检查代码是否有错的方法就是核对一遍算法中矩阵的维数。
上图,5层NN,4个隐层,1个输出层,L=5。
前面课程中已经介绍过,从输入特征开始,分别表示为第0,1,2,3,4,5层。
每层的单元数用n[l]表示
- n[0]=2
- n[1]=3
- n[2]=5
- n[3]=4
- n[4]=2
- n[5]=1
实现正向传播过程,单训练样本情况第一步
- 输入特征x有2个,所以维度是(n[0],1),2x1
- 第一层激活函数向量z维度是(n[1],1),3x1
先忽略偏置项b。要符合上面2个向量维度,根据矩阵乘法法则,W[1]维度必须是 3x2,即 (n[1],n[0])
依次类推,可以归纳出 第L层的W[l]的维度是 (n[l],n[l-1])。
例如:
- 第二层W[2]的维度是(n[2],n[1]),5x3。
- 第三层W[3]的维度是(n[3],n[2]),4x5。
- 第四层W[4]的维度是(n[4],n[3]),2x4。
- 第五层W[5]的维度是(n[5],n[4]),1x2。
再来看偏置项b,很显然,根据向量加法法则,第一层因为z[1]是3x1,那么b[1]也必须是3x1。
依次类推,可以归纳出 第L层的b[l]的维度是 (n[l],1)。
总结一下,第L层的向量W和b的维度为
反向传播中,dw和W的维度应该相同,db和b的维度应该系统
训练集向量化以后
其中矩阵Z是把z向量从左到右横向叠起来。
所以的维度不再是(n[1],1),3x1,而是(n[1],m),m是训练集大小。
X的维度不再是(n[0],1),2x1,而是把所有训练样本水平堆叠在一起,所以维度是(n[0],m),m是训练集大小。
按照上面单个样本时候的推导方式,先忽略偏置项b,根据矩阵乘法法则,此时的维度不变,依然是(n[1],n[0])。
最后再看偏置项b,根据矩阵加法法则,的维度是(n[1],m)。
总结一下,Z和A矩阵的维度为
同样,反向传播过程dZ和dA的维度,保持与Z和A一致
提醒一下:在你做深度NN的反向传播时,一定要确认所有的矩阵维数是前后一致的,可以大大提高代码通过率。
4.4 为什么使用深层表示 Why deep representations?
深度NN能解决好多问题。我们并不需要很大的NN,但是得有深度,得有比较多的隐藏层,这是为什么呢?
1-人脸识别
以人脸识别为例。了解相关知识参见链接
当你输入一张脸部的照片,可以把深度NN的第一层,当成一个特征探测器或者边缘探测器。
观察上图,我们可以把每个要识别的特征(右下角的每个小方块)当做第一层一个隐藏单元。
例如
- 第一行第一列,会去找照片中"|"的边缘特征
- 第四行第五列,会去找照片中"—"的边缘特征
人脸识别使用的是卷积NN,如果想了解为什么小方块(或者说要识别的特征)是这么表示的,可以查找相关资料深入了解。
我们把NN的第一层(特征)当作看图,去找这张照片的各个边缘。
把这许多的边缘结合在一起,就可以开始检测人脸的不同部分,也就是NN的第二层的每个单元。
我们可以把照片里组成边缘的像素们放在一起看,然后它可以把被探测到的边缘组合成面部的不同部分(右下角图中的各个小方块),每个不同部分(每个小方块)就是第二层的一个单元。
例如,
- 通过第一层的几个特征得到了第二层的一个单元-眼睛的某个部分,也就是右下角图的第一行第一列
- 通过第一层的几个特征得到了第二层的另一个单元-鼻子的某个部分,也就是右下角图的第一行第三列
最后再把这些部分放在一起,比如鼻子眼睛下巴,就可以识别或是探测不同的人脸,也就是NN的第三层的每个单元。
所以你可以考虑用NN网络的前几层来探测(学习)简单的功能,比如边缘。然后在NN的后面几层把它们结合在一起,这样就能够学习更多复杂的功能。
有一个技术性的细节需要理解的是,边缘探测器其实相对来说都是针对照片中非常小块的面积。就像下图中的每一块,都是很小的区域。
面部探测器就会针对于大一些的区域,如下图。
主要的概念是:一般你会从比较小的细节入手,比如边缘,然后再一步步到更大更复杂的区域,比如一只眼睛或是一个鼻子,再把眼睛鼻子装一块组成更复杂的部分。
这种从简单到复杂的金字塔状表示方法或者组成方法,也可以应用在图像或者人脸识别以外其他类型的数据上。
2-语音识别系统
语音识别系统需要解决的就是如何可视化语音。
比如你输入一个音频片段,那么NN的第一层可能就会去先开始试着探测比较低层次的音频波形的一些特征,例如:音调是变高了还是低了,分辨白噪音,咝咝咝的声音,或者音调。可以选择这些相对程度比较低的波形特征low level audio waveform features,然后把这些波形组合在一起就能去探测声音的基本单元。
在语言学中有个概念叫做音位phonemes,比如说单词ca,c的发音,“嗑”就是一个音位,a的发音“啊”是个音位,t的发音“特”也是个音位,有了基本的声音单元以后,组合起来,你就能识别音频当中的单词words,单词再组合起来就能识别词组,再到完整的句子sentences。
深度NN的这许多隐藏层中,前几层能学习一些低层次的简单特征,等到后几层,就能把简单的特征结合起来,去探测更加复杂的东西。
比如(学习)你录在音频里的单词、词组或是句子,然后就能运行语音识别了。
上图中,我们计算前的几层,就是相对简单的输入函数,比如图像单元的边缘之类的。到网络中的深层时,你实际上就能做很多复杂的事,比如探测面部或是探测单词、短语或是句子。
有些人喜欢把深度神经网络和人类大脑做类比,这些神经科学家觉得人的大脑也是先探测简单的东西,比如你眼睛看得到的边缘,然后组合起来才能探测复杂的物体,比如脸。
这种深度学习和人类大脑的比较,有时候比较危险。但是不可否认的是,我们对大脑运作机制的认识很有价值。有可能大脑就是先从简单的东西,比如边缘着手,再组合成一个完整的复杂物体,这类简单到复杂的过程,同样也是其他一些深度学习的灵感来源
**3-电路理论 circuit theory **
概念
- Small L-layer:隐藏单元的数量相对较少
- Deep NN:隐藏层数目比较多
在非正式的情况下,函数都可以用相对较小,但很深(层数多)的NN来计算。
但是如果你用浅一些的NN计算同样的函数,也就是说在我们不能用很多隐藏层时,你会需要 成指数增长的单元数量 才能达到同样的计算结果。
假设你想要对输入特征计算异或或是奇偶性,假设你有x个特征,
上图左边是异或树图,采用了多隐层。深度是O(log(n))。节点的数量不会很大,也就是不需要太多的门去计算异或。
上图右边采用的是单隐层,此时节点数就是呈指数增长。因为你需要穷举2n种可能的配置。隐藏单元数量是2n-1,复杂度是O(2n)。
很多数学函数用深度网络计算比浅网络要容易得多。
“深度学习”这个名字以前就表示有很多隐藏层的NN。
再次重复以前提到过的经验:
开始解决一个新问题时,通常从逻辑回归开始,再试试一到两个隐层,把隐藏层数量当作参数、超参数一样去调试,这样去找比较合适的深度。
近几年以来,有一些人会趋向于使用非常非常深邃的神经网络,比如好几打的层数,某些问题中只有这种网络才是最佳模型。