深度学习:神经网络中的激活函数

来源:互联网 发布:saas软件美国公司 编辑:程序博客网 时间:2024/05/22 04:59
http://blog.csdn.net/pipisorry/article/details/71157037

激活函数

神经网络神经元中,输入的 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 函数

sigmoid单元也可以作为输出单元用来预测二值型变量取值为1的概率。

[Sigmod/Softmax变换 ]

软饱和和硬饱和

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

优点:

在特征相差比较复杂或是相差不是特别大时效果比较好(这样饱不饱和就没那么在影响了?)。

sigmoid激活函数在除了前馈网络以外的情景中更为常见。循环网络、许多概率模型以及一些自编码器有一些额外的要求使得它们不能使用分段线性激活函数,并且使得sigmoid单元更具有吸引力,尽管它存在饱和性的问题。[深度学习]

缺点:
1 激活函数计算量大,反向传播求误差梯度时,求导涉及除法;
2 与分段线性单元不同,sigmoid单元在其大部分定义域内都饱和——当z取绝对值很大的正值时,它们饱和到一个高值,当z取绝对值很大的负值时,它们饱和到一个低值,并且仅仅当z接近0时它们才对输入强烈敏感。sigmoid单元的广泛饱和性会使得基于梯度的学习变得非常困难。因为这个原因,现在不鼓励将它们用作前馈网络中的隐藏单元。当使用一个合适的代价函数来抵消sigmoid的饱和性时,它们作为输出单元可以与基于梯度的学习相兼容。[深度学习]

sigmoid单元在反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练。Sigmoids saturate and kill gradients. (sigmoid饱和和消失梯度)sigmoid 有一个非常致命的缺点,当输入非常大或者非常小的时候(saturation),这些神经元的梯度是接近于0的(因为反向传播时候δj = σ'(aj)∑δkwkj,即梯度计算要用到前面的输入),从图中可以看出梯度的趋势。具体来说,由于在后向传递过程中,sigmoid向下传导的梯度包含了一个f'(x) 因子(sigmoid关于输入的导数),因此一旦输入落入饱和区,f'(x) 就会变得接近于0,导致了向底层传递的梯度也变得非常小。所以,你需要尤其注意参数的初始值来尽量避免saturation的情况。如果你的初始值很大的话,大部分神经元可能都会处在saturation的状态而把gradient kill掉,这会导致网络变的很难学习。但是反过来,软饱能够让其对输入变化或噪声更鲁棒。Sigmoid 的饱和性虽然会导致梯度消失,但也有其有利的一面。例如它在物理意义上最为接近生物神经元。 (0, 1) 的输出还可以被表示作概率,或用于输入的归一化,代表性的如Sigmoid交叉熵损失函数。

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

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

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评价
优点:
1 tanh在特征相差明显时的效果会很好,在循环过程中会不断扩大特征效果。
2 与 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](一种二次优化技术),从而降低所需的迭代次数
3 tanh更像是单位函数,更易训练。

缺点:
也具有软饱和性。

与sigmod曲线比较

硬双曲正切函数(hard tanh)

它的形状和 tanh 以及整流线性单元类似,但是不同于后者,它是有界的,g(a) = max(−1, min(1, a))。它由 Collobert (2004)引入。
HTanh function

整流线性单元 ReLU

Rectified Linear Unit(ReLU) 整流线性单元通常作用于仿射变换之上:

h=g(Wx+b).

当初始化仿射变换的参数时,可以将b的所有元素设置成一个小的正值,例如0.1。这使得整流线性单元很可能初始时就对训练集中的大多数输入呈现激活状态,并且允许导数通过。


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 的优点:

  • 速度快    和sigmoid函数需要计算指数和倒数相比,relu函数其实就是一个max(0,x),计算代价小很多。
  • 减轻梯度消失问题    回忆一下计算梯度的公式。其中,是sigmoid函数的导数。在使用反向传播算法进行梯度计算时,每经过一层sigmoid神经元,梯度就要乘上一个。从下图可以看出,函数最大值是1/4。因此,乘一个会导致梯度越来越小,这对于深层网络的训练是个很大的问题。而relu函数的导数是1,不会导致梯度变小。当然,激活函数仅仅是导致梯度减小的一个因素,但无论如何在这方面relu的表现强于sigmoid。使用relu激活函数可以让你训练更深的网络。
  • 稀疏性    通过对大脑的研究发现,大脑在工作的时候只有大约5%的神经元是激活的,而采用sigmoid激活函数的人工神经网络,其激活率大约是50%。有论文声称人工神经网络在15%-30%的激活率时是比较理想的。因为relu函数在输入小于0时是完全不激活的,因此可以获得一个更低的激活率。

