深度学习(四)浅层神经网络及其向量化

概述

本篇简要介绍浅层神经网络,并给出其向量化形式。

在这里插入图片描述


转自猴开发博客:深度学习(四)浅层神经网络及其向量化

4.0 Logistic 回顾

在前三篇当中,我们见过了 Logistic 回归的相关内容,了解了向前传播、向后传播、梯度下降与向量化等重要概念,并结合一个实际例子在 Jupyter Notebook 环境下搭建了一个 Logistic 回归网络,成功实现了 72% 测试集准确率的猫图识别功能。

在这里插入图片描述

图 1-0 Logistic 回归

虽然 Logistic 回归能够较好的学习线性函数,但是由于它太过简单,对于非线性的数据往往不能够很好地适应,而这一点在浅层神经网络当中将有所改善。在这一篇中将介绍浅层神经网络的一些内容,你将看到浅层神经网络是怎样向前传播的,以及如何对其进行向量化处理。

4.1 浅层神经网络

下图1-1就是一个浅层神经网络的示例。

在这里插入图片描述

图 1-1 浅层神经网络示例图

浅层神经网络是一个单隐层的神经网络,也是一个双层神经网络。对于上图的单输出情况而言,如果你遮住输入层不看的话,你会发现隐藏层与输出层所组成的结构与 Logistic 回归网络完全一致(图1-2左),事实上,如果你不遮住输入层,单看一个隐藏单元的话情况是一样的(图1-2右)。

在这里插入图片描述

图 1-2 浅层神经网络是多个单层神经网络的堆叠

从这个层面上来讲,可以认为浅层神经网络就是多个 Logistic 回归的堆叠,更准确的说是多个单层神经网的堆叠,区别在于浅层神经网络具有隐藏层与输入层共两层,因此可以有不同的激活函数的选择,而在单层神经网络中,只能够为输出层选择一个激活函数。

4.2 浅层网络的向前传播

在前面你看到了一个单输出的浅层神经网络是什么样子的,其实就是多个单层网络的堆叠。下面来看一看浅层神经网络是怎样进行向前传播的。

为了方便描述,在浅层神经网络中所有第一层的参数我们都用方括号上标来表示,而该层中的某一个单元则用下标来表示,例如 图1-2右 中隐藏层的第一个单元,它作为一个独立的“单层网络”具有的参数 w w b b ,就用符号 w 1 [ 1 ] w^{[1]}_1 b 1 [ 1 ] b^{[1]}_1 来表示,输出层只有一个单元,其参数就用 w 1 [ 2 ] w^{[2]}_1 b 1 [ 2 ] b^{[2]}_1 来表示。下面来看一看对于下图 图1-3 所显示的这个隐藏单元都经历了什么。

在这里插入图片描述

图 1-3 单输出的浅层神经网络

与 Logistic 回归相同,每一个神经网络单元在向前传播中都分别完成线性计算与激活函数这两步,因此 x 1 . . . x n x x_1 ... x_{nx} 作为输入数据进入到了第一个隐藏单元中同样完成了这两步:

z 1 [ 1 ] = w 1 [ 1 ] x + b 1 [ 1 ] z^{[1]}_1 = w^{[1]}_1x + b^{[1]}_1

a 1 [ 1 ] = σ ( z 1 [ 1 ] ) a^{[1]}_1 = \sigma(z^{[1]}_1)

隐藏层中的第二个隐藏单元也是同理:

在这里插入图片描述

图 1-4 单输出的浅层神经网络

对于 n x n_x 个输入 x 1 . . . x n x x_1...x_{n_x} ,有

z 2 [ 1 ] = w 2 [ 1 ] x + b 2 [ 1 ] z^{[1]}_2 = w^{[1]}_2x + b^{[1]}_2

a 2 [ 1 ] = σ ( z 2 [ 1 ] ) a^{[1]}_2 = \sigma(z^{[1]}_2)

第三个单元也是在做同样的计算,这里就不再写出了。

当隐藏层中所有的单元都完成了计算,也就完成了浅层神经网络中第一层的向前传播。现在,你的神经网络的向前传播正处在 图1-5 的情形:

在这里插入图片描述

图 1-5 完成了第一层的向前传播

