常见激活函数
为什么要使用激活函数?
激活函数用来怎加非线性因素的,提高模型拟合能力。如果不存在激活函数,神经网络的每一层的输入都是对前面输入的线性变化,就算把网络加到很深也无法去拟合任意函数的。
激活函数具有的特性
虽然我们常用激活函数不是很多,那是否只有这些函数能作为激活函数呢?我们从神经网络的工作过程中看,激活函数具有什么样的性质能够更好的帮助神经网络的训练。(借鉴Hengkai Guo添加链接描述)
- 非线性:数,激活函数必须是非线性的。
- 计算简单:神经元都要经过激活运算的,在随着网络结构越来越庞大、参数量越来越多,激活函数如果计算量小就节约了大量的资源。
- f ( x ) ≈ x {\rm{f}}(x) \approx x f(x)≈x:在向前传播时,如果参数的初始化是随机量的最小值,神经网络的训练很高效。在训练的时候不会出现输出的幅度随着不断训练发生倍数的增长,是网络更加的稳定,同时也使得梯度更容易回传。
- 可微:因为神经网络要通过反向传播来跟新参数,如果激活函数不可微,就无法根据损失函数对权重求偏导,也就无法更新权重。传统的激活函数如sigmoid等满足处处可微。对于分段线性函数比如ReLU,只满足几乎处处可微(即仅在有限个点处不可微)。对于SGD算法来说,由于几乎不可能收敛到梯度接近零的位置,有限的不可微点对于优化结果不会有很大影响1。
- 非饱和性:(饱和函数有Sigmoid、Tanh等,非饱和函数ReLU等)例如Sigmoid函数求导以后的值很小,两端的值接近为零在反向传播的时候,如果网络的层次过大便会发生梯度消失的问题,使得浅层的参数无法更新。(梯度消失后面会介绍)
- 单调性:当激活函数单调时,单层网络保证是凸函数。
- 输出值的范围: 当激活函数输出值是有限的时候,基于梯度的优化方法会更加稳定,因为特征的表示受有限权值的影响更显著;当激活函数的输出是无限的时候,模型的训练会更加高效,不过在这种情况小,一般需要更小的Learning Rate2。
激活函数的类别
饱和激活函数
Sigmoid激活函数
1. 函数图像和公式
我们从图像和公式上结合上面分析的激活函数的特性来看看Sigmoid激活函数的优点和缺点。
f
(
x
)
=
1
1
+
e
−
x
{\rm{f}}(x) = \frac{1}{{1 + {e^{ - x}}}}
f(x)=1+e−x1
2. 函数性质
- 非线性函数
- 求导简单,函数求导后为 f ′ ( x ) = f ( x ) ( 1 − f ( x ) ) {f'}(x) = f(x)(1 - f(x)) f′(x)=f(x)(1−f(x))
- 不满足 f ( x ) ≈ x {\rm{f}}(x) \approx x f(x)≈x
- 在定义域内处处可导
- 饱和激活函数
- 函数为单调函数
- 函数的输出区间在(0,1)之间,函数定义域为负无穷到正无穷
3. 函数倒数图像和导数
4. 优点和缺点
- 优点:平滑、容易求导
- 缺点:
- 激活函数运算量大(包含幂的运算)
- 函数输出不关于原点对称,使得权重更新效率变低,同时这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入,随着网络的加深,会改变数据的原始分布
- 由图像知道导数的取值范围[0,0.25],非常的小。在进行反向传播计算的时候就会乘上一个很小的值,如果网络层次过深,就会发生“梯度消失”的现象了,无法更新浅层网络的参数了。
Tanh(双曲正切函数)激活函数
1. 函数图像和公式
函数图像:
函数公式:
f
(
x
)
=
(
e
x
−
e
−
x
)
(
e
x
+
e
−
x
)
f(x) = \frac{{({e^x} - {e^{ - x}})}}{{({e^x} + {e^{ - x}})}}
f(x)=(ex+e−x)(ex−e−x)
2. 函数倒数图像和导数
导数公式:
f
′
(
x
)
=
1
−
(
f
(
x
)
)
2
{f'}(x) = 1 - {(f(x))^2}
f′(x)=1−(f(x))2
倒数图像:
3. 函数性质
我们从图像和公式上结合上面分析的激活函数的特性来看看Tanh激活函数的优点和缺点,Tanh函数类似于将Sigmoid函数拉伸和向下平移的结果。
- 非线性函数(从图像上来看是一个分段线性函数,所有的负值为0,正值不变)
- 求导简单, f ′ ( x ) = 1 − ( f ( x ) ) 2 {f'}(x) = 1 - {(f(x))^2} f′(x)=1−(f(x))2
- 不满足 f ( x ) ≈ x {\rm{f}}(x) \approx x f(x)≈x
- 饱和激活函数
- 函数为单调函数
- 函数的输出区间在(-1,1)之间,函数定义域为负无穷到正无穷
4. 优点和缺点
- 优点:
- 解决了Sigmoid的输出不关于零点对称的问题
- 也具有Sigmoid的优点平滑,容易求导
- 缺点:
- 激活函数运算量大(包含幂的运算
- Tanh的导数图像虽然最大之变大,使得梯度消失的问题得到一定的缓解,但是不能根本解决这个问题
Sigmoid、Tanh激活函数引发的常见问题解决
先针对自然语言处理领域常用的RNN和LSTM网络来说
1. RNN 中为什么要采用 tanh,而不是 ReLU 作为激活函数?
(引用何之源的回答)添加链接描述
2. 为什么LSTM模型中既存在sigmoid又存在tanh两种激活函数?
(引用知乎问题添加链接描述)
非饱和激活函数
ReLU激活函数
ReLU函数代表的的是“修正线性单元”,它是带有卷积图像的输入x的最大函数(x,o)。ReLU函数将矩阵x内所有负值都设为零,其余的值不变
- 函数图像和公式
公式:
ReLu: f ( x ) = max ( 0 , x ) f(x) = \max (0,x) f(x)=max(0,x)
函数图像
2.激活函数的性质
- 非线性函数(虽然单侧是线性函数)
- 计算简单是真的简单(不管是在神经网络向前计算过程中还是反向传播的时候)
- 虽然ReLU在数学上的定义x=0处是不可导的,但是实际中为了解决这个问题直接将处的导数设置为1 ,当x>0时,Relu’(x) = 1, 当x<=0时,Relu’(x) = 0。(参考Young如果在前向传播的过程中使用了不可导的函数,是不是就不能进行反向传播了?)
- 右侧满足 f ( x ) ≈ x {\rm{f}}(x) \approx x f(x)≈x
- 右侧为单调函数
- 输出为(0,+无穷)
- 优点和缺点
- 优点
- 计算量小,相对于之前使用sigmoid和Tanh激活函数需要进行指数运算,使用ReLu的计算量小很多,在使用反向传播计算的时候也要收敛更更快。
- 缓解了在深层网络中使用sigmoid和Tanh激活函数造成了梯度消失的现象(右侧导数恒为1)
- 缓解过拟合的问题。由于函数的会使小于零的值变成零,使得一部分神经元的输出为0,造成网络的稀疏性,减少参数相互依赖的关系缓解过拟合的问题(请问人工神经网络中的activation function的作用具体是什么?为什么ReLu要好过于tanh和sigmoid function?)
- 缺点
- 造成神经元的“死亡”(详细的介绍见连接深度学习中,使用relu存在梯度过大导致神经元“死亡”,怎么理解?)
- ReLU的输出不是0均值的
- 对于ReLU神经元“死亡”解决方案
- 对函数进行优化,也就有了后面介绍的函数Leaky ReLU等
- 采用较小的学习速率
- 采用 momentum based 优化算法,动态调整学习率
- ReLu使用中疑问
- 在使用relu的网络中,是否还存在梯度消失的问题? ReLu是否彻底的解决了梯度消失的问题?知乎精彩解释
- RNN 中为什么要采用 tanh,而不是 ReLU 作为激活函数?是不是ReLU效果好就一定要使用这个激活函数?知乎大神讲得很清楚见链接
- relu激活函数比sigmoid效果好为什么还用sigmoid?sigmoid常常还有跟概率分布很像
Leaky ReLU等变种激活函数
- 函数图像和公式
公式:
f
(
x
)
=
max
(
α
x
,
x
)
f(x) = \max (\alpha x,x)
f(x)=max(αx,x)
函数图像跟之前的ReLu图像很像,同样的PReLU和ELU激活函数也是在ReLu的基础上针对ReLU在训练时神经元容易死亡做出了优化,基本的思路就是让函数小于0的部分不直接为0,而是等于一个很小的数,使得负轴的信息不至于完全丢弃。
- 在残差网络中激活函数relu的使用,为什么不使用leakyrelu、rrule等改进后的激活函数呢?详细见链接
- 为什么在生成对抗网络(GAN)中,隐藏层中使用leaky relu比relu要好?详细见链接
- https://zhuanlan.zhihu.com/p/73214810
- https://zhuanlan.zhihu.com/p/71882757