尽管神经网络的研究和应用已经取得巨大成功,但在网络的开发设计方面至今仍没有一套完善的理论做指导,应用中采取的主要设计方法是,在充分了解待解决问题的基础上将经验与试探相结合,通过多次改进性试验,最终选出一个较好的设计方案。下面是在开发神经网络中常用的基本方法和实用技术。
(1) 网络信息容量与训练样本数
多层神经网络的分类能力与网络信息容量相关,如果网络的权值和阈值总数nw表征网络信息容量,研究表明,训练样本数N与给定的训练误差ε之间应满足以下匹配关系:
N = nw / ε.
上式表明网络的信息容量与训练样本数之间存在合理匹配关系。在解决实际问题时,训练样本数常常难以满足以上要求。对于确定的样本数,网络参数太少则不足以表达样本中所蕴含的全部规律即发生欠拟合;而网络参数太多,则可能发生过拟合,造成网络的泛化能力减弱。所以,通过上式根据设定的网络结构和误差要求,可以评估一下大致需要多少训练样本。
(2) 训练样本集的准备
训练数据的准备工作是网络设计与训练的基础,数据选择的科学合理性以及数据表示的合理性对于网络设计具有极为重要的影响。数据准备分为原始数据的收集、数据分析、变量选择和数据预处理等诸多步骤。
输入输出量的选择。
一般来讲,输出量代表系统要实现的功能目标,常常是系统的性能指标,分类问题的类别归属,或非线性函数的函数值等。输入量必须选择那些对输出影响大且能检测或提取的变量,此外还要求输入变量之间互不相关或相关性很小。如果对于某个变量是否合适作网络输入没有把握,可分别训练含有和不含有该输入变量的两个网络,对比其效果。从输入、输出量的性质来看,可分为两类:一是数值变量,一类是语言变量。数值变量指的是数值确定的连续量和离散量。而语言变量是用自然语言表示的概念,其“语言值”使用自然语言标识的事物的各个属性,比如颜色、性别、规模等。当选择语言变量作为网络输入或输出时,需将语言值进行编码转变为离散的数值量。
输入量的提取与表示。
通常需要使用信号处理与特征提取技术从原始数据中提取能够反映其特征的若干特征参数作为网络的输入。常见的典型情况有文字符号输入、曲线输入、函数自变量输入和图像输入。字符输入常常根据要识别的字符的特征进行编码之后再作为网络输入;曲线输入通常进行离散化采样,在满足香农采样定理的前提下等间隔采样,也可以根据小波变化或短时傅里叶变换的思想在曲线变化大的地方细分间隔,在曲线平坦的地方放宽间隔;函数自变量输入直接采用待拟合的曲线的自变量作为网络输入;图像输入则很少直接采用像素点的灰度值作为网络输入,通常根据识别的具体目的从图像中提取一些有用的特征参数,再根据这些参数对输入的贡献进行筛选,而这些特征提取则属于图像处理的范畴。
输出量的表示。
0,1或者-1,1表示为二分类;多个有限的离散值表示为多分类;[0,1]之间表示为逻辑回归;连续值表示为拟合。
输入输出数据的预处理。
尺度变换,也叫归一化或标准化(normalization)。进行尺度变换的原因是:网络的输入数据常常具有不同的物理意义和不同量纲,尺度变换为0~1之间使网络训练一开始就给各输入分量以同等重要地位;BP网络的神经元均采用Sigmoid激发函数,变换后可防止输出饱和;Sigmoid激发函数的输出为0~1之间,作为教师信号的输出数据如不进行变换处理,势必使数值大的输出分量绝对误差大,数值小的输出分量绝对误差小,会导致权值调整不均匀。尺度变换是一种线性变换,当样本分布不合理时,线性变换只能统一样本数据的变化范围,而不能改变其分布规律。适合网络训练的样本分布应该比较均匀,相应的样本分布曲线应比较平坦,当样本分布不理想时,最常用是分布变换。比如对数变换或平方根、立方根等。由于变换是非线性的,其结果不仅压缩了数据变化的范围,而且改善了其分布规律。
训练集的设计。
训练样本数的确定。一般来说训练样本数越多,训练结果越能正确反映其内在规律,但样本的收集整理往往受到客观条件的限制。此外,当样本数量多到一定程度,网络的精度也很难再提高。实践表明,网络训练所需的样本数取决于输入-输出非线性映射关系的复杂度,映射关系越复杂,样本中含的噪声越大,为保证映射精度所需的样本数越多,而网络规模也越大。因此,可以参考这样一个经验规则,即:训练样本数是网络连接权总数的5~10倍。样本的选择和组织。网络训练中提取的规律蕴含在样本中,因此样本一定要有代表性。样本的选择要注意样本类别的均衡,尽量使得每个类别的数量大致相等。即使是同一类样本也要照顾到样本的多样性和均匀性。按照这种“平均主义”原则选择的样本能使网络在训练时见多识广,而且可以避免网络对样本数量多的类别“印象深”,而对样本数量少的类别“印象浅”。同类样本太集中会使得网络训练时倾向于只建立与其匹配的映射关系,而当另一类别样本集中输入时,权重的调整又转向新的映射关系而将前面的训练结果否定。当各类样本轮流集中输入时,网络的训练会出现振荡使训练时间延长。
(3) 初始权值的设计
网络权值的初始化决定了网络的训练从误差曲面的哪一点开始,因此初始化方法对缩短网络的训练时间至关重要。神经元的变换函数都是关于零点对称的,如果每个节点的净输入均在零点附近,则其输出均处在变换函数的中点。这个位置是其变换最敏感的地方,必然使得网络学习速度快。为了使得各个结点的初始净输入在零点附近,有两种办法可以采用:一是使得初始权值足够小;二是使得初始权值为+1和-1的数量相等。应用中对隐含层权值可采用第一种办法,而对输出层可采用第二种办法。如果输出层权值太小,会使得隐层权值在训练初期的调整量变小,因此采用第二种权值与净输入兼顾的办法。
(4) 神经网络结构设计
神经网络在训练样本问题解决后,网络的输入层结点和输出层结点数便已确定。因此神经网络结构设计主要解决设置几个隐含层和每个隐含层设置几个结点的问题。以下是神经网络的设计者们通过大量实践积累的经验。
隐含层数的设计。
理论证明单隐层的感知器可以映射所有连续函数,只有当学习不连续函数(如锯齿波等)时,才需要两个隐层,所以多层感知器最多需要两个隐层。再设计多层感知器时,一般先考虑设一个隐层,当一个隐层的隐结点数很多仍不能改善网络性能时,才考虑再增加一个隐层。经验表明,采用两个隐层时,如在第一个隐层设置较多的隐结点而第二层设置较少的隐结点,则有利于改善多层前馈网络的性能。此外,对于有些实际问题,采用双隐层所需的隐节点数可能少于单隐层所需的隐节点数。所以,对于隐节点仍不能明显降低训练误差的情况,应当尝试一下增加隐层数。
隐节点数的设计。隐节点的作用是从样本中提取并存储内在规律,每个隐节点有若干权值,而每个权值都是增强网络映射能力的一个参数。隐节点数太少,网络从样本中获取信息的能力就差,不足以概括和体现集中的样本规律;隐节点数太多,可能把样本中非规律性内容如噪声等也学会记劳,从而导致过拟合,造成网络泛化能力减弱。确定最佳隐节点数的一个常用方法是试凑法,可先设置较少的隐节点进行训练,然后逐渐增加隐节点数,用同一个样本集进行训练,从中确定网络误差最小时对应的隐节点数。在用试凑法时,可以用一些确定隐节点数的经验公式。这些公式计算出来的隐节点数只是一种粗略的估计值,可作为试凑法的初始值。其中m为隐层结点数,n为输入层节点数,为输出层节点数,α为1~10之间的常数。
m = sqrt(n+l)+α
m = log2(n)
m = sqrt(nl)
(5) 网络训练与测试
网络设计完成后,要应用设计值进行训练。训练时对所有样本正向运行一轮并反向修改权值一次称为一次训练。在训练过程中反复使用样本集数据,但每一轮最好不要按固定的顺序取数据。通常训练一个网络需要成千上万次。
网络的性能好坏主要看其是否具有很好的泛化能力,而对泛化能力的测试不能用训练数据,而应该用训练数据之外的验证(validation)集。只有训练好的网络在验证集上表现良好才能说明网络训练良好,因此通常是用在验证集上的误差精度来终止训练过程,而不是用训练集上的误差精度。如果网络在训练集上误差非常小,而在验证集上误差却很大,则有可能发生了过拟合。训练次数越多,训练集上误差会越小,而在验证集上误差会先小后增,因此会大致有一个最佳的训练次数。通常在实现中可以判定验证集误差的改变来作为终止训练的标准。比如设定在验证集上,本次训练后的误差要比前一次训练后的误差大20%,就认为前一次训练的结果已经是最佳,则保留前一次训练的网络权值作为训练的结果。