机器学习——激活函数

1 引言

  学习神经网络的时候总是听到激活函数这个词,常用的激活函数,比如Sigmoid函数、tanh函数、Relu函数。学习激活函数之前,先问几个问题:

  1. 什么是激活函数?
  2. 为什么需要激活函数?
  3. 有哪些激活函数,都有什么性质和特点?
  4. 应用中如何选择合适的激活函数?

2 什么是激活函数?

  首先要了解神经网络的基本模型:

  

   神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值,并将输入值传递给下一层,输入层神经元节点会将输入属性值直接传递给下一层(隐层或输出层)。在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数(又称激励函数)。

3 为什么需要激活函数?

  如果不用激励函数(其实相当于激励函数是 $f(x) = x$ ),在这种情况下每一层节点的输入都是上层输出的线性函数,无论神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)。正因为上面的原因,引入非线性函数作为激励函数,这样深层神经网络表达能力就更加强大,不再是输入的线性组合,而是几乎可以逼近任意函数。

  举个简单的例子,二分类问题,如果不使用激活函数,例如使用简单的逻辑回归,只能作简单的线性划分,如下图所示:

  

   如果使用激活函数,则可以实现非线性划分,如下图所示:

  

  为什么激活函数一般都是非线性的,而不能是线性的呢?
  从反面来说,如果所有激活函数都是线性的,则激活函数 $g(z)=z$,即 $a=z$。那么,以两层神经网络为例,最终的输出为:
  $\begin{aligned} A^{[2]} &=Z^{[2]} \\ &=W^{[2]} A^{[1]}+b^{[2]} \\ &=W^{[2]}\left(W^{[1]} X+b^{[1]}\right)+b^{[2]} \\ &=\left(W^{[2]} W^{[1]}\right) X+\left(W^{[2]} b^{[1]}+b^{[2]}\right) \\ &=W^{\prime} X+b^{\prime} \end{aligned}$
  经过推导发现网络输出仍是 $X$ 的线性组合。这表明,使用神经网络与直接使用线性模型的效果没什么两样。即便是包含多层隐藏层的神经网络,如果使用线性函数作为激活函数,最终的输出仍然是线性模型,这样神经网络就没有任何作用。因此,隐藏层的激活函数必须要是非线性的。
  如果所有的隐藏层全部使用线性激活函数,只有输出层使用非线性激活函数,那么整个神经网络的结构就类似于一个简单的逻辑回归模型,效果与单个神经元无异。另外,如果是拟合问题而不是分类问题,输出层的激活函数可以使用线性函数。

4 有哪些激活函数,性质和特点?

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

