BP神经网络的缺陷及对策
基于误差梯度信息的反向传播算法(BP)的提出,破除了明斯基的魔咒,解决了多层前馈神经网络(MLFNN)的训练问题,为神经网络的繁荣昌盛立下了汗马功劳。但该算法与生俱来就存在诸多缺陷。本文和各位探讨和交流本人利用MATLAB Neural Networks Toolbox进行BPNN应用研究中的一些问题及经验。(您可以传播本文,可以引用本文的观点,但不可以据为己有。欢迎有不同看法和意见,欢迎交流,Email:)
1 BP算法的缺点
1.1 对初始权重非常敏感,极易收敛于局部极小
BP算法本身就是一个优秀的局部搜索算法,加上BPNN对初始网络权重非常敏感,以不同的权重初始化网络,BP算法会收敛于不同的局部极小。这是很多初学者每次训练得到不同结果的根本原因。
1.2 往往停滞于误差梯度曲面的平坦区,收敛缓慢甚至不能收敛
在误差梯度曲面的平坦区,误差梯度信息极小,每次对权重的改变量也极小,使得网络收敛及其缓慢,甚至网络不能收敛。尽管提出了诸如自适应学习速率、添加动量项、共轭梯度以及牛顿、LM等训练方法,使得这个问题有所改善,但都没有根本解决这个问题。
1.3 过拟合/过训练
我经常看到Over Fitting和Over Training,我一开始觉得这两个概念没有什么区别。不过后来我发现还是有区别的。
过拟合主要指训练后的网络对训练样本(Train sample)具有极高的拟合精度,但是对工作样本(Work sample)的预测误差却非常大。过拟合着重于网络的推广能力(Generalization Ability)问题。过训练主要指训练网络时,尽管训练误差还在下降,但是对于验证样本(Validation Sample)的误差已经不再下降,甚至逐渐增大。其结果也表现为训练后网络的推广能力低。但是概念还是有区别的,前者强调训练结果,后者着重于训练过程。
1.4 网络隐含节点数的确定
隐含层数的确定基本上没有什么争议了。因为已经从数学上证明具有Sigmoidal激励函数的单隐层FNN可以实现从m维到n维的非线性映射。但是隐含节点数(隐含层神经元的个数)的确定至今没有任何理论上指导,尽管有一些经验公式,但仅供参考而已,具体问题还是要具体分析。
除此以外,BPNN还有诸如网络各层的激励函数的选择、训练算法选择、训练参数的设置等等问题,但基本上我认为这些都不是什么大问题了。
2 对策(个人看法,仅供参考)
2.1 解决初始权重敏感性和局部收敛问题
如果您要每次训练得到相同或者说可重现的结果,在MATLAB中,你可以选择如下方法之一:
(1)固定随机数字发生器的状态。具体操作请参考rand函数的帮助信息;
(2)以一个固定的权重矩阵初始化网络。具体参考net对象的属性IW、LW、b以及init函数的帮助信息。
但是以上方法都是一种逃避现实的做法,同时不能解决收敛于局部极小的问题。目前来说,更好的方法是引入进化计算方法,如GA、PSO、EP、ES、SA等等,也有ACS选择最佳初始权重的文献报道。但我的经验是,GA、ES、EP、SA要优于PSO,ACS不能用于训练网络权重(本人尚未见有ACS训练网络权重的文献)。
拿GA和PSO来说(因为这两种进化算法在FNN的训练中最为常用),GA相对于PSO实现起来要复杂一些,因为GA拥有selection、crossover、mutation等方法更新换代,远胜于PSO较为单一的仅靠速度更新换代。但是GA不能帮助我们获得高精度的最优解,只能是最接近最优解。因此,有大量的文献报道了先用GA获得近似最优解,赋予网络初始化,再用BP进行训练,从而获得较高精度的解。PSO算法,根据本人的经验,不仅存在训练精度低的问题,也存在局部收敛的问题,尽管提出了很多改进的PSO算法。大多数时候,单纯的基于群体的进化算法比BP算法收敛更慢。基于群体的进化算法的一个通病都是一种随机搜索算法,因为群的初始化同BPNN的初始化一样,都受到随机数字发生器状态的影响。
直到现在,还没有一个特异的高精度的全局搜索算法出现,来解决FNN的这个问题。如果您发展出这样一种算法,您将一鸣惊人。
2.2 解决陷入平坦区收敛缓慢甚至不能收敛的问题
如果采用自适应学习速率、添加动量项、共轭梯度、牛顿、LM等方法还不能解决,您可以考虑采用进化算法GA、PSO等等。这些算法不依赖梯度信息,因此没有这个问题。但是正如上述,这些算法的收敛精度可能不高。
2.3 解决过拟合、过训练的问题
过拟合的解决方法是设置满足问题求解精度要求的上限,不要将目标误差设置太小。个人认为过拟合还与样本过于冗余有关,采用删除冗余样本信息的特征样本,不仅可以加快训练速度,还可以改善过拟合问题。解决过训练的方法,通常采用验证样本,通过验证样本误差的下降趋势来决定何时结束训练,这就是最有停止法(Early Stopping)。
2.4 解决隐含节点数确定的问题
现在可能最好的方法是采用进化算法,如GA、PSO等,进行优化计算来确定。当然,对于小规模的FNN,采用递增或递减也不失为一种好方法,但对大规模FNN,工作量太大。
其实,NN的另一个重要方面,是训练样本的质量和代表性问题。