神经网络中的激活函数

标签: 深度学习神经网络激活函数
286人阅读 评论(0) 收藏 举报
分类:

http://blog.csdn.net/pipisorry/article/details/52102805

激活函数

神经网络神经元中,输入的 inputs 通过加权,求和后,还被作用了一个函数,这个函数就是激活函数 Activation Function。

 

为什么要用激活函数

神经网络中激活函数的主要作用是提供网络的非线性建模能力,如不特别说明,激活函数一般而言是非线性函数。假设一个示例神经网络中仅包含线性卷积和全连接运算,那么该网络仅能够表达线性映射,即便增加网络的深度也依旧还是线性映射,难以有效建模实际环境中非线性分布的数据。加入(非线性)激活函数之后,深度神经网络才具备了分层的非线性映射学习能力。

激活函数通常有如下一些性质:

  • 非线性:如果不用激励函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合。如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。当激活函数是非线性的时候,一个两层的神经网络就可以逼近基本上所有的函数了。但是,如果激活函数是恒等激活函数的时候(即f(x)=x),就不满足这个性质了,而且如果MLP使用的是恒等激活函数,那么其实整个网络跟单层神经网络是等价的。
  • 可微性: 当优化方法是基于梯度的时候,这个性质是必须的。
  • 单调性: 当激活函数是单调的时候,单层网络能够保证是凸函数。
  • f(x)x 当激活函数满足这个性质的时候,如果参数的初始化是random的很小的值,那么神经网络的训练将会很高效;如果不满足这个性质,那么就需要很用心的去设置初始值。
  • 输出值的范围: 当激活函数输出值是 有限 的时候,基于梯度的优化方法会更加 稳定,因为特征的表示受有限权值的影响更显著;当激活函数的输出是 无限 的时候,模型的训练会更加高效,不过在这种情况小,一般需要更小的learning rate。

激活函数如何选择

从定义来看,几乎所有的连续可导函数都可以用作激活函数。但目前常见的多是分段线性和具有指数形状的非线性函数。

选择的时候,就是根据各个函数的优缺点来配置,例如:

如果使用 ReLU,要小心设置 learning rate,注意不要让网络出现很多 “dead” 神经元,如果不好解决,可以试试 Leaky ReLU、PReLU 或者 Maxout。

最好不要用 sigmoid,你可以试试 tanh,不过可以预期它的效果会比不上 ReLU 和 Maxout。

一般来说,在分类问题上建议首先尝试 ReLU,其次ELU,这是两类不引入额外参数的激活函数。然后可考虑使用具备学习能力的PReLU和MPELU,并使用正则化技术,例如应该考虑在网络中增加Batch Normalization层。

通常来说,很少会把各种激活函数串起来在一个网络中使用的。

某小皮



常用激活函数详解

激活函数用于隐层输出。

sigmoid函数/Logistic 函数


取值范围为(0,1),它可以将一个实数映射到(0,1)的区间,可以用来做二分类。

sigmoid 的导数表达式为:

sigmoid 原函数及导数图形如下:


Note: 从导数表达式可知,logit梯度最大为0.25。

软饱和和硬饱和

sigmoid 在定义域内处处可导,且两侧导数逐渐趋近于0。Bengio 教授等[1]将具有这类性质的激活函数定义为软饱和激活函数。与极限的定义类似,饱和也分为左饱和与右饱和。
与软饱和相对的是硬饱和激活函数,即:f'(x)=0,当 |x| > c,其中 c 为常数。同理,硬饱和也分为左饱和和右饱和。常见的 ReLU 就是一类左侧硬饱和激活函数。
sigmoid评价

优点:在特征相差比较复杂或是相差不是特别大时效果比较好。

