神经网络——激活函数
神经网络——激活函数
激活函数的主要作用是加入非线性变换防止多层网络退化为单层网络。
激活函数的选择遵循如下标准:
- 最大限度增强、放大输入的有效特征,去除、降低噪音特征;
- 缩短训练周期,加快模型收敛,选择可导且求导快的激活函数;
- 避免梯度消失、梯度爆炸、神经元死亡等问题。
Sigmoid函数
这个函数我们已经很熟悉了,它又称为S形函数,能够将输入压缩到中并且处处连续可导,输出非常平滑。
函数表达式为
Sigmoid函数其中是函数中心点。虽然该函数在ML中应用广泛,但在神经网络模型中有些情况下并不是一个最好的选择,由于数据的不同,该函数可能会引起如下问题。
梯度消失
虽然Sigmoid函数有很多有点,但是它的两端太过平滑了,我们很容易从图像上看到该函数在0附件梯度较大,但是若输入非常大或非常小,即离原点很远时,此时梯度将非常小,在训练中的表现便是使用梯度下降法更新参数时收敛过慢甚至不更新,使得梯度下降法失效。
并且该特性会导致饱和,即当输入大于某个值时,输出变化非常小,例如和差异很小,会导致反向传播更新参数时特征丢失明显。
不过这并不代表该函数一定会产生梯度消失问题,在一些小规模数据集或浅层网络上sigmoid依然表现良好。
同时Sigmoid函数涉及指数运算,复杂度较大。
ReLU
该函数是目前深度神经网络中经常使用的激活函数,表达式为
与S形函数相比,该函数是一个左饱和函数,即当时,ReLU函数的导数趋于0,同时当时,导数恒为1,可以缓解梯度消失问题,加快收敛速度。
ReLU函数图像
神经元死亡
虽然ReLU缓解了S形函数带来的梯度消失问题,但是在ReLU中,当时,导数恒等于0,可能会导致“神经元死亡”。
即若激活函数输出值为0,后面的值便会一直是0,相应参数永远不会再更新。一般可能有两种原因导致神经元死亡:
- 初始化参数选择不当;
- 学习率太高导致训练时参数更新太大,使得大量神经元死亡,整个训练过程失败。
LReLU
LReLU中的L为Leaky,该函数时为了解决“死亡ReLU问题”而提出,其表达式为
其中且是一个很小的正数。通过引入,使得时导数不为0,能够继续更新参数,防止神经元死亡。
LReLU函数图像上图中。
Softplus
中文称其为软加函数,在LReLU函数中虽然其不会导致神经元死亡,但是他还是太线性了,无法处理复杂的神经网络,而Softplus便是良好的解决了这个问题,表达式为
Softplus函数图像Softplus函数可以看成就是ReLU函数的光滑版本,弥补了ReLU函数的一些缺点。
Softmax
Sortmax函数常常用来处理多分类问题,它能够对输出值进行归一化操作,表达式为
可以看到该函数就是将每个值经过放大之后再进行归一化,该操作可以方法数据的重要特征,即最大值得到的输出更大。
不过该函数负输入的梯度为0,此时权重不会再反向传播中更新,也会导致神经元死亡的问题。
本博文选取了几个经典的激活函数以及经典问题进行介绍,实际上激活函数有很多,且每种激活函数都有其适合的具体问题,并不存在固定的优劣排行。
更多激活函数可以参考 深度学习随笔——激活函数(Sigmoid、Tanh、ReLU、Leaky ReLU、PReLU、RReLU、ELU、SELU、Maxout、Softmax、Swish、Softplus)。