激活函数理解
激活函数
直观理解
Activation Function,用来做非线性变换
对于前馈神经网络模型,如果没有非线性变换的话,只能拟合线性模型,无论经过多少隐藏层,输出层都是输出特征的线性组合。添加激活函数后,相当于做了非线性变换,能够拟合更为复杂的模型。
激活函数通常具备一下性质
- 简单的非线性函数
- 连续并可导(要用梯度下降)
- 单调函数(保证loss函数为凸函数)
sigmoid
sigmoid函数为S型函数,两端饱和函数,在x趋向于\(+\infty\)和\(-\infty\)时导数为0,包括logistic函数和tanh函数
logistic的输出范围是(0,1),输出非零中心化的,而tanh的输出范围是(-1,1),输出是零中心化
非零中心化的输出会使得收敛速度变慢,参考:https://liam.page/2018/04/17/zero-centered-active-function/
以下为参考文章中的截图
ReLU
Rectified Linear Unit,修正线性单元
其定义为
图像如下
-
(+)相比于sigmoid两端饱和的函数,relu函数是左饱和的,当x>0时,导数为1,缓解了梯度消失的问题,加快了梯度下降收敛
-
(-)relu存在和logistic一样输出非零中心化的问题
-
(-)存在relu死亡现象
对于relu死亡现象的理解,参考:https://blog.csdn.net/qq_51698536/article/details/127211764
造成relu死亡的根本原因是,在对于某个神经元参数更新之后,导致这个参数变为负值(可能是学习率设置过大,或者输入值异常导致)。在此之后,在这个负参数的影响下,relu函数的输入可能是负值,对于relu函数来说,当输入小于0时,输出也是0,梯度也是0,这就导致这个参数无法更新,并一致持续下去,也就是说这个神经元在网络中不起到任何作用了,即死亡
Leaky ReLU
在输入x<0时,也给一个很小的梯度\(\lambda\),这样当神经元非激活时,也能有一个很小的梯度更新参数,从而避免relu死亡问题
带参数的ReLU
为每一个神经元的relu引入一个可学习的参数\(\gamma_i\),允许不同的神经元有不同的参数
ELU
指数线性单元,近似零中心化
Softplus
ReLU函数的平滑版本