缺点:
1 激活函数计算量大,反向传播求误差梯度时,求导涉及除法;
2 反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练。Sigmoids saturate and kill gradients. (sigmoid饱和和消失梯度)sigmoid 有一个非常致命的缺点,当输入非常大或者非常小的时候(saturation),这些神经元的梯度是接近于0的(因为反向传播时候δj = σ'(aj)∑δkwkj,即梯度计算要用到前面的输入),从图中可以看出梯度的趋势(越是趋于两极,z的变化对于f(z)就变得非常小,再经过反向传导的链式法则运算,最后得到的梯度就会变得很小,出现所谓的梯度消失的情况)。具体来说,由于在后向传递过程中,sigmoid向下传导的梯度包含了一个f'(x) 因子(sigmoid关于输入的导数),因此一旦输入落入饱和区,f'(x) 就会变得接近于0,导致了向底层传递的梯度也变得非常小。所以,你需要尤其注意参数的初始值来尽量避免saturation的情况。如果你的初始值很大的话,大部分神经元可能都会处在saturation的状态而把gradient kill掉,这会导致网络变的很难学习。但是反过来,软饱能够让其对输入变化或噪声更鲁棒

一般来说, sigmoid 网络在 5 层之内就会产生梯度消失现象。

梯度消失问题至今仍然存在,但被新的优化方法有效缓解了,例如DBN中的分层预训练,Batch Normalization的逐层归一化,Xavier和MSRA权重初始化等代表性技术。这个问题也可以通过选择激活函数进行改善,比如PReLU;在LSTM中你可以选择关闭“遗忘闸门”来避免改变内容,即便打开了“遗忘闸门”,模型也会保持一个新旧值的加权平均。

Sigmoid 的饱和性虽然会导致梯度消失,但也有其有利的一面。例如它在物理意义上最为接近生物神经元。 (0, 1) 的输出还可以被表示作概率,或用于输入的归一化,代表性的如Sigmoid交叉熵损失函数。

3 Sigmoid 的 output 不是0均值。这是不可取的,因为这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。产生的一个结果就是:如果数据进入神经元的时候是正的(e.g. x>0 elementwise in f=wTx+b),那么 w 计算出的梯度也会始终都是正的或者始终都是负的 then the gradient on the weights w will during backpropagation become either all be positive, or all negative (depending on the gradient of the whole expression f)。 当然了,如果你是按batch去训练,那么那个batch可能得到不同的信号,所以这个问题还是可以缓解一下的。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的 kill gradients 问题相比还是要好很多的。

Tanh函数/双切正切函数


tanh 是sigmoid的变形:tanh(x)=2sigmoid(2x)1
取值范围为[-1,1]。
tanh评价
优点:
tanh在特征相差明显时的效果会很好,在循环过程中会不断扩大特征效果。
与 sigmoid 的区别是,tanh 是 0 均值的,因此实际应用中 tanh 会比 sigmoid 更好。文献 [LeCun, Y., et al., Backpropagation applied to handwritten zip code recognition. Neural computation, 1989. 1(4): p. 541-551.] 中提到tanh 网络的收敛速度要比sigmoid快,因为 tanh 的输出均值比 sigmoid 更接近 0,SGD会更接近 natural gradient[4](一种二次优化技术),从而降低所需的迭代次数。
缺点:
也具有软饱和性。

与sigmod曲线比较


ReLU

Rectified Linear Unit(ReLU) 整流线性单元


f(x)=max(0,x)

输入信号 <0 时,输出都是0,>0 的情况下,输出等于输入。

曲线

曲线如图


对比sigmoid类函数主要变化是:
1)单侧抑制
2)相对宽阔的兴奋边界
3)稀疏激活性。

ReLU 的导数(不存在sigmoid 的梯度消失的问题):


ReLU评价

ReLU 在x<0 时硬饱和。由于 x>0时导数为 1,所以,ReLU 能够在x>0时保持梯度不衰减,从而缓解梯度消失问题。但随着训练的推进,部分输入会落入硬饱和区,导致对应权重无法更新。这种现象被称为“神经元死亡”

ReLU 的优点:

虽然2006年Hinton教授提出通过分层无监督预训练解决深层网络训练困难的问题,但是深度网络的直接监督式训练的最终突破,最主要的原因是采用了新型激活函数ReLU。与传统的sigmoid激活函数相比,ReLU能够有效缓解梯度消失问题,从而直接以监督的方式训练深度神经网络,无需依赖无监督的逐层预训练。

Krizhevsky et al. 发现使用 ReLU 得到的SGD的收敛速度会比 sigmoid/tanh 快很多(看右图)。有人说这是因为它是linear,而且非饱和的 non-saturating。

相比于 sigmoid/tanh,ReLU 只需要一个阈值就可以得到激活值,而不用去算一大堆复杂的运算。

ReLU另外一个性质是提供神经网络的稀疏表达能力。PReLU[10]、ELU[7]等激活函数不具备这种稀疏性,但都能够提升网络性能。

ReLU 的缺点:

