1.神经网络概述
图 1 单个隐藏层的神经网络结构
在上图中,x1,x2,x3为输入层,上图右下角中,x1,x2,x3右边3个圆圈代表隐藏层,而yhat左边一个节点是输出层。前向传播过程是计算yhat值,从输入层开始到隐藏层再到输出层,其中每一层都经过 z=w.T·x+b 并且激活函数a=fuc(z),并将a传入到下一层。而反向传播的过程是刚好相反,求出J值后求出输出层的da,dz,dw,db 再求出隐藏层的da,dz,dw,db,致使所有梯度求解完成。
2.神经网络的表示方法
我们在正向传播时,上一层的输入称为a',而通过上一层的输入计算该层的结果成为z,而结果经过激活函数后的值为a,所以输入层的输出被称为a[0],第一个隐藏层的计算结果为z[1]=w[1]a[0]+b[1]输出为a[1]=fuc(z[1])。
3. 神经网络多样本向量化表示方法
上一周所用的正向和反向传播方法中有两个循环,第一个是对m个样本的循环,第二个是对隐藏层节点个数的循环也就是求w1、w2,b1,b2,dw1,dw2,db1,db2。而在这节中去掉了这两个循环,将输入X的向量定义为如下所示:
图2 m个样本X的矩阵
图中X被定义为大小为(nx,m)其中nx是每个样本的参数个数,m是样本个数。
进而隐藏层的w也升级为如下所示列向量:
W=[w1,w2,..,w(nw)]
其中w1,w2,..w(nw)分别为长度为nx的列向量,nw为隐藏层节点数个数,所以其shape为(nw,nx)
因此W与X的叉乘结果后的shape为(nw,m),因此b的shape也为(nw,m),最后Z=WX+B的结果Z的shape为(nw,m)可以发现如输入层的(nx,m)结构类似,只是列数变为隐藏层的个数nw。最后再将求得的记过Z通过激活函数便可得出隐藏层的输出A。经过向量化,只需要一步便可以完成隐藏层的前向传播,而不需要进行两次for循环。
4.激活函数
1)sigmoid函数 f(x)=1/(1+exp(-x))
2)ReLU函数 f(x)=x(x>=0)f(x)=0(x<0)
3)Leaky ReLU函数f(x)=x (x>=0) f(x)=0.0001x (x<0)
4)tanh函数 f(x)=(exp(x)-exp(-x))/(exp(x)+exp(-x))
图3 各种激活函数的图形
图中可以看出tanh和sigmoid在z比较大或者比较小的时候,剃度下降很慢,所以一般在影藏层用ReLU或者Leaky ReLU函数作为激活函数,而在做二元输出层时,可以使用sgmoid函数。
4.为什么要使用激活函数?
如果不使用激活函数,以两层为例
a1=z1=w1*X0+b1 公式1
a2=z2=w2*A1+b2 公式2
将公式1代入公式2得到
a2=w2·w1X0+w2·b1+b2 公式3
那么w2与w1的乘机就组成了新的w‘,w2·b1+b2就组成新的b’,如下:
a2=w‘X0+b’ 公式4
这样两层的网络其实最后演算结果得出的效果与一层相同,所以如果没有激活函数则神经网络的多层效果会消失。
5.激活函数的导数
1.sigmoid导数:a(1-a)
2.tanh导数:1-sqrt(a)
3.ReLU导数:1 (x>=0) 0(x<0)
4 Leaky ReLU导数:1 (x>=0) 0.0001(x<0)
6.一个隐藏层的神经网路梯度下降
图4 一个隐藏层的神经网络梯度下降公式
第一步求出第二层(输出层)的dZ2:
dZ2:=A2-Y
第二步利用第一层的输入A1和dZ2求出第二层的dW2:
dW2=1/m*dZ2·A1.T
第三步求出第二层的db2:
db2=1/m*np.sum(dZ2,axis=1,keepdims=True)
第四步利用第一层的输出的导数g1'(Z1)和第二层的W2以及第二层的dZ2求出第一层(隐藏层)的dZ1(注意*代表矩阵每个元素对应相乘,·代表矩阵乘法,这里是求A1=g1(z1)J对z1的导数,参见复合函数求导):
dZ1=W2.T·dZ2 * g1'(Z1)
第五步利用dZ1求dW1
第六步利用dZ1求db1
7.随机初始化参数
图5 如果将两个参数设置成相同+的后果
如果将w均设置成为0,b也设置为0,则在同一层内a11与a12会作相同的运算,即正向传播和反向传播都将会是一样的。所以这将会导致a11与a12效果相同,则该层的所有节点其实是等效的,也就是即使再多的节点也对神经网络没有提升。因此使用下列语句,初始化参数w,将会防止这个问题:
w=np.random.randn((m,nx))*0.01
最后乘以0.01的原因是,激活函数有时候是sigmoid函数,如果w设置过大,sigmoid在离原点比较远时梯度下降比较慢,将会导致梯度下降的学习效率变低。
8.编程作业
1)利用float(x)可将x从1x1的数组强制转化为float数
2)np.power(A1, 2),np幂函数,这里是将A2平方