当前位置:   article > 正文

激活函数简介_sigmoid

sigmoid

激活函数的作用

卷积神经网络提供非线性

1、Sigmoid激活函数

Sigmoid激活函数是常用的连续、平滑的“s”型激活函数,其数学定义比较简单,如公式1所示:

在这里插入图片描述
简单来说,Sigmoid函数以实数输入映射到(0,1)区间,用来做二分类。对于一个极大的负值输入,它输出的值接近于0;对于一个极大的正值输入,它输出的值接近于1。
在这里插入图片描述
Sigmoid激活函数曾一度被不同的网络使用,从Sigmoid及其导数曲线图可知,当输入的值非常小或者非常大时,其Sigmoid输出的值接近0或者1,当Sigmoid函数的前一层梯度接近于0时,由于前一层的学习参数梯度接近于0,使得参数无法得到有效更新,从而产生饱和神经元,因此Sigmoid激活函数在网络使用中比较容易产生梯度消失问题,饱和的神经元会加重梯度消失问题。在神经网络训练过程中,常需要对Sigmoid的值进行幂计算,增加训练时长,此外Sigmoid不是关于原点中心对称的,使得收敛变慢。

2、tanh激活函数

非线性函数tanh成为双曲线正切函数,其数学表达式见公式2:
在这里插入图片描述

简单的说,tanh激活函数可以将实数映射到(-1,1)区间,当tanh的输出极值接近-1和1时,也面临梯度饱和的问题。图2所示为tanh激活函数及其导数曲线图:
在这里插入图片描述
由曲线图可知,tanh激活函数是关于原点中心对称的,相比Sigmoid而言,收敛速度加快,梯度消失的特点依旧存在,因此难以训练。尽管tanh激活函数和Sigmoid激活函数存在梯度消失问题,但是梯度过大就会导致梯度爆炸问题。

3、ReLU激活函数

近年来ReLU激活函数变得很受欢迎,我们几乎可以在很多神经网络架构中看到ReLU的应用。其数学表达式见公式3:
在这里插入图片描述
简单来说,ReLU将所有负值取作0,正值保持不变。图3所示为ReLU激活函数及其导数曲线图
在这里插入图片描述
ReLU会使一部分神经元的输出为0,这样就造成了 网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。使用ReLU激活函数有助于优化器更快的找到正确的权重集合,理论上它使随机梯度下降收敛得更快。ReLU激活函数的计算成本低,因为只是判断了阈值。ReLU有个缺点,当一个很大的梯度进行反向传播时,流经的神经元经常会变得无效,这些神经元称为无效神经元,可以通过谨慎选择学习率控制。

4、Leaky ReLU激活函数

Leaky ReLU的提出就是为了解决神经元“死亡”问题,Leaky ReLU与ReLU很相似,仅在输入小于0的部分有差别,ReLU输入小于0的部分值都为0,而LeakyReLU输入小于0的部分,值为负,且有微小的梯度。其数学表达式见公式4:
在这里插入图片描述
通常取0.01,图4所示为Leaky ReLU激活函数及其导数曲线图
在这里插入图片描述
使用Leaky ReLU作为激活函数的优点就是在反向传播过程中也可以计算输入小于零部分的梯度,而不是像ReLU激活函数对于输入小于零部分的计算得到的梯度值为0,这样就避免了梯度方向锯齿问题。

5、Softplus激活函数

Softplus激活函数曲线类似ReLU激活函数曲线,但Softplus激活函数曲线相对平滑许多。其数学表达式见公式5:
在这里插入图片描述
图5所示为Softplus激活函数及其导数曲线图:
在这里插入图片描述
可以看出,Softplus可以被视为ReLU的平滑。根据神经科学家的相关研究,Softplus和ReLU类似于大脑神经元的激活频率功能。换句话说,与早期的激活函数相比,Softplus和ReLU更接近大脑神经元的激活模型。优点:Softplus可以作为ReLU的一个不错的替代选择,可以看到与ReLU不同的是,Softplus的导数是连续的、非零的、无处不在的,这一特性可以防止出现ReLU中的“神经元死亡”现象。缺点:Softplus是不对称的,不以0为中心,存在偏移现象;而且,由于其导数常常小于1,也可能会出现梯度消失的问题。

6、hardswish激活函数

hardswish激活函数。在MobileNet v3中被提出,相较于swish函数,具有数值稳定性好,计算速度快等优点。其数学表达式见公式6:
在这里插入图片描述
图6所示为hardswish激活函数及其导数曲线图
在这里插入图片描述
hardswish激活函数是对swish激活函数 的改进,因为swish非线性激活函数作为ReLU非线性激活函数的替代,在一定程度上可以提高神经网络的准确性。尽管swish非线性激活函数提高了检测精度,但不适合在嵌入式移动设备上使用,因为“S”型函数在嵌入式移动设备上的计算成本更高,求导较为复杂,在量化时计算较慢。在实验中使用hardswish非线性激活函数在准确性上没有明显差别,但从部署在嵌入式移动设备上而言具有多重优势。首先,几乎所有软件和硬件框架都提供了ReLU的优化实现。其次,在量化模式下,它消除了由于近似Sigmoid形的不同实现而导致的潜在数值精度损失。最后,在实践中,hardswish激活函数可以实现为分段功能,以减少内存访问次数,从而大大降低了等待时间成本。

