一、神经网络简介
神经网络neural network,是生物科学和信息科学交叉的产物。用计算机模拟人脑的工作过程,完成分类识别的任务。
因为人脑神经元(神经细胞)和神经元之间通过轴突或者树突的相连,神经细胞感受到刺激之后将产生兴奋并通过细胞突起(轴突+树突)将兴奋传导给与之有连接的神经元。
一个神经细胞的结构:
一个神经元和其它神经元连接:
一个神经元通常和若干个神经元相连,连接有强有弱,不同的连接就像电阻不同的导体。一个非感受神经元(非输入神经元)在兴奋传导过程中受到的刺激总和为与之相连的神经元传递来的兴奋之和。
一个神经元受到的刺激之和用Y表示,那么:
神经元与上层n个神经元相连,xi是n个上层神经元传来的兴奋值,wi是与上层n个神经元的连接紧密程度。
一个神经元受到刺激Y之后会在细胞内部转化一下,得到一个兴奋输出y,该输出将传导给与之相连的下层神经元。
而且我们假设y与Y满足如下关系(对应整形函数,整形函数可以有多种定义)
sigmoid是一个长成这样的函数:
sigmoid是一个单调递增函数,当Y取0时y=0.5,当Y-》+无穷时,y=1,当Y-》-无穷时,y=0.
二、单层感知机
神经网络中最简单的就是单输出的单层感知机。
我们举个简单的例子:
只有两个输出单元的单层感知机,x为输入神经元,y为输出神经元,y与两个输入神经元相连。
假设有一批样本S,样本是二维平面上的点,样本特征是点的坐标x1,x2。
这些样本分为红点、绿点两类,分别用0和1表示。
现在想训练一个神经网络,用于区分红点和绿点,怎么做到呢?
希望输入绿点坐标就让y接近1,输入红点坐标,就让y接近0.
描述一下网络训练过程:
选取一个训练两本(x1,x2,T),T为类别标记,为0或者1.
我们希望当网络输入x1,x2时,输出的y接近目标输出T。
输入x1,x2,通过公式,我们可以算得y。在网络训练前y往往和实际想要的输出T不一样。这就产生一个错误信号,该信号要用来指导网络的修正(修正参数w1,w2,w3)。
错误信号的定义为:
网络怎么训练,权重怎么修改呢?
有两个直观地方法:
(1)错误越大,与输出神经元的连接(W)就需要越多的修改;
例如:Err(Y)很大,说明W修改量delta(W)也应该很大。
(2)在输入神经元中,谁输出越大,对错误的贡献就越大,对应的连接需要的修改量就越多。
例如:x1=0.1,x2=0.8。Err(Y)的出现,x2的责任更大,连接权重w2的修改量delta(w2)要比delta(w1)要更大。
于是,我们得到网络权重的修改量:
delta(W)=x*Err(Y);
一条连接权重的修改量可以理解为:上层的输出x
和 本层的Err(Y)
之积;
在样例中表示为:
算出delta(W)之后,就可以更新网络了。
如果训练样本S满足两类样本可以通过线性分类器(一条直线)分开,那么通过样本的多次训练,我们得到如下的分类器:
如果样不能分开,我们可能训练得到如下分类器:
在上文中,我介绍了单层感知机的BP训练过程(前向后向)。也感性地说明了为什么要这样训练。
其实上面的方法是数学推导得来的。这本质是一个多元函数求极值的问题。
首先模型的训练目的是使|Err(y)|最小,但是带有绝对值的目标不方便求导,我们把模型训练目标设损失函数lossFun最小。lossFun定义如下:
对于一个样本[(x1,x2),T],特征为x1,x2?;类别或输出目标为T;
lossFun是一个以[(x1,x2),T]为常量,以[w1,w2,w3]为变量的多元函数。模型的训练优化可看成一个多元函数求极值的问题:
训练样本[(x1,x2),T]时,网络参数按照梯度下降的方向求解。偏导数算出的是lossFun上升最快的方向,W的修改量delta(W)是lossFun下降最快的方向,所以delta(W)方向与梯度方向相反。
三、单输出多层感知机
在单层感知机的基础上增加若干个(本文增加一个)隐层,得到多层感知机。结构如下:
上图满足:
假如现在有一个样本[(x1,x2),T],用该样本训练网络时,网络优化的目标为lossFun最小。lossFun是一个关于变量w和v多元函数。网络的训练又变成多元函数求极值的问题。
通过上述方法算得网络梯度。
只要按照w和v的梯度下降方向更新网络就能完成网络训练。
总结一下错误反向传导:
某个非输出层神经元的错误来自它的下层,通过与之相连的下层神经元收集。
Err(y)=?v*Err(Z);
权重更新方法为:
Wij=Ni.output*Nj.Err;
四、多输出多层感知器
以上讨论神经网络输出都是单个节点,如果是多分类问题,输出神经元设为多个就行。推导如下:
训练过程为: