1. 概念
激活函数是一种为神经网络提供非线性表达能力的函数,如果一个深度学习网络,隐藏层都是简单的全连接层,那么它也只能表达线性映射,网络的深度就变得没有意义。只有加入了激活函数之后,深度神经网络才拥有表达非线性关系的能力。
2. 导数求导法则
- 线性法则:
- 导数乘法
- 导数除法
- 复合函数求导(链式求导)
3. 常用的激活函数
3.1. sigmoid 激活函数。
3.1.1. 数学相关
Sigmoid函数是深度学习领域开始时使用频率最高的激活函数,它是便于求导的平滑函数,能够将输出值压缩到0-1范围之内。数学表达式为
对其求导
推导过程如下:
sigmoid函数及其导数图像
3.1.1. 优点
-全程平滑可导
3.1.2. 缺点
- 容易出现梯度消失
sigmoid 函数的导数最大值为 0.25, 在反向过程中,由于链式求导法则,每一层往前都要乘以一个小于0.25的值,所以在深层网络中,梯度很容易趋近于0, 梯度消失深层网络的权重得不到更新。 - 输出不是zero-centered
Sigmoid函数的输出值恒大于0,假设后层的输入都是非0的信号,在反向传播过程中,weight要么是都往正方向更新,要么都往负方向更新,按照图中所示的阶梯式更新,并非好的优化路径,计算量较大,模型收敛的速度减慢 - 幂运算相对耗时
3.2. tanh 激活函数
tanh 是 sigmoid 函数的改良版。其数学表达式为
通过简单的推导,可以得到
推导过程如下
根据链式求导法则
tanh 函数及其导数图像
3.2.1. 优点
- 全程平滑可导,解决了sigmoid函数不是zero-centered的问题
3.2.2. 缺点
- 同Sigmoid一样,容易出现梯度消失,运算耗时
3.3 ReLu 激活函数
ReLU函数(Rectified Linear Units)是一个简单的在0与输入值之间取更大值的函数,在x=0处是不可微的。其数学表达式很简单
函数图像和导数为
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 代替