激活函数

一.激活函数的意义

为什么需要激活函数

  1. 激活函数对模型学习、理解非常复杂和非线性的函数具有重要作用。
  2. 激活函数可以引入非线性因素。如果不使用激活函数,则输出信号仅是一个简单的线性函数。线性函数一个一级多项式,线性方程的复杂度有限,从数据中学习复杂函数映射的能力很小。没有激活函数,神经网络将无法学习和模拟其他复杂类型的数据,例如图像、视频、音频、语音等。
  3. 激活函数可以把当前特征空间通过一定的线性映射转换到另一个空间,让数据能够更好的被分类。

为什么需要非线性激活函数

  1. 如果网络中全部是线性结构,那么线性的组合还是线性,与单独一个线性分类器无异。这样就做不到拟合逼近任意函数。
  2. 使用非线性激活函数 ,可以增加网络的学习能力,使它可以学习复杂的事物,复杂的表单数据,以及复杂的任意函数映射。即能够从输入输出之间生成非线性映射。

激活函数的性质

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

二.常见的激活函数

(1)Sigmoid 激活函数

函数的定义为:

为什么要进行激活函数 激活函数的目的_深度学习_03

如下图所示,其值域为 为什么要进行激活函数 激活函数的目的_神经网络_04。也就是说,输入的每个神经元、节点都会被缩放到一个介于0和1之间的值。

当x大于零时输出结果会趋近于1,而当x小于零时,输出结果趋向于0,由于函数的特性,经常被用作二分类的输出端激活函数。

为什么要进行激活函数 激活函数的目的_神经网络_05

Sigmoid的导数

为什么要进行激活函数 激活函数的目的_深度学习_06

为什么要进行激活函数 激活函数的目的_机器学习_07时,为什么要进行激活函数 激活函数的目的_深度学习_08

Sigmoid的优点
  1. 平滑
  2. 易于求导
  3. 可以作为概率,辅助模型解释
Sigmoid的缺陷
  1. 当输入数据很大或者很小时,函数的梯度几乎接近于0,这对神经网络在反向传播中的学习非常不利。如下图所示。
  2. Sigmoid函数的均值不是0,这使得神经网络的训练过程中只会产生全正或全负的反馈。
  3. 导数值小于1,反向传播易导致梯度消失。

为什么要进行激活函数 激活函数的目的_激活函数_09

为什么要进行激活函数 激活函数的目的_激活函数_10

(2)Tanh激活函数

函数的定义为:
为什么要进行激活函数 激活函数的目的_深度学习_11

如下图所示,值域为 为什么要进行激活函数 激活函数的目的_神经网络_12

Tanh的优势
  1. Tanh函数把数据压缩到-1到1的范围,解决了Sigmoid函数均值不为0的问题,所以在实践中通常Tanh函数比Sigmoid函数更容易收敛。在数学形式上其实Tanh只是对Sigmoid的一个缩放形式,公式为tanh(x) = 2f(2x) -1(f(x)是sigmoid的函数)。
  2. 平滑
  3. 易于求导

为什么要进行激活函数 激活函数的目的_深度学习_13

Tanh的导数

为什么要进行激活函数 激活函数的目的_机器学习_14

为什么要进行激活函数 激活函数的目的_机器学习_07时,为什么要进行激活函数 激活函数的目的_神经网络_16

由Tanh和Sigmoid的导数也可以看出Tanh导数更陡,收敛速度比Sigmoid快。

为什么要进行激活函数 激活函数的目的_激活函数_17

Tanh的缺点

导数值小于1,反向传播易导致梯度消失。

(3)Relu激活函数

函数的定义为:

为什么要进行激活函数 激活函数的目的_激活函数_18

如下图所示,值域为 为什么要进行激活函数 激活函数的目的_深度学习_19

为什么要进行激活函数 激活函数的目的_深度学习_20

