深层神经网络

深层神经网络

浅层神经网络和深层神经网络的主要区别在于隐藏层的多少。隐藏层的层数越多,神经网络越深。

深层神经网络的一些符号定义:
L L: 神经网络的层数
n[l]: 第l l层的神经单元个数
a[l]=g[l](z[l]): 第l l层的激活函数
W[l]: 第l lz[l]的权重
x=a[0] x = a [ 0 ]y^=a[L] y ^ = a [ L ]

深层神经网络的前向传播

下图是有3层隐藏层的神经网络
3层隐藏层的神经网络
一个样本x在这个神经网络中进行前向传播的过程是

z[1]a[1]z[2]a[2]z[3]a[3]z[4]y^=a[4]=W[1]a[0]+b[1]=g[1](z[1])=W[2]a[1]+b[2]=g[2](z[2])=W[3]a[2]+b[3]=g[3](z[3])=W[4]a[3]+b[4]=g[4](z[4]) z [ 1 ] = W [ 1 ] a [ 0 ] + b [ 1 ] a [ 1 ] = g [ 1 ] ( z [ 1 ] ) z [ 2 ] = W [ 2 ] a [ 1 ] + b [ 2 ] a [ 2 ] = g [ 2 ] ( z [ 2 ] ) z [ 3 ] = W [ 3 ] a [ 2 ] + b [ 3 ] a [ 3 ] = g [ 3 ] ( z [ 3 ] ) z [ 4 ] = W [ 4 ] a [ 3 ] + b [ 4 ] y ^ = a [ 4 ] = g [ 4 ] ( z [ 4 ] )

从中可以总结到规律:

z[l]a[l]=W[l]a[l1]+b[l]=g[l](z[l]) z [ l ] = W [ l ] a [ l − 1 ] + b [ l ] a [ l ] = g [ l ] ( z [ l ] )

多个样本X在这个神经网络中进行前向传播的过程:

Z[1]A[1]Z[2]A[2]Z[3]A[3]Z[4]y^=A[4]=W[1]A[0]+b[1]=g[1](Z[1])=W[2]A[1]+b[2]=g[2](Z[2])=W[3]A[2]+b[3]=g[3](Z[3])=W[4]A[3]+b[4]=g[4](Z[4]) Z [ 1 ] = W [ 1 ] A [ 0 ] + b [ 1 ] A [ 1 ] = g [ 1 ] ( Z [ 1 ] ) Z [ 2 ] = W [ 2 ] A [ 1 ] + b [ 2 ] A [ 2 ] = g [ 2 ] ( Z [ 2 ] ) Z [ 3 ] = W [ 3 ] A [ 2 ] + b [ 3 ] A [ 3 ] = g [ 3 ] ( Z [ 3 ] ) Z [ 4 ] = W [ 4 ] A [ 3 ] + b [ 4 ] y ^ = A [ 4 ] = g [ 4 ] ( Z [ 4 ] )

从中可以总结到规律:

Z[l]A[l]=W[l]A[l1]+b[l]=g[l](Z[l]) Z [ l ] = W [ l ] A [ l − 1 ] + b [ l ] A [ l ] = g [ l ] ( Z [ l ] )

因此在实现时可以使用for循环来实现。检查代码是否正确,可以检查上述的公式得到的矩阵的维度是否正确。比如, W[l] W [ l ]的维度是 (n[l],n[l1]) ( n [ l ] , n [ l − 1 ] ) b[l] b [ l ]的维度是 (n[l],1) ( n [ l ] , 1 ) Z[l] Z [ l ]的维度是 (n[l],m) ( n [ l ] , m )。确保这些参数的维度没有问题,公式运算一般没问题。

为什么使用深层表示

神经网络越深,表现效果越好,为什么呢?下面举一些直观的例子:
人脸识别的深层网络的层数大概可以分成4组,第1组的层主要负责识别图像的边缘部分,可以称为边缘识别器。第2组的层根据第1组的层识别的边缘部分识别人脸的某些部位,如眼睛,鼻子等,可以称为人脸部位识别器。第3组的层根据第2组能够识别出人脸。神经网络中的隐藏层的层数越深,隐藏层的功能就越复杂。
人脸识别的深层网络
对于语音识别也是一样的,浅层的隐藏层识别某种声音,深一点的隐藏层识别单词,更深一点的隐藏层识别语音的意思。

