文章目录
什么是激活函数
激活函数,通俗讲,就是一个函数,针对某个神经元,就是将输入经过这个激活函数后,得到输出。
激活函数的作用
激活函数用在神经网络中,目的是增加非线性,使神经网络可以学习任意非线性的函数。
常用激活函数
1.Sigmoid函数
Sigmoid公式如下:
f ( x ) = 1 1 + e − x f(x)=\frac{1}{1+e^{-x}} f(x)=1+e−x1
Sigmoid输出范围是[0,1]内的实数,比较适用于二分类的类别情况,但实际中已经很少使用了。
- 优点:
梯度平滑,比较容易求导,可以避免模型在训练过程中出现突变的情况。 - 缺点:
(1)容易出现梯度消失。sigmoid函数求导后结果都是小于0.25的,所以反向传播时,不断的相乘,会是乘积结果渐渐趋于0,那么这个神经元就不起作用了,即出现了梯度消失,那么神经网络可能就不学习了
(2)sigmoid函数是指数运算,比较耗时和耗资源
(3)sigmoid函数输出并不是以0为中心,梯度可能会向特定方向移动,这样就会降低权重更新的效率(其实这句话我有点不咋理解,可能从图中看是当x=0时,y值不是0 )
图形如下:
2.Softmax函数
Softmax公式如下:
f ( x ) = e x i ∑ i e x i f(x)=\frac{e^{x_i}}{\sum_ie^{x_i}} f(x)=∑iexiexi
Softmax输出范围是[0,1]内的实数,且所有输出值的总和为1,常用于多分类任务中。
- 优点:
(1)输出可以被解释为概率,易于理解和解释,非常适合多分类任务
(2)归一化输出,将任何实数向量转换为一个有效的概率分布,其中所有输出值都是非负的,并且总和为1
(3)梯度特性,在训练过程中,当一个类别的输出接近1时,其梯度会减小,这有助于减缓学习过程,防止过度调整 - 缺点:
(1)计算时需要计算指数,计算效率低
(2)当输入特征的值非常大或非常小的时候,Softmax函数可能会遇到数值稳定性问题,如溢出或下溢
(3)梯度消失,当训练样本中一个类别的概率远大于其他类别时,梯度可能会非常小,导致梯度消失问题,从而减慢学习过程
图形如下:
3.Tanh函数
Tanh公式如下:
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−xex−e−x
Tanh输出范围是[-1,1]内的实数,Tanh是Sigmoid函数的变形,即 t a n h ( x ) = 2 s i g m o i d ( 2 x ) − 1 tanh(x)=2sigmoid(2x)-1 tanh(x)=2sigmoid(2x)−1,但Tanh是以零为中心的,实际应用中Tanh会比sigmoid更好一些,但是饱和神经情况下,Tanh还是会存在梯度消失问题,适合负输入将被强映射为负,而零输入被映射为接近零的情况。
-
优点:
(1)比sigmoid更好些,是以0为中心,梯度可能就不会向特定方向移动,这样就不会降低权重更新的效率
-
缺点:
(1)仍然会出现梯度饱和,即当输入-∞和+∞时,激活函数值无限接近-1和1,即神经元发挥不出作用了
(2)指数运算,耗时耗资源
图形如下:
4.Relu函数
Relu公式如下:
f ( x ) = m a x ( 0 , x ) f(x)=max(0,x) f(x)=max(0,x)
Tanh输出范围是[0,+∞]内的实数,输出不是以0为中心。
- 优点:
(1)解决了部分梯度消失问题,当输入值为正时,神经元不会饱和
(2)由于其线性、非饱和性质,relu容易收敛
(3)复杂度低,不需要指数运算 - 缺点:
(1)函数输出并不是以0为中心,梯度可能会向特定方向移动,这样就会降低权重更新的效率
(2)出现神经元死亡问题,即当输入为负,可能会出现梯度消失问题,输入为负数,经relu后变为0,神经元失效,对任何输入都无响应,导致参数永远不会被更新了
图形如下:
5.LeakyRelu函数
LeakyRelu公式如下:
f ( x ) = m a x ( α x , x ) f(x)=max(αx,x) f(x)=max(αx,x)
Tanh输出范围是[-∞,+∞]内的实数,输出不是以0为中心。
- 优点:
(1)减少梯度消失问题,当输入值为正时,神经元不会饱和;当输入为负时,不会出现Relu的神经元死亡问题,即结果为0的情况
(2)由于其线性、非饱和性质,relu容易收敛
(3)复杂度低,不需要指数运算 - 缺点:
(1)函数中的α是恒定值,需要经先验知识,人工赋值(常设0.01)
(2)有些近似线性,导致在复杂分类任务中效果不好
图形如下:
6.PRelu函数
PRelu公式如下:
f ( x ) = { α x , x < 0 x , x ≥ 0 } f(x)=\left\{ \begin{matrix} αx,x<0 \\ x,x≥0 \end{matrix} \right\} f(x)={αx,x<0x,x≥0}
PRelu输出范围是[-∞,+∞]内的实数,输出不是以0为中心。与Relu、LeakyRelu和PRelu不同的是,ELU的负半轴是一个指数函数不是一条直线。
- 优点:
(1)α是通过学习得到的,不是手动设置的确定值,更能灵活适应各种情况
(2)减少梯度消失问题,当输入值为正时,神经元不会饱和;当输入为负时,不会出现Relu的神经元死亡问题,即结果为0的情况
(3)由于其线性、非饱和性质,relu容易收敛
(4)复杂度低,不需要指数运算 - 缺点:
(1)有些近似线性,导致在复杂分类任务中效果不好
图形如下:
7.ELU函数
ELU公式如下:
f ( α , x ) = { α ( e x − 1 ) , x ≤ 0 x , x > 0 } f(α,x)=\left\{ \begin{matrix} α(e^x-1),x≤0 \\ x,x>0 \end{matrix} \right\} f(α,x)={α(ex−1),x≤0x,x>0}
ELU输出范围是[-α,+∞]内的实数,输出不是以0为中心。
- 优点:
(1)减少梯度消失问题,当输入值为正时,神经元不会饱和;当输入为负时,不会出现Relu的神经元死亡问题,即结果为0的情况,有助于减轻梯度消失问题,从而改善深层网络的训练效率
(3)输出均值接近0,有助于数据的中心化,减少训练过程中的偏置偏移,加速学习过程
(4)在整个定义域内连续可导,尤其是原点处连续,能够加速函数收敛 - 缺点:
(1)计算时需要计算指数,计算效率低
(2)α是根据先验知识手动设置的确定值
图形如下:
8.SELU函数
SELU公式如下:
f ( α , x ) = λ { α ( e x − 1 ) , x ≤ 0 x , x > 0 } f(α,x)= \lambda \left\{ \begin{matrix} α(e^x-1),x≤0 \\ x,x>0 \end{matrix} \right\} f(α,x)=λ{α(ex−1),x≤0x,x>0}
ELU输出范围是[-2,+∞]内的实数,输出不是以0为中心。其中,λ=1.0507,α=1.6733。SELU激活函数是在自归一化网络(SNN)中定义的,通过调整均值和方差来实现内部的归一化,这种内部归一化比外部归一化更快,这使得网络能够更快得收敛。
- 优点:
(1)自归一化。能够使输出的均值和方差接近1,有助于解决梯度消失和梯度爆炸问题,适合难以使用批量归一化的深度神经网络结构(如SNN 自归一化神经网络)
(2)无需额外归一化技术,可以减少或消除批量归一化等额外归一化需求,简化模型结构和训练过程 - 缺点:
(1)计算时需要计算指数,计算效率低
(2)自归一化属性依赖特定网络初始化方法和网络结构,在某些复杂模型结构中不适用或效果不明显
图形如下:
针对上述常用激活函数的场景汇总如下: - Sigmoid:
- 使用场景: 二分类问题中的输出层,因为输出值在0到1之间,可以表示为概率。
- 优点: 输出值在0和1之间,具有概率解释。
- 缺点: 容易受到梯度消失的影响,不适合深层网络。
- Softmax:
- 使用场景: 多分类问题中的输出层,将输出转换为概率分布。
- 优点: 输出可以解释为概率,并且所有输出值的和为1。
- 缺点: 计算复杂度较高,同样容易受到梯度消失的影响。
- Tanh (双曲正切):
- 使用场景: 隐藏层,输出值在-1到1之间,可以提供零中心化的数据。
- 优点: 输出值中心化,有助于数据的处理。
- 缺点: 仍然容易受到梯度消失的影响。
- ReLU (Rectified Linear Unit):
- 使用场景: 隐藏层,因为计算简单且可以缓解梯度消失问题。
- 优点: 计算效率高,可以加速神经网络的训练。
- 缺点: 存在死亡ReLU问题,即对于负输入,梯度为0。
- LeakyReLU:
- 使用场景: 隐藏层,当输入为负时,有一个非零的梯度。
- 优点: 解决了ReLU的死亡神经元问题。
- 缺点: 需要手动设置泄漏参数。
- PReLU (Parametric ReLU):
- 使用场景: 隐藏层,泄漏参数可以通过训练学习得到。
- 优点: 泄漏参数可学习,可能比LeakyReLU更有效。
- 缺点: 增加了模型的参数量。
- ELU (Exponential Linear Unit):
- 使用场景: 隐藏层,对于负数输入有一个非零的输出,有助于激活神经元。
- 优点: 可以缓解梯度消失问题,输出均值为零。
- 缺点: 计算复杂度比ReLU高。
- SELU (Scaled Exponential Linear Unit):
- 使用场景: 隐藏层,特别是在那些需要自归一化和不需要额外归一化技术的网络中。
- 优点: 自归一化,有助于加快收敛速度。
- 缺点: 需要仔细的参数初始化。
还有一些别的激活函数,如:Swish和Mish,这俩不太常用,可以详看篇博客:
https://blog.csdn.net/qq_42691298/article/details/126590726,注意:这篇博客里的softmax函数图像是错误的。
(如有问题,欢迎指出,一起学习,一起交流! 常总结,常复盘)