4.1 Logistic 函数函数

  Sigmoid 型函数是指一类 S 型曲线函数,为两端饱和函数.常用的 Sigmoid 型函数有 Logistic 函数和 Tanh 函数.

  Logistic 函数 是常用的非线性的激活函数,Sigmoid型函数指一类S型曲线函数,为两端饱和函数。它的数学形式如下:

    ${\large \sigma(x)=\frac{1}{1+e^{-x}}} $

  数学小知识 | 饱和

  对于函数  $f(x)$ , 若  $x \rightarrow-\infty$  时, 其导数  $f^{\prime}(x) \rightarrow 0 $, 则称其为左饱和. 若  $x \rightarrow+\infty$  时, 其导数  $f^{\prime}(x) \rightarrow 0$ , 则称其为右饱和. 当同时满足左、右饱和时, 就称为两端饱和.

  Logistic 的几何图像如下:
  

  优点

  1. 具有“挤压”功能:把一个实数域的输入“挤压”到 (0, 1).当输入值在 0 附近时,Logistic  型函数近似为线性函数;当输入值靠近两端 时,对输入进行抑制.输入越小,越接近于 0;输入越大,越接近于 1。这样的特点 也和生物神经元类似,对一些输入会产生兴奋(输出为 1),对另一些输入产生抑 制(输出为 0).和感知器使用的阶跃激活函数相比,Logistic 函数是连续可导的, 其数学性质更好.
  2. 输出可看作概率分布:在数学上, Logistic  激活函数为每个类输出提供独立的概率。
  3. 非零中心化的输出会使得其后一层神经元的输入发生偏置偏移(Bias Shift),并进一步使得梯度下降的收敛速度变慢。参考《神经网络:激活函数非0中心导致的问题》

  缺点1:
    Logistic  函数容易饱和,导致训练结果不佳

  饱和区如下图所示:

  

  上图中红色椭圆标注的饱和区曲线平缓,梯度的值很小,近似为零。而且 Sigmoid 函数的饱和区范围很广,例如除了 $[-5,5]$,其余区域都近似饱和区。这种情况很容易造成梯度消失,梯度消失会增大神经网络训练难度,影响神经网络模型的性能。
  缺点2:
  Sigmoid 函数输出是非零对称的,即输出恒大于零。这是不可取的,因为这会导致后一层的神经元将得到上一层输出的非 $0$ 均值的信号作为输入。 产生的一个结果就是:
    输入 $x>0$ , $f=w^{T} x+b$
  这会产生什么影响呢?假如 Sigmoid 函数的输出为 $\sigma(\mathrm{Wx}+\mathrm{b})$,且满足 $0<\sigma(W x+b)<1$。在反向求导过程中,令损失函数 $J$ 对 $\sigma(\mathrm{Wx}+\mathrm{b})$ 的求导为 $\mathrm{d} \sigma$,现在计算 $J$ 对 $W$ 的偏导数:
    $\begin{aligned} \frac{\mathrm{d} J}{\mathrm{d} W}  &=d \sigma \cdot \frac{d}{d W}(\sigma(W x+b)) \\ &=d \sigma \cdot \sigma(W x+b)(1-\sigma(W x+b)) \cdot x \end{aligned}$
  其中,$\sigma(Wx+b)>0$,$1-\sigma (Wx+b)>0$。
  若神经元的输入 $x>$0,则无论 $d\sigma$ 正负如何,总能得到 $d W$ 恒为正或者恒为负。也就是说参数矩阵 $W$ 的每个元素都会朝着同一个方向变化,同为正或同为负。这对于神经网络训练是不利的,所有的 $W$ 都朝着同一符号方向变化会减小训练速度,增加模型训练时间。 
  值得一提的是,针对 Logistic  函数的这一问题,神经元的输入 $x$ 常会做预处理,即将均值归一化到零值。这样也能有效避免 $d W$ 恒为正或者恒为负。
  缺点3
  解析式中含有幂运算,机求解时相对来讲比较耗时。

4.2 tanh函数

  Tanh 函数也是一种 Sigmoid 型函数.其定义为
    ${\large \tanh (x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}} $
  Tanh 函数可以看作放大并平移的 Logistic 函数,其值域是 (−1, 1).
    $\tanh (x)=2 \sigma(2 x)-1$
   tanh函数及其导数的几何图像如下图:

  

  优点:

  零中心化,可提升收敛速度。

  缺点:

  没有改变Sigmoid函数由饱和性引起的梯度消失问题。