或者优点等价的解释为:

Krizhevsky et al. 发现使用 ReLU 得到的SGD的收敛速度会比 sigmoid/tanh 快很多(看右图)。有人说这是因为它是linear,而且非饱和的 non-saturating。相比于 sigmoid/tanh,ReLU 只需要一个阈值就可以得到激活值,而不用去算一大堆复杂的运算。

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

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

ReLU 的缺点:

当然 ReLU 也有缺点,就是训练的时候很”脆弱”,很容易就”die”了。举个例子:一个非常大的梯度流过一个 ReLU 神经元,更新过参数之后(lz:参数很可能变为一个很大的负值,之后正向传播时很大概率会使激活aj为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/]

整流线性单元的三个扩展基于当 z i < 0 时使用一个非零的斜率 αi:hi=g(z,α)i=max(0,zi)+αimin(0,zi)

整流线性单元和它们的这些扩展都是基于一个原则,那就是如果它们的行为更接近线性,那么模型更容易优化。使用线性行为更容易优化的一般性原则同样也适用于除深度线性网络以外的情景。循环网络可以从序列中学习并产生状态和输出的序列。当训练它们时,需要通过一些时间步来传播信息,当其中包含一些线性计算(具有大小接近 1 的某些方向导数)时,这会更容易。作为性能最好的循环网络结构之一,LSTM 通过求和在时间上传播信息,这是一种特别直观的线性激活。

绝对值整流(absolute value rectification)

固定 α i = −1 来得到 g(z) = |z|。它用于图像中的对象识别 (Jarrett et al., 2009a),其中寻找在输入照明极性反转下不变的特征是有意义的。整流线性单元的其他扩展比这应用地更广泛。

渗漏整流线性单元(Leaky ReLU)(Maas et al., 2013)

将 α i 固定成一个类似 0.01 的小值。

参数化整流线性单元PReLU

参数化整流线性单元(parametric ReLU)或者 PReLU 将α i 作为学习的参数 [He, K., et al. Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification. ICCV 2015.],具有非饱和性:


与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更好的选择。

softplus函数

f(x)= ζ(x) =ln(1+ex)

这是整流线性单元的平滑版本,由 Dugas et al. (2001b) 引入用于函数近似,由 Nair and Hinton (2010a) 引入用于无向概率模型的条件分布。Glorot et al. (2011a) 比较了 softplus 和整流线性单元,发现后者的结果更好。通常不鼓励使用 softplus 函数。softplus 表明隐藏单元类型的性能可能是非常反直觉的——因为它处处可导或者因为它不完全饱和,人们可能希望它具有优于整流线性单元的点,但根据经验来看,它并没有。
这里写图片描述

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神经元死亡的缺点,但增加了参数和计算量。




其它隐藏单元

[Deeplearning:径向基网络(RBF)]

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

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

激活函数速查表


[by Sebastian Raschka]

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

[tensorflow中的Activation Functions]

某小皮



输出单元

1 用于高斯输出分布的线性单元

2 用于bernoulli输出分布的sigmoid单元

3 用于multinouli输出分布的softmax单元

softmax函数:


[Sigmod/Softmax变换]
线性、sigmoid 和 softmax 输出单元是最常见的。神经网络可以推广到我们希望的几乎任何种类的输出层。最大似然原则给如何为几乎任何种类的输出层设计一个好的代价函数提供了指导。
一般的,如果我们定义了一个条件分布 p(y | x; θ),最大似然原则建议我们使用− log p(y | x; θ) 作为代价函数。
4 其它输出类型
异方差模型
混合密度网络:用于执行多峰回归,具有n个分量的高斯混合输出。

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

ref: [深度学习-花书]

[常用激活函数比较]

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


0 0
原创粉丝点击