7、Mish激活函数

Mish激活函数是Diganta Misra等人提出的一种平滑的非单调的激活函数。其数学表达式见7、8、9所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其函数曲线如图7所示
在这里插入图片描述
Mish激活函数主要有一下四个特点:无上界、无下界、光滑、非单调。这四个特性提高了函数的性能。无上限:它可以防止网络饱和,即梯度消失。有下界:提高网络的正则化效果。平滑:首先,与ReLU相比,在0值点连续可以减少一些不可预测的问题。其次,它可以使网络更容易优化,提高泛化性能,一些较小的负输入可以保留为负输出,以提高网络的可解释性和梯度流。
8、总结
激活函数的作用将将输入映射到输出,为神经网络提供非线性。激活函数选用是否恰当,直接影响网络的性能,比如收敛速度、检测精度、泛化性能等。图2-13展示了以上所述激活函数的曲线对比图。
在这里插入图片描述

9、代码绘图

代码仅仅是根据公式和求导进行绘图的。仅供参考:
注意阅读代码,选择需要绘制的激活函数的代码段运行,其余不用的注释掉即可

  1. # -*- coding : UTF-8 -*-
  2. import math
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. from math import exp
  6. # set x's range
  7. x = np.arange(-100, 100, 0.1)
  8. y1 = 1 / (1 + math.e ** (-x)) # sigmoid
  9. y11 = 1 / (2 + math.e ** (-x) + math.e ** (x)) # sigmoid的导数
  10. y2 = (math.e ** (x) - math.e ** (-x)) / (math.e ** (x) + math.e ** (-x)) # tanh
  11. y22 = 1 - y2 * y2 # tanh函数的导数
  12. y3 = np.where(x < 0, 0, x) # relu
  13. y33 = np.where(x < 0, 0, 1) # ReLU函数导数
  14. y4 = np.where(x < 0, 0.01*x, x) #Leaky ReLU
  15. y44 = np.where(x < 0, 0.01, 1) #Leaky ReLU导数
  16. y5 = np.log(np.exp(x) + 1) #softplus
  17. y55 = math.e ** (x) / (1+math.e ** (x))
  18. y6 = np.where(x <= -3, 0,np.where(x >= 3,x,x*(x+3)/6)) #hardswish
  19. y66 = np.where(x <= -3, 0, np.where(x >= 3, 1, (2*x)/6))
  20. y7 = x * (np.exp(y5)-np.exp(-y5))/(np.exp(y5)+np.exp(-y5))
  21. plt.xlim(-5, 5)
  22. plt.ylim(-2, 2)
  23. ax = plt.gca()
  24. ax.spines['right'].set_color('none')
  25. ax.spines['top'].set_color('none')
  26. ax.xaxis.set_ticks_position('bottom')
  27. ax.yaxis.set_ticks_position('left')
  28. ax.spines['bottom'].set_position(('data', 0))
  29. ax.spines['left'].set_position(('data', 0))
  30. # Draw pic
  31. #plt.plot(x, y1, label='Sigmoid', linestyle="-", color="red")
  32. #plt.plot(x, y11, label='Sigmoid derivative', linestyle="-", color="violet")
  33. #plt.plot(x, y2, label='Tanh', linestyle="-", color="blue")
  34. #plt.plot(x, y22, label='Tanh derivative', linestyle="-", color="violet")
  35. #
  36. plt.plot(x, y3, label='Relu', linestyle="-", color="green")
  37. plt.plot(x, y33, label='Relu derivative', linestyle="-", color="violet")
  38. #plt.plot(x, y4, label='Leaky ReLU', linestyle="-", color="olive")
  39. #plt.plot(x, y44, label='Leaky ReLU derivative', linestyle="-", color="orangered")
  40. #plt.plot(x, y5, label='Softplus', linestyle="-", color="dimgrey")
  41. #plt.plot(x, y55, label='Softplus derivative', linestyle="-", color="rosybrown")
  42. #plt.plot(x, y6, label='Softplus', linestyle="-", color="purple")
  43. #plt.plot(x, y66, label='Softplus derivative', linestyle="-", color="deeppink")
  44. #plt.plot(x, y7, label='Mish', linestyle="-", color="k")
  45. # Title
  46. plt.legend(['Sigmoid', 'Tanh', 'Relu', 'Leaky ReLU', 'Softplus','hardswish','Mish'])
  47. #plt.legend(['Sigmoid', 'Sigmoid derivative']) # y1 y11
  48. #plt.legend(['Tanh', 'Tanh derivative']) # y2 y22
  49. plt.legend(['Relu', 'Relu derivative']) # y3 y33
  50. #plt.legend(['Leaky ReLU', 'Leaky ReLU derivative']) # y4 y44
  51. #plt.legend(['Mish', 'Mish derivative']) # y5 y55
  52. # plt.legend(['Sigmoid', 'Sigmoid derivative', 'Relu', 'Relu derivative', 'Tanh', 'Tanh derivative']) # y3 y33
  53. # plt.legend(loc='upper left') # 将图例放在左上角
  54. # save pic
  55. plt.savefig('plot_test.png', dpi=100)
  56. plt.savefig(r"D:\desktop\activation_plot\ReLU")
  57. # show it!!
  58. plt.show()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/853317
推荐阅读
相关标签
  

闽ICP备14008679号