--神经网络)
上篇主要讨论了决策树算法。首先从决策树的基本概念出发引出决策树基于树形结构进行决策进一步介绍了构造决策树的递归流程以及其递归终止条件在递归的过程中划分属性的选择起到了关键作用因此紧接着讨论了三种评估属性划分效果的经典算法介绍了剪枝策略来解决原生决策树容易产生的过拟合问题最后简述了属性连续值/缺失值的处理方法。本篇将讨论现阶段十分热门的另一个经典监督学习算法——神经网络neural network。5、神经网络在机器学习中神经网络一般指的是“神经网络学习”是机器学习与神经网络两个学科的交叉部分。所谓神经网络目前用得最广泛的一个定义是“神经网络是由具有适应性的简单单元组成的广泛并行互连的网络它的组织能够模拟生物神经系统对真实世界物体所做出的交互反应”。5.1 神经元模型神经网络中最基本的单元是神经元模型neuron。在生物神经网络的原始机制中每个神经元通常都有多个树突dendrite一个轴突axon和一个细胞体cell body树突短而多分支轴突长而只有一个在功能上树突用于传入其它神经元传递的神经冲动而轴突用于将神经冲动传出到其它神经元当树突或细胞体传入的神经冲动使得神经元兴奋时该神经元就会通过轴突向其它神经元传递兴奋。神经元的生物学结构如下图所示不得不说高中的生化知识大学忘得可是真干净…一直沿用至今的“M-P神经元模型”正是对这一结构进行了抽象也称“阈值逻辑单元“其中树突对应于输入部分每个神经元收到n个其他神经元传递过来的输入信号这些信号通过带权重的连接传递给细胞体这些权重又称为连接权connection weight。细胞体分为两部分前一部分计算总输入值即输入信号的加权和或者说累积电平后一部分先计算总输入值与该神经元阈值的差值然后通过激活函数activation function的处理产生输出从轴突传送给其它神经元。M-P神经元模型如下图所示与线性分类十分相似神经元模型最理想的激活函数也是阶跃函数即将神经元输入值与阈值的差值映射为输出值1或0若差值大于零输出1对应兴奋若差值小于零则输出0对应抑制。但阶跃函数不连续不光滑故在M-P神经元模型中也采用Sigmoid函数来近似Sigmoid函数将较大范围内变化的输入值挤压到 (0,1) 输出值范围内所以也称为挤压函数squashing function。将多个神经元按一定的层次结构连接起来就得到了神经网络。它是一种包含多个参数的模型比方说10个神经元两两连接则有100个参数需要学习每个神经元有9个连接权以及1个阈值若将每个神经元都看作一个函数则整个神经网络就是由这些函数相互嵌套而成。5.2 感知机与多层网络感知机Perceptron是由两层神经元组成的一个简单模型但只有输出层是M-P神经元即只有输出层神经元进行激活函数处理也称为功能神经元functional neuron输入层只是接受外界信号样本属性并传递给输出层输入层的神经元个数等于样本的属性数目而没有激活函数。这样一来感知机与之前线性模型中的对数几率回归的思想基本是一样的都是通过对属性加权与另一个常数求和再使用sigmoid函数将这个输出值压缩到0-1之间从而解决分类问题。不同的是感知机的输出层应该可以有多个神经元从而可以实现多分类问题同时两个模型所用的参数估计方法十分不同。给定训练集则感知机的n1个参数n个权重1个阈值都可以通过学习得到。阈值Θ可以看作一个输入值固定为-1的哑结点的权重ωn1即假设有一个固定输入xn1-1的输入层神经元其对应的权重为ωn1这样就把权重和阈值统一为权重的学习了。简单感知机的结构如下图所示感知机权重的学习规则如下对于训练样本xy当该样本进入感知机学习后会产生一个输出值若该输出值与样本的真实标记不一致则感知机会对权重进行调整若激活函数为阶跃函数则调整的方法为基于梯度下降法其中 η∈01称为学习率可以看出感知机是通过逐个样本输入来更新权重首先设定好初始权重一般为随机逐个地输入样本数据若输出值与真实标记相同则继续输入下一个样本若不一致则更新权重然后再重新逐个检验直到每个样本数据的输出值都与真实标记相同。容易看出感知机模型总是能将训练数据的每一个样本都预测正确和决策树模型总是能将所有训练数据都分开一样感知机模型很容易产生过拟合问题。由于感知机模型只有一层功能神经元因此其功能十分有限只能处理线性可分的问题对于这类问题感知机的学习过程一定会收敛converge因此总是可以求出适当的权值。但是对于像书上提到的异或问题只通过一层功能神经元往往不能解决因此要解决非线性可分问题需要考虑使用多层功能神经元即神经网络。多层神经网络的拓扑结构如下图所示在神经网络中输入层与输出层之间的层称为隐含层或隐层hidden layer隐层和输出层的神经元都是具有激活函数的功能神经元。只需包含一个隐层便可以称为多层神经网络常用的神经网络称为“多层前馈神经网络”multi-layer feedforward neural network该结构满足以下几个特点* 每层神经元与下一层神经元之间完全互连 * 神经元之间不存在同层连接 * 神经元之间不存在跨层连接根据上面的特点可以得知这里的“前馈”指的是网络拓扑结构中不存在环或回路而不是指该网络只能向前传播而不能向后传播下节中的BP神经网络正是基于前馈神经网络而增加了反馈调节机制。神经网络的学习过程就是根据训练数据来调整神经元之间的“连接权”以及每个神经元的阈值换句话说神经网络所学习到的东西都蕴含在网络的连接权与阈值中。5.3 BP神经网络算法由上面可以得知神经网络的学习主要蕴含在权重和阈值中多层网络使用上面简单感知机的权重调整规则显然不够用了BP神经网络算法即误差逆传播算法error BackPropagation正是为学习多层前馈神经网络而设计BP神经网络算法是迄今为止最成功的的神经网络学习算法。一般而言只需包含一个足够多神经元的隐层就能以任意精度逼近任意复杂度的连续函数[Hornik et al.,1989]故下面以训练单隐层的前馈神经网络为例介绍BP神经网络的算法思想。上图为一个单隐层前馈神经网络的拓扑结构BP神经网络算法也使用梯度下降法gradient descent以单个样本的均方误差的负梯度方向对权重进行调节。可以看出BP算法首先将误差反向传播给隐层神经元调节隐层到输出层的连接权重与输出层神经元的阈值接着根据隐含层神经元的均方误差来调节输入层到隐含层的连接权值与隐含层神经元的阈值。BP算法基本的推导过程与感知机的推导过程原理是相同的下面给出调整隐含层到输出层的权重调整规则的推导过程学习率η∈01控制着沿反梯度方向下降的步长若步长太大则下降太快容易产生震荡若步长太小则收敛速度太慢一般地常把η设置为0.1有时更新权重时会将输出层与隐含层设置为不同的学习率。BP算法的基本流程如下所示BP算法的更新规则是基于每个样本的预测值与真实类标的均方误差来进行权值调节即BP算法每次更新只针对于单个样例。需要注意的是BP算法的最终目标是要最小化整个训练集D上的累积误差即如果基于累积误差最小化的更新规则则得到了累积误差逆传播算法accumulated error backpropagation即每次读取全部的数据集一遍进行一轮学习从而基于当前的累积误差进行权值调整因此参数更新的频率相比标准BP算法低了很多但在很多任务中尤其是在数据量很大的时候往往标准BP算法会获得较好的结果。另外对于如何设置隐层神经元个数的问题至今仍然没有好的解决方案常使用“试错法”进行调整。前面提到BP神经网络强大的学习能力常常容易造成过拟合问题有以下两种策略来缓解BP网络的过拟合问题早停将数据分为训练集与测试集训练集用于学习测试集用于评估性能若在训练过程中训练集的累积误差降低而测试集的累积误差升高则停止训练。引入正则化regularization基本思想是在累积误差函数中增加一个用于描述网络复杂度的部分例如所有权值与阈值的平方和其中λ∈0,1用于对累积经验误差与网络复杂度这两项进行折中常通过交叉验证法来估计。5.4 全局最小与局部最小模型学习的过程实质上就是一个寻找最优参数的过程例如BP算法试图通过最速下降来寻找使得累积经验误差最小的权值与阈值在谈到最优时一般会提到局部极小local minimum和全局最小global minimum。* 局部极小解参数空间中的某个点其邻域点的误差函数值均不小于该点的误差函数值。 * 全局最小解参数空间中的某个点所有其他点的误差函数值均不小于该点的误差函数值。要成为局部极小点只要满足该点在参数空间中的梯度为零。局部极小可以有多个而全局最小只有一个。全局最小一定是局部极小但局部最小却不一定是全局最小。显然在很多机器学习算法中都试图找到目标函数的全局最小。梯度下降法的主要思想就是沿着负梯度方向去搜索最优解负梯度方向是函数值下降最快的方向若迭代到某处的梯度为0则表示达到一个局部最小参数更新停止。因此在现实任务中通常使用以下策略尽可能地去接近全局最小。* 以多组不同参数值初始化多个神经网络按标准方法训练迭代停止后取其中误差最小的解作为最终参数。 * 使用“模拟退火”技术这里不做具体介绍。 * 使用随机梯度下降即在计算梯度时加入了随机因素使得在局部最小时计算的梯度仍可能不为0从而迭代可以继续进行。5.5 深度学习理论上参数越多模型复杂度就越高容量capability就越大从而能完成更复杂的学习任务。深度学习deep learning正是一种极其复杂而强大的模型。怎么增大模型复杂度呢两个办法一是增加隐层的数目二是增加隐层神经元的数目。前者更有效一些因为它不仅增加了功能神经元的数量还增加了激活函数嵌套的层数。但是对于多隐层神经网络经典算法如标准BP算法往往会在误差逆传播时发散diverge无法收敛达到稳定状态。那要怎么有效地训练多隐层神经网络呢一般来说有以下两种方法无监督逐层训练unsupervised layer-wise training每次训练一层隐节点把上一层隐节点的输出当作输入来训练本层隐结点训练好后输出再作为下一层的输入来训练这称为预训练pre-training。全部预训练完成后再对整个网络进行微调fine-tuning训练。一个典型例子就是深度信念网络deep belief network简称DBN。这种做法其实可以视为把大量的参数进行分组先找出每组较好的设置再基于这些局部最优的结果来训练全局最优。权共享weight sharing令同一层神经元使用完全相同的连接权典型的例子是卷积神经网络Convolutional Neural Network简称CNN。这样做可以大大减少需要训练的参数数目。深度学习可以理解为一种特征学习feature learning或者表示学习representation learning无论是DBN还是CNN都是通过多个隐层来把与输出目标联系不大的初始输入转化为与输出目标更加密切的表示使原来只通过单层映射难以完成的任务变为可能。即通过多层处理逐渐将初始的“低层”特征表示转化为“高层”特征表示从而使得最后可以用简单的模型来完成复杂的学习任务。传统任务中样本的特征需要人类专家来设计这称为特征工程feature engineering。特征好坏对泛化性能有至关重要的影响。而深度学习为全自动数据分析带来了可能可以自动产生更好的特征。