这一周主要讲了深层的神经网络搭建。
深层神经网络的符号表示
在深层的神经网络中,
- L表示神经网络的层数 L=4
- n[l]表示第l层的神经网络个数
- W[l]:(n[l],nl−1)
- dW[l]:(n[l],nl−1)
- b[l]:(n[l],1)
- db[l]:(n[l],1)
- z[l]:(n[l],1)
- a[l]:(n[l],1)
前向传播和反向传播
前向传播
input a[l−1]
output a[l],cache(z[l]) ,其中cache也顺便把 W[l],b[l]也保存下来了
所以,前向传播的公式可以写作:
Z[l]=W[l]A[l−1]+b[l]
A[l]=g[l](Z[l])
维度
假设有m个样本,那么Z[l] 维度就是 (n[l],m) ,A[l]的维度和Z[l]一样。
那么 W[l]A[l−1]维度就是 (n[l],nl−1)∗(n[l−1],m) 也就是 (n[l],m),这个时候,还需要加上b[l],而b[l]本身的维度是(n[l],1),借助python的广播,扩充到了m个维度。
反向传播
input da[l]
output da[l−1],dW[l],db[l]
公式:
向量化:
正向传播和反向传播如图:
具体过程为,第一层和第二层用Relu函数,第三层输出用sigmoid,这个时候的输出值是a[3]
而首先进行反向传播的时候先求得da[3]=−ya−1−y1−a,然后再包括之前存在cache里面的z[3],反向传播可以得到dw[3],db[3],da[2],然后继续反向,直到得到了dw[1],db[1]后,更新一下w,b的参数,然后继续做前向传播、反向传播,不断循环。
Why Deep?
如图直观上感觉,比如第一层,它会先识别出一些边缘信息;第二层则将这些边缘进行整合,得到一些五官信息,如眼睛、嘴巴等;到了第三层,就可以将这些信息整合起来,输出一张人脸了。
如果网络层数不够深的话,可以组合的情况就很少,或者需要类似门电路那样,用单层很多个特征才能得到和深层神经网络类似的效果。
搭建深层神经网络块
和之前说的一样,一个网络块中包含了前向传播和反向传播。
前向输入a[l−1],经过神经网络的计算,g[l](w[l]a[l−1]+b[l])得到a[l]
反向传播,输入da[l],再有之前在cache的z[l],即可得到dw[l],db[l]还有上一层的da[l−1]
参数与超参数
超参数就是你自己调的,玄学参数:
- learning_rate
- iterations
- L = len(hidden layer)
- n[l]
- activation function
- mini batch size(最小的计算批)
- regularization(正则)
- momentum(动量)