ReLU的优势
  1. 计算公式非常简单,不像上面介绍的两个激活函数那样涉及成本更高的指数运算,大量节约了计算时间。
  2. 在随机梯度下降中比Sigmoid和Tanh更加容易使得网络收敛。
  3. ReLU进入负半区的时候,梯度为 0,神经元此时不会训练形成单侧抑制,产生稀疏性。这样可以提高学习的精度,更好更快地提取稀疏特征。
  4. sigmoid 和 tanh 函数的导数在正负饱和区的梯度都会接近于 0,这会造成梯度消失,而 ReLU函数大于 0 部分都为常数保持梯度不衰减,不会产生梯度消失现象。

稀疏:数量少,通常分散在很大的区域。在神经网络中,这意味着激活的矩阵含有许多 0。这种稀疏性能让我们得到什么?当某个比例(比如 50%)的激活饱和时,我们就称这个神经网络是稀疏的。这能提升时间和空间复杂度方面的效率——常数值(通常)所需空间更少,计算成本也更低。

ReLU的导数

为什么要进行激活函数 激活函数的目的_激活函数_21

通常为什么要进行激活函数 激活函数的目的_机器学习_07时,给定其导数为1和0。

为什么要进行激活函数 激活函数的目的_神经网络_23

ReLU的不足
  1. 训练中可能会导致出现某些神经元永远无法更新的情况。其中一种对ReLU函数的改进方式是LeakyReLU。
  2. ReLU不能避免梯度爆炸问题。

(4)LeakyReLU 激活函数

函数定义为:

为什么要进行激活函数 激活函数的目的_机器学习_24

如下图所示(为什么要进行激活函数 激活函数的目的_为什么要进行激活函数_25),值域为 为什么要进行激活函数 激活函数的目的_机器学习_26

为什么要进行激活函数 激活函数的目的_神经网络_27

LeakyReLU的优势

该方法与ReLU不同的是在x小于0的时候取f(x) = ax,其中a是一个非常小的斜率(比如0.01)。这样的改进可以使得当x小于0的时候也不会导致反向传播时的梯度消失现象。

LeakyReLU的不足
  1. 无法避免梯度爆炸的问题。
  2. 神经网络不学习为什么要进行激活函数 激活函数的目的_神经网络_28值。
  3. 在求导的时候,两部分都是线性的。

(5)SoftPlus 激活函数

函数的定义为:

为什么要进行激活函数 激活函数的目的_为什么要进行激活函数_29

值域为 为什么要进行激活函数 激活函数的目的_深度学习_30

函数图像如下:

为什么要进行激活函数 激活函数的目的_为什么要进行激活函数_31

可以把SoftPlus看作是ReLU的平滑。

(6)Softmax函数

函数定义为:

为什么要进行激活函数 激活函数的目的_机器学习_32

其中为什么要进行激活函数 激活函数的目的_机器学习_33可以等于为什么要进行激活函数 激活函数的目的_为什么要进行激活函数_34为什么要进行激活函数 激活函数的目的_深度学习_35为什么要进行激活函数 激活函数的目的_激活函数_36 是列向量,为什么要进行激活函数 激活函数的目的_为什么要进行激活函数_34 可能被换成函数关于 为什么要进行激活函数 激活函数的目的_激活函数_36 的函数 为什么要进行激活函数 激活函数的目的_为什么要进行激活函数_39

Softmax的特点

通过 softmax 函数,可以使得 为什么要进行激活函数 激活函数的目的_深度学习_40 的范围在 为什么要进行激活函数 激活函数的目的_神经网络_41 之间。在回归和分类问题中,通常 为什么要进行激活函数 激活函数的目的_激活函数_42 是待求参数,通过寻找使得 为什么要进行激活函数 激活函数的目的_深度学习_40 最大的 为什么要进行激活函数 激活函数的目的_深度学习_35

使得范围在 为什么要进行激活函数 激活函数的目的_神经网络_41 之间的方法有很多,这里使用 为什么要进行激活函数 激活函数的目的_机器学习_46

为什么要进行激活函数 激活函数的目的_为什么要进行激活函数_47

