深层神经网络的一些符号定义: LL: 神经网络的层数 n[l]: 第ll层的神经单元个数 a[l]=g[l](z[l]): 第ll层的激活函数 W[l]: 第ll层z[l]的权重 x=a[0]x = a [ 0 ],y^=a[L]y ^ = a [ L ]
深层神经网络的前向传播
下图是有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[l−1]+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[l−1]+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[l−1])( 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 )。确保这些参数的维度没有问题,公式运算一般没问题。
另外一种解释是,某些函数的功能只需要简单的L层神经网络就可以实现,如果使用层数更少的神经网络,隐藏层就需要更多的隐藏单元。比如求n个数字的异或结果,深层的神经网络需要O(logn)O ( l o g n )个神经元,如果使用2层神经网络,可能需要O(2n)O ( 2 n )个神经元,如下图所示:
搭建深层神经网络块
整个深层神经网络的学习过程就是不断地进行前向传播、反向传播和梯度下降,如下图所示
把前向传播和反向传播两个过程使用前向函数和反向函数表示,第ll层的前向函数的输入是a[l−1],输出是a[l]a [ l ],第ll层的反向函数的输入是da[l]和z[l]z [ l ],输出是da[l−1]d a [ l − 1 ]、dW[l]d W [ l ]和db[l]d b [ l ]。在前向函数计算过程中,记得把z[l]z [ l ]保存起来,然后传递给反向函数。
前向和反向传播
这里详细介绍在每一层中前向和反向传播的具体运算过程。
前向函数
输入:a[l−1]a [ l − 1 ] 输出:a[l]a [ l ]
z[l]a[l]=W[l]a[l−1]+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[l−1]+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[l−1]d a [ l − 1 ],dW[l]d W [ l ],db[l]d b [ l ]
dz[l]dW[l]db[l]da[l−1]=da[l]∗g′[l](z[l])=dz[l]a[l−1]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[l−1]=dA[l]∗g′[l](Z[l])=1mdZ[l]A[l−1]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 ]