产生背景
在机器学习领域,线性模型是最基础的模型,以逻辑回归和线性回归为例,这两个模型无论通过凸优化还是闭式解都能够高效且可靠的拟合数据。但是现实问题往往是线性不可分的,比如我们在学习svm的时候svm很难解决线性不可分的问题,所以采用和核函数,将一个非线性可分的映射到一个高维空间,进而变得线性可分。我们的激活函数也是为了解决非线性的问题的,它们通过给每个神经元增加非线性函数,进而达到整个神经网络具有拟合非线性的能力。
常见激活函数
sigmoid函数
sigmoid函数是最常用的一个激活函数,在逻辑回归的部分我们使用sigmoid来解决二分类的问题,其公式为:
求导公式为:
图像为:
![](https://img.haomeiwen.com/i10857530/e93d22c813a7ad40.png)
Tanh函数
tanh函数也是一个较常用的函数,其函数式为:
求导公式是:
图像为:
![](https://img.haomeiwen.com/i10857530/c0c9fdb02086b974.png)
Relu函数
relu函数是日常使用中用的最多的函数,而且其形式非常简单:
其导函数是:
其函数图像是:
![](https://img.haomeiwen.com/i10857530/1e29ab7adb767d99.png)
为什么sigmoid函数和tanh函数会出现梯度消失的情况?
首先看sigmoid函数,它是将一个输入映射到一个(0,1)区间,当z很小时,趋向于0,当z很大时,
趋向于1,而它的导数是
,这会导致不管z是极大还是极小它的导函数都趋向于0,造成了梯度消失。
而Tanh函数也是一样的,导函数是,和sigmoid是一样的情况。
Relu函数和sigmoid以及Tanh相比好处在哪?
优点:
- 首先Relu计算不用计算指数,计算上比后两者简单很多
- Relu的非饱和性可以有效的解决梯度消失问题(但是不能完全解决,只能说好一点,同样达到饱和区,也就是z极大或者极小时,后两者梯度一直都是0,Relu最起码保证了正方向的不是0),提供一个相对较宽的边界。(关于饱和的问题可以参考链接2)
- Relu的单侧抑制提供了网络稀疏表达的能力,我们都知道希望学习的参数是稀疏的,这样能够有效的抑制过拟合。
缺点:
缺点很直观,当然是函数为负的时候,梯度是0。
为了解决这个缺点,设计了新的激活函数,Leaky ReLU(LReLU):
求导公式是:
函数图像是:
![](https://img.haomeiwen.com/i10857530/20c0168b31e7c8f6.png)
这个函数即保证能够实现单侧抑制,又保证负梯度不会完全丢失,但是这里面存在一个问题,就是超参数a的调节,可能需要多次调节才能找到最好的。
基于解决这个问题,出现了参数化的PReLU(Parametric ReLU)。 它与LReLU的主要区别是将负轴部分斜率a作为网络中一个可学习的参数, 进行反向传播训练, 与其他含参数网络层联合优化。
还有一种LReLU的变种增加了“随机化”机制, 具体地, 在训练过程中, 斜率a作为一个满足某种分布的随机采样; 测试时再固定下来。 Random ReLU(RReLU) 在一定程度上能起到正则化的作用。
网友评论