常用激活函数优劣对比

为什么要引入非线性激活函数(non-linear active function)?

增加神经网络模型的非线性映射。如果不用激活函数,那么每一层的输出与上一层都是线性相关,可以证明无论多少层神经网络,输出都是输入\
的线性组合,只能模拟线性函数。所以通过使用非线性激活函数来使神经网络可以拟合任意函数。

常见的激活函数有 sigmoid、tanh、ReLU 等,下面来分别讨论一下不同激活函数的优劣势。

sigmoid 激活函数

sigmoid 激活函数为:
$ f(x) = \frac{1}{1 + e^{-x}}, $
其导数为:
$ f^\prime(x) = f(x)(1-f(x)), $
fx df(x)
所以 sigmoid 函数的取值范围为[0, 1], 导数取值范围为[0, 0.25].

优势

光滑S型曲线连续可导,函数阈值有上限

劣势

  1. 容易出现梯度消失问题
  2. 函数输出不是zero-centered
  3. 幂运算相对来讲比较耗时

tanh 激活函数

tanh 激活函数为:
$ f(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}, $
其导数为:
$ f^\prime(x) = 1 - (f(x))^2, $
fx df(x)
所以 tanh 函数的取值范围为[-1, 1], 导数的取值范围为[0, 1].

优势

  1. 取值范围满足零中心化(zero-center), 防止了梯度偏差
  2. 当输入为0时,梯度值为1,相对于sigmoid函数梯度消失问题相对较轻

劣势

  1. 容易出现梯度消失问题
  2. 幂运算相对来讲比较耗时

ReLU 激活函数

ReLU 激活函数为:
$ f(x) = max(0, x), $
其导数为:
$$ f^\prime(x) =
\begin{cases} 0, & \text{x <= 0} \\
1, & \text{x > 0}
\end{cases}
$$
fx df(x)
其为分段函数,当输入大于0时,导数为常数,小于0时,不可导。

优势

  1. 当输入大于0时,梯度为常数,不存在梯度消失问题,学习速度更快;

劣势

  1. 函数输出不是zero-centered
  2. 当输入小于0时,函数不可导,无法进行梯度更新,即 Dead ReLU Problem,指的是某些神经元可能永远不会激活,导致相应的参数永远不能被更新。\
    需要注意初始化方式,一般使用 Xavier 初始化方式,同时避免将学习率设置过大或者使用 adagrad 等自动调节学习率的优化算法。

Leaky ReLU 激活函数

Leaky ReLU 激活函数为:
$ f(x) = max(0.01x, x)$
其导数为:
$$ f^\prime(x) =
\begin{cases} 0.01, & \text{x <= 0} \\
1, & \text{x > 0}
\end{cases}
$$

为了解决 Dead ReLU Problem, 提出将 ReLU 的负半段设置为$0.01$,或者$\alpha x$。理论上讲,Leaky ReLU 有 ReLU 的所有优点并且没有\
Dead ReLU Problem 的问题,但在实际操作中,并没有完全证明 Leaky ReLU 总是好于 ReLU。

ELU(Exponential Linear Units) 函数

ELU 激活函数为:
$$
f(x) =
\begin{cases}
\alpha(e^x - 1), &\text{x <= 0} \\
x, & \text{x > 0}
\end{cases}
$$
其导数为:
$$
f(x) = \begin{cases}
\alpha e^x, & \text{x <= 0} \\
1, & \text{x > 0}
\end{cases}
$$
fx df(x)

ELU 也是为了解决 ReLU 的缺点提出来的,ELU 有 ReLU 的有点并且没有 Dead ReLU Problem、函数输出为zero-centered。
计算量稍大,同时在实践中并没有明显的体现出优于 ReLU。

梯度消失(Gradient Vanishing)

使用 Back Propagation 进行网络优化时,先计算输出层的损失,然后将损失以导数的形式不断向上一层网络进行传递,修正相应的参数,达到降低损失的目的。\
因为在求导的过程中使用链式法则,当前层的导数需要与之前层导数相乘,几个小数的乘积结果会很接近0,比如 sigmoid 函数,其导数最大值为0.25,意味着\
没经过一层导数最少被压缩为之前的1/4,并且 sigmoid 函数的导数值几乎都是接近0。

zero-centered

sigmoid 函数的输出恒大于0,会导致模型训练的收敛速度变慢。举例来讲,对于 sigmoid 函数,
$$
L(x) = \frac{1}{1 + e^{-f(x)}},
f(x) = wx + b,
\frac{df}{dw} = \frac{dL}{df} \frac{df}{dw} = \frac{dL}{df}x
$$
如果所有的x均为正数或负数,那么其对w的导数总是正数或负数,会导致w阶梯式更新。