深度学习之三大激活函数

1. 概念

激活函数是一种为神经网络提供非线性表达能力的函数,如果一个深度学习网络,隐藏层都是简单的全连接层,那么它也只能表达线性映射,网络的深度就变得没有意义。只有加入了激活函数之后,深度神经网络才拥有表达非线性关系的能力。

2. 导数求导法则

  • 线性法则:

g(x)=f(x)±u(x)g(x)=f(x)±u(x)g(x) = f(x) \pm u(x) \Rightarrow g'(x) = f'(x) \pm u'(x)

  • 导数乘法

g(x)=f(x)u(x)g(x)=f(x)u(x)+f(x)u(x)g(x) = f(x)\cdot u(x) \Rightarrow g'(x) = f'(x) \cdot u(x) + f(x) \cdot u'(x)

  • 导数除法

g(x)=f(x)u(x)g(x)=f(x)u(x)f(x)u(x)(u(x))2g(x) = \frac{f(x)}{u(x)} \Rightarrow g'(x) = \frac{f'(x) \cdot u(x) - f(x) \cdot u'(x)}{(u(x))^2}

  • 复合函数求导(链式求导)

g(x)=f(u(x))g(x)=f(u(x))u(x)g(x) = f(u(x)) \Rightarrow g'(x) = f'(u(x)) \cdot u'(x)

3. 常用的激活函数

3.1. sigmoid 激活函数。

3.1.1. 数学相关

Sigmoid函数是深度学习领域开始时使用频率最高的激活函数,它是便于求导的平滑函数,能够将输出值压缩到0-1范围之内。数学表达式为

sigmoid(x)=11+exsigmoid(x) = \frac{1}{1+e^{-x}}

对其求导

sigmoid(x)=11+ex1(1+ex)2=sigmoid(x)sigmoid2(x) sigmoid'(x) = \frac{1}{1+e^{-x}} - \frac{1}{(1+e^{-x})^2} =sigmoid(x) - sigmoid^2(x)

推导过程如下:

image.png
sigmoid函数及其导数图像

image.png

3.1.1. 优点

-全程平滑可导

3.1.2. 缺点

  • 容易出现梯度消失
    sigmoid 函数的导数最大值为 0.25, 在反向过程中,由于链式求导法则,每一层往前都要乘以一个小于0.25的值,所以在深层网络中,梯度很容易趋近于0, 梯度消失深层网络的权重得不到更新。
  • 输出不是zero-centered
    Sigmoid函数的输出值恒大于0,假设后层的输入都是非0的信号,在反向传播过程中,weight要么是都往正方向更新,要么都往负方向更新,按照图中所示的阶梯式更新,并非好的优化路径,计算量较大,模型收敛的速度减慢
  • 幂运算相对耗时

3.2. tanh 激活函数

tanh 是 sigmoid 函数的改良版。其数学表达式为

tanh(x)=exexex+extanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}

通过简单的推导,可以得到

tanh(x)=exexex+ex=21+e2x1=2sigmoid(2x)1tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}=\frac{2}{1+e^{-2x}}- 1 = 2\cdot sigmoid(2x) - 1

推导过程如下

image.png
根据链式求导法则

tanh(x)=2sigmoid(2x)2=4sigmoid(2x)tanh'(x) = 2 \cdot sigmoid'(2x) \cdot 2 = 4 \cdot sigmoid'(2x)

tanh 函数及其导数图像

image.png

3.2.1. 优点

  • 全程平滑可导,解决了sigmoid函数不是zero-centered的问题

3.2.2. 缺点

  • 同Sigmoid一样,容易出现梯度消失,运算耗时

3.3 ReLu 激活函数

ReLU函数(Rectified Linear Units)是一个简单的在0与输入值之间取更大值的函数,在x=0处是不可微的。其数学表达式很简单

ReLU(x)=max(0,x)ReLU(x) = max(0, x)

函数图像和导数为

image.png

3.3.1. 优点

  • 解决了梯度消失的问题 (在正区间)
  • 计算速度非常快,只需要判断输入是否大于0
  • 收敛速度远快于sigmoid和tanh
  • Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生

3.3.2 缺点

  • 输出不是zero-centered
  • Dead ReLU Problem
    Dead ReLU Problem指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) 学习速率太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将学习速率设置太大或使用adagrad等自动调节学习速率的算法。
    尽管存在这两个问题,ReLU目前仍是最常用的激活函数。

4. 总结

  • ReLU是最常使用的激活函数。
    由于Sigmoid的值域为(0,1),非常适合做二分类问题的激活函数。其他情况尽量使用 tanh 代替
阅读(128)
评论(0)
updated@2021-05-10
评论区
目录