深度神经网络中常用的激活函数的优缺点分析

深度神经网络中常用的激活函数的优缺点分析

本文主要总结了深度神经网络中常用的激活函数,根据其数学特性分析它的优缺点。
在开始之前,我们先讨论一下什么是激活函数(激活函数的作用)?
如果将一个神经元的输出通过一个非线性函数,那么整个神经网络的模型也就不在是线性的了,这个非线性函数就是激活函数。 显然非线性函数具有更强的表达能力。引入非线性函数作为激励函数,这样深层神经网络表达能力(泛化能力)就更加强大(不再是输入的线性组合,而是几乎可以逼近任意函数)。

1. Sigmoid 函数

Sigmoid函数是传统的神经网络和深度学习领域开始时使用频率最高的激活函数。
Sigmoid函数的数学表达式如下:

f(x)=11+ex f(x) = \frac 1{1+e^{-x}}\

σ(x)=11+ex \sigma(x) = \frac 1{1+e^{-x}}\

f(x)=σ(x)f(x) = \sigma(x)

其导数为

f(x)=σ(x)(1σ(x))f'(x) = \sigma(x)(1 - \sigma(x))

它的函数图像如下。
在这里插入图片描述
作为最早开始使用的激活函数之一, Sigmoid 函数具有如下优点。

  • 连续,且平滑便于求导
    但是缺点也同样明显。
  • none-zero-centered(非零均值, Sigmoid 函数 的输出值恒大于0),会使训练出现 zig-zagging dynamics 现象,使得收敛速度变慢。
  • 梯度消失问题。 由于Sigmoid的导数总是小于1,所以当层数多了之后,会使回传的梯度越来越小,导致梯度消失问题。而且在前向传播的过程中,通过观察Sigmoid的函数图像,当 x 的值大于2 或者小于-2时,Sigmoid函数的输出趋于平滑,会使权重和偏置更新幅度非常小,导致学习缓慢甚至停滞。
  • 计算量大。由于采用了幂计算。

建议:基于上面Sigmoid的性质,所以不建议在中间层使用Sigmoid激活函数,因为它会让梯度消失。

2. Tanh 函数

tanh 函数的表达式为:

tanh(x)=exexex+extanh(x) = \frac {e^x-e^{-x}}{e^x+e^{-x}}

其倒数为

tanh(x)=1tanh2(x)tanh‘(x) = 1 - tanh^2(x)

它们的函数图像如下。
在这里插入图片描述
通过观察其函数图像,可以发现它的优点主要是解决了none-zero-centered 的问题,但是缺点依然是梯度消失,计算消耗大。但是如果和上面的 sigmoid 激活函数相比, tanh 的导数的取值范围为(0, 1), 而 sigmoid 的导数的取值范围为(0,1/4),显然sigmoid 会更容易出现梯度消失,所以 tanh 的收敛速度会比 sigmoid 快。

3. ReLU

ReLU 是 Hinton 大神于 2010 在 Rectified Linear Units Improve Restricted Boltzmann Machines 中提出, 更多关于 ReLU 的介绍可以参考 [ReLU_WiKi]

ReLU 的函数表达式为:

Relu(x)=max{0,x}Relu(x) = max \lbrace 0,x \rbrace

它的函数图像如下。
在这里插入图片描述

其优点如下

  • x 大于0时,其导数恒为1,这样就不会存在梯度消失的问题
  • 计算导数非常快,只需要判断 x 是大于0,还是小于0
  • 收敛速度远远快于前面的 Sigmoid 和 Tanh函数

缺点

  • none-zero-centered
  • Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。因为当x 小于等于0时输出恒为0,如果某个神经元的输出总是满足小于等于0 的话,那么它将无法进入计算。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用 MSRA 初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。

这个激活函数应该是在实际应用中最广泛的一个。

4. Leaky ReLU

Leaky ReLU 由 Andrew L. Maas 等人于 2014 年 在 Rectifier Nonlinearities Improve Neural Network Acoustic Models 中提出。

Leaky ReLU 函数表达式为

f(x)=max{0.01x,x}f(x) = max \lbrace 0.01x,x \rbrace

其函数图像为
在这里插入图片描述

Leaky ReLU 的提出主要是为了解决前面提到的 Dead ReLUProblem 的问题,因为当 x 小于 0 时,其输出不再是 0.
而同时 Leaky ReLU 具有 ReLU 的所有优点。听上去貌似很好用,只是在实际操作中并没有完全证明好于 ReLU 函数。

这里其实还有一个小的变种 PRelu,其函数表达式如下:
f(x)=max{αx,x}f(x) = max \lbrace \alpha x,x \rbrace. 在实际的使用中PRelu使用的是比较多的。

5. ELU(Exponential Lenear Unit)

ELU 是 Clevert, Djork-Arné 等人于 2015 年在 Fast and Accurate Deep Network Learning by Exponential Linear Units (ELUs) 中提出。

ELU 函数表达式为:

f(x)={α(ex1),x0x,x>0 f(x)=\left\{ \begin{aligned} \alpha(e^x -1), x \leq0\\ x, x >0\\ \end{aligned} \right.

其函数图像为
在这里插入图片描述

ELU 主要是对小于等于 0 的部分进行了改进,使得函数在 x = 0 处可导, 而且 使得神经元的平均激活均值趋近为 0,对噪声更具有鲁棒性。
缺点是由于又引入了指数,计算量增大了。

6. SELU(Self_Normalizing Neural Networks)

SELU 函数表达式为:

f(x)=λ{α(ex1),x0x,x>0 f(x)=\lambda\left\{ \begin{aligned} \alpha(e^x -1), x \leq0\\ x, x >0\\ \end{aligned} \right.

显然仅仅是在 ELU 的基础上加了一个系数。其目的据说(Self-Normalizing Neural Networks是为了使输入在经过一定层数之后变成固定的分布。

7. Softmax

SoftMax 函数表达式为:

Softmax(x)=exik=1KexkSoftmax(x) = \frac {e^ {x_i}} {\sum_{k=1} ^K e^ {x_k}}

Softmax 函数可视为 Sigmoid 函数的泛化形式, 其本质就是将一个 K 维的任意实数向量压缩(映射)成另一个 K 维的实数向量, 其中向量中的每个元素的取值范围都介于 [01][0,1] 之间(可以理解为概率)。Softmax 常常是作为多分类神经网络的输出,比如 LeNet-5 中就用Softmax 映射到最后的输入结果,其表示1~10的概率。

引用

本文主要参考《深度学习之图像识别》和 常用激活函数(激励函数)理解与总结
关于 Swish & Maxout 可以参考激活函数(ReLU, Swish, Maxout)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章