BP神经网络算法



查看原文:http://www.wyblog.cn/2017/02/12/bp%e7%a5%9e%e7%bb%8f%e7%bd%91%e7%bb%9c%e7%ae%97%e6%b3%95/

BP神经网络概念

BP(Back Propagation)神经网络是在1986年被Rumelhart与McCelland等科学家提出的概念,正如名字所说,它是一种back propagation型的网络,它将训练误差进行逆向传播,通过前馈的方式不断修正网络中各神经元的权值,而进行自身学习的。 BP神经网络拓扑结构包含有三个层,输入层、隐含层以及输出层。层与层之间即通过神经元映射关系而连接,这种网络中包含有大量输入输出映射关系,所以要学习的参数也是非常的多,但是这种结构的好处就是我们可以用这种简单的映射关系而拟合出任何一种高阶复杂的函数(万能逼近定理)。 BP神经网络的典型结构图如下:
《BP神经网络算法》 这里输入层、隐含层、输出层的神经元个数都是可以根据需要进行自由调节的,所以BP神经网络既能进行分类任务,也能进行回归任务,它是一种典型的有监督学习方式。

模型

BP神经网络包含了两个过程:

  • 激励信号正向传递过程
  • 误差信号反向传播过程

正向传递

前向传递的两个神经元为节点i与节点j,i与j之间的权值为ωij,在节点j处,还有个阈值bj,作为激活神经元的最小值。根据神经元节点的特点,每个神经元的输出值是根据上一层的所有节点的输出值通过各自权值加权求和后,再通过一个定义的激活函数而得到的。用公式表示即: $latex S_{j}=\sum_{i=0}^{m-1} \omega_{i,j}x_{i}+b_{j}$, $latex x_{j}=f(S_{j})$ 以上Sj则为前一层所有节点的加权和,而f(x)则为一个激活函数,xj则为当前神经元节点的输出值。 通常,激活函数可以选择线性函数,或者非线性函数。 线性函数常用的有:

  1. 线性函数:f(x)=k*x+c
  2. 阈值函数:f(x)=1 当x>c,f(x)=0 当x<c

非线性函数有:

  1. sigmoid函数(S型函数):f(x)=1/(1+exp(-α*x)),它的值域为(0,1)
  2. 双极型sigmoid函数,即对其做变换2f(x)-1,其值域为(-1,1)
  3. 另外,为了拓展sigmoid函数可行定义域宽度,可使其横向拉伸一倍,即变换为2f(x/2)-1,其值域仍未(-1,1)

反向传播

BP神经网络中,反向传播的元素是当前输出的误差值。误差通过输出层,按误差梯度下降的方式修正各层权值,由隐含层、输入层逐层反转,周而复始的信息正向传播和误差反向传播过程,是各层权值不断调整的过程,也是神经网络学习训练的过程,此过程一直进行到网络输出的误差减少到可以接受的程度,或者预先设定的学习次数为止。

神经元节点

在模型里,还要考虑一个问题,即
神经元的个数。对于输入层输出层比较好说,输入层个数即特征的个数,输出层的个数即待分类的个数或者是一个(回归问题)。那么隐含层呢?对于隐含层,如果神经元过少,那么这一层能承载的信息量就比较小,所得到的模型泛化能力可能就比较弱;如果神经元过多,那么可能会有过拟合的现象,使得这一模型对训练集表现优异,对真实数据表现异常,而且,节点过多也会加剧网络的运算量。 所以,有一个隐含层节点个数的经验公式可以借鉴: $latex h=\sqrt{m+n}+a$

策略

由算法模型可知,BP神经网络实际上就是不断通过修正各个神经元传播的权重以及各个阈值,使得神经网络的输出值信息尽可能地与真实信息接近。因此,定义模型的loss function为二次损失形式,即 $latex E(\omega,b)=\frac{1}{2} \sum_{j=0}^{n-1}(d_{j}-y_{j})^{2}$ 以上dj为网络的输出值,yi为真实值。

算法

