激活函数(Activation Function),就是在人工神经元上运行的函数,负责将神经元的输入映射到输出端 。
simoid函数为:
优点:
它能够将输入值约束在(0,1),单调连续,当输入x趋向于负的无穷大,输出为0。当输入x趋向于正的无穷大,输出为1。
缺点:
当输入x趋向于负的无穷大或者趋向于正的无穷大时,其梯度变化很小,倒数接近于0.x在两端时,容易产生软饱和。同时该函数并不是关于原点成中心对称。深度神经网络中梯度反向传递时导致梯度爆炸和梯度消失,而梯度消失发生的概率比较大。当输入非常大或者非常小的时候(saturation),这些神经元的梯度是接近于0的,从图中可以看出梯度的趋势。如果你的初始值很大的话,大部分神经元可能都会处在saturation的状态而把gradient kill掉,这会导致网络变的很难学习。
tanh函数为:
和sigmoid函数相似,可以看作时拉伸版的sigmoid函数。关于原点成中心对称。
优点:
- 比Sigmoid函数收敛速度更快。
缺点:
- 并没有解决Sigmoid函数的存在的最大问题——由于饱和性产生的梯度消失。
ReLU函数为:
目前使用最多最受欢迎的激活函数,公式和函数图像如下所示:
优点:
- 相比起Sigmoid和tanh,ReLU在SGD中能够快速收敛,这是因为它线性(linear)、非饱和(non-saturating)的形式。
- Sigmoid和tanh涉及了很多很expensive的操作(比如指数),ReLU可以更加简单的实现。
- 有效缓解了梯度消失的问题。
- 在没有无监督预训练的时候也能有较好的表现。
- 随着训练的进行,可能会出现神经元死亡,权重无法更新的情况。如果发生这种情况,那么流经神经元的梯度从这一点开始将永远是0。也就是说,ReLU神经元在训练中不可逆地死亡了。
- 提供了神经网络的稀疏表达能力。
-
缺点:
随着训练的进行,部分输入会落到硬饱和区,导致对应的权重无法更新。我们称之为“神经元死亡”。 实际中,如果学习率设置得太高,可能会发现网络中 40% 的神经元都会死掉(在整个训练集中这些神经元都不会被激活)。合理设置学习率,会降低这种情况的发生概率。