机器学习算法系列(七)

本篇博客主要分享学习了神经网络的相关知识、原理、实例与扩展,包括基本的神经元模型、梯度下降法、BP算法、多层前馈神经网络及相关各个环节的优化处理等;

六、神经网络

最基本的成分为神经元模型,如下M-P神经元模型:每个神经元收到n个其他神经元传递过来的输入信号,这些信号通过带权重的连接传递给细胞体,这些权重又称为连接权(connection weight)。细胞体分为两部分,前一部分计算总输入值(即输入信号的加权和,或者说累积电平),后一部分先计算总输入值与该神经元阈值的差值,然后通过激活函数(activation function)的处理,产生输出从轴突传送给其它神经元。(类比于神经元当中,每个输入具有不同的权重,全部汇集之后与阈值比较,满足条件的进行自我相应处理激活之后再输出)
这里写图片描述
在这里激活函数有如下两种常用形式:阶跃函数a和sigmoid函数b;第一个函数最后的取值只有0、1,可谓简单粗暴的处理;第二个函数将整体压缩至0-1之间,相对更加连续平滑,对于比较阈值的设置更加灵活多变,所以实际应用当中第二个应用较多:
这里写图片描述
权重的更新:对于训练样本(x,y)进入神经网络得到输出值^y,如何训练模型即得到相应的权重(包括权重wi及阈值)使模型的输出^y更接近于真实值y,这就是模型训练的过程;
下面以阶跃函数为激活函数且基于梯度下降法来学习一下参数学习过程:如下稍微将阈值变了一下型归结到了权重wi更好的统一形式,如何使输出值与真实值更接近无非就是是两者的均方差最小,也就是求均方差最小值;
E对于wi求偏导以找到使E变化最大的方向,取其负值即为下降最快的方向,顺着此方向以找到最小的E(这就是梯度下降法);
这里写图片描述
在这里E对wi求偏导得到的值就是xi(wj相对于wi就是常数),这里取了一个步长(学习率)防止一次性更新太大至于越过最低点;更新即Wi加上如上偏置之后的所得值;

只有一层功能神经元,其功能十分有限,只能处理线性可分的问题,对于这类问题学习过程一定会收敛(converge),因此总是可以求出适当的权值。但是对于像异或及更复杂的问题,只通过一层功能神经元往往不能解决,因此要解决非线性可分问题,需要考虑使用多层功能神经元,即神经网络

在神经网络中,输入层与输出层之间的层称为隐含层或隐层(hidden layer),隐层和输出层的神经元都是具有激活函数的功能神经元。常用的神经网络称为“多层前馈神经网络”,这里的“前馈”指的是网络拓扑结构中不存在环或回路,而不是指该网络只能向前传播而不能向后传播(反馈调节机制更新调节中必不可少的重要环节)。

**

BP神经网络算法

即误差逆传播算法(error BackPropagation):用于多层网络权重的更新调整。BP算法首先将误差反向传播给隐层神经元,调节隐层到输出层的连接权重与输出层神经元的阈值;接着根据隐含层神经元的均方误差,来调节输入层到隐含层的连接权值与隐含层神经元的阈值。这里是利用同样的思想即梯度下降法(上面已经讲过)来进行跟新权重,但是之前的参数比较少更新起来相对简单,而对于多层复杂交错的神经网络再像之前那样求偏导几乎是不可能的;而BP算法正是用来求解这种多层复合函数所有变量的偏导数的利器。

下面引入实例解析:
这里写图片描述
这里写图片描述

这里写图片描述
上面这个实例理解起来应该是非常简单的,利用链式法则可以求得上层节点e对于底层节点a、b的相关偏导数。然而这个值理解是好理解,而对于多层复杂结构实现起来是非常麻烦的且包含大量的冗余,比如单条路径的累积与多条路径的累加及中间的重复计算(e-c-a与e-c-b都包含e-c);而BP算法很好的规避了冗余,它自上而下且对于每一次求导均存储其值,往下迭代时直接取值即可(如e-c于c内存入2、c-a于a内存入1);从输出到输入层层反向传递求偏导以到达更新层层权重参数:Wi=Wi - 学习率*偏导

文章实例详细讲解见https://zhuanlan.zhihu.com/p/24801814

BP神经网络强大的学习能力常常容易造成过拟合问题(训练集误差越来越低,测试集误差不降反而升高),有以下两种策略来缓解BP网络的过拟合问题:

早停:将数据分为训练集与测试集,训练集用于学习,测试集用于评估性能,若在训练过程中,训练集的累积误差降低,而测试集的累积误差升高,则停止训练。

引入正则化(regularization):基本思想是在累积误差函数中增加一个用于描述网络复杂度的部分,例如所有权值与阈值的平方和,其中λ∈(0,1)用于对累积经验误差与网络复杂度这两项进行折中,常通过交叉验证法来估计。 正则化加入权重平方的目的是相当于平滑处理,让wi尽可能地相对较小,那么在x变化时,wx导致的y变化相对较小;
这里写图片描述

**
局部极小与全局最小

这里写图片描述
BP算法利用梯度下降法,延负梯度方向以最快速度达到梯度为0的点,但这只是局部极小,并不能保证全局最小;通常使用如下策略尽可能地跳出局部极小从而去接近全局最小:

1、从不同的初始点开始搜索,这样就有可能陷入不同的局部极小,然后再从中选择最小的作为最终结果(以多组不同的参数值初始化多个神经网络,按标准化训练之后取误差最小的解作为最终的参数)

2、使用‘模拟退火’技术,在训练的每一步当中都以一定的概率接收比当前稍差的结果,从而有助于跳出局部极小(需注意:每部迭代过程中,接收次优解的概率要逐步降低以保证算法最终的稳定性)

3、使用随机梯度下降,在计算梯度时加入随机因素,即原本梯度为0变为不为0了,以防止跳入局部最小(原理其实同第二步只是处理时机不同)

**
深度学习:

理论上,参数越多,模型复杂度就越高,容量(capability)就越大,从而能完成更复杂的学习任务。深度学习(deep learning)正是一种极其复杂而强大的模型。

增大模型复杂度,一是增加隐层的数目,二是增加隐层神经元的数目。前者更有效一些,因为它不仅增加了功能神经元的数量,还增加了激活函数嵌套的层数。但是对于多隐层神经网络,经典算法如标准BP算法往往会在误差逆传播时发散(diverge),无法收敛达到稳定状态。

那要怎么有效地训练多隐层神经网络呢?一般来说有以下两种方法

1、无监督逐层训练(unsupervised layer-wise training):每次训练一层隐节点,把上一层隐节点的输出当作输入来训练,本层隐结点训练好后,输出再作为下一层的输入来训练,这称为预训练(pre-training)。全部预训练完成后,再利用BP算法对整个网络进行微调(fine-tuning)训练。

2、权共享(weight sharing):令同一层神经元使用完全相同的连接权,典型的例子是卷积神经网络(Convolutional Neural Network,简称CNN)。这样做可以大大减少需要训练的参数数目。
这里写图片描述
对于深度学习后续还会有专题系列涉及,在这不在累赘扩展;

猜你喜欢

转载自blog.csdn.net/enjoy_endless/article/details/80707835