这个函数的作用就是使得 为什么要进行激活函数 激活函数的目的_深度学习_40 在负无穷到 0 的区间趋向于 0, 在 0 到正无穷的区间趋向 1。同样 softmax 函数加入了 为什么要进行激活函数 激活函数的目的_激活函数_49:正样本的结果将趋近于 1,而负样本的结果趋近于 0,并把输出总和进行了归一化。

这样为多类别提供了方便(可以把 为什么要进行激活函数 激活函数的目的_深度学习_40

它是一个网络预测多分类问题的最佳输出激活函数。

Softmax函数应用于多分类

假设我们有一个数组,为什么要进行激活函数 激活函数的目的_机器学习_33 表示 为什么要进行激活函数 激活函数的目的_神经网络_52 中的第 为什么要进行激活函数 激活函数的目的_机器学习_53

为什么要进行激活函数 激活函数的目的_激活函数_54

从下图看,神经网络中包含了输入层,然后通过两个特征层处理,最后通过 softmax 分析器就能得到不同条件下的概率,这里需要分成三个类别,最终会得到 为什么要进行激活函数 激活函数的目的_深度学习_55

为什么要进行激活函数 激活函数的目的_深度学习_56

继续看下面的图,三个输入通过 softmax 后得到一个数组 为什么要进行激活函数 激活函数的目的_深度学习_57,这就是 soft 的功能。

为什么要进行激活函数 激活函数的目的_机器学习_58

更形象的映射过程如下图所示:

为什么要进行激活函数 激活函数的目的_为什么要进行激活函数_59

softmax 直白来说就是将原来输出是 为什么要进行激活函数 激活函数的目的_神经网络_60 通过 softmax 函数一作用,就映射成为 为什么要进行激活函数 激活函数的目的_神经网络_41 的值,而这些值的累和为 为什么要进行激活函数 激活函数的目的_激活函数_62(满足概率的性质),那么我们就可以将它理解成概率,在最后选取输出结点的时候,我们就可以选取概率最大(也就是值对应最大的)结点,作为我们的预测目标。

激活函数的选择

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

以下是常见的选择情况:

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

(7)ELU激活函数

ELU激活函数解决了 ReLU 的一些问题,同时也保留了一些好的方面。这种激活函数要选取一个为什么要进行激活函数 激活函数的目的_深度学习_63值;常见的取值是在 0.1 到 0.3 之间。

函数定义如下所示:

为什么要进行激活函数 激活函数的目的_为什么要进行激活函数_64

如果我们输入的 为什么要进行激活函数 激活函数的目的_激活函数_36值大于0,则结果与ReLU一样,即为什么要进行激活函数 激活函数的目的_神经网络_66值等于为什么要进行激活函数 激活函数的目的_激活函数_36值;但如果输入的为什么要进行激活函数 激活函数的目的_激活函数_36值小于0,则我们会得到一个稍微小于0的值,所得到的为什么要进行激活函数 激活函数的目的_神经网络_66值取决于输入的为什么要进行激活函数 激活函数的目的_激活函数_36值,但还要兼顾参数 为什么要进行激活函数 激活函数的目的_深度学习_63——你可以根据需要来调整这个参数。更进一步,我们引入了指数运算为什么要进行激活函数 激活函数的目的_为什么要进行激活函数_72,因此 ELU 的计算成本比 ReLU 高。

下面给出了为什么要进行激活函数 激活函数的目的_深度学习_63值为0.2时的ELU函数图:

为什么要进行激活函数 激活函数的目的_机器学习_74

ELU的导数:

为什么要进行激活函数 激活函数的目的_深度学习_75

导数图如下所示:

为什么要进行激活函数 激活函数的目的_为什么要进行激活函数_76

ELU的优势
  1. 能避免ReLU中一些神经元无法更新的情况。
  2. 能得到负值输出,这能帮助网络向正确的方向推动权重和偏置变化。
ELU的不足
  1. 包含指数运算,计算时间长。
  2. 无法避免梯度爆炸问题。
  3. 神经网络无法学习为什么要进行激活函数 激活函数的目的_神经网络_28值。