何为激活函数

激活函数(Activation Function)是一种添加到人工神经网络中的函数,旨在帮助网络学习数据中的复杂模式。在神经元中,输入的input经过一系列加权求和后作用于另一个函数,这个函数就是这里的激活函数。

激活函数可以分为线性激活函数(线性方程控制输入到输出的映射,如f(x)=x等)以及非线性激活函数(非线性方程控制输入到输出的映射,比如Sigmoid、Tanh、ReLU、LReLU、PReLU、Swish 等)

因为神经网络中每一层的输入输出都是一个线性求和的过程,下一层的输出只是承接了上一层输入函数的线性变换,所以如果没有激活函数,那么无论你构造的神经网络多么复杂,有多少层,最后的输出都是输入的线性组合,纯粹的线性组合并不能够解决更为复杂的问题。而引入激活函数之后,我们会发现常见的激活函数都是非线性的,因此也会给神经元引入非线性元素,使得神经网络可以逼近其他的任何非线性函数,这样可以使得神经网络应用到更多非线性模型中。

为了增强网络的表示能力和学习能力,神经网络的激活函数都是非线性的,通常具有以下几点性质:

  • 连续并可导(允许少数点上不可导),可导的激活函数可以直接利用数值优化的方法来学习网络参数;
  • 激活函数及其导数要尽可能简单一些,太复杂不利于提高网络计算率;
  • 激活函数的导函数值域要在一个合适的区间内,不能太大也不能太小,否则会影响训练的效率和稳定性。

常见的激活函数

Sigmoid 函数(Logistic 函数)

用于隐层神经元输出,取值范围为(0,1),它可以将一个实数映射到(0,1)的区间,可以用来做二分类。在特征相差比较复杂或是相差不是特别大时效果比较好。

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

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

Sigmoid 激活函数的图像是 S 形

优点

  • Sigmoid 函数的输出范围是 0 到 1。由于输出值限定在 0 到1,因此它对每个神经元的输出进行了归一化;
  • 可用于将预测概率作为输出的模型。由于概率的取值范围是 0 到 1,因此 Sigmoid 函数非常合适;
  • 梯度平滑,避免「跳跃」的输出值;
  • 函数是可导且易于求导。可以找到任意两个点的 sigmoid 曲线的斜率;
  • 明确的预测,输入很大或很小时输出非常接近 1 或 0。

存在的不足

  • 梯度消失:Sigmoid 函数趋近 0 和 1 的时候变化率会变得平坦,也就是说,Sigmoid 的梯度趋近于 0。神经网络使用 Sigmoid 激活函数进行反向传播时,输出接近 0 或 1 的神经元其梯度趋近于 0。这些神经元叫作饱和神经元。因此,这些神经元的权重不会更新。此外,与此类神经元相连的神经元的权重也更新得很慢。该问题叫作梯度消失。因此,想象一下,如果一个大型神经网络包含 Sigmoid 神经元,而其中很多个都处于饱和状态,那么该网络无法执行反向传播。
  • 不以零为中心:Sigmoid 输出不以零为中心的,,输出恒大于0,非零中心化的输出会使得其后一层的神经元的输入发生偏置偏移(Bias Shift),并进一步使得梯度下降的收敛速度变慢。
  • 计算成本高昂:exp() 函数与其他非线性激活函数相比,计算成本高昂,计算机运行起来速度较慢。

Tanh/双曲正切 激活函数

Tanh 激活函数又叫作双曲正切激活函数(hyperbolic tangent activation function)。与 Sigmoid 函数类似,Tanh 函数也使用真值,但 Tanh 函数将其压缩至-1 到 1 的区间内。与 Sigmoid 不同,Tanh 函数的输出以零为中心,因为区间在-1 到 1 之间。

f(x)=tanh(x)=exexex+ex=1e2x1+e2x=21+e2x1f(x)=tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}=\frac{1-e^{-2x}}{1+e^{-2x}}=\frac{2}{1+e^{-2x}}-1

Tanh 函数可以看作放大并平移的Sigmoid 函数

tanh(x)=2sigmoid(2x)1tanh(x)=2sigmoid(2x)-1

tanh 激活函数的图像也是 S 形

在实践中,Tanh 函数的使用优先性高于 Sigmoid 函数。负数输入被当作负值,零输入值的映射接近零,正数输入被当作正值:

  • 当输入较大或较小时,输出几乎是平滑的并且梯度较小,这不利于权重更新。二者的区别在于输出间隔,tanh 的输出间隔为 1,并且整个函数以 0 为中心比 sigmoid 函数更好
  • 在 tanh 图中,负输入将被强映射为负,而零输入被映射为接近零。

