神经网络中的激活函数

激活函数简介

神经网络是目前比较流行深度学习的基础,神经网络模型模拟人脑的神经元。人脑神经元接收一定的信号,对接收的信号进行一定的处理,并将处理后的结果传递到其他的神经元,数以亿计的神经元组成了人体复杂的结构。在神经网络的数学模型中,神经元节点,将输入进行加权求和,加权求和后再经过一个函数进行变换,然后输出。这个函数就是激活函数,神经元节点的激活函数定义了对神经元输入的映射关系。



激活函数的定义

在ICML2016的一篇论文:Noisy Activation Functions中给出的了激活函数的定义:激活函数是实数到实数的映射,且几乎处处可导。激活函数一般具有以下性质:

  • 非线性:弥补线性模型的不足;
  • 几乎处处可导:反向传播时需要计算激活函数的偏导数,所以要求激活函数除个别点外,处处可导;
  • 计算简单
  • 单调性:当激活函数是单调的时候,单层网络能够保证是凸函数;
  • 输出值范围有限:当激活函数的输出值有限的时候,基于梯度的优化方法会更加稳定;因为特定的表示受有限权值的影响更显著;当激活函数的输出是无限的时候,模型的训练会更加高效,不过在这种情况下,一般需要更小的learning rate。

激活函数的作用

  • 神经网络中的激活函数能够引入非线性因素,提高模型的表达能力;
    网络中仅有线性模型的话,表达能力不够。比如一个多层的线性网络,其表达能力和单层的线性网络是相同的。网络中卷积层、池化层和全连接层都是线性的。所以,需要在网络中加入非线性的激活函数层。
  • 一些激活函数能够起到特征组合的作用;
    例如,对于Sigmoid函数$\sigma(x) = \frac {1}{1+e^(-x)}$,根据泰勒公式展开:$$
    e^x = 1+ \frac {1}{1!}x + \frac {1}{2!}x^2 + \frac {1}{3!}x^3+O(x^3)
    $$
    对于输入特征为$x_1,x_2$,加权组合后如下:
    $$
    x = w_1x_1+w_2x_2
    $$
    将x带入到$e^x$泰勒展开的平方项,$$
    x^2=(w_1x_1+w_2x_2)^2 = ((w_1x_1)^2+(w_2x_2)^2 + 2w_1x_1*w_2x_2)
    $$
    可以看出,平方项起到了特征两两组合的作用,更高阶的$x^3,x^4$等,则是更复杂的特征组合。

常见非线性激活函数

在介绍常见的激活函数之前,先介绍一下饱和(Saturated)的概念。

  • 左饱和:当函数h(x)满足,$\lim \limits_{x \to +\infty}h^{‘}(x)=0$;
  • 右饱和:当函数h(x)满足,$\lim \limits_{x \to -\infty}h^{‘}(x)=0$;
  • 饱和:当函数h(x)既满足左饱和又满足右饱和,称h(x)是饱和的;

当激活函数是饱和的,对激活函数进行求导计算梯度时,计算出的梯度趋近于0,导致参数更新缓慢。

Sigmoid

Sigmoid函数:

  • 定义:$\sigma(x) = \frac {1}{1+e^{-x}}$
  • 值域:(0,1)
  • 导数:$\sigma^{‘}(x) = \sigma(x)(1-\sigma(x))$
    mark

从数学上看,非线性的Sigmoid函数对中央区域的信号增益较大,对两侧区域的信号增益较小,在信号的特征空间映射上,有很好的效果。从神经科学上来看,中央神经区酷似神经元的兴奋态,两侧区酷似神经元的抑制状态,因而在神经网络学习方面,可以将重点特征推向中央区,将非重点特征推向两侧区。

Sigmoid的有以下优点:

  • 输出值域在(0,1)之间,可以被表示为概率;
  • 输出范围有限,数据在传递的过程中不容易发散;
  • 求导比较方便;

