深层神经网络
深层神经网络样子也许是下面这样的,也有可能是更多层的。
上图是一个四层的神经网络(输入层一般记为零层或不记住),我们用L表示神经网络的层数,n^[l] 表示第 l 层的神经元数量
由于神经网络具有许多层,在下图中用方框代表一层,每个层都要完成各自的任务,流程图大致如下所示:
蓝框中的部分完成正向传播:
该过程的输入是 X 也就是 A[0],一层一层向后计算,最后得到A[L]。
并且,在各层 l 计算出 A^[l] 的同时,缓存各层的输出值 A^[l] 到变量 cache 中,因为反向传播将会用上。图中这里写错了,应该是A[1]、A[2]、A[3]的。
绿框中的部分完成反向传播:
该过程的输入是dA[L],并根据dA[L]一步步向前计算,得到各层对应的dZ[l],dW[l],db[l]
此外,还要计算出 dA[l - 1] 作为前一层的输入
具体过程请看浅层神经网络的正向传播) 和 浅层神经网络的反向传播)
核对矩阵的维数
为了在写代码的过程中减少出现bug,尤其是在进行反向传播的时候,我们要注意核对矩阵的维数,这个知识点我们前面将 浅层神经网络的反向传播)的文章中也提到了,大致规律如下:
W^[l] : (n[ l ], n[l - 1])
Z^[l] : (n[ l ], m),
A^[l] : (n[ l ], m)
另外,还有一个规律:
对任意层而言:
dW 的维度和 W 的维度相同
dZ 的维度和 Z 的维度相同
dA 的维度和 A 的维度相同
为什么要使用深度神经网络?
我们都知道深度神经网络可以解决很多问题,网络并不一定要很大,但一定要有深度,需要比较多的隐藏层。这到底为什么呢?
如果我们在建立一个人脸识别或者检测系统,当我们输入一张脸部的图片时,我们可以把深度神经网络第一层当成一个特征探测器或者边缘检测器。在这个例子中,我们建立一个大概有20个隐藏单元的深度神经网络。看下图:
隐藏单元就是这个图里这些小方块。每个小方块都是一个隐藏单元,它会去寻找一张图的边缘方向。它可能在水平方向找、也可能在竖直方向找。这个东西在卷积神经网络我们会细讲(别问,问就是当时不会)。这里就告诉你们我们可以先把神经网络的第一层当作看图,然后去找这张图片的各个边缘。接着我们把组成图片边缘的像素放在一起看。它可以把探测到的边缘组合成面部的不同部分。比如说,可能有一个神经元回去找眼睛的部分,另外还有找鼻子或其它的部分。然后把这许多边缘结合在一起,就可以开始检测人脸的不同部分,最后再把这些部分放在一起,就可以识别或检测不同的人脸。我们把前几层的神经网络当作简单的检测函数,例如:边缘检测等,之后把它们跟后几层结合在一起。注意:边缘探测器其实相对来说都是针对图片中非常小块的面积。
具体原因移步网易云课堂的吴恩达的深度学习。链接
超参数
在学习算法中还有其它参数,需要输入到学习算法中,比如学习率α、隐藏层的数量、使用的激活函数种类等都是超参数。因为它们影响着最终W和b的值。