根据损失函数,E(x)是关于dj的函数,dj是关于激活函数f(x)的函数,f(x)恰好就是关于权值ωij与阈值b的函数,所以,自然地就会想到,可以根据梯度下降法进行学习。 为了方便起见,这里推导过程选择传递函数为线性函数f(x)=ωij * xi+bj,激活函数选择sigmoid函数形式。这两个函数导数形式容易求得,通过推导可以发现,对于sigmoid函数,f'(x)=f(x)*[1-f(x)]。 误差的反向传播过程涉及到输出层到隐含层,再从隐含层到输入层。首先看看输出层到隐含层。 损失函数对权值ω的偏导数为 $latex \frac{\partial E(\omega,b)}{\partial \omega_{i,j}}=(d_{j}-y_{j}) \cdot \frac{\partial d_{j}}{\partial \omega_{i,j}} $ 刚才说了,dj激活函数我们选择的sigmoid函数,将它关于加权和的导数带入上式,最后可得, $latex \frac{\partial E(\omega,b)}{\partial \omega_{i,j}}=(d_{j}-y_{j}) \cdot f(S_{j})[1-f(S_{j})] \cdot x_{i} $ 除了xi,其他均为常值,记为δij。 同样的,用误差函数对bj求偏导数,可得 $latex \frac{\partial E(\omega,b)}{\partial \omega_{i,j}}=\delta_{i,j} $ 接着看看从隐含层到输入层,推理步骤要复杂一点,复杂在求偏导时,要求两次,则 $latex \frac{\partial E(\omega,b)}{\partial \omega_{i,j}}= \sum_{j=0}^{n-1}\delta_{i,j} \cdot \omega_{ij} \cdot f(S_{i})[1-f(S_{i})] \cdot x_{k} $ 同样的,除了xk,其他记为δki。 利用梯度下降法,可以给以上四个偏导数分别设置一个学习率η1,η2,η3,η4。 最终,经梯度下降法,隐含层和输出层之间误差反向传播权值与阈值调整为:
《BP神经网络算法》 输入层与隐含层之间的误差反向传播权值与阈值调整为:
《BP神经网络算法》

BP神经网络算法Matlab实验

这里使用的数据集为经典Iris数据集,它通过给出花瓣的4个特征而辨别出3类Iris来,
下载地址在此。 数据集分为训练集与测试集,各有75条数据,matlab代码如下:

%读入文件
[f1,f2,f3,f4,class] = textread('train.txt' , '%f%f%f%f%f',75);
%数据归一化
[input,inps]=mapminmax([f1,f2,f3,f4]');
%将class进行one-hot编码
s = length( class) ;
output = zeros( s , 3  ) ;
for i = 1 : s 
   output( i , class( i )  ) = 1 ;
end;
%创建BP神经网络
net = feedforwardnet( 10 , 'traingdx' );
net.trainparam.show = 10 ;        %每间隔10步显示训练结果
net.trainparam.epochs = 500 ;   %允许最大训练步数
net.trainparam.goal = 0.01 ;       %训练目标最小误差
net.trainParam.lr = 0.01 ;            %学习率
%创建网络
net = train( net, input , output' ) ;
%以下构造测试集
[t1,t2,t3,t4,c] = textread('test.txt' , '%f%f%f%f%f',75);
[testInput,testps]=mapminmax([t1,t2,t3,t4]');
Y = sim( net , testInput );
[s1 , s2] = size( Y ) ;
hitNum = 0 ;
for i = 1 : s2
    [m , Index] = max( Y( : ,  i ) ) ;
    if( Index  == c(i)   ) 
        hitNum = hitNum + 1 ; 
    end
end
sprintf('识别率是 %3.3f%%',100 * hitNum / s2 )

因为训练数据量非常小,所以训练速度也很快。如上,我这里隐含层选择了10个神经元节点,并且误差阈值设定为0.01,最终误差曲线如下图。
《BP神经网络算法》 可以看到,经过163次迭代,我们的误差值就达到要求了。从红色曲线测试集来看,这个模型表现很好,测试集的误差达到了比训练集的误差更小的情况。

参考资料

https://en.wikipedia.org/wiki/Backpropagation http://blog.csdn.net/acdreamers/article/details/44657439 http://blog.csdn.net/gongxq0124/article/details/7681000

查看原文:
http://www.wyblog.cn/2017/02/12/bp%e7%a5%9e%e7%bb%8f%e7%bd%91%e7%bb%9c%e7%ae%97%e6%b3%95/

    原文作者:神经网络算法
    原文地址: https://blog.csdn.net/wy250229163/article/details/54999995
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