Sigmoid的缺点如下:

  • Sigmoid函数是饱和的,可能导致梯度消失(两个原因:(1)Sigmoid导数值较小;(2)Sigmoid是饱和的),导致训练出现问题;
  • 输出不以0为中心,可能导致收敛缓慢(待思考原因);
  • 指数计算,计算复杂度高;

Tanh

Tanh函数的表达式为:

$$tanh(x)=\frac {e^x-e^{-x}}{e^x+e^{-x}}=2\sigma(2x) - 1$$
它将输入值映射到[-1,1]区间内,其函数图像为:
mark

它的导数为$tanh^{‘}(x)=1-tanh^2(x)$
Tanh函数是Sigmoid函数的一种变体;与Sigmoid不同的是,Tanh是0均值的。因此,在实际应用中,Tanh会比Sigmoid更好,但Tanh函数现在也很少使用,其优缺点总结如下:

  • 相比Sigmoid函数,收敛速度更快;
  • 相比Sigmoid函数,其输出是以0为中心的;
  • 没有解决由于饱和性产生的梯度消失问题;

ReLU(Rectified Linear Units)

ReLU函数为现在使用比较广泛的激活函数,其表达式为:
$$
f(x)=max(0,x)=\begin{cases}
x, & if x>0 \\
0 & if x\leq0
\end{cases}
$$
其函数图像如下:
mark

导数图像如下:
mark

ReLU的优点如下:

  • 相比Sigmoid和Tanh,ReLU在SGD中收敛速度要相对快一些;
  • Sigmoid和Tanh涉及到指数运算,计算复杂度高,ReLU只需要一个阈值就可以得到激活值,加快正向传播的计算速度;
  • 有效的缓解了梯度消失的问题;
  • 提供了神经网络的稀疏表达能力;

ReLU的缺点如下:

  • ReLU的输出不是以0为中心的;
  • 训练时,网络很脆弱,很容易出现很多神经元值为0,从而再也训练不动;

ReLU的变体

为了解决上面的问题,出现了一些变体,这些变体的主要思路是将x>0的部分保持不变,$x\leq0$的部分不直接设置为0,设置为$\alpha x$,如下三种变体:

  • L-ReLU(Leaky ReLU):$\alpha$固定为比较小的值,比如:0.01,0.05;
  • P-ReLU(Parametric ReLU):$\alpha$作为参数,自适应地从数据中学习得到;
  • R-ReLU(Randomized ReLU):先随机生成一个$\alpha$,然后在训练过程中再进行修正;

ELU

ELU的函数形式如下:
$$
f(x)=\begin{cases}
x, & if x>0 \\
\alpha(e^x-1) & if x\leq0
\end{cases}
$$

其函数图像如下:
mark

ELU也是为了解决ReLU存在的问题而提出的,它具有ReLU的基本所有优点,以及:

  • 不会有神经元死亡的问题;
  • 输出的均值接近于0,zero-centered;
  • 计算量稍大,理论上虽然好于ReLU,但在实际使用中,目前并没有好的证据证明ELU总是优于ReLU;

MaxOut

MaxOut函数定义如下:$$
y=f(x)=max_{j\in[1,k]}z_j \\
z_j = w_jx+b_j
$$
一个比较容易的介绍,如下图:



假设w是二维的,那么有:
$$
f(x)=max(w_1^Tx+b_1,w_2^Tx+b_2)
$$
可以看出,ReLU及其变体都是它的一个变形(当$w_1,b_1=0的时候,就是ReLU$)

激活函数使用建议

  • 如果想让结果在(0,1)之间,使用Sigmoid(如LSTM的各种Gates);
  • 如果想神经网络训练的很深,不要使用S型的激活函数;
  • 如果使用ReLU,要注意初始化和Learning Rates的设置;
  • 如果使用ReLU,出现很多神经元死亡的问题,且无法解决,可以尝试使用L-ReLU、P-ReLU等ReLU的变体;
  • 最好不要使用Sigmoid,可以尝试使用Tanh;
坚持原创技术分享,您的支持将鼓励我继续创作!