[TOC]

概述

激活函数对模型学习、理解非常复杂和非线性的函数具有重要作用。

激活函数可以引入非线性因素。如果不使用激活函数,则输出信号仅是一个简单的线性函数。线性函数一个一级多项式,线性方程的复杂度有限,从数据中学习复杂函数映射的能力很小。没有激活函数,神经网络将无法学习和模拟其他复杂类型的数据,例如图像、视频、音频、语音等。

激活函数可以把当前特征空间通过一定的线性映射转换到另一个空间,让数据能够更好的被分类。

激活函数的作用

假若网络中全部是线性部件,那么线性的组合还是线性,与单独一个线性分类器无异。这样就做不到用非线性来逼近任意函数。

使用非线性激活函数 ,以便使网络更加强大,增加它的能力,使它可以学习复杂的事物,复杂的表单数据,以及表示输入输出之间非线性的复杂的任意函数映射。使用非线性激活函数,能够从输入输出之间生成非线性映射。

常见激活函数

  1. sigmoid 激活函数

    函数的定义为:$ f(x) = \frac{1}{1 + e^{-x}} $,其值域为 $ (0,1) $。

    函数图像如下:

  1. tanh激活函数

    函数的定义为:$ f(x) = tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} $,值域为 $ (-1,1) $。

    函数图像如下:

  1. Relu激活函数

    函数的定义为:$ f(x) = max(0, x) $ ,值域为 $ [0,+∞) $;

    函数图像如下:

  1. Leak Relu 激活函数

    函数定义为: $ f(x) = \left{
    \begin{aligned}
    ax, \quad x<0 \
    x, \quad x>0
    \end{aligned}
    \right. $,值域为 $ (-∞,+∞) $。

    图像如下($ a = 0.5 $):

  1. SoftPlus 激活函数

    函数的定义为:$ f(x) = ln( 1 + e^x) $,值域为 $ (0,+∞) $。

    函数图像如下:

  1. softmax 函数

    函数定义为: $ \sigma(z)j = \frac{e^{z_j}}{\sum{k=1}^K e^{z_k}} $。

    Softmax 多用于多分类神经网络输出。

常见激活函数的导数计算

对常见激活函数,导数计算如下:

原函数 函数表达式 导数 备注
Sigmoid激活函数 $f(x)=\frac{1}{1+e^{-x}}$ $f^{‘}(x)=\frac{1}{1+e^{-x}}\left( 1- \frac{1}{1+e^{-x}} \right)=f(x)(1-f(x))$ 当$x=10$,或$x=-10$,$f^{‘}(x) \approx0$,当$x=0$$f^{‘}(x) =0.25$
Tanh激活函数 $f(x)=tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}$ $f^{‘}(x)=-(tanh(x))^2$ 当$x=10$,或$x=-10$,$f^{‘}(x) \approx0$,当$x=0$$f^{`}(x) =1$
Relu激活函数 $f(x)=max(0,x)$ $c(u)=\begin{cases} 0,x<0 \ 1,x>0 \ undefined,x=0\end{cases}$ 通常$x=0$时,给定其导数为1和0

激活函数的性质

  1. 非线性: 当激活函数是非线性的,一个两层的神经网络就可以基本上逼近所有的函数。但如果激活函数是恒等激活函数的时候,即 $ f(x)=x $,就不满足这个性质,而且如果 MLP 使用的是恒等激活函数,那么其实整个网络跟单层神经网络是等价的;
  2. 可微性: 当优化方法是基于梯度的时候,就体现了该性质;
  3. 单调性: 当激活函数是单调的时候,单层网络能够保证是凸函数;
  4. $ f(x)≈x $: 当激活函数满足这个性质的时候,如果参数的初始化是随机的较小值,那么神经网络的训练将会很高效;如果不满足这个性质,那么就需要详细地去设置初始值;
  5. 输出值的范围: 当激活函数输出值是有限的时候,基于梯度的优化方法会更加稳定,因为特征的表示受有限权值的影响更显著;当激活函数的输出是无限的时候,模型的训练会更加高效,不过在这种情况下,一般需要更小的 Learning Rate。

激活函数选择

​ 选择一个适合的激活函数并不容易,需要考虑很多因素,通常的做法是,如果不确定哪一个激活函数效果更好,可以把它们都试试,然后在验证集或者测试集上进行评价。然后看哪一种表现的更好,就去使用它。

以下是常见的选择情况:

  1. 如果输出是 0、1 值(二分类问题),则输出层选择 sigmoid 函数,然后其它的所有单元都选择 Relu 函数。
  2. 如果在隐藏层上不确定使用哪个激活函数,那么通常会使用 Relu 激活函数。有时,也会使用 tanh 激活函数,但 Relu 的一个优点是:当是负值的时候,导数等于 0。
  3. sigmoid 激活函数:除了输出层是一个二分类问题基本不会用它。
  4. tanh 激活函数:tanh 是非常优秀的,几乎适合所有场合。
  5. ReLu 激活函数:最常用的默认函数,如果不确定用哪个激活函数,就使用 ReLu 或者 Leaky ReLu,再去尝试其他的激活函数。
  6. 如果遇到了一些死的神经元,我们可以使用 Leaky ReLU 函数。