建立神经网络模型
由于网易深度学习课程只有视频部分,配套的作业还没上线,故只得进行自我练习。
课程共分为5个大部分,其中有三个大部分是连续的,剩下两个为补充部分,现笔者已经完成了第一大部分-神经网络和深度学习,为了更好的进行接下来的学习,必须保证这一基础部分完全掌握,所以就利用这一部分吴教授所提到的整个神经网络的构造方法,利用python语言,进行详尽的建模工作,让自己把这部分的知识学扎实。
首先做出一个base architecture
import pandas as pd
import numpy as np
def neuralnetworkslmodel(n):
#0 assumption
#tree layers - 4 4 1 -
#1 input data
trainningset=loaddata()
X1=trainningset[:-1]
y=trainningset[-1]
m=len(y)
#2 initialization parameters
W1=np.random.randn((m,4))
W2=np.random.randn((4,4))
W3=np.random.randn((4,1))
b1=0
b2=0
b3=0
#3 forward propagation
Z1=X1*w1+b1
A1=actfun(z1)
Z2=A1*w2+b2
A2=actfun(Z1)
Z3=A2*w2+b2
A3=actfun(Z1)
#4 bakcward propagation - gradient descent
#gradient
dZ3=A3-y
dW3=dZ3*A2.T/m
db3=np.sum(dZ3,axis=1,keepdims=True)
dZ2=np.multiply(W3*dZ3,dacfun(Z2))
dW2=dZ2*A1.T/m
db2=np.sum(dZ2,axis=1,keepdims=True)
dZ1=np.multiply(W2*dZ2,dacfun(Z1))
dW1=dZ1*A1.T/m
db1=np.sum(dZ1,axis=1,keepdims=True)
# descent
W1=W1-alpha*dW1
b1=b1-alpha*db1
W2=W2-alpha*dW2
b2=b2-alpha*db2
W3=W2-alpha*dW3
b3=b2-alpha*db3
return W1,b1,W2,b2,W3,b3
该代码共分成5个部分,下面进行详解。
1.假定
考虑当前代码只是列出基本框架,并非直接运行,所以先假定所建立的神经网络模型为3层,各层的单元数分别为4,4,1
2.数据输入
trainningset=loaddata()
X1=trainningset[:-1]
y=trainningset[-1]
m=len(y)
建立数据读取函数loaddata,将数据特征值和预测值统一读入,然后分别赋给不同变量
3.参数初始化
W1=np.random.randn((m,4))*0.01
W2=np.random.randn((4,4)))*0.01
W3=np.random.randn((4,1)))*0.01
b1=0
b2=0
b3=0
考虑到这是个三层的神经网络,故一共6个参数,对于W需要初始化为接近于0的随机数,b可直接取0
4.前向传播
Z1=X1*w1+b1
A1=actfun(z1)
Z2=A1*w2+b2
A2=actfun(Z2)
Z3=A2*w2+b2
A3=actfun(Z3)
这些公式已经是向量化之后的结果,也就是说每个变量中包含了样本的所有信息
Z表征的是前一层的输出结果进行线性组合
A是将Z值通过激活函数actfun计算后的输出值
actfun即激活函数,实际上考虑最后输出结果,最后一层输出层可先考虑为二元分类问题,其的激活函数应该为sigmoid函数,其它层可选取为Relu函数,但实际上可以根据情况选取
每层依次向前传递
5.后向传播-梯度下降
这一部分实际上可划分为计算梯度、参数下降两小部分。
dZ3=A3-y
dW3=dZ3*A2.T/m
db3=np.sum(dZ3,axis=1,keepdims=True)
dZ2=np.multiply(W3*dZ3,dacfun(Z2))
dW2=dZ2*A1.T/m
db2=np.sum(dZ2,axis=1,keepdims=True)
dZ1=np.multiply(W2*dZ2,dacfun(Z1))
dW1=dZ1*A1.T/m
db1=np.sum(dZ1,axis=1,keepdims=True)
这一小部分就是计算各个参数的偏导数,也就是所谓的梯度。
这里应该明确的是,我们的目标是最小化代价函数J
J=1m∑L(y^,y) J = 1 m ∑ L ( y ^ , y )
所以所求的梯度应该是J对各个参数的梯度