深度学习:神经网络中的激活函数
来源:互联网 发布:saas软件美国公司 编辑:程序博客网 时间:2024/05/22 04:59
激活函数
神经网络神经元中,输入的 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的概率。
软饱和和硬饱和
优点:
在特征相差比较复杂或是相差不是特别大时效果比较好(这样饱不饱和就没那么在影响了?)。
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.
Tanh函数/双曲正切函数
取值范围为[-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](一种二次优化技术),从而降低所需的迭代次数。
也具有软饱和性。
与sigmod曲线比较
硬双曲正切函数(hard tanh)
它的形状和 tanh 以及整流线性单元类似,但是不同于后者,它是有界的,g(a) = max(−1, min(1, a))。它由 Collobert (2004)引入。整流线性单元 ReLU
输入信号 <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 的缺点:
当然 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 时使用一个非零的斜率
整流线性单元和它们的这些扩展都是基于一个原则,那就是如果它们的行为更接近线性,那么模型更容易优化。使用线性行为更容易优化的一般性原则同样也适用于除深度线性网络以外的情景。循环网络可以从序列中学习并产生状态和输出的序列。当训练它们时,需要通过一些时间步来传播信息,当其中包含一些线性计算(具有大小接近 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.],具有非饱和性:
softplus函数
这是整流线性单元的平滑版本,由 Dugas et al. (2001b) 引入用于函数近似,由 Nair and Hinton (2010a) 引入用于无向概率模型的条件分布。Glorot et al. (2011a) 比较了 softplus 和整流线性单元,发现后者的结果更好。通常不鼓励使用 softplus 函数。softplus 表明隐藏单元类型的性能可能是非常反直觉的——因为它处处可导或者因为它不完全饱和,人们可能希望它具有优于整流线性单元的点,但根据经验来看,它并没有。
Maxout单元
Note: lz每个神经元有多个不同输入,求梯度时取最大。
其它隐藏单元
[深度学习中的激活函数导引 ]
[【机器学习】神经网络-激活函数-面面观(Activation Function) ]
激活函数速查表
[by Sebastian Raschka]
[https://en.wikipedia.org/wiki/Activation_function]
[tensorflow中的Activation Functions]
输出单元
1 用于高斯输出分布的线性单元
2 用于bernoulli输出分布的sigmoid单元
3 用于multinouli输出分布的softmax单元
softmax函数:
from: http://blog.csdn.net/pipisorry/article/details/71157037
ref: [深度学习-花书]
[常用激活函数比较]
[神经网络-激活函数-面面观(Activation Function) ]
- 深度学习:神经网络中的激活函数
- 深度学习神经网络激活函数的优点
- 深度学习中的激活函数
- 深度学习中的激活函数
- 深度学习中的数学与技巧(13):神经网络之激活函数
- 神经网络中的激活函数
- 神经网络中的激活函数
- 神经网络中的激活函数
- 神经网络中的激活函数
- 深度学习/神经神经网络常用激活函数总结
- 【深度学习技术】卷积神经网络常用激活函数总结
- AndrewNg神经网络和深度学习笔记-Week3-6激活函数
- 深度学习中的激活函数导引
- 深度学习中的激活函数导引
- 深度学习中的激活函数对比
- 浅谈深度学习中的激活函数
- 浅谈深度学习中的激活函数
- 浅谈深度学习中的激活函数
- bootstrap的tooltip提示
- poj 2376 Cleaning Shifts
- 重构二叉树
- ubuntu下自动安装tensorflow脚本
- Spring加载配置文件--jdbc.propertities
- 深度学习:神经网络中的激活函数
- MFC 动态的Bresenham直线画法 最详细的讲解,,,
- 字符编码认识
- Leetcode-2D Dynamic Programming
- C++新特性:函数模板
- MySQL启程学习回忆录3
- oracle最强大函数之一decode函数的使用
- 模仿WIN32程序处理消息
- 预处理:条件编译