本文已参与「新人创作礼」活动,一起开启掘金创作之路。
本文首发于微信公众号【DeepDriving】,欢迎关注。
前言
在人工神经网络中,激活函数扮演了非常重要的角色,其主要作用是对所有的隐藏层和输出层添加一个非线性的操作,使得神经网络的输出更为复杂、表达能力更强。试想一下如果激活函数都是线性的,那么这个神经网络模型就变成了一个回归模型,整个模型就只能表示一种操作了。本文对深度学习中常用的几种激活函数进行简单的介绍。
常用的几种激活函数
1 Sigmoid激活函数
Sigmoid
激活函数的数学表达式为:
函数图像如下:
Sigmoid
激活函数的优点如下:
- 其值域为[0,1],非常适合作为模型的输出函数用于输出一个0~1范围内的概率值,比如用于表示二分类的类别或者用于表示置信度。
- 该函数是连续可导的,可以提供非常平滑的梯度值,防止模型训练过程中出现突变的梯度。
缺点:
- 从其导数的函数图像上可以看到,其导数的最大值只有0.25,而且当x在[-5,5]的范围外时其导数值就已经几乎接近于0了。这种情况会导致训练过程中神经元处于一种饱和状态,反向传播时其权重几乎得不到更新,从而使得模型变得难以训练,这种现象被称为梯度消失问题。
- 其输出不是以0为中心而是都大于0的,这样下一层的神经元会得到上一层输出的全正信号作为输入,所以
Sigmoid
激活函数不适合放在神经网络的前面层而一般是放在最后的输出层中使用。 - 需要进行指数运算,计算复杂度高。
2 Tanh激活函数
Tanh
激活函数的数学表达式为:
函数图像如下:
Tanh
激活函数的值域是以0为中心的[-1,1],这样可以解决Sigmoid
激活函数输出不以0为中心的问题。但是同样的,使用Tanh
激活函数也会存在梯度消失和计算复杂度高的问题。下面是其导数的函数图像:
3 ReLU激活函数
ReLU
激活函数的数学表达式为:
函数图像如下:
ReLU
激活函数的优点是可以解决Sigmoid
和Tanh
激活函数存在的梯度消失问题,但是也存在以下缺点:
- 与
Sigmoid
一样,其输出不是以0为中心的。 - 前向传播时如果输入小于0,则其输出全为0,导致反向传播时没有梯度回传,从而使得神经元的权重得不到更新,这种情况相当于神经元处于非激活状态,进入了“死区”。
4 LeakyRelu激活函数
LeakyRelu
激活函数的数学表达式为:
函数图像如下:
LeakyRelu
激活函数通过在负半轴添加一个小的正斜率来解决ReLU
激活函数的“死区”问题,该斜率参数是手动设置的超参数,一般设置为0.01。通过这种方式,LeakyRelu
激活函数可以确保模型训练过程中神经元的权重在输入小于0的情况下依然会得到更新。
5 PRelu激活函数
PRelu
激活函数的数学表达式为:
函数图像如下:
与LeakyRelu
激活函数不同的是,PRelu
激活函数负半轴的斜率参数是通过学习得到的而不是手动设置的恒定值,通过学习的方式去选择似乎更为合理一些。
6 ELU激活函数
ELU
激活函数的数学表达式为:
函数图像如下:
与LeakyRelu
和PRelu
激活函数不同的是,ELU
激活函数的负半轴是一个指数函数而不是一条直线,整个函数更加平滑,这样可以使得训练过程中模型的收敛速度更快。
7 SELU激活函数
SELU
激活函数的数学表达式为:
其中。
函数图像如下:
SELU
激活函数是在自归一化网络中定义的,通过调整均值和方差来实现内部的归一化,这种内部归一化比外部归一化更快,这使得网络收敛得更快。
8 Swish激活函数
Swish
激活函数的数学表达式为:
函数图像如下:
从上图中我们可以观察到,Swish
激活函数具备无上界而有下界、平滑、非单调的特性,这些特性能够在模型训练过程中发挥有利的影响。与上述其他函数相比,Swish
激活函数在x=0
附近更为平滑,而非单调的特性增强了输入数据和要学习的权重的表达能力。
9 Mish激活函数
Mish
激活函数的数学表达式为:
函数图像如下:
Mish
激活函数的函数图像与Swish
激活函数类似,但要更为平滑一些,缺点是计算复杂度要更高一些。
如何选择合适的激活函数
梯度消失和梯度爆炸是训练深度神经网络经常会遇到的问题,所以选择合适的激活函数是非常重要的。如果要选择模型输出层的激活函数,可以根据任务类型来选择:
- 回归任务选择线性激活函数。
- 二分类任务选择
Sigmoid
激活函数。 - 多分类任务选择
Softmax
激活函数。 - 多标签任务选择
Sigmoid
激活函数。
如果要选择隐藏层的激活函数,一般根据神经网络的类型来选择:
- 卷积神经网络选择
ReLU
激活函数及其改进型激活函数(LeakyRelu
、PRelu
、SELU
等等)。 - 递归神经网络选择
Sigmoid
或Tanh
激活函数。
除此之外,还有下面一些经验准则以供参考:
ReLU
及其改进型激活函数只适合用在隐藏层。Sigmoid
和Tanh
激活函数一般用在输出层而不适合用在隐藏层。Swish
激活函数适合用于超过40层的神经网络。