一、深层神经网络
深层神经网络的符号与浅层的不同,记录如下:
- 用\(L\)表示层数,该神经网络\(L=4\)
- \(n^{[l]}\)表示第\(l\)层的神经元的数量,例如\(n^{[1]}=n^{[2]}=5,n^{[3]}=3,n^{[4]}=1\)
- \(a^{[l]}\)表示第\(l\)层中的激活函数,\(a^{[l]}=g^{[l]}(z^{[l]})\)
二、前向和反向传播
1. 第\(l\)层的前向传播
输入为 \(a^{[l-1]}\)
输出为 \(a^{[l]}\), cache(\(z^{[l]}\))
矢量化表示:
\[Z^{[l]}=W^{[l]}·A^{[l-1]}+b^{[l]}\]
\[A^{[l]}=g^{[l]}(Z^{[l]})\]
2. 第\(l\)层的反向传播
输入为 \(da^{[l]}\)
输出为 \(da^{[l-1]},dW^{[l]},db^{[l]}\)
计算细节:
\[dz^{[l]}=da^{[l]}*g^{[l]'}(z^{[l]})\]
\[dw^{[l]}=dz^{[l]}*a^{[l-1]}\]
\[db^{[l]}=dz^{[l]}\]
\[da^{[l-1]}=w^{[l]^T}·dz^{[l]}\]
\[dz^{[l]}=w^{[l+1]^T}dz^{[l+1]}*g^{[l]'}(z^{[l]})\]
矢量化表示:
\[dZ^{[l]}=dA^{[l]}*g^{[l]'}(z^{[l]})\]
\[dw^{[l]}=\frac{1}{m}dz^{[l]}·A^{[l-1]^T}\]
\[db^{[l]}=\frac{1}{m}np.sum(dz^{[l]},axis=1,keepdim=True)\]
\[dA^{[l-1]}=w^{[l]^T}·dz^{[l]}\]
3. 总结
前向传播示例
反向传播
更清晰的表示:
三、深层网络中的前向传播
四、核对矩阵的维数
这节的内容主要是告诉我们如何知道自己在设计神经网络模型的时候各个参数的维度是否正确的方法。其实我自己在写代码的时候都得这样做才能有信心继续往下敲键盘,2333。
还是以这个神经网络为例,各层神经网络节点数为\(n^{[0]}=3,n^{[1]}=n^{[2]}=5,n^{[3]}=3,n^{[4]}=1\)。
先确定\(W^{[1]}\)的维度:
已知\(Z^{[1]}=W^{[1]}·X+b^{[1]}\),很容易知道\(Z^{[1]}∈R^{5×1},X∈R^{3×1}\),\(b^{[1]}\)其实不用计算就知道其维度与\(Z\)是相同的,即\(b^{[1]}∈R^{5×1}\)。根据矩阵内积计算公式可以确定\(W^{[1]}∈R^{5×3}\)。
其他层同理,不再赘述。
五、为什么使用深层表示
为什么要使用深层表示?
下面就从直观上来理解深层神经网络。
如上图所示是一个人脸识别的过程,具体的实现步骤如下:
1.通过深层神经网络首先会选取一些边缘信息,例如脸形,眼框,总之是一些边框之类的信息(我自己的理解是之所以先找出边缘信息是为了将要观察的事物与周围环境分割开来),这也就是第一层的作用。
2.找到边缘信息后,开始放大,将信息聚合在一起。例如找到眼睛轮廓信息后,通过往上一层汇聚从而得到眼睛的信息;同理通过汇聚脸的轮廓信息得到脸颊信息等等
3.在第二步的基础上将各个局部信息(眼睛、眉毛……)汇聚成一张人脸,最终达到人脸识别的效果。
六、搭建深层神经网络块
上图表示单个神经元的前向和反向传播算法过程。
前向
输入\(a^{[l-1]}\),经过计算\(g^{[l]}(w^{[l]}·a^{[l-1]}+b^{[l]})\)得到\(a^{[l]}\)反向
计算\(da^{[l]}\),然后反向作为输入,经过一系列微分运算得到\(dw^{[l]},db^{[l]}\)(用来更新权重和偏差),以及上一层的\(da^{[l-1]}\)。
推广到整个深层神经网络就如下图所示:
祭上神图:
七、参数 vs 超参数
参数
常见的参数即为\(W^{[1]},b^{[1]},W^{[2]},b^{[2]}……\)-
超参数
- learning_rate: \(α\)
- iterations(迭代次数)
- hidden layer (隐藏层数量\(L\))
- hidden units (隐藏层神经元数量\(n^{[l]}\))
- 激活函数的选择
- minibatch size
- 几种正则化的方法
- momentum(动力、动量)后面会提到
八、这和大脑有什么关系
主要就是说神经网络和人的大脑运行机理貌似很相似,blabla。。。