什么是激活函数
为什么要用激活函数
1、Sigmod激活函数
公式:
曲线:
也叫 Logistic 函数,用于隐层神经元输出,取值范围为(0,1)。
它可以将一个实数映射到(0,1)的区间,可以用来做二分类。(它不像SVM直接给出一个分类的结果,Logistic Regression给出的是这个样本属于正类或者负类的可能性是多少,当然在多分类的系统中给出的是属于不同类别的可能性,进而通过可能性来分类。)
Sigmod函数优点
输出范围有限,数据在传递的过程中不容易发散。
输出范围为(0,1),所以可以用作输出层,输出表示概率。
抑制两头,对中间细微变化敏感,对分类有利。
在特征相差比较复杂或是相差不是特别大时效果比较好。
sigmoid缺点:
激活函数计算量大,反向传播求误差梯度时,求导涉及除法反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练(sigmoid的饱和性)。
下面解释为何会出现梯度消失:
反向传播算法中,要对激活函数求导,sigmoid 的导数表达式为:
sigmoid 原函数及导数图形如下:
(2) Tanh函数
公式
曲线
也称为双切正切函数,取值范围为[-1,1]。
tanh在特征相差明显时的效果会很好,在循环过程中会不断扩大特征效果。与 sigmoid 的区别是,tanh 是 0 均值的,因此实际应用中 tanh 会比 sigmoid 更好,然而,tanh一样具有软饱和性,从而造成梯度消失。
(3) ReLU
Rectified Linear Unit(ReLU) - 用于隐层神经元输出
公式
曲线
输入信号 <0 时,输出都是0,>0 的情况下,输出等于输入
ReLU 的优点:
Krizhevsky et al . 发现使用 ReLU 得到的 SGD 的收敛速度会比 sigmoid/tanh 快很多。除此之外,当x<0时,ReLU硬饱和,而当x>0时,则不存在饱和问题。所以,ReLU 能够在x>0时保持梯度不衰减,从而缓解梯度消失问题。这让我们能够直接以监督的方式训练深度神经网络,而无需依赖无监督的逐层预训练。
ReLU 的缺点:
随着训练的推进,部分输入会落入硬饱和区,导致对应权重无法更新。这种现象被称为“神经元死亡”。与sigmoid类似,ReLU的输出均值也大于0,偏移现象 和 神经元死亡会共同影响网络的收敛性。
eaky-ReLU、P-ReLU、R-ReLU
(1)Leaky ReLUs: 就是用来解决这个 “dying ReLU” 的问题的。与 ReLU 不同的是:
这里的
关于Leaky ReLU 的效果,众说纷纭,没有清晰的定论。有些人做了实验发现 Leaky ReLU 表现的很好;有些实验则证明并不是这样。
数学表示如下:
maxout
参考:https://blog.csdn.net/hjimce/article/details/50414467
Maxout出现在ICML2013上,作者Goodfellow将maxout和dropout结合后,号称在MNIST, CIFAR-10, CIFAR-100, SVHN这4个数据上都取得了start-of-art的识别率。 可以注意到,ReLU 和 Leaky ReLU 都是它的一个变形(比如,Maxout的拟合能力是非常强的,它可以拟合任意的的凸函数。作者从数学的角度上也证明了这个结论,即只需2个maxout节点就可以拟合任意的凸函数了(相减),前提是”隐隐含层”节点的个数可以任意多。
我们在一层同时训练n组参数,然后选择激活值最大的作为下一层神经元的激活值。
所以,Maxout 具有 ReLU 的优点(如:计算简单,不会 saturation),同时又没有 ReLU 的一些缺点 (如:容易 go die)。不过呢,还是有一些缺点的嘛:就是把参数double了。
还有其他一些激活函数,请看下表:
怎么选择激活函数呢?
如果你使用 ReLU,那么一定要小心设置 learning rate,而且要注意不要让你的网络出现很多 “dead” 神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU、PReLU 或者 Maxout.
友情提醒:最好不要用 sigmoid,你可以试试 tanh,不过可以预期它的效果会比不上 ReLU 和 Maxout.
还有,通常来说,很少会把各种激活函数串起来在一个网络中使用的。
Reference
[1]. http://www.faqs.org/faqs/ai-faq/neural-nets/part2/section-10.html
[2]. http://papers.nips.cc/paper/874-how-to-choose-an-activation-function.pdf
[3]. https://en.wikipedia.org/wiki/Activation_function
[4]. http://cs231n.github.io/neural-networks-1/