为什么使用深层表示
如上图所示,上图是一个简化的进行人脸识别的神经网路,我们可以将它看作:
- 在前几层进行简单的探测。
- 在后几层进行复杂的操作和分析。
- 生理学上认为,人类的🧠貌似也是从简单的试探入手,再逐渐组合成复杂的信息。因此更深层的神经网络更能对人类的🧠进行模拟。
另一种理解:如果要将x1 ~ xn进行异或XOR运算,如果使用深层神经网络,可以将时间复杂度降低到O(logn),但是如果使用浅层神经网络,隐藏层中神经元的数量会大幅度上升,使时间复杂度变为O(2n)。
搭建深层神经网络块
这是一个较浅的神经网络,我们随机选择一层,曾这一层的计算着手。
- 在第l层,我们有参数
W^[l],b^[l]
,正向传播里有输入的激活函数,输入是前一层的激活函数值a^[l-1]
,输出是a^[l]
。即:Z^[l] = W^[l]*a^[l-1] + b^[l];a^[l] = g^[l](z^[l])
。这两个算式是每一层神经网络要做的,它们使用向量化实现。之后将z^[l]
放入缓存中,这对正向传播和之后的反向传播都有好处。 - 之后是反向传播。输入是
da^[l]
,输出是da^[l-1]
。注意,此处的输入实际是da^[l]
以及缓存中的z^[l]
,而输出除了da^[l-1]
还有dW^[l],db^[l]
以用于实现梯度下降。 - 正向传播和反向传播所做的事情和二者之间的关联如图:
因此,如果我们能够实现方框中所描述功能的函数,那么我们就能成功实现神经网络。
实现前向传播和反向传播
- 从前向传播说起:
在缓存z^[l]
的同时,同时缓存w^[l]和b^[l]
也可使后续的反向传播更便捷。
有了这些参数,我们就可以得到每一步正向传播的输出:z^[l] = w^[l]*a^[l-1] + b^[l];a^[l] = g^[l](z^[l])
,向量化的版本为:Z^[l] = W^[l]*A^[l-1] + b^[l];A^[l] = g^[l](Z^[l])
。 - 之后是反向传播:
输入为da^[l]
,输出为da^[l-1],dW^[l],db^[l]
。
计算的过程为:dz^[l] = da^[l]*g^[l]'(z^[l])
,注意,此处是g^[l]
的导数g^[l]'
。而dW^[l] = dz^[l]*a^[l-1];db^[l] = dz^[l];da^[l-1] = w^[l]T * dz^[l]
,注意此处是w^[l]
的转置w^[l]T
。向量化的版本为把这些向量都换成对应的矩阵,注意对于dW和db都需要乘以1/m
,因为训练集的容量为m。