深度学习笔记之神经网络、激活函数、目标函数和深度的初步认识
不多说,直接上干货!
AI技术研究的兴起,伴随着两种最直观的思维技巧,即遗传算法与神经网络,这是对生物学研究最直观的技术抽象。深度学习的前身就是神经网络,这个80年代灵光乍现的技术,在那一波人工智能的大潮驱使下,带着人们对于未来AI时代的憧憬,迅速蔓延,一时风头无两,和今天深度学习的火热几乎如出一辙。
某乎友的观点给出了这两种技术的鲜明对比,如同麻汁与芝麻酱,换汤不换药,所谓深度在于把二两变成了三斤,给出的官方解释是深度学习只是依赖于大数据和更好的硬件,除此再无区别。
当然也有不同观点,但不管如何,这并不是我们要讨论的话题,只要捋清来龙去脉,请读者自己站队。
• 神经网络
生物学家对人体大脑研究发现,人脑存在860亿个神经元,复杂的神经元通过生物电驱动,实现消息的加工和处理,神经元是怎么处理信息的呢?通过神经元结构来进行说明:
1)神经元作为信息处理的基本结构,主要构件是树突,细胞体和轴突,树突及细胞体接收外部刺激信号(由其他神经元传递);
2)轴突的作用过程是信号处理的过程,这个过程不完全是一种线性的处理过程,而是存在一种潜在的拟合方法,实现信号的放大或者抑制,也有可能出现信号消失,因此这种处理过程带有较大的随机性;
3)突触 实现信号的向下传递,当前面的信号处理后仍然存在时,将信号传递到相连接的神经元;
4)由于每个神经元对其他神经元产生的刺激或者抑制,最初的信号得到加工,这个加工过程非常复杂,路径也很深,有人把这个过程称为一个“图灵机”。
基于生物神经学的研究,神经网络的概念诞生,被抽象成数学符号,描述为以加权平均形式,而信号加工处理过程被简化为单向网络,如下图所示:
左图是1943年McCulloch和Pitts抽象出来的一种人工神经元模型,称为“M-P神经元模型”,分为信息归集(加权求和)和 随机处理(激活函数)两个部分,“加权求和”对接收信息进行触发响应,而“激活函数”旨在模拟信号衰减、抑制的随机过程。
多个神经元按照层次划分,严格定义输入输出,这就是神经网络的雏形,虽然这与实际情况仍有较大差异。
目前你已经了解一个基本的神经网络模型,那这里面我们需要求解的是什么呢?对,是参数。直接给出公式:
第二层的输出 由第一层的输入 加权计算得到, 是加权后的一个非线性变换,我们将其描述为激活函数,这是我们接下来要讲的一个重要概念。
• 激活函数
机器学习里面数据拟合有一个关键问题,模型越复杂,所能描述的信息量越丰富,其可分性也就越好。
从这个图上,我们能够看到一个很明显的结论,线性函数对于数据的实用性最差,想要描述问题,我们有两种方法:
1)原来线性的加权平均过程变为更高次幂函数;
2)分段拟合。
拟合函数的次数越高,越能描述数据的特征;分段越合理,结果越准确,这两种方法所描述的是同一种思路-非线性。
非线性解决了简单加权平均无法有效解决的分类描述问题,也是我们所说的激活函数的灵魂所在。
激活函数 通过添加一个额外的非线性过程来模拟神经元处理过程,避免了次数过高带来的计算复杂性,同时兼顾随机性因素。根据生物学特征研究,典型的激活函数应具备以下几个特征:
1)单侧抑制;
2)相对宽阔的兴奋边界;
3)稀疏激活性。
目前 常用的几种激活函数有sigmoid、tanh、ReLU、Softplus。
tanh函数相比在于允许负值的出现,其表现与Sigmoid一致,公式描述为:
ReLU(RectifiedLinear Units)是最简单的激活函数(小于0时归0,大于0时不处理),代表特征是分段线性,因此其前向后向传播、求导都是分段线性,计算量相比前两种较小。
ReLU另一个关键特征在于,其有效模拟了输出为0的神经元丢弃特征,确保了网络稀疏性,能够有效减少参数的相互依存关系,缓解了过拟合问题的发生。ReLU解决了前面两种模型所未能有效描述的单侧抑制(右侧不抑制)问题,公式描述为:
Softplus同样是一类接近于生物学特征的激活函数,和ReLU的区别在于不具备稀疏性,公式描述为:
• 目标函数
相信大家对目标函数并不陌生,借助于已有样本,我们能够衡量特定输入与期待的输出之间的差异,描述为:
我们的目的在于,通过大量的数据训练,得到上面所提到的一组参数集 ,使得对于特定样本输入,得到的输出结果最接近所期待的样本y值,也就是目标损失最小,一般也把这个损失定义为损失函数(LostFunction)。
目标函数优化的过程是个求极值的过程,经典的方法包括随机梯度下降法(RandomGradient Descent)、牛顿法(Newton’smethod)。
另外还有启发式方法、共轭梯度法等,不如前面两种常用,可以不必关注,对于梯度下降法和牛顿法建议大家系统学习一下PRML、MLAPP、ESL等机器学习的书籍,里面讲的比较透彻,喜欢看视频的也可以找下AndrewNg的Stanford公开课,这里我们不在概念上进行描述,仅给出这两种方法的优缺点,以供选择:
1)收敛方式不同,梯度下降法以梯度负方向为搜索方向,一阶收敛;而牛顿法考虑了梯度变化趋势,是二阶收敛,能更合适的确定全局搜索方向;
2)在收敛速度上,梯度下降法在远离极小值的地方下降很快,而在靠近极小值的地方下降很慢;牛顿法收敛方向更为明确,过程更快;
3)复杂性来看,牛顿法对目标函数有严格要求,必须有连续的一、二阶偏导数,海森矩阵必须正定,每一步的计算量更大;
前面提到了目标函数最小化,是求解网络参数的唯一手段,不管是梯度下降还是牛顿法,都是基于迭代过程的。
以梯度下降法为例,对于目标函数 cost(x),如何求参数 (w,b) 呢?给定任意初始点,按照负梯度方向搜索,确定下一个迭代点,重复计算直到目标函数收敛,这里面最关键的一点就在于梯度方向的计算,而求负梯度方向的过程可以描述为求偏导的过程。
链式求导法则,这个在微积分的基本概念是时候发挥用场了,对于函数 f(x)=(1+x)(1+x),链式公式可以描述为:
求导公式:
Backpropagationalgorithm,即BP算法,是神经网络典型的应用,其反向传播的思路在于,计算所构造的误差函数针对对应参数的偏导数,来更新对应参数的值。
我们假设一组样本及参数数据作为迭代输入,参数更新过程描述为:
Step0:初始化
1)样本 x=[0.1,0.3,0.2],对应输出为 z = 0.6,
2)对应的初始化权值 a0 = [0.5,0.5,0.5],b0 = 0.5,
3)对应的初始化权值 w = [0.5,0.5,0.5],b1 = 0.5,
Step1:数据正向传播
Y0 =0.5*0.1 + 0.5*0.3 + 0.5*0.2 + 0.5 = 0.8,
Y1 Y2 省略计算,假设结果为 [0.6, 0.8],
Z0 = 0.5*0.8 + 0.5*Y1 + 0.5*Y2 + 0.5 = 1.6,
当前样本误差值:
平均样本误差值(可以作为终止判定依据):
Step2:计算偏导
Step3:更新权值(负梯度方向)
• 所谓深度
我想现在可以真正开启深度学习了。
多层神经网络是不是深度学习?对于这个问题也许有一些争论,作者的给出的答案是肯定的。
深度学习== 多层神经网络
Ok,工程师们可以不再有顾虑,开始干活了;学术健儿们先别慌,你字典里的深度学习必然要更高大上,否则让你的CVPR情何以堪呐?So在你眼中:
深度学习==(带Trick的)多层神经网络
多层网络采用BP方法训练时,会遇到两个问题:
1)初始化参数选择不当,导致的 局部极值问题。局部极值问题;
2)误差传播到前面已经变得很小,无法起到参数矫正的意义,这就是所说的 梯度发散。梯度发散导致最后面靠近输出的2-3层参数结果收敛,前面若干层震荡,而震荡效应又导致后面参数的重新收敛,因此,结果就是,大于3层的网络不光训练困难,准确度也会下降。
对于这个实际存在的问题,大牛们通过两个阶段来克服:
第一阶段:
2006年Hinton大神提出逐层贪心预训练(layer-wisepre-training)方法进行有效克服,方法概述为:
1)逐层构建单层神经元,保证每次训练一个单层网络;
2)所有层训练完后,使用wake-sleep算法进行调优。
第二阶段:
2012年开始,CNN大行其道,并且借助ReLU、Dropout等技巧,更有效的规避了训练问题(预训练方法基本被抛弃),至此,多层网络的“所谓深度”得以正名,“深度学习”的概念正式确立。
作者:大数据和人工智能躺过的坑
出处:http://www.cnblogs.com/zlslch/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
如果您认为这篇文章还不错或者有所收获,您可以通过右边的“打赏”功能 打赏我一杯咖啡【物质支持】,也可以点击右下角的【好文要顶】按钮【精神支持】,因为这两种支持都是我继续写作,分享的最大动力!