存在的不足

  • Tanh 函数也会有梯度消失

在一般的二元分类问题中,tanh 函数用于隐藏层,而 sigmoid 函数用于输出层,但这并不是固定的,需要根据特定问题进行调整。

ReLU激活函数

ReLU函数又称为修正线性单元(Rectified Linear Unit),是一种分段线性函数,其弥补了sigmoid函数以及tanh函数的梯度消失问题,在目前的深度神经网络中被广泛使用。ReLU函数本质上是一个斜坡(ramp)函数。

ReLU(x)={x,x>00,x0=max(0,x)ReLU(x)=\begin{cases}x,& x>0 \\[2ex] 0,& x\leq0\end{cases}=max(0,x)

优点

  • 当输入为正时,导数为1,一定程度上改善了梯度消失问题,加速梯度下降的收敛速度;
  • ReLU 函数中只存在线性关系,因此它的计算速度快。
  • 被认为具有生物学合理性(Biological Plausibility),比如单侧抑制、宽兴奋边界(即兴奋程度可以非常高)
  • 使用Relu会使部分神经元为0,这样就造成了网络的稀疏性,并且减少了参数之间的相互依赖关系,缓解了过拟合问题的发生。

存在的不足

  • Dead ReLU 问题。当输入为负时,ReLU 完全失效,在正向传播过程中,这不是问题。有些区域很敏感,有些则不敏感。但是在反向传播过程中,如果输入负数,则梯度将完全为零;

ReLU神经元在训练时比较容易“死亡”。在训练时,如果参数在一次不恰当的更新后,第一个隐藏层中的某个ReLU 神经元在所有的训练数据上都不能被激活,那么这个神经元自身参数的梯度永远都会是0,在以后的训练过程中永远不能被激活,这种现象称为Dead ReLU问题,并且也有可能会发生在其他隐藏层。

  • 不以零为中心,ReLU 函数的输出不以零为中心,ReLU 函数的输出为 0 或正数,给后一层的神经网络引入偏置偏移,会影响梯度下降的效率。

Leaky ReLU 激活函数

为了解决 ReLU 激活函数中的梯度消失问题, 我们使用Leaky ReLU——该函数试图修复 Dead ReLU 问题。

LeakyReLU(X)={x,x>0γx,x0=max(0,x)+γmin(0,x)LeakyReLU(X)=\begin{cases}x,& x>0\\[2ex] \gamma x,& x\leq0\end{cases}=max(0,x)+\gamma min(0,x)

γ\gamma一般是个很小的数。

LeakyReLU(X)=max(x,γx)LeakyReLU(X)=max(x,\gamma x)

γ\gamma< 1,相当于是一个比较简单的Maxout单元。

Parametric ReLU 激活函数

Leaky ReLU 是让 x 乘常数项,而 Parametric ReLU 让 x 乘超参数。

PReLUi(X)={x,x>0γix,x0=max(0,x)+γimin(0,x)PReLU_i(X)=\begin{cases}x,& x>0\\[2ex] \gamma_i x,& x\leq0\end{cases}=max(0,x)+\gamma_i min(0,x)

其中γi\gamma_i是超参数,对应了x0x\leq0时函数的斜率。这里引入了一个随机的超参数,它可以被学习,可以对它进行反向传播。不同神经元可以有不同的参数,其中的i对应了第i个神经元,这使神经元能够选择负区域最好的梯度

如果 γi=0\gamma_i=0 ,那么 PReLU 就退化为 ReLU;

如果 γi\gamma_i 为一个很小的常数,则 PReLU 可以看作 Leaky ReLU;

PReLU 可以允许不同神经元具有不同的参数,也可以一组神经元共享一个参数。

ELU 激活函数

ELU(Exponential Linear Unit) 的提出同样也是针对解决 ReLUDead ReLU的问题,由Djork等人提出,被证实有较高的噪声鲁棒性。ELU激活函数对 xx 小于零的情况采用类似指数计算的方式进行输出。与 ReLU 相比,ELU 有负值,这会使激活的平均值接近零。均值激活接近于零可以使学习更快,因为它们使梯度更接近自然梯度。

ELU(X)={x,x>0α(ex1),x0ELU(X)=\begin{cases}x,& x>0\\ \alpha(e^x-1),& x\leq0\end{cases}

优点

  • 解决了 Dead ReLU 问题,输出的平均值接近 0,以 0 为中心;
  • ELU 通过减少偏置偏移的影响,使正常梯度更接近于单位自然梯度,从而使均值向零加速学习;
  • ELU 在较小的输入下会饱和至负值,从而减少前向传播的变异和信息。

不足

  • 计算量较大且强度更高。

Softmax 激活函数

Softmax 是用于多类分类问题的激活函数,在多类分类问题中,超过两个类标签则需要类成员关系。对于长度为 K 的任意实向量,Softmax 可以将其压缩为长度为 K,值在(0,1)范围内,并且向量中元素的总和为 1 的实向量。

Si=ezij=1KezjS_i=\frac{e^{z_i}}{\sum_{j=1}^K e^{z_j}}

Softmax 函数的分母结合了原始输出值的所有因子,这意味着 Softmax 函数获得的各种概率彼此相关

存在的不足

  • 在零点不可微;
  • 负输入的梯度为零,这意味着对于该区域的激活,权重不会在反向传播期间更新,因此会产生永不激活的死亡神经元。

Swish 激活函数

Swish激活函数又叫作自门控激活函数,它由谷歌的研究者发布。

Swish(x)=xSigmoid(βx)=xsigmoid(βx)=x1+eβxSwish(x)=x·Sigmoid(\beta x)=x·sigmoid(\beta x)=\frac{x}{1+e^{-\beta x}}

sigmoid(βx)sigmoid(\beta x)接近于1时,门处于“”状态,激活函数的输出近似于x本身;

sigmoid(βx)sigmoid(\beta x)接近于0时,门处于“”状态,激活函数的输出近似于0;

β=0\beta=0时,Swish 函数变成线性函数 �/2 ;

β=1\beta=1时,Swish 函数在 xx>0 时近似线性,在 xx<0 时近似饱和,同时具有一定的非单调性;

β\beta 趋于正无穷时,sigmoid(βx)sigmoid(\beta x) 函数趋向于离散的0-1函数,Swish 函数近似为 ReLU 函数;

因此,Swish 函数可以看作线性函数和ReLU 函数之间的非线性插值函数其程度由参数 β\beta 控制。

Maxout 激活函数

通常情况下,如果激活函数采用sigmoid函数的话,在前向传播过程中,隐含层节点的输出表达式为:

hi(x)=sigmoid(xTW...i+bi)h_i(x)=sigmoid(x^TW_{...i}+b_i)

一般情况下,W是2维的,这里表示的 i 是第 i 列,…表示的是对应第 i 列中的所有行。

在Maxout网络中,其隐含层节点的输出表达式为:

hi(x)=maxj[1,k] zijzij=xTW...ij+bij ,WRd×m×kh_i(x)=max_{j\in[1,k]} \space z_{ij} \\ z_{ij}=x^TW_{...ij}+b_{ij} \space ,W\in R^{d×m×k}

这里的 W 是3维的,尺寸为 d×m×k,其中 d 表示输入层节点的个数,m 表示隐含层节点的个数,k表示每个隐含层节点对应了 k 个”隐隐含层”节点,这k个”隐隐含层”节点都是线性输出的,而 maxout 的每个节点就是取这 k 个”隐隐含层”节点输出值中最大的那个值。因为激发函数中有了max操作,所以整个 maxout 网络也是一种非线性的变换。

Maxout 激活函数是一个可学习的激活函数,因为我们 W 参数是学习变化的。任何一个凸函数,都可以由线性分段函数进行逼近近似。ReLU、abs激活函数,看成是分成两段的线性函数,如下示意图所示:

优点

  • Maxout的拟合能力非常强,可以拟合任意的凸函数。
  • Maxout具有ReLU的所有优点,线性、不饱和性。同时没有ReLU的一些缺点。如:神经元的死亡。
  • 实验结果表明Maxout与Dropout组合使用可以发挥比较好的效果。

不足

每个神经元中有两组(w,b)参数,参数量增加了一倍,这就导致了整体参数的数量激增。

Softplus激活函数

Softplus 函数是 Sigmoid 函数原函数,Softplus 可以看做是ReLU函数的一个平滑版本。

Softplus(x)=f(x)=log(1+ex)f(x)=ex1+ex=11+ex=sigmoid(x)Softplus(x)=f(x)=log(1+e^x) \\ f'(x)=\frac{e^x}{1+e^x}=\frac{1}{1+e^{-x}}=sigmoid(x)

Softplus函数加了 1 是为了保证非负性。Softplus可以看作是强制非负校正函数max(0,x)平滑版本。

Softplus 函数其导数刚好是 Sigmoid 函数,Softplus 函数虽然也具有单侧抑制、宽兴奋边界的特性,却没有稀疏激活性

深度学习笔记:如何理解激活函数?(附常用激活函数) - 知乎 (zhihu.com)

激活函数(ReLU, Swish, Maxout) - 康行天下 - 博客园 (cnblogs.com)