当然 ReLU 也有缺点,就是训练的时候很”脆弱”,很容易就”die”了. 什么意思呢?举个例子:一个非常大的梯度流过一个 ReLU 神经元,更新过参数之后(lz:参数变为一个很大的负值,之后正向传播时很大概率会使激活为0,就死了δj = σ'(aj)∑δkwkj中aj为0之后δj也一直为0),这个神经元可能再也不会对任何数据有激活现象了。如果这个情况发生了,那么这个神经元的梯度就永远都会是0。实际操作中,如果你的learning rate 很大,那么很有可能你网络中的40%的神经元都”dead”了。 当然,如果你设置了一个合适的较小的learning rate(大的梯度流过一ReLU 神经元会变成小梯度,参数不会变得特别小,正向传播时激活就不一定为0了),这个问题发生的情况其实也不会太频繁。ReLU units can be fragile during training and can “die”. For example, a large gradient flowing through a ReLU neuron could cause the weights to update in such a way that the neuron will never activate on any datapoint again. If this happens, then the gradient flowing through the unit will forever be zero from that point on. That is, the ReLU units can irreversibly die during training since they can get knocked off the data manifold. For example, you may find that as much as 40% of your network can be “dead” (i.e. neurons that never activate across the entire training dataset) if the learning rate is set too high. With a proper setting of the learning rate this is less frequently an issue. 或者这么解释:如果某次某个点梯度下降的非常多,权重被改变的特别多,那么这个点的激励可能永远都是0了。

ReLU还经常被“诟病”的一个问题是输出具有偏移现象,即输出均值恒大于零。偏移现象和 神经元死亡会共同影响网络的收敛性。在arxiv的文章[Li, Y., et al., Improving Deep Neural Network with Multiple Parametric Exponential Linear Units. arXiv preprint arXiv:1606.00305, 2016.]中的实验表明,如果不采用Batch Normalization,即使用 MSRA 初始化30层以上的ReLU网络,最终也难以收敛。相对的,PReLU和ELU网络都能顺利收敛。

[http://cs231n.github.io/neural-networks-1/]

Relu的改进和maxout等其它激活函数

PReLU

PReLU [He, K., et al. Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification. ICCV 2015.]是ReLU 和 LReLU的改进版本,具有非饱和性:

与LReLU相比,PReLU中的负半轴斜率a可学习而非固定。原文献建议初始化a为0.25,不采用正则。个人认为,是否采用正则应当视具体的数据库和网络,通常情况下使用正则能够带来性能提升。
虽然PReLU 引入了额外的参数,但基本不需要担心过拟合。例如,在上述cifar10+NIN实验中, PReLU比ReLU和ELU多引入了参数,但也展现了更优秀的性能。所以实验中若发现网络性能不好,建议从其他角度寻找原因。
与ReLU相比,PReLU收敛速度更快。因为PReLU的输出更接近0均值,使得SGD更接近natural gradient。证明过程参见原文[10]。
此外,作者在ResNet 中采用ReLU,而没有采用新的PReLU。这里给出个人浅见,不一定正确,仅供参考。首先,在上述LReLU实验中,负半轴斜率对性能的影响表现出一致性。对PReLU采用正则将激活值推向0也能够带来性能提升。这或许表明,小尺度或稀疏激活值对深度网络的影响更大。其次,ResNet中包含单位变换和残差两个分支。残差分支用于学习对单位变换的扰动。如果单位变换是最优解,那么残差分支的扰动应该越小越好。这种假设下,小尺度或稀疏激活值对深度网络的影响更大。此时,ReLU或许是比PReLU更好的选择。

Maxout

Maxout[Goodfellow, I.J., et al. Maxout Networks.  ICML 2013.]是ReLU的推广,其发生饱和是一个零测集事件(measure zero event)。正式定义为:


Maxout网络能够近似任意连续函数,且当w2,b2,…,wn,bn为0时,退化为ReLU。 其实,Maxout的思想在视觉领域存在已久。例如,在HOG特征里有这么一个过程:计算三个通道的梯度强度,然后在每一个像素位置上,仅取三个通道中梯度强度最大的数值,最终形成一个通道。这其实就是Maxout的一种特例。
Note: lz每个神经元有多个不同输入,求梯度时取最大。
Maxout能够缓解梯度消失,同时又规避了ReLU神经元死亡的缺点,但增加了参数和计算量。


[深度学习中的激活函数导引 ]

[【机器学习】神经网络-激活函数-面面观(Activation Function) ]

输出函数

softmax函数

Softmax - 用于多分类神经网络输出。二类分类当然也可以用,但是如果只输出一个神经元可以使用sigmod函数。


举个例子来看公式的意思:


就是如果某一个 zj 大过其他 z, 那这个映射的分量就逼近于 1,其他就逼近于 0,主要应用就是多分类。

为什么要取指数?

第一个原因是要模拟 max 的行为,所以要让大的更大;第二个原因是需要一个可导的函数。

Sigmoid 和 Softmax 区别

sigmoid将一个real value映射到(0,1)的区间,用来做二分类。

而 softmax 把一个 k 维的real value向量(a1,a2,a3,a4….)映射成一个(b1,b2,b3,b4….)其中 bi 是一个 0~1 的常数,输出神经元之和为 1.0,所以相当于概率值,然后可以根据 bi 的概率大小来进行多分类的任务。

二分类问题时 sigmoid 和 softmax 是一样的,求的都是 cross entropy loss,而 softmax 可以用于多分类问题

softmax建模使用的分布是多项式分布,而logistic则基于伯努利分布
多个logistic回归通过叠加也同样可以实现多分类的效果,但是 softmax回归进行的多分类,类与类之间是互斥的,即一个输入只能被归为一类;多个logistic回归进行多分类,输出的类别并不是互斥的,即"苹果"这个词语既属于"水果"类也属于"3C"类别。

[常用激活函数比较]

激活函数速查表


[by Sebastian Raschka]

[https://en.wikipedia.org/wiki/Activation_function]

[tensorflow中的Activation Functions]

某小皮

from: http://blog.csdn.net/pipisorry/article/details/52102805

ref: [神经网络-激活函数-面面观(Activation Function) ]


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2206753次
    • 积分:23250
    • 等级:
    • 排名:第285名
    • 原创:530篇
    • 转载:30篇
    • 译文:5篇
    • 评论:233条
    Welcome to 皮皮blog~

    博客专栏
    最新评论