深度学习(四)浅层神经网络及其向量化
概述
本篇简要介绍浅层神经网络,并给出其向量化形式。
4.0 Logistic 回顾
在前三篇当中,我们见过了 Logistic 回归的相关内容,了解了向前传播、向后传播、梯度下降与向量化等重要概念,并结合一个实际例子在 Jupyter Notebook 环境下搭建了一个 Logistic 回归网络,成功实现了 72% 测试集准确率的猫图识别功能。
4.1 浅层神经网络
下图1-1就是一个浅层神经网络的示例。
4.2 浅层网络的向前传播
在前面你看到了一个单输出的浅层神经网络是什么样子的,其实就是多个单层网络的堆叠。下面来看一看浅层神经网络是怎样进行向前传播的。
为了方便描述,在浅层神经网络中所有第一层的参数我们都用方括号上标来表示,而该层中的某一个单元则用下标来表示,例如 图1-2右 中隐藏层的第一个单元,它作为一个独立的“单层网络”具有的参数 $w$ 和 $b$,就用符号 $w^{[1]}_1$ 和 $b^{[1]}_1$ 来表示,输出层只有一个单元,其参数就用 $w^{[2]}_1$ 和 $b^{[2]}_1$ 来表示。下面来看一看对于下图 图1-3 所显示的这个隐藏单元都经历了什么。
与 Logistic 回归相同,每一个神经网络单元在向前传播中都分别完成线性计算与激活函数这两步,因此 $x_1 ... x_{nx}$ 作为输入数据进入到了第一个隐藏单元中同样完成了这两步:
$$ \begin{equation} z^{[1]}_1 = w^{[1]}_1x + b^{[1]}_1 \end{equation} $$
$$ \begin{equation} a^{[1]}_1 = \sigma(z^{[1]}_1) \end{equation} $$
隐藏层中的第二个隐藏单元也是同理:
对于 $n_x$ 个输入 $x_1...x_{n_x}$,有
$$ \begin{equation} z^{[1]}_2 = w^{[1]}_2x + b^{[1]}_2 \end{equation} $$
$$ \begin{equation} a^{[1]}_2 = \sigma(z^{[1]}_2) \end{equation} $$
第三个单元也是在做同样的计算,这里就不再写出了。
当隐藏层中所有的单元都完成了计算,也就完成了浅层神经网络中第一层的向前传播。现在,你的神经网络的向前传播正处在 图1-5 的情形:
第一层完成了所有单元的激活函数的计算,现在所有的第一层单元作为第二层的输入,进行后续的传播,相信不难想到这一层的传播方程是公式 (5)(6) 所示了:
$$ \begin{equation} z^{[2]}_1 = w^{[2]}_1a^{[1]} + b^{[2]}_1 \end{equation} $$
$$ \begin{equation} \hat{y} = a^{[2]}_1 = \sigma(z^{[2]}_1) \end{equation} $$
输出单元的计算结果 $a^{[2]}_1$ 即是整个网络的最终输出了,相信你还记得,这个输出用 $\hat{y}$ 来表示。至此,浅层神经网络就完成了一轮完整的向前传播。
下面,你就可以计算损失函数了:
$$ \begin{equation} L(\hat{y},y) = -[ ylog(\hat{y}) + (1-y)log(1-\hat{y}) ] \end{equation} $$
在编写代码的过程当中,我们不希望看到显式的 for 循环降低神经网络计算的效率,因此下面来看一看浅层网络的向前传播如何用向量化的方式实现。
4.3 浅层网络的向量化
对于隐藏层而言,结合公式(1)(2)(3)(4)不难得到其第 $i$ 个单元的计算通式:
$$ \begin{equation} z^{[1]}_i = w^{[1]}_ix + b^{[1]}_i \end{equation} $$
$$ \begin{equation} a^{[1]}_i = \sigma(z^{[1]}_i) \end{equation} $$
去除变量角标并大写即可得到向量化形式:
$$ \begin{equation} Z^{[1]} = W^{[1]}x + b^{[1]} \end{equation} $$
$$ \begin{equation} A^{[1]} = \sigma(Z^{[1]}) \end{equation} $$
其中大写的 $Z^{[1]}$、$A^{[1]}$、$W^{[1]}$ 是每个单元 $z_i$、$a_i$、$w_i$ 的纵向堆叠,其中 $n_x$ 表示输入个数,$n_1$ 表示隐藏层的单元个数:
$$ \begin{equation} Z^{[1]} = \begin{bmatrix} z^{[1]}_1\\ z^{[1]}_2\\ {\vdots}\\ z^{[1]}_{n_0} \end{bmatrix} _{n_1 \times 1} , A^{[1]} = \begin{bmatrix} a^{[1]}_1\\ a^{[1]}_2\\ {\vdots}\\ a^{[1]}_{n_0} \end{bmatrix} _{n_1 \times 1} , W^{[1]} = \begin{bmatrix} {\cdots}&w^{[1]}_1&{\cdots}\\ {\cdots}&w^{[1]}_2&{\cdots}\\ {\cdots}&w^{[1]}_3&{\cdots}\\ \end{bmatrix} _{n_1 \times n_x} \end{equation} $$
对于输出层而言也是同理,将隐藏层的输出作为输出层的输入,可得向量化形式:
$$ \begin{equation} Z^{[2]} = W^{[2]}A^{[1]} + b^{[2]} \end{equation} $$
$$ \begin{equation} A^{[2]} = \sigma(Z^{[2]}) \end{equation} $$
单输出浅层神经网络成本函数的形式与 Logistic 回归中一致:
$$ \begin{equation} J = -(1/m)(YlogA^{[2]} + (1-Y)log(1-A^{[2]})) \end{equation} $$
如果对向量化过程有任何疑问,可以回看深度学习(二)向量化 Logistic 回归及其梯度输出
本篇小结
至此,你已经完成了浅层神经网络的向前传播及其向量化,但是这个过程还是有值得改进的地方,主要在于公式(8)(10),在目前为止的这几篇里在处理 $z$ 上一直使用的是 sigmoid 函数作为激活函数,事实上有其他更好的函数可供选择,而将其它这些函数作为隐藏层的激活函数所训练出的网络往往具有更好的效果。
关于激活函数的选择将在下篇中进行探讨,同时在下一篇中你将看到浅层神经网络的向后传播过程,并将对双层神经网络具有一个较为完整的认识。
- 感谢你赐予我前进的力量