第五章 神经网络
读书笔记 周志华老师的《机器学习》
因为边看边记,所以写在随笔里,如果涉及版权问题,请您联系我立马删除,lvxia@mail.ustc.edu.cn
5.1 神经元模型
“神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应。”
神经元模型:生物神经网络中,每个神经元与其他神经元相连,当它“兴奋”时,就会向相连的神经元发送化学物质,从而改变这些神经元内的电位;如果某神经元的电位超过了一个“阈值”,那么它就会被激活,即“兴奋”起来,向其他神经元发送化学物质。
1943年,McCulloch and Pitts将上述情形抽象为图5.1所示的简单模型,M-P神经元模型,在这个模型中,神经元接收到来自n个其他神经元传递过来的输入信号,这些输入信号通过带权重的连接进行传递,神经元接收到的总输入值将与神经元的阈值进行比较,然后通过“激活函数”处理以产生神经元的输出。
引入激活函数的原因:如果不用激活函数(相当于f(x)=x),每一层输出都是上一层输入的线性组合,与只有一个隐藏层效果相当。理想的激活函数是a所示的阶跃函数,它将输入值映射为输出值“0”或“1”,显然“1”对应于神经元兴奋,“0”对应于神经元抑制。 然而阶跃函数具有不连续、不光滑等不太好的性质,因此实际常用Sigmoid函数作为激活函数,它将可能在较大范围内变化的输入值挤压到(0,1)输出值范围内。
关于激活函数
传统神经网络中最常用的激活函数是Sigmoid型函数,sigmoid型函数是 一类S型曲线函数。常用的Sigmoid型函数有logistic函数 和tanh函数。
tanh函数可以看做是放大并平移的logistic函数:
从数学上来看,非线性的Sigmoid函数对中央区的信号增益较大,对两侧区的信号增益小,在信号的特征空间映射上,有很好的效果;从神经科学上来看,中央区酷似神经元的兴奋态,两侧区酷似神经元的抑制态,因而在神经网络学习方面,可以将重点特征推向中央区,将非重点特征推向两侧区。 无论是哪种解释,看起来都比早期的线性激活函数(y=x),阶跃激活函数高明了不少。
2001年,神经科学家Dayan、Abott从生物学角度,模拟出了脑神经元接受信号更精确的激活模型。这个模型对比Sigmoid系主要变化有三点:①单侧抑制 ②相对宽阔的兴奋边界 ③稀疏激活性(红色框中前端状态完全没有激活)
从信号方面来看,即神经元同时只对输入信号的少部分选择性响应,大量信号被刻意的屏蔽了,这样可以提高学习的精度,更好更快地提取稀疏特征。 从这个角度来看,在经验规则的初始化W之后,传统的Sigmoid系函数同时近乎有一半的神经元被激活,这不符合神经科学的研究,而且会给深度网络训练带来巨大问题。
rectifier函数定义为:
rectifier函数被认为有生物上的解释性。神经科学家发现神经元具有单侧抑制、宽兴奋边界、稀疏激活性等特性。 采用rectifier函数的单元也叫作修正线性单元(rectified linear unit ReLU)。
softplus函数定义为:
softplus函数可以看做是rectifier函数的平滑版本,其导数刚好是logistic函数,softplus虽然也具有单侧抑制、宽兴奋边界的特性,却没有稀疏激活性。
5.2 感知机与多层网络
感知机(Perceptron)由两层神经元组成,输入层接收外界输入信号后传递给输出层,输出层是M-P神经元。假定 ,f是阶跃函数,感知机实现与、或、非运算:
若两类模式是线性可分的,即存在一个线性超平面能将它们分开,则感知机的学习过程一定会收敛而求得适当的权向量w.否则感知机学习过程将会发生振荡,w难以稳定下来,不能求得合适解,例如感知机不能解决第四张图显示的异或这样简单的非线性可分问题。使用多层功能神经元解决非线性可分问题,输入层和输出层之间的一层神经元称为隐层或隐含层(hidden layer),隐含层和输出层神经元都是拥有激活函数的功能神经元。
每层神经元与下一层神经元全互连,神经元之间不存在同层连接,也不存在跨层连接。这样的网络结构称为“多层前馈神经网络”(multi-layer feedforward neural networks) 。神经网络的学习过程,就是根据训练数据调整神经元之间的“连接权”以及每个功能神经元的“阈值”。
5.3 误差逆传播算法
误差逆传播(error BackPropagation)算法是迄今最成功的神经网络学习算法。下图所示是一个d个输入神经元、l个输出神经元、q个隐层神经元的多层前馈网络结构。
对每个训练样例,BP算法执行以下操作:先将输入示例提供给输入层神经元,然后逐层将信号前传,直到产生输出层的结果;然后计算输出层的误差(4-5),再将误差逆向传播至隐层神经元(6),最后根据隐层神经元的误差来对连接权和阈值进行调整(7),该迭代过程循环进行,直到达到某些停止条件为止。
BP神经网络的过拟合问题(训练误差持续降低,测试误差可能上升)通常用两种策略缓解。 “早停”:将数据分成训练集和验证集,训练集用来计算梯度、更新连接权和阈值、验证集用来估计误差,若训练集误差降低但验证集误差升高,则停止训练。 “正则化”:在误差目标函数中增加一个用于描述网络复杂度的部分。例如连接权和阈值的平方和,训练过程中将会偏好比较小的连接权和阈值。
关于梯度消失
Sigmoid函数导数的值域都小于1,这样误差经过每一层传递都会不断衰减,当网络层数很深时,梯度就会不断的衰减,甚至消失,使得整个网络很难训练,这就是梯度消失问题(Vanishing Gradient Problem),也叫梯度弥散。
梯度消失:一定深度的梯度对模型更新无帮助。
发生地点:梯度消失发生在层数较深的DNN中,最常发生在RNN中。
原因简述:更新模型参数的方法是反向求导,而反向求导就是chain rule(形象点说就是“追根溯源”)。越往前梯度越小。而激活函数是sigmoid系函数的时候,这两个函数的导数又是在两端都是无限趋近于0,会使得之前的梯度也朝向0。最终的结果是到达一定”深度“梯度就对模型的更新没有任何贡献。
解决方法:用ReLU激活函数替换sigmoid系函数。
1. Sigmoid系函数在反向传播求误差梯度时,求导计算量很大,而ReLU容易求解。
2. 对于深层网络,Sigmoid函数反向传播时容易出现梯度消失情况,从而无法完成深层网络的训练。
3. ReLU会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。
5.4 全局最小和局部极小
现实任务中,人们尝试以下策略试图跳出局部极小:
- 以多组不同的参数值初始化多个神经网络,按标准方法训练后,取其中误差最小的解作为最终参数,这样可从中选择有可能获得更接近全局最小的结果
- 使用“模拟退火”simulated annealing技术,模拟退火技术在每一步都以一定的概率接受比当前解更差的结果,从而有助于“跳出”局部极小,在每步迭代过程中,接受“次优解”的概率要随着时间的推移而逐渐降低,从而保证算法稳定。
- 使用随机梯度下降,与标准梯度下降法精确计算梯度不同,随机梯度下降法在计算梯度时加入了随机因素。即便陷入局部极小点,他计算出的梯度仍可能不为零,这样就有机会跳出局部极小继续搜索。
5.5 其他神经网络
1. RBF(Radial Basis Function, 径向基函数)网络 单隐层前馈神经网络,径向基函数作为隐层神经元的激活函数,输出层则是对隐层神经元输出的线性组合。
假定输入为d维向量x,输出为实值,则RBF网络可表示为:
Park and Sandberg,1991证明,具有足够多隐层神经元的RBF网络能以任意精度逼近任意连续函数。
2. ART(Adaptive Resonance Theory, 自适应谐振理论) 竞争型学习的代表,竞争型学习是神经网络中一种常用的无监督学习策略,网络的输出神经元相互竞争,每一时刻仅有一个竞争获胜的神经元被激活。
ART比较好地缓解了竞争型学习中的“可塑性-稳定性窘境”(stability-plasticity dilemma),可塑性是指神经网络要有学习新知识的能力,而稳定性则是指神经网络在学习新知识时要保持对旧知识的记忆。ART具有一个很重要的优点:可进行增量学习incremental learning或在线学习online learning。
3. SOM(Self-Organizing Map, 自组织映射) 竞争学习型的无监督神经网络,可将高维输入数据映射到低维空间同时保持输入数据在高维空间的拓扑结构,即将高位空间中相似的样本点映射到网络输出层中的邻近神经元。
SOM的训练过程:在接收到一个训练样本后,每个输出层神经元会计算该样本与自身携带的权向量之间的距离,距离最近的神经元成为竞争获胜者,称为最佳匹配单元,然后,最佳匹配单元及其邻近神经元的权向量将被调整,以使得这些权向量与当前输入样本的距离缩小,这个过程不断迭代,直至收敛。
4. 级联相关网络 结构自适应网络的重要代表。
一般的神经网络模型通常假定网络结构是事先固定的,训练的目的是利用训练样本来确定合适的连接权、阈值等参数,不同的是结构自适应网络是将网络结构也作为学习的目标之一。
5. 递归神经网络 与前馈神经网络不同,recurrent neutral networks允许网络中出现环形结构,从而可让一些神经元的输出反馈回来作为输入信号。
Elman网络 常见的递归神经网络之一,结构与多层神经网络相似,但隐层神经元的输出被反馈回来,与下一时刻输入层神经元提供的信号一起,作为隐层神经元在下一时刻的输入。隐层神经元通常采用sigmoid激活函数,而网络的训练则常通过推广的BP算法进行。
6. Boltzmann机 Boltzmann是一种“基于能量的模型”。
能量最小化时达到理想状态,网络的训练就是在最小化这个能量函数。神经元分为两层,显层与隐层。显层用于表达数据的输入与输出,隐层则被理解为数据的内在表达。Boltzmann机中的神经元都是布尔型的,即只能取0\1两种状态(激活、抑制),Boltzmann机的训练过程就是将每个训练样本视为一个状态向量,使其出现的概率尽可能大。标准的Boltzmann机是一个全连接图,训练网络的复杂度很高,这使其难以用于解决现实任务,现实中常采用受限Boltzmann机(Restricted Boltzmann Machine,RBM)仅保留显层与隐层之间的连接。
5.6 深度学习
复杂模型的训练效率低,易陷入过拟合,随着云计算大数据时代的到来,计算能力的大幅提高可缓解训练低效性,训练数据的大幅增加可降低过拟合风险,因此,以“深度学习”为代表的fuza模型开始流行。典型的深度学习模型就是很深层的神经网络。多隐层神经网络难以直接用经典算法(例如标准BP算法)进行训练,因为误差在多隐层内逆传播时,往往会“发散”而不能收敛到稳定状态。
无监督逐层训练unsupervised layer-wise training是多隐层网络训练的有效手段,其基本思想是每次训练一层隐结点,训练时将上一层隐结点的输出作为输入,而本层隐结点的输出作为下一层隐结点的输入,这称为“预训练”pre-training;在预训练全部完成后,再对整个网络进行“微调”fine-tuning训练。例如,深度信念网络deep belief network,DBN每层都是一个受限Boltzmann机,即整个网络可视为若干个RBM堆叠而得,在使用无监督逐层训练时,首先训练第一层,然后将第一层预训练好的隐结点视为第二层的输入结点,对第二层进行预训练,各层训练完成后,再利用BP算法等对整个网络进行训练。“预训练+微调”的做法可视为将大量参数分组,对每组先找到局部看起来比较好的设置,然后再基于这些局部较优的结果联合起来进行全局寻优。这样就利用了模型大量参数所提供的自由度的同时,有效的节省了训练开销。
“权共享”是另一种节省训练的开销的策略,即让一组神经元使用相同的连接权。这个在卷积神经网络Convolutional Neural Network,CNN中起到重要作用.CNN复合多个“卷积层”和“采样层”对输入信号进行加工,然后在连接层实现与输出目标之间的映射。
无论是DBN还是CNN,其多隐层堆叠、每层对上一层的输出进行处理的机制,可看作是在对输入信号进行逐层加工,从而把初始的、与输出目标之间联系不太密切的输入表示,转化成与输出目标联系更密切的表示,使得原来仅基于最后一层输出映射难以完成的任务成为可能。