深度学习中常用的激活函数

文章目录

    • 前言
    • 常用的几种激活函数
      • 1 Sigmoid激活函数
      • 2 Tanh激活函数
      • 3 ReLU激活函数
      • 4 LeakyRelu激活函数
      • 5 PRelu激活函数
      • 6 ELU激活函数
      • 7 SELU激活函数
      • 8 Swish激活函数
      • 9 Mish激活函数
    • 如何选择合适的激活函数
    • 参考资料

前言

在人工神经网络中,激活函数扮演了非常重要的角色,其主要作用是对所有的隐藏层和输出层添加一个非线性的操作,使得神经网络的输出更为复杂、表达能力更强。试想一下如果激活函数都是线性的,那么这个神经网络模型就变成了一个回归模型,整个模型就只能表示一种操作了。本文对深度学习中常用的几种激活函数进行简单的介绍。

常用的几种激活函数

1 Sigmoid激活函数

Sigmoid激活函数的数学表达式为:

f ( x ) = 1 1 + e − x f(x)=\frac{1}{1+e^{-x} } f(x)=1+ex1

函数图像如下:

深度学习中常用的激活函数_第1张图片

Sigmoid激活函数的优点如下:

  • 其值域为[0,1],非常适合作为模型的输出函数用于输出一个0~1范围内的概率值,比如用于表示二分类的类别或者用于表示置信度。
  • 该函数是连续可导的,可以提供非常平滑的梯度值,防止模型训练过程中出现突变的梯度。

缺点:

  • 从其导数的函数图像上可以看到,其导数的最大值只有0.25,而且当x在[-5,5]的范围外时其导数值就已经几乎接近于0了。这种情况会导致训练过程中神经元处于一种饱和状态,反向传播时其权重几乎得不到更新,从而使得模型变得难以训练,这种现象被称为梯度消失问题。
  • 其输出不是以0为中心而是都大于0的,这样下一层的神经元会得到上一层输出的全正信号作为输入,所以Sigmoid激活函数不适合放在神经网络的前面层而一般是放在最后的输出层中使用。
  • 需要进行指数运算,计算复杂度高。

深度学习中常用的激活函数_第2张图片

2 Tanh激活函数

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+exexex

函数图像如下:

深度学习中常用的激活函数_第3张图片

Tanh激活函数的值域是以0为中心的[-1,1],这样可以解决Sigmoid激活函数输出不以0为中心的问题。但是同样的,使用Tanh激活函数也会存在梯度消失和计算复杂度高的问题。下面是其导数的函数图像:

深度学习中常用的激活函数_第4张图片

3 ReLU激活函数

ReLU激活函数的数学表达式为:

f ( x ) = m a x ( 0 , x ) f(x)=max(0,x) f(x)=max(0,x)

函数图像如下:

深度学习中常用的激活函数_第5张图片

ReLU激活函数的优点是可以解决SigmoidTanh激活函数存在的梯度消失问题,但是也存在以下缺点:

  • Sigmoid一样,其输出不是以0为中心的。
  • 前向传播时如果输入小于0,则其输出全为0,导致反向传播时没有梯度回传,从而使得神经元的权重得不到更新,这种情况相当于神经元处于非激活状态,进入了“死区”。

4 LeakyRelu激活函数

LeakyRelu激活函数的数学表达式为:

f ( x ) = m a x ( α x , x ) f(x)=max(\alpha x,x) f(x)=max(αx,x)

函数图像如下:

深度学习中常用的激活函数_第6张图片

LeakyRelu激活函数通过在负半轴添加一个小的正斜率来解决ReLU激活函数的“死区”问题,该斜率参数 α \alpha α是手动设置的超参数,一般设置为0.01。通过这种方式,LeakyRelu激活函数可以确保模型训练过程中神经元的权重在输入小于0的情况下依然会得到更新。

5 PRelu激活函数

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 x0}

函数图像如下:

深度学习中常用的激活函数_第7张图片

LeakyRelu激活函数不同的是,PRelu激活函数负半轴的斜率参数 α \alpha α是通过学习得到的而不是手动设置的恒定值,通过学习的方式去选择似乎更为合理一些。

6 ELU激活函数

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)={α(ex1),for x0x,for x>0}

函数图像如下:

深度学习中常用的激活函数_第8张图片

LeakyReluPRelu激活函数不同的是,ELU激活函数的负半轴是一个指数函数而不是一条直线,整个函数更加平滑,这样可以使得训练过程中模型的收敛速度更快。

7 SELU激活函数

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)=λ{α(ex1),for x0x,for x>0}

其中 λ = 1.0507 , α = 1.6733 \lambda=1.0507, \alpha=1.6733 λ=1.0507,α=1.6733

函数图像如下:

深度学习中常用的激活函数_第9张图片

SELU激活函数是在自归一化网络中定义的,通过调整均值和方差来实现内部的归一化,这种内部归一化比外部归一化更快,这使得网络收敛得更快。

8 Swish激活函数

Swish激活函数的数学表达式为:

f ( x ) = x ∗ s i g m o i d ( x ) f(x)= x * sigmoid(x) f(x)=xsigmoid(x)

函数图像如下:

深度学习中常用的激活函数_第10张图片

从上图中我们可以观察到,Swish激活函数具备无上界而有下界、平滑、非单调的特性,这些特性能够在模型训练过程中发挥有利的影响。与上述其他函数相比,Swish激活函数在x=0附近更为平滑,而非单调的特性增强了输入数据和要学习的权重的表达能力。

9 Mish激活函数

Mish激活函数的数学表达式为:

f ( x ) = x ∗ t a n h ( l n ( 1 + e x ) ) f(x)=x * tanh(ln(1+e^{x})) f(x)=xtanh(ln(1+ex))

函数图像如下:

深度学习中常用的激活函数_第11张图片

Mish激活函数的函数图像与Swish激活函数类似,但要更为平滑一些,缺点是计算复杂度要更高一些。

如何选择合适的激活函数

梯度消失和梯度爆炸是训练深度神经网络经常会遇到的问题,所以选择合适的激活函数是非常重要的。如果要选择模型输出层的激活函数,可以根据任务类型来选择:

  • 回归任务选择线性激活函数。
  • 二分类任务选择Sigmoid激活函数。
  • 多分类任务选择Softmax激活函数。
  • 多标签任务选择Sigmoid激活函数。

如果要选择隐藏层的激活函数,一般根据神经网络的类型来选择:

  • 卷积神经网络选择ReLU激活函数及其改进型激活函数(LeakyReluPReluSELU等等)。
  • 递归神经网络选择SigmoidTanh激活函数。

除此之外,还有下面一些经验准则以供参考:

  • ReLU及其改进型激活函数只适合用在隐藏层。
  • SigmoidTanh激活函数一般用在输出层而不适合用在隐藏层。
  • Swish激活函数适合用于超过40层的神经网络。

参考资料

  1. https://www.v7labs.com/blog/neural-networks-activation-functions
  2. https://learnopencv.com/understanding-activation-functions-in-deep-learning/
  3. https://himanshuxd.medium.com/activation-functions-sigmoid-relu-leaky-relu-and-softmax-basics-for-neural-networks-and-deep-8d9c70eed91e

你可能感兴趣的:(自动驾驶与深度学习,深度学习,机器学习,人工智能)