人工智能-深度学习笔记6 神经网络的激活函数

为什么神经网络需要激活函数,且是非线性的。记得之前的笔记中讨论过将线性系统变为非线性的一个技巧,引入了Sigmoid激活函数。激活函数的作用就是希望输入一些数据后可以通过函数的计算得到想要的输出,如果仅仅是想描述下数学中的线、面等这样的现象,那么那些几元几次的方程倒是可行。但是如果先解决再高维度的数据呢?或是简单的二分类问题,怕是这些线性函数的逼近能力就相当有限了。简言之,神经网络的表达能力想要更加的强大,就不能再是输入的线性组合,而是几乎可以逼近任意函数的非线性组合。下面就学习下几个非线性激活函数的特点:

 

1、常用到的几个激活函数

Sigmoid函数数学公式、几何形式,特别注意下导数的几何形式:

特点

它能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1。

但是大家注意看看其导数,这是神经网络反向传播少不了的计算,如果将神经网络的权重初始化为 [0,1]之间的随机值,由反向传播算法的数学推导可知,梯度从后向前传播时,每传递一层梯度值都会减小为原来的0.25倍,如果神经网络隐层特别多,那么梯度在穿过多层后将变得非常小接近于0,即出现梯度消失现象;当网络权值初始化为 (1,+∞) (1,+∞)(1,+∞) 区间内的值,则会出现梯度爆炸情况;其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大。

还有就是Sigmoid 的 output 不是0均值(即zero-centered),这通常是不可取的,因为这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入, 产生的一个结果就是:如x>0, f=wTx+b 那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。 当然了,如果按batch去训练,那么batch可能得到不同的信号,所以这个问题还是可以缓解一下的。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的梯度消失问题相比还是要好很多的。

最后就是其解析式中含有幂运算,计算机求解时相对来讲比较耗时,对于规模比较大的深度神经网络,这会较大地增加训练时间。如果隐藏层都是如此的激活函数,那么此就是深度神经网络为何很难训练的原因之一啦。

tanh函数数学公式、几何形式、导数的几何形式:

tanh读作Hyperbolic Tangent,它解决了Sigmoid函数的不是zero-centered输出问题,但是梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。

Relu函数数学公式、几何形式、导数的几何形式:

ReLU函数其实就是一个取最大值函数,注意这并不是全区间可导的,但是我可以取sub-gradient,如上图所示。ReLU虽然简单,但却是近几年的重要成果,有以下几大特点:

1)解决了gradient vanishing问题 (在正区间);2)计算速度非常快,只需要判断输入是否大于0;3)收敛速度远快于sigmoid和tanh。

ReLU也有几个需要特别注意的问题:

1)ReLU的输出不是zero-centered;2)Dead ReLU Problem,是指某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用更好的参数初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。

尽管存在这两个问题,ReLU目前仍是最常用的activation function,在搭建神经网络的时候推荐优先尝试!这里推荐大家关注下Leaky ReLU函数和ELU (Exponential Linear Units) 函数。

 

2、选择激活函数的经验法则

如果输出是0、1值(二分类问题),则输出层选择sigmoid函数,然后其它的所有单元都选择Relu函数。这是很多激活函数的默认选择,如果在隐藏层上不确定使用哪个激活函数,那么通常会使用Relu激活函数。有时,也会使用tanh激活函数,但Relu的一个优点是:当z是负值的时候,导数等于0。这里也有另一个版本的Relu被称为Leaky Relu,当z是负值时,这个函数的值不是等于0,而是轻微的倾斜,

在z的区间变动很大的情况下,激活函数的导数或者激活函数的斜率都会远大于0,在程序实现就是一个if-else语句,而sigmoid函数需要进行浮点四则运算,在实践中,使用ReLu激活函数神经网络通常会比使用sigmoid或者tanh激活函数学习的更快。sigmoid和tanh函数的导数在正负饱和区的梯度都会接近于0,这会造成梯度弥散,而Relu和Leaky ReLu函数大于0部分都为常熟,不会产生梯度弥散现象。(同时应该注意到的是,Relu进入负半区的时候,梯度为0,神经元此时不会训练,产生所谓的稀疏性,而Leaky ReLu不会有这问题)。z在ReLu的梯度一半都是0,但是,有足够的隐藏层使得z值大于0,所以对大多数的训练数据来说学习过程仍然可以很快。

在选择神经网络的激活函数时,存在一定的直观感受,在深度学习中的经常遇到一个问题:在编写神经网络的时候,会有很多选择:隐藏层单元的个数、激活函数的选择、初始化权值……这些选择想得到一个对比较好的指导原则是挺困难的。鉴于以上三个原因,大家可以借鉴下工业界和学术界的见闻,提供一种直观的感受,哪一种用的多,哪一种用的少。但是,自己的神经网络的应用,以及其特殊性,是很难提前知道选择哪些效果更好。所以通常的建议是:如果不确定哪一个激活函数效果更好,可以把它们都试试,然后在验证集上进行评价。然后看哪一种表现的更好,就去使用它。为自己的神经网络的应用测试这些不同的选择,会在以后检验自己的神经网络或者评估算法的时候,看到不同的效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值