神经网络的定义:神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应”。
神经网络中最基本的成分是神经元(neuron)模型,即上述定义中的“简单单元”。
神经元是神经网络中最基本的结构,也可以说是神经网络的基本单元,它的设计灵感完全来源于生物学上神经元的信息传播机制。神经元有两种状态:兴奋和抑制。一般情况下,大多数的神经元是处于抑制状态,但是一旦某个神经元收到刺激,导致它的电位超过一个阈值,那么这个神经元就会被激活,处于“兴奋”状态,进而向其他的神经元传播化学物质(其实就是信息)。
1943年,McCulloch和Pitts将上图的神经元结构用一种简单的模型进行了表示,构成了一种人工神经元模型,也就是我们现在经常用到的“M-P神经元模型”,如下图所示:
图中: θ θ θ是神经元的激活阈值,函数 f ( ⋅ ) f(⋅) f(⋅)被称为激活函数。
函数 f ( ⋅ ) f(⋅) f(⋅)可以用一个阶跃方程表示,大于阈值激活,否则则抑制。理想中的激活函数阶跃函数,然而阶跃函数具有不连续、不光滑等不好的性质,因此我们更常用的方法是用sigmoid函数来表示函数函数 f ( ⋅ ) f(⋅) f(⋅)。
把许多个这样的神经元按-定的层次结构连接起来,就得到了神经网络。
感知机(Perceptron)由两层神经元组成,如图所示,输入层接收外界输入信号后传递给输出层,输出层是M-P神经元,亦称“阈值逻辑单元”(threshold logic unit)。
感知机能容易地实现逻辑与、或、非运算。更一般地,给定训练数据集,权重 w i ( i = 1 , 2 , … , n ) w_i (i=1, 2, …,n) wi(i=1,2,…,n)以及阈值 θ θ θ可通过学习得到。
感知机学习规则非常简单,对训练样例 ( x , y ) (x,y) (x,y),若当前感知机的输出为y,则感知机权重将这样调整:
其中 η ∈ ( 0 , 1 ) η∈(0,1) η∈(0,1) 称为学习率(learning rate)。从式可看出,若感知机对训练样例 ( x , y ) (x,y) (x,y)预测正确,即 y ^ = y \hat{y}=y y^=y,则感知机不发生变化,否则将根据错误的程度进行权重调整。
需注意的是,感知机只有输出层神经元进行激活函数处理,即只拥有一层功能神经元(functional neuron),其学习能力非常有限.
事实上,上述与、或、非问题都是线性可分(linearly separable)的问题.可以证明,若两类模式是线性可分的,即存在一个线性超平面能将它们分开,如图5.4(a)-©所示,则感知机的学习过程一定会收敛(converge)而求得适当的权向量 w = ( w 1 ; w 2 ; … ; w n + 1 ) w= (w_1;w_2;…;w_{n+1}) w=(w1;w2;…;wn+1),否则感知机学习过程将会发生振荡(fuctuation), w难以稳定下来,不能求得合适解,例如感知机甚至不能解决如图5.4(d)所示的异或这样简单的非线性可分问题.
要解决非线性可分问题,需考虑使用多层功能神经元.例如下图中这个简单的两层感知机就能解决异或问题.
在图中,输出层与输入层之间的一层神经元,被称为隐层或隐含层(hidden layer),隐含层和输出层神经元都是拥有激活函数的功能神经元.
更一般的,常见的神经网络是形如图5.6所示的层级结构,每层神经元与下-层神经元全互连,神经元之间不存在同层连接,也不存在跨层连接.这样的神经网络结构通常称为“多层前馈神经网络”(multi-layer feedforward neural networks),
其中输入层神经元接收外界输入,隐层与输出层神经元对信号进行加工,最终结果由输出层神经元输出;
换言之,输入层神经元仅是接受输入,不进行函数处理,隐层与输出层包含功能神经元.因此,图5.6(a)通常被称为“两层网络”。
为避免歧义,这里称其为“单隐层网络”。只需包含隐层,即可称为多层网络。
神经网络的学习过程,就是根据训练数据来调整神经元之间的“连接权”(connection weight)以及每个功能神经元的阈值;换言之,神经网络“学”到的东西,蕴涵在连接权与阈值中。
多层网络的学习能力比单层感知机强得多.需要更强大的学习算法.
误差逆传播(error BackPropagation,简称BP)算法就是其中最杰出的代表,它是迄今最成功的神经网络学习算法.
现实任务中使用神经网络时,大多是在使用BP算法进行训练.值得指出的是,BP算法不仅可用于多层前馈神经网络,还可用于其他类型的神经网络,例如训练递归神经网络[Pineda, 1987].
但通常说“BP网络”时,一般是指用BP算法训练的多层前馈神经网络.
给定训练集 D = { ( x 1 , y 1 ) , ( x 1 , y 1 ) , … … , ( x m , y m ) } , y i ∈ R d D=\{(x_{1},y_{1}),(x_{1},y_{1}),……,(x_{m},y_{m})\},y_{i}\in R^{d} D={(x1,y1),(x1,y1),……,(xm,ym)},yi∈Rd,即输入示例由d个属性描述,输出l维实值向量.
对训练例 ( x k , y k ) (x_k, y_k) (xk,yk),假定神经网络的输出为 y ^ k = ( y ^ 1 k , y ^ 2 k , … … , y ^ l k ) \hat{y}_{k}=(\hat{y}_{1}^k,\hat{y}_{2}^k,……,\hat{y}_{l}^k) y^k=(y^1k,y^2k,……,y^lk),即
则网络在 ( x k , y k ) (x_k, y_k ) (xk,yk)上的均方误差为:
图5.7的网络中有 ( d + l + 1 ) q + l (d+l+1)q+l (d+l+1)q+l个参数需确定:输入层到隐层的 d × q d×q d×q个权值、隐层到输出层的 q × l q×l q×l个权值、 q q q个隐层神经元的阈值、 l l l个输出层神经元的阈值.
BP是一个迭代学习算法,在迭代的每一轮中采用广义的感知机学习规则对参数进行更新估计,即与式类似,任意参数v的更新估计式为:
如何求每一个节点的梯度?
链式法则->反向传播
BP算法基于梯度下降(gradient descent)策略,以目标的负梯度方向对参数进行调整.对式的误差E_k,给定学习率η,有:
注意到 W h j W_{hj} Whj先影响到第 j j j个输出层神经元的输入值 B j B_j Bj,再影响到其输出值 y ^ j k \hat{y}_j^k y^jk,然后影响到 E k E_k Ek,有:
根据 B j B_j Bj的定义,显然有:
Sigmoid函数有一个很好的性质:
于是有:
于是,得到了BP算法中关于 W h j W_{hj} Whj的更新公式:
类似可得:
学习率 η ∈ ( 0 , 1 ) η∈(0,1) η∈(0,1)控制着算法每一轮迭代中的更新步长,若太大则容易振荡,太小则收敛速度又会过慢。
BP算法的工作流程.对每个训练样例:
需注意的是,BP算法的目标是要最小化训练集D上的累积误差,
但我们上面介绍的“标准BP算法”每次仅针对一个训练样例更新连接权和阈值,也就是说,算法的更新规则是基于单个的E_k推导而得.
如果类似地推导出基于累积误差最小化的更新规则,就得到了累积误差逆传播(accumulated error backpropagation)算法.
损失函数中,求和并不影响单个求导,所以,是多个样例的求和
两种方法的比较:
两种方法的缺点?
标准BP:震荡,
累积BP:大样本时速度慢
Hornik 在1989年已经证明,只需一个包含足够多神经元的隐层,多层前馈网络就能以任意精度逼近任意复杂度的连续函数。然而,如何设置隐层神经元的个数仍是个未决问题,实际应用中通常靠“试错法”(trial-by-error)调整.
试错法:为了追求达到理想目标而通过不断试验和消除误差,探索具有黑箱性质的系统的方法。统称为试错法
有两种策略常用来缓解BP网络的过拟合:
仍令 E k E_k Ek表示第 k k k个训练样例上的误差, w i w_i wi表示连接权和阙值,则误差目标函数改变为:
其中 λ ∈ ( 0 , 1 ) λ∈(0,1) λ∈(0,1)用于对经验误差与网络复杂度这两项进行折中,常通过交叉验证法来估计。
若用 E E E表示神经网络在训练集上的误差,则它显然是关于连接权 w w w和阈值 θ θ θ的函数。此时,神经网络的训练过程可看作一个参数寻优过程,即在参数空间中,寻找一组最优参数使得 E E E最小。
两种“最优”:“ 局部极小”(local minimum)和“全局最小”(global minimum)。对 w ∗ w^* w∗和θ ∗ ^* ∗,若存在 ϵ > 0 ϵ>0 ϵ>0使得:
都有 E ( w ; θ ) ≥ E ( w ∗ ; θ ∗ ) E(w;θ)≥E(w^*;θ^*) E(w;θ)≥E(w∗;θ∗) 成立,则 ( w ∗ ; θ ∗ ) (w^*;θ^*) (w∗;θ∗)为局部极小解;若对参数间中的任意 ( w ; θ ) (w;θ) (w;θ)都有 E ( w ; θ ) ≥ E ( w ∗ ; θ ∗ ) E(w;θ)≥E(w^*;θ^*) E(w;θ)≥E(w∗;θ∗),则 ( ( w ∗ ; θ ∗ ) ((w^*;θ^*) ((w∗;θ∗)为全局最小解。两者对应的 E ( w ∗ ; θ ∗ ) E(w^*;θ^*) E(w∗;θ∗) 分别称为误差函数的局部极小值和全局最小值。
基于梯度的搜索是使用最为广泛的参数寻优方法.在此类方法中,我们从某些初始解出发,迭代寻找最优参数值.每次迭代中,我们先计算误差函数在当前点的梯度,然后根据梯度确定搜索方向。
如果误差函数具有多个局部极小,则不能保证找到的解是全局最小.对后一种情形,我们称参数寻优陷入了局部极小,这显然不是我们所希望的.
在现实任务中,人们常采用以下策略来试图“跳出”局部极小,从而进一步接近全局最小:
此外,遗传算法也常用来训练神经网络以更好地逼近全局最小。
标准BP算法实质上是一种简单的最速下降静态寻优算法, 在修正权值w(k)时,只是按k时刻的负梯度方向进行修正, 没有考虑积累的经验,即以前的梯度方向,从而使学习过程振荡,收敛缓慢。
附加动量法使网络在修正权值时不仅考虑误差在梯度上的 作用,而且考虑在误差曲面上变化趋势的影响。
其中:
所加入的动量项实质上相当于阻尼项,它减小了学习过程 的振荡趋势,改善了收敛性,是一种应用比较广泛的改进 算法。
标准BP学习算法采用的是一阶梯度法,因而收敛较慢。若 采用二阶梯度法,则可以大大提高收敛性。
虽然二阶梯度法具有较好的收敛性,但是需要计算 E E E对 w w w的 二阶导数,这个计算量很大。所以一般不直接采用二阶梯度法,而常常采用变尺度法或共轭梯度法,它们具有如二阶梯度法收敛较快的优点,又无需直接计算二阶梯度。
在BP算法中,网络权值的调整取决于学习速率和梯度。
自适应学习率调整准则是:检查权值的修正是否真正降低了误差函数,如果确实如此,则说明所选的学习率小了,可对其增加一个量;若不是则说明产生了过调,那么就应减小学习速率的值。
当连续两次迭代其梯度方向相同时,表明下降太慢,这时可使步长加倍;当连续两次迭代其梯度方向相反时,表明下降过头,这时可使步长减半。
包括原始数据的收集、数据分析、变量选择和数据的预处理
尺度变换常常将它们变换到[-1,1]或[0,1]的范围。
在进行尺度变换前必须先检查是否存在异常点(或称野点),这些点必须删除。
通过对数据的预处理分析还可以检验其是否存在周期性、固定变换趋势或其它关系。
对数据的预处理就是要使得经变换后的数据对于神经网络更容易学习和训练。
对于一个问题应该选择多少数据,这也是一个很关键的问题。
系统的输入输出关系就包含在数据样本中。一般来说,取的 数据越多,学习和训练的结果便越能正确反映输入输出关系。
但选太多的数据将增加收集、分析数据以及网络训练付出的代价;选太少的数据则可能得不到正确的结果。
事实上数据的多数取决于许多因素,如网络的大小、网络 测试的需要以及输入输出的分布等。
其中网络的大小最关键。通常较大的网络需要较多的训练数据。
在神经网络训练完成后,需要有另外的测试数据来对网络加以检验,测试数据应是独立的数据集合。
最简单的方法是(交叉验证):将收集到的可用数据随机地分成两部分,比如其中三分之二用于网络的训练。另外三分之一 用于将来的测试。随机选取的目的是为了尽量减小这两部分数据的相关性。
影响数据大小的另一个因素是输入模式和输出结果的分布, 对数据预先加以分类可以减小所需的数据量。相反,数据 稀薄不匀甚至覆盖则势必要增加数据量。
神经网络的类型很多,需根据问题的性质和任务的要求来 合适地选择网络类型。
一般从已有的网络类型中选用一种比较简单而又能满足要求的网络,新设计一个网络类型来满足问题的要求往往比 较困难。
若主要用于模式分类,尤其是线性可分的情况,则可采用 较为简单的感知器网络。
若主要用于函数估计,则可应用BP网络。
在网络的类型确定后,需要选择网络的结构和参数。
以BP网络为例,需选择网络的层数、每层的节点数、初始 权值、阈值、学习算法、学习率等参数。
有些项的选择有一些指导原则,但更多的是靠经验和试凑。
对于网络层数的选取:
增加层数主要可以更进一步降低误差,提高精度,但同时也使网络复杂化,从而增加了网络权值的训练时间。
而误差精度的提高实际上也可以通过增加隐含层中的神经元数目来获得,其训练效果也比增加层数更容易观察和调整。所以,一般情况下,应优先考虑增加隐含层中的神经元数。
对于每层节点数的选取:
对于具体问题若确定了输入和输出变量后,网络输入层和输出层的节点个数也便随之确定了。
隐层节点数对网络的泛化能力有很大的影响。节点数太多,倾向于记住所有的训练数据,包括噪声的影响,反而降低了泛化能力;节点数太少,不能拟和样本数据,没有较好的泛化能力。
原则:选择尽量少的节点数以实现尽量好的 泛化能力。
具体选择可采用如下方法:先设较少的节点,对网络进行训练,并测试网络的逼近误差,然后逐渐增加节点数,直到测试的误差不再有明显的减少为止。
初始权值的选取:
由于系统是非线性的,初始值对于学习是否达到局部最小、是否能够收敛以及训练时间的长短关系很大。
如果初始值太大,使得加权后的输入落到激活函数的饱和区,从而导致其导数非常小,而在计算权值的修正公式中,修正量正比与其导数,从而使调节过程几乎停顿下来。
一般总是希望经过初始加权后的每个神经元的输出值都接近于零,这样可以保证每个神经元的权值都能够在他们的S 型激活函数变化最大之处进行调节。所以,一般取初始权 值在(-1,1)之间的随机数。
学习速率的选取:
学习速率决定每一次循环训练中所产生的权值变化量。大的学习速率可能导致系统的不稳定 ;小的学习速率会导致训练较长,收敛速度很慢。不过能保证网络的误差值不跳出表面的低谷而最终趋于最小误差值。
一般情况下,倾向于选取较小的学习速率以保证系统的稳 定性。学习速率一般的选取范围为 0.01 - 0.8 0.01-0.8 0.01-0.8 和初始权值的选取过程一样,在一个神经网络的设计中,网络要经过几个不同的学习速率的训练。通过观察每一次训练后的误差平方和的下降速率来判断选定的学习速率是否合适。 如果下降很快,说明学习速率合适。若出现振荡,则说明学习速率过大。
对于较复杂的网络,为了减小寻找学习速率的训练次数以及训练时间,比较合适的方法是采用自适应学习速率。
对所有样本数据正向运行一次并反向修改连接权一次称为一 次训练(或一次学习) 。 通常训练一个网络需要成百上千次。 并非训练的次数越多,越能得到正确的输入输出的映射关系。
训练网络的目的在于找出蕴含在样本数据中的输入和输出之间的本质联系,从而对于未经训练的输入也能给出合适的输出,即局部泛化能力。
网络的性能主要是用它的泛化能力来衡量,它不是用对训练数据的拟和程度来衡量,而是用一组独立的数据来加以测试和检验。
由于所收集的数据都是包含噪声的,训练的次数过多,网络将包含噪声的数据都记录了下来,在极端情况下,训练后的网络可以实现相当于查表的功能。但是对于新的输入数据却不能给出合适的输出,即并不具备很好的泛化能力。
实际操作时应该训练和测试交替进行,即每训练一次,同时用测试数据测试一遍,画出均方误差随训练次数的变换曲线 。
在用测试数据检验时,均方误差开始逐渐减小,当训练次数再增加时,测试检验误差反而增加,误差曲线上极小点所对应的即为恰当的训练次数,若再训练即为“过度训练”了。
项目实战请转至:
[1] tensorflow学习笔记(三):利用BP线性回归
[2] tensorflow学习笔记(四):利用BP手写体(MNIST)识别
系列相关论文:
1.卷积神经网络CNN模块化剖析
2.用于图像分类的经典的卷积神经网络CNN
3.神经⽹络可以计算任何函数的可视化证明