在人工神经网络中,激活函数扮演了非常重要的角色,其主要作用是对所有的隐藏层和输出层添加一个非线性的操作,使得神经网络的输出更为复杂、表达能力更强。试想一下如果激活函数都是线性的,那么这个神经网络模型就变成了一个回归模型,整个模型就只能表示一种操作了。本文对深度学习中常用的几种激活函数进行简单的介绍。
Sigmoid
激活函数的数学表达式为:
f ( x ) = 1 1 + e − x f(x)=\frac{1}{1+e^{-x} } f(x)=1+e−x1
函数图像如下:
Sigmoid
激活函数的优点如下:
缺点:
Sigmoid
激活函数不适合放在神经网络的前面层而一般是放在最后的输出层中使用。Tanh
激活函数的数学表达式为:
f ( x ) = e x − e − x e x + e − x f(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x} } f(x)=ex+e−xex−e−x
函数图像如下:
Tanh
激活函数的值域是以0为中心的[-1,1],这样可以解决Sigmoid
激活函数输出不以0为中心的问题。但是同样的,使用Tanh
激活函数也会存在梯度消失和计算复杂度高的问题。下面是其导数的函数图像:
ReLU
激活函数的数学表达式为:
f ( x ) = m a x ( 0 , x ) f(x)=max(0,x) f(x)=max(0,x)
函数图像如下:
ReLU
激活函数的优点是可以解决Sigmoid
和Tanh
激活函数存在的梯度消失问题,但是也存在以下缺点:
Sigmoid
一样,其输出不是以0为中心的。LeakyRelu
激活函数的数学表达式为:
f ( x ) = m a x ( α x , x ) f(x)=max(\alpha x,x) f(x)=max(αx,x)
函数图像如下:
LeakyRelu
激活函数通过在负半轴添加一个小的正斜率来解决ReLU
激活函数的“死区”问题,该斜率参数 α \alpha α是手动设置的超参数,一般设置为0.01。通过这种方式,LeakyRelu
激活函数可以确保模型训练过程中神经元的权重在输入小于0的情况下依然会得到更新。
PRelu
激活函数的数学表达式为:
f ( α , x ) = { α x , f o r x < 0 x , f o r x ≥ 0 } f(\alpha ,x)=\begin{Bmatrix} \alpha x , for \ x<0 \\ x , for \ x\ge 0 \end{Bmatrix} f(α,x)={αx,for x<0x,for x≥0}
函数图像如下:
与LeakyRelu
激活函数不同的是,PRelu
激活函数负半轴的斜率参数 α \alpha α是通过学习得到的而不是手动设置的恒定值,通过学习的方式去选择似乎更为合理一些。
ELU
激活函数的数学表达式为:
f ( α , x ) = { α ( e x − 1 ) , f o r x ≤ 0 x , f o r x > 0 } f(\alpha ,x)=\begin{Bmatrix} \alpha (e^{x} - 1) , for \ x\le 0 \\ x , for \ x> 0 \end{Bmatrix} f(α,x)={α(ex−1),for x≤0x,for x>0}
函数图像如下:
与LeakyRelu
和PRelu
激活函数不同的是,ELU
激活函数的负半轴是一个指数函数而不是一条直线,整个函数更加平滑,这样可以使得训练过程中模型的收敛速度更快。
SELU
激活函数的数学表达式为:
f ( α , x ) = λ { α ( e x − 1 ) , f o r x ≤ 0 x , f o r x > 0 } f(\alpha ,x)=\lambda \begin{Bmatrix} \alpha (e^{x} - 1) , for \ x\le 0 \\ x , for \ x> 0 \end{Bmatrix} f(α,x)=λ{α(ex−1),for x≤0x,for x>0}
其中 λ = 1.0507 , α = 1.6733 \lambda=1.0507, \alpha=1.6733 λ=1.0507,α=1.6733。
函数图像如下:
SELU
激活函数是在自归一化网络中定义的,通过调整均值和方差来实现内部的归一化,这种内部归一化比外部归一化更快,这使得网络收敛得更快。
Swish
激活函数的数学表达式为:
f ( x ) = x ∗ s i g m o i d ( x ) f(x)= x * sigmoid(x) f(x)=x∗sigmoid(x)
函数图像如下:
从上图中我们可以观察到,Swish
激活函数具备无上界而有下界、平滑、非单调的特性,这些特性能够在模型训练过程中发挥有利的影响。与上述其他函数相比,Swish
激活函数在x=0
附近更为平滑,而非单调的特性增强了输入数据和要学习的权重的表达能力。
Mish
激活函数的数学表达式为:
f ( x ) = x ∗ t a n h ( l n ( 1 + e x ) ) f(x)=x * tanh(ln(1+e^{x})) f(x)=x∗tanh(ln(1+ex))
函数图像如下:
Mish
激活函数的函数图像与Swish
激活函数类似,但要更为平滑一些,缺点是计算复杂度要更高一些。
梯度消失和梯度爆炸是训练深度神经网络经常会遇到的问题,所以选择合适的激活函数是非常重要的。如果要选择模型输出层的激活函数,可以根据任务类型来选择:
Sigmoid
激活函数。Softmax
激活函数。Sigmoid
激活函数。如果要选择隐藏层的激活函数,一般根据神经网络的类型来选择:
ReLU
激活函数及其改进型激活函数(LeakyRelu
、PRelu
、SELU
等等)。Sigmoid
或Tanh
激活函数。除此之外,还有下面一些经验准则以供参考:
ReLU
及其改进型激活函数只适合用在隐藏层。Sigmoid
和Tanh
激活函数一般用在输出层而不适合用在隐藏层。Swish
激活函数适合用于超过40层的神经网络。