🌌 深层神经网络 Deep Neural Network
🔈 本节是对上节课的延伸和扩展,讨论更深层的神经网络。
一、深层神经网络 Deep L-layer neural network
深层神经网络其实就是包含更多的隐藏层神经网络。如下图所示,分别列举了逻辑回归、1个隐藏层的神经网络、2个隐藏层的神经网络和5个隐藏层的神经网络它们的模型结构。
命名规则上,一般只参考隐藏层个数和输出层。例如,上图中的逻辑回归又叫1 layer NN,1个隐藏层的神经网络叫做 2 layer NN,2 个隐藏层的神经网络叫做 3 layer NN,以此类推。如果是 L-layer NN,则包含了 L-1 个隐藏层,最后的第 L 层是输出层。
🔣 我们再看下深度学习的符号定义:
上图是一个四层的神经网络,有三个隐藏层。我们可以看到,第一层(即左边数过去第二层,因为输入层是第0层)有5个神经元数目,第二层5个,第三层3个。
我们用L表示层数,上图:$L=4$,输入层的索引为“0”,第一个隐藏层${n}^{[1]}=5$,表示有5个隐藏神经元,同理${n}^{[2]}=5$,${n}^{[3]}=3$,${{n}^{[4]}}$=${{n}^{[L]}}=1$(输出单元为1)。而输入层,${n}^{[0]}={n}_{x}=3$,表示三个输入特征$x_1,x_2,x_3$。
第 $l$层 激活函数的输出用$a^{[l]}$表示,$a^{[l]}=g^{[l]}(z^{[l]})$。$W^{[l]}$表示第 $l$ 层的权重,用于计算 $z^{[l]}$。另外,我们把输入 x 记为$a^{[0]}$,把输出层 $\hat y$ 记为$a^{[L]}$。
二、深层网络中的前向传播 Forward propagation in a Deep Network
接下来,我们来推导一下深层神经网络的正向传播过程。仍以上面讲过的4层神经网络为例:
🔸 对于单个样本
第 1 层,l =1:
$z^{[1]}=W^{[1]}x+b^{[1]}=W^{[1]}a^{[0]}+b^{[1]}$
$a^{[1]}=g^{[1]}(z^{[1]})$
第2层,l=2:
$z^{[2]}=W^{[2]}a^{[1]}+b^{[2]}$
$a^{[2]}=g^{[2]}(z^{[2]})$
第3层,l=3:
$z^{[3]}=W^{[3]}a^{[2]}+b^{[3]}$
$a^{[3]}=g^{[3]}(z^{[3]})$
第4层,l=4:
$z^{[4]}=W^{[4]}a^{[3]}+b^{[4]}$
$a^{[4]}=g^{[4]}(z^{[4]})$
🔸 如果有m个训练样本,其向量化矩阵形式为:
第1层,l=1:
$Z^{[1]}=W^{[1]}X+b^{[1]}=W^{[1]}A^{[0]}+b^{[1]}$
$A^{[1]}=g^{[1]}(Z^{[1]})$
第2层,l=2:
$Z^{[2]}=W^{[2]}A^{[1]}+b^{[2]}$
$A^{[2]}=g^{[2]}(Z^{[2]})$
第3层,l=3:
$Z^{[3]}=W^{[3]}A^{[2]}+b^{[3]}$
$A^{[3]}=g^{[3]}(Z^{[3]})$
第4层,l=4:
$Z^{[4]}=W^{[4]}A^{[3]}+b^{[4]}$
$A^{[4]}=g^{[4]}(Z^{[4]})$
⭐ 综上所述,对于第ll层,其正向传播过程的$Z^{[l]}$和$A^{[l]}$可以表示为:
$Z^{[l]}=W^{[l]}A^{[l-1]}+b^{[l]}$
$A^{[l]}=g^{[l]}(Z^{[l]})$
其中$l=1,\cdots L$
这里只能用一个显式for循环,从1到 L,然后一层接着一层去计算。下一节讲的是为避免代码产生BUG,我们必须要确保矩阵的维数是正确的
三、核对矩阵的维数 Getting your matrix dimensions right
对于单个训练样本,输入x的维度是($n^{[0]},1$)神经网络的参数$W^{[l]}$和$b^{[l]}$的维度分别是:
$W^{[l]}(下一层的维数,前一层的维数):\ (n^{[l]},n^{[l-1]})$
$b^{[l]}(下一层的维数,1):\ (n^{[l]},1)$
其中,$l=1,\cdots,L$,$n^{[l]}$和$n^{[l-1]}$分别表示第$l$层和$l-1$层的所含单元个数。$n^{[0]}=n_x$,表示输入层特征数目。
💡 反向传播过程中的$dW^{[l]}$和$db^{[l]}$的维度 与 $W^{[l]}$ 和 $b^{[l]}$ 相同
正向传播过程中的$z^{[l]}$和$a^{[l]}$的维度分别是:
$z^{[l]}:\ (n^{[l]},1)$
$a^{[l]}:\ (n^{[l]},1)$
$z^{[l]}$和$a^{[l]}$的维度是一样的,且反向传播过程中 $dz^{[l]}$和$da^{[l]}$的维度均与$z^{[l]}$和$a^{[l]}$的维度一致。
🚨 注意:向量化后 w 和 b 维度不变,但 z, a 以及 x 的维度会发生变化。
对于 m 个训练样本,向量化后:
$W^{[l]}:\ (n^{[l]},n^{[l-1]})$ 不变
$b^{[l]}:\ (n^{[l]},1)$ 不变
${Z}^{[l]}$可以看成由每一个单独的${Z}^{[l]}$叠加而得到,${Z}^{[l]}=({{z}^{[l][1]}},{{z}^{[l][2]}},{{z}^{[l][3]}},…,{{z}^{[l][m]}})$,
$m$为训练集大小,所以**${Z}^{[l]}$的维度不再是$({{n}^{[l]}},1)$,而是$({{n}^{[l]}},m)$**。
${A}^{[l]}$:$({n}^{[l]},m)$,${A}^{[0]} = X =({n}^{[l]},m)$
四、为什么使用深层表示
我们都知道神经网络能处理很多问题,而且效果显著。其强大能力主要源自神经网络足够“深”,也就是说网络层数越多,神经网络就更加复杂和深入,学习也更加准确。接下来,我们从几个例子入手,看一下为什么深度网络能够如此强大。
先来看人脸识别的例子,如下图所示。经过训练,神经网络第一层所做的事就是从原始图片中提取出人脸的轮廓与边缘,即边缘检测。这样每个神经元得到的是一些边缘信息。神经网络第二层所做的事情就是将前一层的边缘进行组合,组合成人脸一些局部特征,比如眼睛、鼻子、嘴巴等。再往后面,就将这些局部特征组合起来,融合成人脸的模样。可以看出,随着层数由浅到深,神经网络提取的特征也是从边缘到局部特征到整体,由简单到复杂。可见,如果隐藏层足够多,那么能够提取的特征就越丰富、越复杂,模型的准确率就会越高。
语音识别模型也是这个道理。浅层的神经元能够检测一些简单的音调,然后较深的神经元能够检测出基本的音素,更深的神经元就能够检测出单词信息。如果网络够深,还能对短语、句子进行检测。记住一点,神经网络从左到右,神经元提取的特征从简单到复杂。特征复杂度与神经网络层数成正相关。特征越来越复杂,功能也越来越强
尽管深度学习有着非常显著的优势,Andrew还是建议对实际问题进行建模时,尽量先选择层数少的神经网络模型,这也符合奥卡姆剃刀定律(Occam’s Razor)。对于比较复杂的问题,再使用较深的神经网络模型。
五、搭建神经网络块 Building blocks of deep neural networks
下面用流程块图来解释神经网络正向传播和反向传播过程。如下图所示:
对于第 l 层来说,正向传播过程中:
输入:$a^{[l-1]}$
输出:$a^{[l]}$
参数:$W^{[l]},b^{[l]}$
缓存变量:$z^{[l]}$
反向传播过程中:
输入:$da^{[l]}$
输出:$da^{[l-1]},dW^{[l]},db^{[l]}$
参数:$W^{[l]},b^{[l]}$
上面只是第 l 层的流程块图,对于神经网络所有层,整体的流程块图正向传播过程和反向传播过程如下所示:
六、前向传播和反向传播 Forward and Backward propagation
我们继续接着上一部分流程块图的内容,推导神经网络正向传播过程和反向传播过程的具体表达式。
😊 先讲前向传播,输入${a}^{[l-1]}$,输出是 ${a}^{[l]}$,缓存为 ${z}^{[l]}$;从实现的角度来说我们可以缓存下${w}^{[l]}$和${b}^{[l]}$,这样更容易在不同的环节中调用函数。
所以前向传播的步骤可以写成:
⬜ ${z}^{[l]}={W}^{[l]}\cdot{a}^{[l-1]}+{b}^{[l]}$
⬜ ${{a}^{[l]}}={{g}^{[l]}}\left( {{z}^{[l]}}\right)$
向量化实现过程可以写成:
⬜ ${z}^{[l]}={W}^{[l]}\cdot {A}^{[l-1]}+{b}^{[l]}$
⬜ ${A}^{[l]}={g}^{[l]}({Z}^{[l]})$
前向传播需要喂入${A}^{[0]}$也就是$X$,来初始化;初始化的是第一层的输入值。${a}^{[0]}$对应于一个训练样本的输入特征,而${{A}^{[0]}}$对应于一整个训练样本的输入特征,所以这就是这条链的第一个前向函数的输入,重复这个步骤就可以从左到右计算前向传播。
🙃 下面讲反向传播的步骤:
输入为 ${{da}^{[l]}}$,输出为${{da}^{[l-1]}}$,${{dw}^{[l]}}$, ${{db}^{[l]}}$
所以反向传播的步骤可以写成:
$d{{z}^{[l]}}=d{{a}^{[l]}}*{{g}^{[l]}}'( {{z}^{[l]}})$
$d{{w}^{[l]}}=d{{z}^{[l]}}\cdot{{a}^{[l-1]}}~$
$d{{b}^{[l]}}=d{{z}^{[l]}}~~$
$d{{a}^{[l-1]}}={{w}^{\left[ l \right]T}}\cdot {{dz}^{[l]}}$
$d{{z}^{[l]}}={{w}^{[l+1]T}}d{{z}^{[l+1]}}\cdot \text{ }{{g}^{[l]}}'( {{z}^{[l]}})~$
式子(5)由式子(4)带入式子(1)得到,前四个式子就可实现反向函数。
向量化实现过程可以写成:
$d{{Z}^{[l]}}=d{{A}^{[l]}}*{{g}^{\left[ l \right]}}'\left({{Z}^{[l]}} \right)~~$
$d{{W}^{[l]}}=\frac{1}{m}\text{}d{{Z}^{[l]}}\cdot {{A}^{\left[ l-1 \right]T}}$
$d{{b}^{[l]}}=\frac{1}{m}\text{ }np.sum(d{{z}^{[l]}},axis=1,keepdims=True)$
$d{{A}^{[l-1]}}={{W}^{\left[ l \right]T}}.d{{Z}^{[l]}}$
总结一下:
💬 以一个三层网络的前向和反向传播为例:
第一层你可能有一个ReLU激活函数,第二层为另一个ReLU激活函数,第三层可能是sigmoid函数(如果你做二分类的话),输出值为 $\hat y$,用来计算损失;这样你就可以向后迭代进行反向传播求导来求${{dw}^{[3]}}$,${{db}^{[3]}}$ ,${{dw}^{[2]}}$ ,${{db}^{[2]}}$ ,${{dw}^{[1]}}$ ,${{db}^{[1]}}$。在计算的时候,缓存会把${{z}^{[1]}}$ ${{z}^{[2]}}$${{z}^{[3]}}$传递过来,然后回传${{da}^{[2]}}$,${{da}^{[1]}}$ ,可以用来计算${{da}^{[0]}}$,但我们不会使用它。
七、参数 VS 超参数 Parameters vs Hyperparameters
神经网络中的参数就是我们熟悉的 $W^{[l]}$ 和 $b^{[l]}$。而超参数则是例如学习速率 $\alpha$,训练迭代次数 N,神经网络层数 L,各层神经元个数 $n^{[l]}$,激活函数 $g(z)$ 等。之所以叫做超参数的原因是它们决定了参数 $W^{[l]}$ 和 $b^{[l]}$ 的值。
如何设置最优的超参数是一个比较困难的、需要经验知识的问题。通常的做法是选择超参数一定范围内的值,分别代入神经网络进行训练,测试 cost function 随着迭代次数增加的变化,根据结果选择 cost function 最小时对应的超参数值。这类似于 validation 的方法。
八、深度学习和大脑的关联性
那么,神经网络跟人脑机制到底有什么联系呢?究竟有多少的相似程度?
神经网络实际上可以分成两个部分:正向传播过程和反向传播过程。神经网络的每个神经元采用激活函数的方式,类似于感知机模型。这种模型与人脑神经元是类似的,可以说是一种非常简化的人脑神经元模型。如下图所示,人脑神经元可分为树突、细胞体、轴突三部分。树突接收外界电刺激信号(类比神经网络中神经元输入),传递给细胞体进行处理(类比神经网络中神经元激活函数运算),最后由轴突传递给下一个神经元(类比神经网络中神经元输出)。
值得一提的是,人脑神经元的结构和处理方式要复杂的多,神经网络模型只是非常简化的模型。