第一层完成了所有单元的激活函数的计算,现在所有的第一层单元作为第二层的输入,进行后续的传播,相信不难想到这一层的传播方程是公式 (5)(6) 所示了:

z 1 [ 2 ] = w 1 [ 2 ] a [ 1 ] + b 1 [ 2 ] z^{[2]}_1 = w^{[2]}_1a^{[1]} + b^{[2]}_1

y ^ = a 1 [ 2 ] = σ ( z 1 [ 2 ] ) \hat{y} = a^{[2]}_1 = \sigma(z^{[2]}_1)

输出单元的计算结果 a 1 [ 2 ] a^{[2]}_1 即是整个网络的最终输出了,相信你还记得,这个输出用 y ^ \hat{y} 来表示。至此,浅层神经网络就完成了一轮完整的向前传播。

下面,你就可以计算损失函数了:

L ( y ^ , y ) = [ y l o g ( y ^ ) + ( 1 y ) l o g ( 1 y ^ ) ] L(\hat{y},y) = -[ ylog(\hat{y}) + (1-y)log(1-\hat{y}) ]

在编写代码的过程当中,我们不希望看到显式的 for 循环降低神经网络计算的效率,因此下面来看一看浅层网络的向前传播如何用向量化的方式实现。

4.3 浅层网络的向量化

对于隐藏层而言,结合公式(1)(2)(3)(4)不难得到其第 i i 个单元的计算通式:

z i [ 1 ] = w i [ 1 ] x + b i [ 1 ] z^{[1]}_i = w^{[1]}_ix + b^{[1]}_i

a i [ 1 ] = σ ( z i [ 1 ] ) a^{[1]}_i = \sigma(z^{[1]}_i)

去除变量角标并大写即可得到向量化形式:

Z [ 1 ] = W [ 1 ] x + b [ 1 ] Z^{[1]} = W^{[1]}x + b^{[1]}

A [ 1 ] = σ ( Z [ 1 ] ) A^{[1]} = \sigma(Z^{[1]})

其中大写的 Z [ 1 ] Z^{[1]} A [ 1 ] A^{[1]} W [ 1 ] W^{[1]} 是每个单元 z i z_i a i a_i w i w_i 的纵向堆叠,其中 n x n_x 表示输入个数, n 1 n_1 表示隐藏层的单元个数:

Z [ 1 ] = [ z 1 [ 1 ] z 2 [ 1 ] z n 0 [ 1 ] ] n 1 × 1 , A [ 1 ] = [ a 1 [ 1 ] a 2 [ 1 ] a n 0 [ 1 ] ] n 1 × 1 , W [ 1 ] = [ w 1 [ 1 ] w 2 [ 1 ] w 3 [ 1 ] ] n 1 × n x 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}

对于输出层而言也是同理,将隐藏层的输出作为输出层的输入,可得向量化形式:

Z [ 2 ] = W [ 2 ] A [ 1 ] + b [ 2 ] Z^{[2]} = W^{[2]}A^{[1]} + b^{[2]}

A [ 2 ] = σ ( Z [ 2 ] ) A^{[2]} = \sigma(Z^{[2]})

单输出浅层神经网络成本函数的形式与 Logistic 回归中一致:

J = ( 1 / m ) ( Y l o g A [ 2 ] + ( 1 Y ) l o g ( 1 A [ 2 ] ) ) J = -(1/m)(YlogA^{[2]} + (1-Y)log(1-A^{[2]}))

如果对向量化过程有任何疑问,可以回看深度学习(二)向量化 Logistic 回归及其梯度输出

本篇小结

至此,你已经完成了浅层神经网络的向前传播及其向量化,但是这个过程还是有值得改进的地方,主要在于公式(8)(10),在目前为止的这几篇里在处理 z z 上一直使用的是 sigmoid 函数作为激活函数,事实上有其他更好的函数可供选择,而将其它这些函数作为隐藏层的激活函数所训练出的网络往往具有更好的效果。

关于激活函数的选择将在下篇中进行探讨,同时在下一篇中你将看到浅层神经网络的向后传播过程,并将对双层神经网络具有一个较为完整的认识。

转自猴开发,原文地址:深度学习(四)浅层神经网络及其向量化

发布了26 篇原创文章 · 获赞 24 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/iSunwish/article/details/88759917