BP(BackPropagation)介绍
BP(back propagation)神经网络是1986年由Rumelhart和McClelland为首的科学家提出,是一种按照误差逆向传播算法训练的多层前馈神经网络,是目前应用最广泛的神经网络。本文在大家都大致了解BP假设前提下,用个人的总结,BP神经网络的工作流程就是包含输入层,隐含层以及输出层的全连接网络矩阵,通过“喂入数据”,数据与权重与偏差进行计算(前向传播),计算输出结果与期待结果的误差,再而通过总误差对权重的偏导数进行修正(反向传播),修正权重值和偏差值;随着不断喂入数据,使得网络权重和偏差值不断得到修改,最后使得网络能够很好拟合数据集。
(如果你还没理解网络,可以先去看下基本的公式,如https://blog.csdn.net/qq_15056115/article/details/82927428,
https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/
然后再过来看手算过程会更能理解
)
手算的BP网络图介绍
为了手算简单一点,我建立了一个简单的三层网络(一个输入层,一个隐含层和一个输出层),输入层包括三个输入神经元节点,隐含层包括两个神经元节点,输出层包括一个神经元节点。全连接网络中,bias偏差节点的连接权重为1,其他的连接权重为Wi 表示。具体如下图所示。(注意,所有的输入以及权重参数设置随机,学习率设置为0.1).第一个网络图描述的是网络结构,第二个结构图中加入了对隐含层,输出层神经元结果的进行激活函数的处理。在这次手算的网络里面使用的sigmoid激活函数,公式如下
在手算推导里面,用到的求导公式,大家可以自行计算,这里直接放上公式:
此外,在使用偏差对权重进行求导数的时候,使用的链式法则 ,就是我们高数所学的求复合函数导数。接下来就是看运算了,下面进行了一次前向传播,一次反向传播的计算。
激活函数
激活函数,从上面的过程中,可以看到计算的过程,那么为什么会有激活函数,虽然道理上讲的是进行非线性变换,因为如果没有激活函数,那么网络输出就是输出值和权重的多项式线性方程的结果。但我们网络是为了学习到更多函数模型,把线性的输出结果利用非线性激活函数,映射到曲线上,来实现非线性函数的学习(个人理解,欢迎补充)。
常用的激活函数用如下几种,直接上代码和函数图吧
1、sigmoid 函数
#sigmoid激活函数
def sigmoid(x):
y=1/(1+math.exp(-x))
return y
函数图像如下:
2、Tanh函数
#tanh函数
def Tanh(x):
exp_=math.exp(x)
y=(exp_-1/exp_)/(exp_+1/exp_)
return y
函数图像如下:
3、ReLU函数
#ReLU函数
def ReLU(x):
return max(x,0)
函数图像如下:
4、Leaky ReLU函数
#LeakyReLU函数
def LeakyReLU(x,leak):
return max(x*leak,x)
函数图像如下:
5、ELU 函数
激活函数的求导
在网络图运算里面会遇到激活函数的求导,像上面sigmoid函数求导的公式
下面,我将详细进行函数的描述以及推导
暂时先写到这里了,后续再手写神经网络。如果有不足或者错误的地方,请各位多多指教。