不多说,直接上干货!

 

 

  AI技术研究的兴起,伴随着两种最直观的思维技巧,即遗传算法与神经网络,这是对生物学研究最直观的技术抽象。深度学习的前身就是神经网络,这个80年代灵光乍现的技术,在那一波人工智能的大潮驱使下,带着人们对于未来AI时代的憧憬,迅速蔓延,一时风头无两,和今天深度学习的火热几乎如出一辙。

      某乎友的观点给出了这两种技术的鲜明对比,如同麻汁与芝麻酱,换汤不换药,所谓深度在于把二两变成了三斤,给出的官方解释是深度学习只是依赖于大数据和更好的硬件,除此再无区别。

  当然也有不同观点,但不管如何,这并不是我们要讨论的话题,只要捋清来龙去脉,请读者自己站队。

 

 

 

 

•   神经网络

        生物学家对人体大脑研究发现,人脑存在860亿个神经元,复杂的神经元通过生物电驱动,实现消息的加工和处理,神经元是怎么处理信息的呢?通过神经元结构来进行说明:

            深度学习笔记之神经网络、激活函数、目标函数和深度的初步认识

 

1)神经元作为信息处理的基本结构,主要构件是树突,细胞体和轴突树突及细胞体接收外部刺激信号(由其他神经元传递);

2)轴突的作用过程是信号处理的过程,这个过程不完全是一种线性的处理过程,而是存在一种潜在的拟合方法,实现信号的放大或者抑制,也有可能出现信号消失,因此这种处理过程带有较大的随机性;

3)突触 实现信号的向下传递,当前面的信号处理后仍然存在时,将信号传递到相连接的神经元;

4)由于每个神经元对其他神经元产生的刺激或者抑制,最初的信号得到加工,这个加工过程非常复杂,路径也很深,有人把这个过程称为一个“图灵机”。

        基于生物神经学的研究,神经网络的概念诞生,被抽象成数学符号,描述为以加权平均形式,而信号加工处理过程被简化为单向网络,如下图所示:

          深度学习笔记之神经网络、激活函数、目标函数和深度的初步认识

 

        左图是1943年McCulloch和Pitts抽象出来的一种人工神经元模型,称为“M-P神经元模型”,分为信息归集(加权求和)和 随机处理(激活函数)两个部分,“加权求和”对接收信息进行触发响应,而“激活函数”旨在模拟信号衰减、抑制的随机过程。

        多个神经元按照层次划分,严格定义输入输出,这就是神经网络的雏形,虽然这与实际情况仍有较大差异。

目前你已经了解一个基本的神经网络模型,那这里面我们需要求解的是什么呢?对,是参数。直接给出公式:

                          深度学习笔记之神经网络、激活函数、目标函数和深度的初步认识

 

 

        第二层的输出 由第一层的输入 加权计算得到, 是加权后的一个非线性变换,我们将其描述为激活函数,这是我们接下来要讲的一个重要概念。

 

 

 

 

 

•   激活函数

        机器学习里面数据拟合有一个关键问题,模型越复杂,所能描述的信息量越丰富,其可分性也就越好。

深度学习笔记之神经网络、激活函数、目标函数和深度的初步认识

        从这个图上,我们能够看到一个很明显的结论,线性函数对于数据的实用性最差,想要描述问题,我们有两种方法:

1)原来线性的加权平均过程变为更高次幂函数;

2)分段拟合。

        拟合函数的次数越高,越能描述数据的特征;分段越合理,结果越准确,这两种方法所描述的是同一种思路-非线性

        非线性解决了简单加权平均无法有效解决的分类描述问题,也是我们所说的激活函数的灵魂所在。

        激活函数 通过添加一个额外的非线性过程来模拟神经元处理过程,避免了次数过高带来的计算复杂性,同时兼顾随机性因素。根据生物学特征研究,典型的激活函数应具备以下几个特征:

1)单侧抑制;

2)相对宽阔的兴奋边界;

3)稀疏激活性。

        

  目前 常用的几种激活函数有sigmoid、tanh、ReLU、Softplus。

            深度学习笔记之神经网络、激活函数、目标函数和深度的初步认识
        Sigmoid函数也称S曲线,将输入映射到  之间,从数学上看,非线性的Sigmoid函数对中央区的信号增益较大,对两侧信号增益较小,公式可以表示为:
                              深度学习笔记之神经网络、激活函数、目标函数和深度的初步认识

        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算法,是神经网络典型的应用,其反向传播的思路在于,计算所构造的误差函数针对对应参数的偏导数,来更新对应参数的值。

        我们通过一个实际的例子来进行说明,in(x) 对应的 out(x),对参数 a0,0 迭代更新的过程。
              深度学习笔记之神经网络、激活函数、目标函数和深度的初步认识
 

        我们假设一组样本及参数数据作为迭代输入,参数更新过程描述为:

        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:更新权值(负梯度方向)

                  深度学习笔记之神经网络、激活函数、目标函数和深度的初步认识
        其中 L为Learn Rate学习率(设为0.6)。
 
 
 
 

•   所谓深度

        我想现在可以真正开启深度学习了。

        多层神经网络是不是深度学习?对于这个问题也许有一些争论,作者的给出的答案是肯定的。

        深度学习== 多层神经网络

        Ok,工程师们可以不再有顾虑,开始干活了;学术健儿们先别慌,你字典里的深度学习必然要更高大上,否则让你的CVPR情何以堪呐?So在你眼中:

        深度学习==(带Trick的)多层神经网络

        多层网络采用BP方法训练时,会遇到两个问题:

1)初始化参数选择不当,导致的 局部极值问题。局部极值问题;

2)误差传播到前面已经变得很小,无法起到参数矫正的意义,这就是所说的 梯度发散。梯度发散导致最后面靠近输出的2-3层参数结果收敛,前面若干层震荡,而震荡效应又导致后面参数的重新收敛,因此,结果就是,大于3层的网络不光训练困难,准确度也会下降。

        对于这个实际存在的问题,大牛们通过两个阶段来克服:

        第一阶段:

        2006年Hinton大神提出逐层贪心预训练(layer-wisepre-training)方法进行有效克服,方法概述为:

1)逐层构建单层神经元,保证每次训练一个单层网络;

2)所有层训练完后,使用wake-sleep算法进行调优。

        第二阶段:

        2012年开始,CNN大行其道,并且借助ReLU、Dropout等技巧,更有效的规避了训练问题(预训练方法基本被抛弃),至此,多层网络的“所谓深度”得以正名,“深度学习”的概念正式确立。

 
 
 
 
 
 
 
 
 
参考博客