logo资料库

神经网络实际训练中的问题.pdf

第1页 / 共19页
第2页 / 共19页
第3页 / 共19页
第4页 / 共19页
第5页 / 共19页
第6页 / 共19页
第7页 / 共19页
第8页 / 共19页
资料共19页,剩余部分请下载后查看
神经网络实际训练中的问题 by: 吴少风 下文翻译自Martin T. Hagan 编著的《神经网络设计》,第二版,第22 章。仅供个人学 习交流目的。更准确内容,请购买或去图书馆借阅原著。 目前为止,出现了各种各样的神经网络结构,及其对应的学习规则。在深入理解这些结 构和规则的基础上,要灵活自如地运用神经网络这一技术,就要结合理论运用到实际中去。 那么在实际应用中,应该选择一个什么样的网络结构?如何去训练这个网络?训练的效果怎 么样? 接下来将聚焦于这些问题。 不过,在深入到神经网络的训练细节前,极其重要的一点,必须首先确定:你的问题是 否适合用神经网络解决?或者更简单的线性方法是否已经足够?例如,对于拟合问题,如果 标准的线性回归就可以产生满意的结果,那么就没有必要使用神经网络。神经网络技术虽然 提供了更强大的能力,但是是以更加艰巨的训练需求为代价的。如果线性方法可以满足要求, 应该首先选择线性方法。 训练神经网络可以分为三个阶段:训练前的工作,训练,训练后的分析。图 1 展示了训 练神经网络的迭代流程。首先是收集数据,并作预处理从而使训练更高效,同时将数据分为 训练、验证、测试三个子集。接下来是根据要解决的问题选择一个网络类型(多层、竞争、 动态等)和结构(层数、神经元个数)。再就是选择一个和网络对应的训练算法。当训练结 束后,还需要分析这个网络的性能。通过分析可能会发现前面数据、结构、算法方面的问题, 然后选择数据重新开始,直到性能符合要求为止。
1. 训练前 训练前有许多步骤要做,可将其大致分为三类:数据的选择、数据预处理、网络类型和 结构的选择。 1.1. 数据的选择 将先验知识融合进神经网络是很困难的,因此神经网络仅仅对训练它的数据表现良好。 训练数据必须覆盖应用场合输入空间的全部范围。正如 13 章讲的那样,有训练方法用来确 保网络在贯穿所提供数据的范围内准确内插(通常很好)。但是,对于训练集之外的输入, 网络的性能是不能保证的。像其他非线性黑盒方法一样,神经网络外延性能不好。 保证训练数据对输入空间充分采样,不总是容易的。对于简单的问题,输入向量的维数 较小,向量的每个元素可以单独选择,从而形成网格来采样输入空间。然而,对于很多问题, 输入向量的维数很大,不可能用网格采样。此外,输入变量相互依赖也是经常遇到的情况。 例如图 2 中,阴影区域是两个输入变量的可变范围,尽管每个变量的范围都是-1 到 1,但是 没有必要使用图中点阵所示贯穿两个变量全部范围的网格。神经网络只需要匹配阴影区域, 因为网络工作在这个区域。让网络适配工作范围外的区域是低效的。当维数很大时尤其真切。 精确定义输入空间的有效范围可能不太现实。然而,对试图建立模型的系统进行标准操 作时,通常可以收集数据。一些情况可以完全控制数据收集实验的设计,这时,必须确保实 验的设置让系统通过即将应用网络的全部工况。 那么怎么确保训练数据对输入空间充分采样呢?在训练之前这是难以确认的,有许多情 况,对数据收集过程没有控制,而且必须利用可用的任何数据。训练后部分还会讲到。通过 分析训练过的网络,常常就可以辨别训练数据是否充分了。此外,还可以用训练数据之外的 数据验证,这不会提高网络的性能,但会帮助我们避免在不可靠的情况下使用网络。 收集到数据后,通常将数据分为三个集合:训练、验证、测试。训练数据集通常占全部 的 70%左右,验证、测试各占 15%左右。值得重视的是,每一个集合都要能代表整个数据 集——验证和测试的数据集要能覆盖训练集一样的的输入空间。选取一个集合,最简单的方 法是从整个数据集中随机抽取。这样通常就可以产生一个好的结果,但最好还是要检查一下 数据集之间的差异。也可能在训练后分析时发现数据划分的问题,后面将会详细说明。 关于数据选择,最后必须要问的一个问题是“我们有足够的数据吗?”这难以回答,特
别是在训练网络之前。数据需求的多少取决于:要近似的潜在函数的复杂程度(或者,要实 施的决策边界的复杂程度)。如果函数非常复杂,有许多转折点,这就需要大量数据。如果 函数非常平滑,数据需求量就会显著减少(除非数据含有大量噪声)。所需数据集大小和网 络包含神经元的数量有紧密的联系。当然,在训练一个网络前,通常不知道潜在函数有多复 杂。神经网络的整个训练过程是迭代的,就因为这个原因。训练结束,还要分析网络的性能, 分析结果会有助于判断数据是否足够。 1.2. 数据预处理 数据预处理阶段的主要目的是方便网络的训练。预处理考虑诸如这些内容:归一化、非 线性变换、特征提取、目标和离散输入的编码、缺失数据的处理等。对数据进行初步处理, 让神经网络提炼相关信息变得更容易。 例如,在多层网络中,sigmoid 传输函数常用于隐藏层,当网络输入大于 3 时,这些函 数相当容易饱和。这样的事不希望在训练的开始就发生,因为那样的话梯度会非常小。第一 层的网络输入是输入乘以权重加上偏置产生的,为了避免传输函数饱和,如果输入非常大, 那么权重必须要小。在应用于网络前,输入归一化是一个标准做法。用这种方法,把网络权 重初始化到一个小的随机值,可以保证输入与权重的乘积也是一个小值。当输入归一化后, 权重的量级也才有一致的意义。这对 13 章所述的规则化特别重要。然而,“小”是一个相对 的概念,如果输入非常小,就需要较大的权重来产生有意义的网络输入。小权重的意思是由 归一化输入阐述的。 1). 归一化 归一化有两种标准方法。第一种方法让数据落在一个标准范围,通常是-1 到 1. 另一种方法让数据有特殊的均值和偏差幅度,通常是 0 和 1. min 代表最小,max 代表最大,mean 代表平均值,std 代表标准差。p 为向量,./表示按 元素运算。 通常,对输入向量和目标向量都要进行归一化。 2). 非线性变换 除归一化这样的线性变换外,非线性变换有时也是预处理的一个步骤。不像归一化,有 一个可以应用到任意数据集的标准过程,非线性变换要具体情况具体分析。例如,很多经济 学变量呈对数关系,这时就可能需要对输入适当取对数。再例如,分子的动态仿真,原子力 和距离的倒数相关,因此,可能需要对输入取倒数。这也是将先验知识融合进神经网络的一 种方法。如果刚好机智地选择了一个恰当的非线性变换,则可以让网络训练更有效。在输入 和目标之间寻找潜在函数,预处理会为神经网络减轻一些工作。
3). 特征提取 特征提取通常应用在这种情况下:原始输入向量维数非常大,且输入向量组成有冗余。 特征提取的思想是减少输入空间的维度,通过从每个输入向量计算出一小组特征,用特征作 为网络的输入。例如,神经网络可以用于分析心电图(EKG),以定位心脏问题。数分钟之 内以高采样频率测得的心电图可能牵涉 12 至 15 个信号,将其直接应用到神经网络,数据则 显得过多。取而代之的是,从心电图信号提取特定的某些特征,例如特定波形间的平均时间 间隔,特定波形的平均幅值。 4). 主成分分析 也有一些通用的特征提取方法,主成分分析(PCA)就是其中的一种。这种方法将原始 输入向量变换为线性不相关的向量。而且,变换后的向量按方差从大到小排列。我们通常仅 仅保留变换后的前几个主要成分,因为他们在原始向量中方差最大。如果原始向量高度相关, 这就会极大减小输入向量的维数。PCA 的缺点是只考虑了输入向量间的线性相关性。如果 用线性变换减小维度,那么可能丢失一些非线性信息。因为使用神经网络的主要目的,就是 要获取它强大的非线性映射能力,所以对于运用主成分分析来减小输入向量维数应该非常谨 慎。有一种非线性版的 PCA,叫做 kernel PCA. 5). 编码目标 当输入和目标无论何时都只接受离散值时,编码也是一个重要的必要的预处理步骤。例 如,在模式识别问题中,每个目标都代表有限类别中的一个,这种情况就需要一个对输入和 目标编码的过程。如果一个模式识别问题具有四个类别,那么对目标编码至少有三种常见的 方法。一是,可以用标量目标接收四个可能的值(如:1、2、3、4)。二是,可以用二维目 标按二进制码表示四个类别(如:[0,0]、[0,1]、[1,0]、[1,1])。三是,可以用四维目标,一 次激活一个元素(如:[1,0,0,0]、[0,1,0,0]、[0,0,1,0]、[0,0,0,1])。在实验中第三种方法比较 容易产生最好的结果。离散输入编码也可以采用同样的方式。 当编码目标值的时候,还需要考虑网络输出层所用的传输函数。对于模式识别问题,通 常使用 sigmoid 函数:log-sigmoid 或者 tangent-sigmoid 函数。如果在最后一层选用 tangent- sigmoid 函数,那么可以考虑用函数的渐近线-1 和 1 作为目标值。但是这样会为训练算法带 来麻烦,算法会试图使函数饱和来迎合目标值。目标值的最佳点是在二阶导数最大的地方。 对于 tangent-sigmoid 函数,输入-1 和 1 对应输出为-0.76 和 0.76. 应用在多层模式识别网络中的另一个传输函数是 softmax 函数。该函数形如公式 3: softmax 函数的输出可以解释为与每个类相关的概率。每个输出都落在[0,1]的区间上, 且输出的总和等于 1. 6). 丢失数据 还有一个要考虑的实际问题是丢失数据的处理。这是经常出现的情况,特别是处理有缺
失的经济数据的时候。例如,我们可能需要每月对一个包含 20 个变量的输入向量采集数据, 但有可能在一些月份 20 个数据中有一两个没有正确采集到。最简单的方法是扔掉这些有数 据丢失的月份。但是可能受限于可用的数据的数量,或者再收集额外的数据可能代价很昂贵。 这些情况下,即使数据不完整,也希望充分利用现有的数据。 有些策略可以用来处理丢失数据。如果是一个输入变量有数据丢失,一种可能是用这个 输入变量的平均值替代丢失的数据。同时在输入矢量中添加一个标志元素,当输入变量有效 时标志置 1,当被替换时标志为 0,指示那个被平均值替代的丢失数据。有数据点丢失的每 一个变量都需要在输入向量中添加一个对应的标志元素。 如果目标的一个元素丢失数据,可以修改性能指标,排除因丢失目标值导致的偏差。所 有已知的目标值都会对性能指标发挥作用,但是丢失的不会。 1.3. 网络的选择 网络结构的基本类型是由带解决问题的类型决定的。一旦选定基本类型,就需要决定具 体细节,比如用多少神经元,多少层,网络有多少输出,训练时要用什么类型的性能函数。 1.3.1. 基本结构的选择 选择结构的第一步是定义待解决问题的类型。这里将问题限制在如下四个类型:拟合、 模式识别、聚类、预测。 1). 拟合 拟合也称为函数估计或回归。在拟合问题中使用神经网络目的是,在输入集合和相应目 标集合间建立映射关系。例如:房地产中介想要从税率、当地学校的学生/老师比、犯罪率 等这类变量输入中评估房屋的价格,汽车工程师想要根据油耗和速度的测量值评估发动机的 排放水平,医生想要基于体尺测量预测病人的体脂水平。拟合问题的目标变量是连续的。 对于拟合问题的标准神经网络是:具有 tansig 中间层神经元,和线性输出层神经元的多 层感知机。由于输入归一化的原因,中间层 tansig 传输函数通常优于 logsig 传输函数。tansig 函数产生以 0 附近为中心的输出,而 logsig 函数总是产生正的输出。对于大多数拟合问题, 单个中间层就足够了。如果结果不理想,有时也用两个中间层。一个标准拟合问题很少用超 过两个中间层,尽管具有很多层的深度网络在解决复杂问题中已经得到应用。线性传输函数 用于拟合问题的输出层,是因为目标输出是连续变量。正如在 11 章看到的,sigmoid 传输函 数的两个中间层加上线性传输函数的输出层,就是一个万能逼近器。 径向基函数网络也可用于拟合问题,这种网络的中间层普遍用高斯传输函数,输出层用 线性传输函数。 2). 模式识别 模式识别也称为模式分类。模式识别应用神经把输入归类到目标类别中的一个。例如: 红酒商想要通过红酒的化学分析,识别一瓶红酒来自哪个葡萄园;医生要基于细胞大小的一 致性、聚集的厚度、细胞分裂,判断肿瘤是良性还是恶性。 多层感知机也可用于模式识别。和拟合网络主要的区别是,输出层采用的传输函数不同。
对于模式识别问题,通常在输出层采用 sigmoid 函数。径向基函数网络也可用于模式识别。 3). 聚类 聚类或者分段是神经网络的另一个应用。聚类问题用神经网络根据相似性将数据分组。 例如:商人希望按照人们的消费模式把市场分片;计算机科学家想要把数据划分为相关子集 深度挖掘数据;生物学家希望用来做生物信息学分析,比如具有相关表达模式的基因的分组。 16 章描述的竞争网络可以用于聚类问题。自组织特征映射(SOFM)是解决聚类问题最 常见的网络。SOFM 的主要优点是它允许高维空间的可视化。 4). 预测 预测也属于以下类别:时间序列分析、系统辨识、滤波、动态建模。预测问题的思想是 预测一些时间序列的特征值。股票交易可能就需要预测一些安全风险的特征值;控制工程师 需要预测一些过程对象输出的化学提取物的特征值;电力系统工程师想要预测电网的停电时 间。 预测问题需要用 14 章的动态神经网络来解决。这种网络的具体形式取决于具体的应用。 对非线性预测最简单的网络是如图 3 所示的聚焦时延神经网络(focused time-delay neural network)。这是动态网络中常见的一类,称为聚焦网络,动态只出现在静态多层前馈网络的 输入层。这种网络的优点是可以用静态反向传播算法来训练,因为网络输入处抽头时延线 (tapped-delay-line)可以用输入延时值的扩展向量替换。 对于动态建模和控制的问题,常常采用 NARX(非线性自回归外源输入)网络,该网 络如图 4 所示。举个例子,可以用输入信号表示加到电机的电压,输出表示机械臂的角位置。 和聚焦网络一样,NARX 可以用静态反向传播算法训练。两个抽头时延线可以用输入和目 标延时的扩展向量代替。 还有许多类型的动态网络可以用于预测问题,但是上面介绍的两种类型是最简单的。
1.3.2. 具体细节的选择 当基本结构确定后,就需要决定具体细节了。一些情况下,基本结构会自动确定层数。 例如,如果将 SOFM 用于聚类问题,那么网络将有一层。能用于拟合或模式识别的多层网 络情形,中间层的层数不是取决于问题,因为任何数目的中间层都有可能。标准的流程是从 一层中间层开始,如果两层的效果不好,就用三层。只是通常不会超过两个中间层。随着层 数的增加,训练会变得越来越困难。因为中间层和 sigmoid 函数的作用一样,平均到每一层 则执行了一个压缩的操作。这会导致性能函数对先前层权重的导数非常小,这导致最速下降 法收敛很慢。但是对与极其困难的问题,有好几层的深度网络还是可以用的。通常,在可接 受的时间范围内,需要用 GPU 或并行运算来训练多层深度网络。 然后需要选择每层神经元的个数。输出层神经元个数和目标向量的大小是一致的。中间 层神经元的个数取决于具体应用中所近似的函数或者决策边界的复杂性。不幸的是,如果不 去训练神经网络的话,我们常常不知道问题有多复杂。标准的流程是,在开始使用比本来需 要的多得多的神经元,然后提前停止或者使用贝叶斯正则化防止过度拟合,正如 13 章所述。 神经元过多的主要缺点是,网络会过度拟合数据。提前停止或者使用贝叶斯正则化可以 防止过度拟合,但是也许有些情况要考虑网络的计算时间和所需空间(例如:微控制器、 VLSI、FPGA 上的实时应用)。这些情况就希望找到一个能匹配数据的最简单的网络。如果 用贝叶斯正则化,有效参数个数可以用来决定需要多少神经元。如果训练后的有效参数个数 远远小于网络参数的总数,那么可以减少神经元个数,然后重新训练网络。也可以使用“剪 枝”方法消除网络中的神经元或权重。 输出层神经元个数和目标向量的大小是一致的。但是当出现多目标时,还有一个选择要 做。可以用多输出的一个网络,也可以用一个网络一个输出的多个网络。例如,曾经用神经 网络基于血液光谱分析来估计 LDL、VLDL 和 HDL 的胆固醇水平,就可能用输出层有三个 神经元的网络同时估计出三者的水平,或者用三个单输出的神经网络分别估计三者的水平。 理论上两种方法都可行,但实践中可能一种比另一种好。通常从一个多输出的网络开始,如 果对结果不满意再用多个单输出网络。 输入向量的大小也需要决定。这通常比较简单,直接由训练数据决定。但是有时输入向 量中有冗余或不相干的元素。当输入矢量维度很大时,去掉冗余或不相干的元素是有好处的。 这可以减少对计算资源的需求和帮助防止训练中过度拟合。对非线性网络,输入选择过程会 相当艰难,而且没有好的解决方案。贝叶斯正则化修改后可以帮助输入的选择,对不同的权
重集合可能有不同的 α 参数。例如,我们可以让多层网络第一层的权重矩阵的每一列都有自 己的 α 参数。如果输入向量中给定元素是不相干的,那么对应的 α 参数要变大,权重矩阵那 列所有元素强制变小,然后不相干的那个元素就会从输入向量中消除。 训练后的网络的敏感性分析也可以帮助对输入向量“剪枝”,后面会讨论。 2. 训练 当数据准备好,网络结构选定后,接下来就是训练网络了。这部分将要讨论训练过程中 需要做的一些决定。包括:初始化权重的方法,训练算法,性能指标,终止训练的原则。 2.1. 权重初始化 在开始训练之前,需要初始化权重和偏置。具体的方法取决于具体网络类型。对多层网 络,权重和偏置通常设置为小的随机值(例如:如果输入归一化到[-1, 1]的区间,则均匀分 布在[-0.5, 0.5]区间上)。正如 12 章讨论的那样,如果将权重和偏置设为 0,初始条件可能会 落到性能曲面的鞍点上。如果将初始权重设大,初始条件可能会落到性能曲面上由 sigmoid 函数饱和引起的平坦部分。 对于两层网络有另一种由 Widrow 和 Nguyen 介绍的方法。核心思想是:设置第一层权 重的量级,让每一个 sigmoid 函数的线性区间覆盖输入范围的 1/S1;随机设置偏置,让每一 个 sigmoid 函数的中心随机分布在输入空间上。该方法细节如下(假设输入已经归一化到[-1, 1]区间上): 设置 W1 的 i 行 iW1,方向随机,量级为 1 W i 7.0  S /11  R ,设置 bi 在 1Wi 和 1Wi 之间均匀分布的随机值。 对竞争网络,权重也可以设为小的随机数。另一种可能是随机选择一些训练集中的输入 向量,设置为权重矩阵的初始行。这种方法可以确保初始权重落在输入向量范围内,因此尽 可能少地出现如 16 章所述的死单元。对于 SOM,不存在死单元的问题,则可把初始邻域大 小设得足够大,让所有神经元在训练的初始阶段都有机会学习。这样会把所有的权重向量移 到输入空间的适合区域里。但是如果把权重矩阵的行初始化到输入空间的活跃区域,训练会 收敛得更快。 2.2. 选择训练算法 对于多层网络,通常用如 12 章所述的基于梯度或雅可比的算法。这些算法在批处理模 式或顺序模式都可以实施。例如,最速下降法的顺序模式,网络每输入一次就更新一次权重。 在批处理模式下,所有输入都是同时呈现给网络的,在更新权重时,通过对每一个输入的梯 度求和,计算一个总梯度。某些情况下优先考虑顺序模式——例如,需要在线或自适应运行 时。但是,很多更有效的优化算法(如共轭梯度法和牛顿法)源自于批处理算法。 对于用来做函数近似的有几百个权重和偏置的多层网络,Levenberg-Marquardt 算法通 常是最快的训练方法。当权重数达到一千或更多,Levenberg-Marquardt 算法就不如一些共 轭梯度算法有效了。这主要是因为矩阵求逆的计算规模随权重数量呈几何级数增长。对于大 型网络,比例共轭梯度(SCG)算法非常有效。该方法对模式识别问题也很有吸引力。
分享到:
收藏