前言
激活函数,是神经网络中实现非线性计算的关键,再深的线性神经网络,本质上都和单步线性计算等价。所以,激活函数这个非线性单元是神经网络化腐朽为神奇的关键。
激活函数的要求:
- 计算简单,特别是导函数计算简单
- 连续可导(允许在若干个点上不可导)
- 值域合理,这样可以尽量使得不同网络层的输入和输出数据相似
Sigmoid型函数
sigmoid型函数是一类S型曲线函数,两端饱和。
logistic函数
logistic激活函数是一个左右饱和的激活函数,将输入压缩到(0, 1)的区间中。

它的导数也非常好计算:
tanh函数
tanh又称双曲正切。
它的值域是(-1, 1),所以,它是中心化的
其函数图像如下所示:

相比之下,tanh比logistic好,第一是中心化,第二是不会导致梯度消失。
ReLu相关函数
ReLU激活函数
ReLU全称Rectified Linear Unit,修正线性单元。
数学表达式如下:
函数图像如下:

优势:在x>0时导数为1,一定程度上缓解了梯度消失的问题。
缺点:死亡ReLU问题
死亡ReLU问题
如果某一个隐藏层的ReLU神经元在所有训练数据上都不能被激活(导数都为0),那么在以后的训练中将永远不能被激活
因此,有很多改进的办法。
LeakyReLU函数
LeakyReLU在x<0时也能保持一个很小的梯度(gamma),其数学表达式为:
这里的(gamma)是一个很小的常数。
PReLU函数
PReLU(Parametric ReLU,带参数的ReLU)则是引入一个可学习的参数,其中对于第(i)个神经元有:
当然也可以设置一组神经元共享一个参数。
ELU函数
ELU全称Exponential Linear Unit,指数线性单元。
它通过调整(gamma)来近似地达到零中心化。
Softplus函数
接下来在同一张图中对比下这几种激活函数:

Swish函数和GLEU函数
Swish函数
Swish函数是一种自门控激活函数
(eta)是可学习的或者固定的超参数,(sigma)是一个Logistic函数,起到门控的作用。

可以看到:
- (eta = 0),为线性函数
- (eta = 100),近似为ReLU函数
所以Swish函数可以看成是线性函数和ReLU之间的非线性插值函数。
GELU函数
GELU,全称Gaussian Error Linear Unit,高斯误差线性单元。
其中(P(X leq x))是高斯分布(N(mu, sigma^2))的累积分布函数。其中(mu)和(sigma)一般为0和1
如下图所示,高斯分布的累积分布函数为S型函数,
高斯分布的概率密度函数为:

高斯分布的累积分布函数为:

因此GELU函数可以用Tanh函数或者Logistic函数来近似。
或者
使用Logistic函数来近似时,GELU相当于一种特殊的Swish函数。
Maxout单元
Maxout的输入是上一层神经元的全部原始输出(x = [x_1; x_2; ...; x_D])
它有(K)个权重向量,最后输出最大的那个:
其中,(1 leq k leq K).