深度学习的激活函数分析---Sigmoid & ReLU & Softmax

1,初次接触深度学习一定会遇到一个非常经典的例子 --- MNIST数据集的分析,这个例子也在以往的机器学习的神经网络一章节有过使用。对于MNIST的处理属于多分类的问题,对于深度学习来说就不得不了解激活函数的作用。

    激活函数在三层的神经网络中通常是隐藏层节点输出结果输入到输出层时经历的处理步骤。那我们现在就了解一下经典的三个激励函数Sigmoid & ReLU & Softmax

1,Rectified Linear Uint(ReLU) - 用于隐层神经元输出

2,Sigmoid - 用于隐层神经元输出

3,Softmax- 用于多分类神经网络的输出

4,Linear - 用于回归神经网络的输出(或者二分类的问题)

ReLU函数的计算公式:

                            

Sigmoid函数计算公式:

                            

Softmax()函数的计算公式:

                            

首先复习一下函数可导的条件:在定义域中,函数在该点连续,左右两侧倒数都存在并且相等。

同时,如果不用激励函数的话,相当于激励函数为f(x) = x,那么这种情况下,每一层输出都是上一层输入的线性函数,很容易得到,无论神经网络有多少层,输出都是输入的线性组合,这与没有隐藏层的效果相当。

激活函数的作用是为了增加神经网络模型的非线性,没有激活函数的每层都相当于矩阵相乘。

为什么要引入ReLU,

1,采用Sigmoid等函数,计算激活函数时包含指数运算,计算量大,反向传播求导误差梯度时,求导涉及除法,计算量相对较大,而采用ReLU函数时,整个过程的计算量要节省很多。

2,对于深层网络,Sigmoid函数,反向传播时,很容易出现梯度消失的情况(在Sigmoid接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成信息丢失,从而无法完成深层网络的训练)

3,ReLU会导致一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存的关系,缓解了过拟合的发生。

深度学习的基本原理是基于人工神经网络,信号从一个神经元进入,经过非线性的activation function,传入到下一层神经元;再经过该层神经元的activate,继续往下传递,如此循环往复,直到输出层。正是由于这些非线性函数的反复叠加,才使得神经网络有足够的capacity来抓取复杂的pattern,在各个领域取得state-of-the-art的结果。显而易见,activation function在深度学习中举足轻重,也是很活跃的研究领域之一。目前来讲,选择怎样的activation function不在于它能否模拟真正的神经元,而在于能否便于优化整个深度神经网络。下面我们简单聊一下各类函数的特点以及为什么现在优先推荐ReLU函数。

Sigmoid的三大缺点:1,容易出现梯度消失,2,函数输出不是zero-centered,3,幂运算相对来讲比较耗时。

梯度消失:

优化神经网络的方法是Back Propagation,即导数的后向传递:先计算输出层对应的loss,然后将loss以导数的形式不断向上一层网络传递,修正相应的参数,达到降低loss的目的。 Sigmoid函数在深度网络中常常会导致导数逐渐变为0,使得参数无法被更新,神经网络无法被优化。原因在于两点:(1) 在上图中容易看出,当中较大或较小时,导数接近0,而后向传递的数学依据是微积分求导的链式法则,当前层的导数需要之前各层导数的乘积,几个小数的相乘,结果会很接近0 (2) Sigmoid导数的最大值是0.25,这意味着导数在每一层至少会被压缩为原来的1/4,通过两层后被变为1/16,…,通过10层后为1/1048576。请注意这里是“至少”,导数达到最大值这种情况还是很少见的。

                                            

以上公式表示的是Sigmoid的导数表达式。对应于Sigmoid图形如下:


由图可知,导数从0开始很快就又趋近于0了,易造成“梯度消失”现象。


输出不是zero-centered

Sigmoid函数的输出值恒大于0,这会导致模型训练的收敛速度变慢。举例来讲,对,如果所有均为正数或负数,那么其对的导数总是正数或负数,这会导致如下图红色箭头所示的阶梯式更新,这显然并非一个好的优化路径。深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据 (可以经过数据预处理实现) 和zero-centered输出。


幂运算相对耗时

相对于前两项,这其实并不是一个大问题,我们目前是具备相应计算能力的,但面对深度学习中庞大的计算量,最好是能省则省 :-)。之后我们会看到,在ReLU函数中,需要做的仅仅是一个thresholding,相对于幂运算来讲会快很多。


tanh函数

                                


       tanh函数虽然解决了zero-centered的输出问题,然而,梯度消失和幂运算的问题依然存在。

 ReLU虽然有着非常多的优点,但是也有几个需要特别注意的问题:

1,ReLU的输出不是zero-centered

2,对于层数较多的深度学习网络,某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。原因有二:1,非常不幸的参数初始化,这种情况比较少见。2,学习率塔高导致在训练过程中参数更新太大,不幸使得网络进入这种状态。解决方法有:采用Xavier初始化方法,以及避免将learning rate设置太大或者使用adagrad等自动调节learning rate的方法 。

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值