今天主要是来总结一下深度学习的激活函数:
1、什么是激活函数呢?
2、激活函数的作用是什么呢?
3、常用的激活函数有哪些?
4、如何选择激活函数?
主要围绕上面几个问题展开讲述!
线性模型在处理非线性问题时往往无从下手,这时引入激活函数来解决线性不可分问题!激活函数往往存在于输入层和输出层之间,目的是给神经网络一些非线性因数,使得神经网络能够解决更加复杂的问题,同时增强了神经网络的表达能力和学习能力。
常用的激活函数:
1、Sigmoid函数
- Sigmoid函数
- 双曲正切激活函数(tanh)
- 修正线性单元(ReLU)
这个是神经网络中常用的激活函数,数学表达式为:
函数图像如下:
单调递增函数,输出范围在[0,1]之间,负向增大趋近于0,正向增大越来越慢,趋近于1。比较容易求导。
缺点:
1、容易造成梯度消失,可以看出当输入特别大或特别小时,神经元梯度几乎为0,导致神经网络不收敛,参数就不会更新,训练就会变难。
2、 函数的输出不是以0为均值,导致传入下一层神经网络的输入是非0。这就可能导致传入神经网络的值永远大于0,这时参数无论怎么更新梯度都为正。
2、双曲正切激活函数(Tanh)
它是Sigmoid函数的变形,又名双曲正切激活函数。
数学表达式如下:
图像如下所示:
它的输出范围是[-1,1]之间。Tanh函数的输出是以0为均值的,解决了Sigmoid函数的第二个缺点。但是当输入特别大或者特别小的时候仍然会存在梯度消失的问题。
3、修正线性单元ReLU
这个是目前神经网络比较受欢迎的一种激活函数,其数学表达式为:f(x) = max(0,x),函数图像如下:
函数图像原点的左侧输出为0,斜率为0,函数图像原点右侧是斜率为1的直线,输出值就是输入值。相比上面的两种方法,有效的解决了梯度下降问题。并且计算简单,只要设置一定的阈值就可以计算激活值,极大的提高了计算的速度。
缺点:
训练的时候不适合大梯度的输入数据,因为在参数更新之后,ReLU的神经元不会再任何数据节点被激活,这就会导致梯度永远为0。比如:输入的数据小于0时,梯度就会为0,这就导致了负的梯度被置0,而且今后也可能不会被任何数据所激活,也就是说ReLU的神经元“坏死”了。
针对上面的问题又出现了:带泄露的ReLU和带参数的ReLU
4、其他激活函数
Leaky ReLU:是ReLU激活函数的变形,主要是针对ReLU函数中神经元容易坏死的缺陷,将原点左侧小于0的部分,赋予一个很小的斜率。其效果通常要好于ReLU激活函数,但实践中使用的频率并没有那么高。数据公式为:f(x) = max(0, x) + γmin(0, x)。通常,γ是一个很小的常数,如:0.01。
Parametric ReLU:是ReLU激活函数的另一种变形,和Leaky ReLU函数一样是非饱和函数,解决了坏死难题。不同之处在于其在函数中引入一个可学习的参数,往往不同的神经元有不同的参数,所以第i个神经元的数学表达式为:f(x) = max(0, x) + γi min(0, x)。当γi 取0时,便可以视为ReLU函数,取很小的常数时,可视为Leaky ReLU函数。相对而言,Parametric ReLU激活函数的使用频率也不是很高。
图1 Leaky ReLU/Parametric ReLU函数图像