一、BP神经网络简述
- 人工神经元概述
归纳一下生物神经元传递信息的过程:生物神经元是一个多输入、单输出单元。常用的人工神经元模型可用下图模拟。
当神经元j有多个输入xi(i=1,2,…,m)和单个输出yj时,输入和输出的关系可表示为:
其中j为阈值,wij为从神经元i到神经元j的连接权重因子,f( )为传递函数,或称激励函数。 - BP神经网络概述
BP神经网络是一种2层或者3层以上的多层神经网络,按照有导师学习方式进行训练。当学习模式提供给神经网络后,神经元的激活值将从输入层经隐藏层向输出层传播,在输出层的各神经元输出对应于输入模式的网络响应。再根据输出值与期望值(真实值)用之间的误差,从输出层经隐含层最后回到输入层进行权值的修正,以不断减少误差。
BP神经网络建模主要包含三个步骤:
- 训练集和测试集数据的采集
- BP神经网络的创建和训练
- 仿真测试
- 模型可信度评价
二、BP神经网络的结构
-
正向传播
正向传播就是让信息从输入层进入网络,依次经过每一层的计算,得到最终输出层结果的过程。结构如下:
先来看网络的结构,输入层(input )没有变,还是三个节点。输出层(input )也没有变。重点看隐藏层(hidden ),即上图中红色虚线框起的部分, hidden_1和hidden_2 ,每层的节点为 2 个。关键看一下连线代表的意义,和计算过程。可以从图上看到,每层的节点都与下一层的每个节点有一一对应的连线,每条连线代表一个权重,可以把它理解为信息传输的一条通路,但是每条路的宽度是不一样的,每条通路的宽度由该通道的参数,也就是该通路的权重来决定。为了说明这个问题,拿一个节点的计算过程来进行说明,看下图:
我们可以把H(1,1)看做一个既有输入又有输出的点,我们规定H_i (1,1)为输入,H_o (1,1)为输出。那么隐藏层的实际操作其实如下:
(p.s.)对于sigmoid(),其实最早人们在设计网络的时候,是没有这个过程的,统统使用线性的连接来搭建网络,但是线性函数没有上界,经常会造成一个节点处的数字变得很大很大,难以计算,也就无法得到一个可以用的网络。因此人们后来对节点上的数据进行了一个操作,利用sigmoid()函数来处理,使数据被限定在一定范围内。此外sigmoid函数的图像是一个非线性的曲线,因此,能够更好的逼近非线性的关系,因为绝大多数情况下,实际的关系是非线性的。sigmoid在这里被称为激励函数,这是神经网络中的一个非常重要的基本概念。下一目会具体说明激活函数。
经过上述的一个节点的说明,那么其他节点也就可以举一反三,一一计算出来。现在我们来简化一下网络。我们可以把x1,x2,x3作为一个向量 [x1,x2,x3] ,权重矩阵 u 也作为一个 3×2 的矩阵,w 作为一个 2×2 的矩阵,v作为一个 2×1的矩阵,三个矩阵如下:
可以看到这三个矩阵与网络中的结构图中是一一对应的。下面我们把隐藏层与输出层也写成矩阵的形式:
可以看到这两层隐藏层(hidden)的输入Hi 与 Ho 均为 1×2 的矩阵,输出层(output )为 1×1 的矩阵。下面就可以把网络简化为下面的结构:
根据我们刚才讲过的每个节点的计算方法,以及我们简化后的网络,则可以将整个计算过程等效的化为以下几个矩阵相城的步骤。这样y的值就得到了一次输出…… -
激活函数
(1)激活函数的意义
如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层输出都是上层输入的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了。
正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络就有意义了(不再是输入的线性组合,可以逼近任意函数)。最早的想法是sigmoid函数或者tanh函数,输出有界,很容易充当下一层输入(以及一些人的生物解释balabala)。激活函数的作用是为了增加神经网络模型的非线性。否则没有激活函数的每层都相当于矩阵相乘。即使叠加了若干层之后,仍是矩阵相乘,即没有非线性结构无法实现可行的神经网络。
(2)常用激活函数
① sigmoid函数
-
函数表达式
其导数可以用自身来表示: -
函数图像及其导数图像
上图为函数图像
上图为函数导数图像 -
函数特点分析
可以看到sigmoid函数能够将函数限制在 0到1 的范围之内。Sigmoid函数是深度学习领域开始时使用频率最高的activation function。它是便于求导的平滑函数,其导数可以用自身表示,这是优点。
然而,Sigmoid有三大缺点: -
容易出现gradient vanishing
-
函数输出并不是zero-centered
-
幂运算相对来讲比较耗时
- 反向传播
说明了正向传播后,我们对反向传播进行说明。首先明确一点,反向传播的信息是什么?反向传播的信息是误差,也就是 输出层(output )的结果与输入信息 x 对应的真实结果之间的差距。
(1) 误差函数
式子中d_o (k)为导师训练值(实际值),y_o (k)为神经网络经输出层后的输出结果。当|e|<ε,ε为所要求的的精度时,我们认为训练得较好。
所以我们现在的目的就是不断地通过调整权重u,w,v(也就是网络的参数)来使网络计算的结果 尽可能的接近真实结果 y ,也就等价于是损失函数尽量变小。那么如何调整u,w,v 的大小,才能使损失函数不断地变小呢?这理又要说到一个新的概念:梯度下降法 。
(2) 梯度下降法(图源百度)
假设上图中的曲线就是损失函数的图像,它存在一个最小值。梯度是一个利用求导得到的数值,可以理解为参数的变化量。从几何意义上来看,梯度代表一个损失函数增加最快的方向,反之,沿着相反的方向就可以不断地使损失逼近最小值,也就是使网络逼近真实的关系。
那么反向传播的过程就可以理解为:根据误差函数,来反向计算出每个参数(如 u,v等)的梯度 d(u) ,d(v) …等等,再将原来的参数分别加上自己对应的负梯度,就完成了一次反向传播。
(3) 反向传播的具体过程以及公式
① 计算对输出层权值的偏导数
② 计算误差函数对隐含层各神经元的偏导数
③ 修正权值与阈值:
④ 以上就是一次完整的反向传播过程,需要说明的是,上式当中用到了一个符号 ,这又是一个重要的概念,学习率,一个小于1的实数,它的大小会影响网络学习的速率以及准确度。可以把它理解为梯度下降时的步长。
三、 BP神经网络在Matlab中的应用
最新版本的神经网络工具箱几乎涵盖了所有的神经网络的基本常用模型,如感知器和BP网络等。对于各种不同的网络模型,神经网络工具箱集成了多种学习算法,为用户提供了极大的方便[16]。Matlab R2007神经网络工具箱中包含了许多用于BP网络分析与设计的函数,BP网络的常用函数如表3.1所示。
下面介绍Matlab中的常用神经网络