4.3 Hard-Logistic函数

  Logistic 函数和 Tanh 函数都是 Sigmoid 型函数,具有饱和性,但是计算开销 较大.因为这两个函数都是在中间(0 附近)近似线性,两端饱和.因此,这两个函 数可以通过分段函数来近似。
  Logistic函数和Tanh函数都是Sigmoid型函数,具有饱和性,但是计算开销较大。
  Logistic函数在0附近的一阶泰勒展开为 $g_l(x){\approx}{\sigma}(0)+x*{\sigma}'(0) = 0.25x+0.5$
  这样Logistic函数可以用分段函数hard-logistic(x)来近似
    $\begin{equation} hard-logistic(x)=\left \{ \begin{array}{ll} 1 & g_l(x) \ge 1 \\ g_l & 0<g_l(x)<1 \\ 0 & g_l(x) \le 0 \end{array} \right. \\ = max(min(g_l(x),1),0) \\ = max(min(0.25x+0.5,1),0) \end{equation}$

  

4.4 Hard-Tanh函数

  Tanh函数在 0 附近的一阶泰勒展开为 $g_l(x)\approx tanh(0)+x*tanh'(0)=x$

  $hard-tanh(x)=max(min(g_t(x),1),-1)=max(min(x,1),-1)$

  

4.5 ReLU函数

  ReLU(Rectified Linear Unit,修正线性单元)[Nair et al., 2010],也叫 Rectifier 函数 [Glorot et al., 2011],是目前深度神经网络中经常使用的激活函数. ReLU 实际上是一个斜坡(ramp)函数,定义为
    ${\large Relu(x) =\max (0, x)} $
  Relu函数及其导数的图像如下图所示:

  

  ReLU函数其实就是一个取最大值函数,且并不是全区间可导,如上图所示。

  • ReLU虽然简单,但有以下几大优点
  1. 在优化方面,相比于 Sigmoid 型函数的两端饱和,ReLU 函数为左饱和函数, 且在 𝑥 > 0 时导数为 1,在一定程度上缓解了神经网络的梯度消失问题,加速梯 度下降的收敛速度
  2. 具有单侧抑制、宽兴奋边界的生物学合理性。在生物神经网络中,同时处于兴奋状 态的神经元非常稀疏.人脑中在同一时刻大概只有 1% ∼ 4% 的神经元处于活跃 状态.Sigmoid 型激活函数会导致一个非稀疏的神经网络,而 ReLU 却具有很好 的稀疏性,大约 50% 的神经元会处于激活状态.
  3. 计算速度非常快,只需要判断输入是否大于0;
  4. 收敛速度远快于 Sigmoid 和 tanh,大约是 Sigmoid/tanh 的 6 倍,比 Sigmoid 更符合生物学神经激活机制;
  • ReLU需要特别注意的问题:
  1. ReLU的输出是非零中心化,ReLU 的输出仍然是非零对称的,可能出现 $dW$ 恒为正或者恒为负,从而影响训练速度。
  2. Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新:当 $x<0$ 时,ReLU 输出总为零。该神经元输出为零,则反向传播时,权重、参数的梯度横为零,造成权重、参数永远不会更新,即造成神经元失效,形成了“死神经元”。所以,针对这一问题,有时候会将 ReLU 神经元初始化为正偏值,例如 0.01。
  • 有两个主要原因可能导致这种情况产生:

  (1) 非常不幸的参数初始化,这种情况比较少见。
  (2) Learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。

4.6 Leaky ReLU函数

  带泄露的 ReLU(Leaky ReLU)在输入 $𝑥 < 0$ 时,保持一个很小的梯度 $𝛾$.这 样当神经元非激活时也能有一个非零的梯度可以更新参数,避免永远不能被激 活 [Maas et al., 2013].带泄露的 ReLU 的定义如下:
    $\begin{aligned} \text { LeakyReLU }(x) &=\left\{\begin{array}{ll} x & \text { if } x>0 \\ \gamma x & \text { if } x \leq 0 \end{array}\right.\\ &=\max (0, x)+\gamma \min (0, x) \end{aligned}$

  Leaky ReLU函数及其导数的图像如下图所示:

  

  其中 $\gamma$ 是一个很小的常数,且可调,一般不会太大。比如 $0.01$.当 $\gamma< 1$ 时,带泄露的 ReLU 也可以写为
    $\operatorname{LeakyReLU}(x)=\max (x, \gamma x)$
  相当于是一个比较简单的maxout单元.

  优点:

  1. 没有饱和区,不存在梯度消失问题。
  2. 在 $x< 0$ 时也保持一个很小的梯度,避免永远不能被激活的情况。
  3. 没有复杂的指数运算,计算简单、效率提高。
  4. 实际收敛速度较快,大约是 Sigmoid/tanh 的 6 倍。
  5. 不会造成神经元失效,形成了 “死神经元”。

4.7 带参数的 ReLU

  带参数的 ReLU(Parametric ReLU,PReLU)引入一个可学习的参数,不 同神经元可以有不同的参数 [He et al., 2015].对于第 $𝑖$ 个神经元,其 PReLU 的 定义为

    $\begin{aligned} \operatorname{PReLU}_{i}(x) &=\left\{\begin{array}{ll} x & \text { if } x>0 \\ \gamma_{i} x & \text { if } x \leq 0 \end{array}\right.\\ &=\max (0, x)+\gamma_{i} \min (0, x) \end{aligned}$

  其中 $\gamma_{i}$ 为 $x ≤ 0$ 时函数的斜率.因此,PReLU 是非饱和函数.如果 $\gamma_{i} = 0$,那么 PReLU 就退化为 ReLU.如果 $\gamma_{i}$ 为一个很小的常数,则 PReLU 可以看作带泄露的 ReLU.PReLU 可以允许不同神经元具有不同的参数,也可以一组神经元共享一 个参数.

4.8 ELU 函数

  ELU(Exponential  Linear  Unit,指数线性单元)[Clevert  et  al.,  2015] 是一 个近似的零中心化的非线性函数,其定义为

    $\begin{aligned} \operatorname{ELU}(x) &=\left\{\begin{array}{ll} x & \text { if } x>0 \\ \gamma(\exp (x)-1) & \text { if } x \leq 0 \end{array}\right.\\ &=\max (0, x)+\min (0, \gamma(\exp (x)-1)) \end{aligned}$

  其中  $\gamma \geq 0$ 是一个超参数,决定 $ x \leq 0 $ 时的饱和曲线,并调整输出均值在 $ 0 $ 附近. 

  函数及其导数的图像如下图所示:

  

  ELU 继承了 Leaky ReLU 的所有优点
  优点:

  1. 没有饱和区,不存在梯度消失问题;
  2. 没有复杂的指数运算,计算简单、效率提高;
  3. 实际收敛速度较快,大约是 Sigmoid/tanh 的 6 倍;
  4. 不会造成神经元失效,形成了“死神经元”;
  5. 输出均值为零;
  6. 负饱和区的存在使得 ELU 比 Leaky ReLU 更加健壮,抗噪声能力更强。

  缺点:
  ELU 包含了指数运算,存在运算量较大的问题。

4.9 Softmax函数

  根据维基百科对 Softmax 函数的定义: Softmax 函数的本质是将一个 K 维的任意 实数向量, 压缩(映射)成另一个 K 维的实数向量, 其中向量中的每个元素取值都 介于 (0,1) 范围内。
  Softmax 是对逻辑回归(Logistic Regression, LR)的推广, 逻辑回归用于处理二 分类问题, 其推广 Softmax 回归则用于处理多分类问题。如图 Softmax函数曲线图 所示, 在数学上, Softmax 函数会返回输出类的互斥概率分布,例如,网络的输出为 (1,1,1,1) , 经过 Softmax 函数后输出为 (0.25,0.25,0.25,0.25) 。我们可以得到分类中唯一所属类别, 因此通常把 Softmax 作为输出层的激活函数。Softmax 激活函数如下所示,见

    $\operatorname{softmax}\left(x_{j}\right)=\frac{\mathrm{e}^{x_{j}}}{\sum \limits _{k=1}^{K} \mathrm{e}^{x_{k}}}$

  

4.10 Softplus函数

  Softplus 函数[Dugas  et  al.,  2001] 可以看作 Rectifier 函数的平滑版本,其 定义为

    $\text { Softplus }(x)=\log (1+\exp (x))$

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

  

4.11 Swish函数

  Swish 函数[Ramachandran et al., 2017] 是一种自门控(Self-Gated)激活函数,定义为
    $\operatorname{swish}(x)=x \sigma(\beta x)$

  其中 $𝜎(⋅)$ 为 Logistic 函数,$𝛽$ 为可学习的参数或一个固定超参数.$𝜎(⋅) ∈ (0, 1)$ 可 以看作一种软性的门控机制.当  $𝜎(𝛽𝑥) $ 接近于 1 时,门处于“开”状态,激活函数的 输出近似于 $𝑥 $本身;当 $𝜎(𝛽𝑥) $ 接近于 0 时,门的状态为“关”,激活函数的输出近似于 0.

  给出了 Swish 函数的示例:

  

  当 $𝛽  =  0 $ 时,Swish 函数变成线性函数 $𝑥/2$.当 $𝛽  =  1$ 时,Swish 函数在 $𝑥  >  0$ 时近似线性,在 $𝑥 < 0 $ 时近似饱和,同时具有一定的非单调性.当  $𝛽→ +∞$ 时, $𝜎(𝛽𝑥) $ 趋向于离散的 0-1 函数,Swish 函数近似为 ReLU 函数.因此,Swish 函数可以看作线性函数和 ReLU 函数之间的非线性插值函数,其程度由参数 $𝛽$ 控制.

4.12 GELU函数

  GELU(Gaussian Error Linear Unit,高斯误差线性单元)[Hendrycks et al., 2016] 也是一种通过门控机制来调整其输出值的激活函数,和 Swish 函数比较 类似.

    $\operatorname{GELU}(x)=x P(X \leq x)$

  其中  $P(X \leq x)$  是高斯分布  $\mathcal{N}\left(\mu, \sigma^{2}\right) $ 的累积分布函数,其中  $\mu, \sigma$ 为超参数,一般设  $\mu=0, \sigma=1$  即可. 由于高斯分布的累积分布函数为  $\mathrm{S} $ 型函数, 因此 GELU 函数可 以用 Tanh 函数或 Logistic 函数来近似,

    $z_{k}=\boldsymbol{w}_{k}^{\top} \boldsymbol{x}+b_{k}$

    或 $ \quad \operatorname{GELU}(x) \approx x \sigma(1.702 x)$

  当使用Logistic函数来近似时,GELU相当于一种特殊的Swish函数.

4.13 MaxOut函数

  Maxout 单元[Goodfellow et al., 2013] 也是一种分段线性函数.Sigmoid 型 函数、ReLU 等激活函数的输入是神经元的净输入 𝑧,是一个标量.而 Maxout 单 元的输入是上一层神经元的全部原始输出,是一个向量$\boldsymbol{x}=\left[x_{1} ; x_{2} ; \cdots ; x_{D}\right]$ 。
  每个 Maxout 单元有 $K$ 个权重向量 $ \boldsymbol{w}_{k} \in \mathbb{R}^{D}$ 和偏置 $ b_{k}(1 \leq k \leq K)$ . 对于输 入 $ \boldsymbol{x} $ , 可以得到 $ K$ 个净输入 $ z_{k}, 1 \leq k \leq K$ .
    $\max \left(w_{1}^{T} x+b_{1}, w_{2}^{T} x+b_{2}\right)$
  其中 $ \boldsymbol{w}_{k}=\left[w_{k, 1}, \cdots, w_{k, D}\right]^{\top} $为第 $k$ 个权重向量.。
  Maxout单元的非线性函数定义为
    $\operatorname{maxout}(\boldsymbol{x})=\underset{k \in[1, K]}{max} \left(z_{k}\right)$
  Maxout单元不单是净输入到输出之间的非线性映射,而是整体学习输入到输出之间的非线性映射关系.Maxout激活函数可以看作任意凸函数的分段线性近似,并且在有限的点上是不可微的。

  •  Maxout是对整流线性单元的进一步扩展。
  •  Maxout将神经元的净输入 z 分为 K 组,每一组均为一个线性函数。
  •  Maxout可以看做任意凸函数的分段线性近似。

  

5 如何选择合适的激活函数?

  在选择激活函数时,一般隐层选择 Leak ReLU 函数会得到较为理想的效果。当 然这不是恒定的规律,我们可以尝试使用 Sigmoid 函数作为隐层激活函数,但注意 使用时尽量不要超过太多隐层。另外可以使用 Tanh 函数来代替 Sigmoid 函数观察 模型的精确率甴线图。如果直接使用 ReLU 函数作为激活函数, 注意梯度下降算 法的学习率参数  $\eta$  不能设置得过高,避免神经元的大量 “消亡”。对于输出层, 般使用 Softmax 函数获得同分布最高概率作为输出结果。此外, 可以加入 Batch Normalization (BN) 层, 让下一层的输入数据具有相同的分布。如果遇到神经网络训 练时收敛速度慢,或梯度爆炸或者梯度消失等无法训练的状况都可以尝试加入 BN 层,然后观察其训练结果。

 

posted @ 2021-03-11 11:59  图神经网络  阅读(910)  评论(0编辑  收藏  举报
Live2D