另外一种解释是,某些函数的功能只需要简单的L层神经网络就可以实现,如果使用层数更少的神经网络,隐藏层就需要更多的隐藏单元。比如求n个数字的异或结果,深层的神经网络需要O(logn) O ( l o g n )个神经元,如果使用2层神经网络,可能需要O(2n) O ( 2 n )个神经元,如下图所示:
异或问题神经网络

搭建深层神经网络块

整个深层神经网络的学习过程就是不断地进行前向传播、反向传播和梯度下降,如下图所示
深层神经网络的前向传播和反向传播

把前向传播和反向传播两个过程使用前向函数和反向函数表示,第l l层的前向函数的输入是a[l1],输出是a[l] a [ l ],第l l层的反向函数的输入是da[l]z[l] z [ l ],输出是da[l1] d a [ l − 1 ]dW[l] d W [ l ]db[l] d b [ l ]。在前向函数计算过程中,记得把z[l] z [ l ]保存起来,然后传递给反向函数。

前向和反向传播

这里详细介绍在每一层中前向和反向传播的具体运算过程。

前向函数

输入:a[l1] a [ l − 1 ]
输出:a[l] a [ l ]

z[l]a[l]=W[l]a[l1]+b[l]=g[l](z[l]) z [ l ] = W [ l ] a [ l − 1 ] + b [ l ] a [ l ] = g [ l ] ( z [ l ] )

矢量化实现:

Z[l]A[l]=W[l]A[l1]+b[l]=g[l](Z[l]) Z [ l ] = W [ l ] A [ l − 1 ] + b [ l ] A [ l ] = g [ l ] ( Z [ l ] )

注意 Z[l] Z [ l ]要缓存起来。

反向函数

输入:da[l] d a [ l ]
输出:da[l1] d a [ l − 1 ]dW[l] d W [ l ]db[l] d b [ l ]

dz[l]dW[l]db[l]da[l1]=da[l]g[l](z[l])=dz[l]a[l1]T=dz[l]=W[l]Tdz[l] d z [ l ] = d a [ l ] ∗ g ′ [ l ] ( z [ l ] ) d W [ l ] = d z [ l ] a [ l − 1 ] T d b [ l ] = d z [ l ] d a [ l − 1 ] = W [ l ] T d z [ l ]

矢量化实现:

dZ[l]dW[l]db[l]dA[l1]=dA[l]g[l](Z[l])=1mdZ[l]A[l1]T=1mnp.sum(dZ[l],axis=1,keepdims=True)=W[l]TdZ[l] d Z [ l ] = d A [ l ] ∗ g ′ [ l ] ( Z [ l ] ) d W [ l ] = 1 m d Z [ l ] A [ l − 1 ] T d b [ l ] = 1 m np.sum ( d Z [ l ] , a x i s = 1 , k e e p d i m s = T r u e ) d A [ l − 1 ] = W [ l ] T d Z [ l ]

总结

总结
不同的层,可能使用不同的激活函数,例如隐藏层使用ReLU函数,输出层使用sigmoid函数。反向传播开始的梯度是通过成本函数的导数来求的。成本函数的导数是

da[L]=ya+1y1a d a [ L ] = − y a + 1 − y 1 − a

参数和超参数

参数:W[1] W [ 1 ]b[1] b [ 1 ]W[2] W [ 2 ]b[2] b [ 2 ]
超参数:

  • 学习率α α
  • 梯度下降的迭代次数
  • 隐藏层的层数
  • 每层的隐藏单元n[1] n [ 1 ]n[2] n [ 2 ]
  • 激活函数的选择
  • 还有其他一些,比如minibatch

超参数之所以称为超参数,是因为超参数的值确定了之后,参数的值才确定。超参数的值需要自己决定,比如学习率α α的最优值可能是0.01,也可能是0.05,寻找最优的超参数是一个参数调优的过程。超参数的最优值不是一成不变的,根据数据的不同,最优值也会不同。


版权声明:本文为qq_24548569原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。