激活函数的作用

为卷积神经网络提供非线性

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、代码绘图

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

# -*- coding : UTF-8 -*-
import math
import numpy as np
import matplotlib.pyplot as plt
from math import exp# set x's range
x = np.arange(-100, 100, 0.1)y1 = 1 / (1 + math.e ** (-x))  # sigmoid
y11 = 1 / (2 + math.e ** (-x) + math.e ** (x))  # sigmoid的导数y2 = (math.e ** (x) - math.e ** (-x)) / (math.e ** (x) + math.e ** (-x))  # tanh
y22 = 1 - y2 * y2  # tanh函数的导数y3 = np.where(x < 0, 0, x)  # relu
y33 = np.where(x < 0, 0, 1)  # ReLU函数导数y4 = np.where(x < 0, 0.01*x, x) #Leaky ReLU
y44 = np.where(x < 0, 0.01, 1)  #Leaky ReLU导数y5 = np.log(np.exp(x) + 1)   #softplus
y55 = math.e ** (x) / (1+math.e ** (x))y6 = np.where(x <= -3, 0,np.where(x >= 3,x,x*(x+3)/6))  #hardswish
y66 = np.where(x <= -3, 0, np.where(x >= 3, 1, (2*x)/6))y7 = x * (np.exp(y5)-np.exp(-y5))/(np.exp(y5)+np.exp(-y5))plt.xlim(-5, 5)
plt.ylim(-2, 2)ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
ax.spines['bottom'].set_position(('data', 0))
ax.spines['left'].set_position(('data', 0))# Draw pic
#plt.plot(x, y1, label='Sigmoid', linestyle="-", color="red")
#plt.plot(x, y11, label='Sigmoid derivative', linestyle="-", color="violet")#plt.plot(x, y2, label='Tanh', linestyle="-", color="blue")
#plt.plot(x, y22, label='Tanh derivative', linestyle="-", color="violet")
#
plt.plot(x, y3, label='Relu', linestyle="-", color="green")
plt.plot(x, y33, label='Relu derivative', linestyle="-", color="violet")#plt.plot(x, y4, label='Leaky ReLU', linestyle="-", color="olive")
#plt.plot(x, y44, label='Leaky ReLU derivative', linestyle="-", color="orangered")#plt.plot(x, y5, label='Softplus', linestyle="-", color="dimgrey")
#plt.plot(x, y55, label='Softplus derivative', linestyle="-", color="rosybrown")#plt.plot(x, y6, label='Softplus', linestyle="-", color="purple")
#plt.plot(x, y66, label='Softplus derivative', linestyle="-", color="deeppink")#plt.plot(x, y7, label='Mish', linestyle="-", color="k")# Title
plt.legend(['Sigmoid', 'Tanh', 'Relu', 'Leaky ReLU', 'Softplus','hardswish','Mish'])
#plt.legend(['Sigmoid', 'Sigmoid derivative'])  # y1 y11
#plt.legend(['Tanh', 'Tanh derivative'])  # y2 y22
plt.legend(['Relu', 'Relu derivative'])  # y3 y33
#plt.legend(['Leaky ReLU', 'Leaky ReLU derivative'])  # y4 y44
#plt.legend(['Mish', 'Mish derivative'])  # y5 y55# plt.legend(['Sigmoid', 'Sigmoid derivative', 'Relu', 'Relu derivative', 'Tanh', 'Tanh derivative'])  # y3 y33
# plt.legend(loc='upper left')  # 将图例放在左上角# save pic
plt.savefig('plot_test.png', dpi=100)
plt.savefig(r"D:\desktop\activation_plot\ReLU")# show it!!
plt.show()

【深度学习】之激活函数篇[Sigmoid、tanh、ReLU、Leaky ReLU、Mish、Hardswish、SiLU]附绘图Python代码。相关推荐

  1. 深度学习之激活函数篇(Sigmoid、tanh、ReLU、PReLU)

    写在前面:此文只记录了下本人感觉需要注意的地方,不全且不一定准确.详细内容可以参考文中帖的链接,比较好!!! 常用激活函数(激励函数)理解与总结 激活函数的区别与优点 梯度消失与爆炸 1. 激活函数是 ...

  2. 激活函数总结sigmoid,tanh,relu,Leaky ReLU,RRelu,ELU,PRelu,SELU,swish

    本文总结深度学习的损失函数及其优缺点. 激活函数是深度学习模型的重要成分,目的是将线性输入转换为非线性.常见的激活函数有sigmoid,tanh,ReLU等 1.sigmoid Sigmoid 非线性 ...

  3. 独家 | 深度学习基础——激活函数以及什么时候使用它们?(附代码)

    作者:Dishashree Gupta 翻译:王紫岳 校对:王琦 本文约5200字,建议阅读20分钟 本文简要介绍了作者在初次进行机器学习的操作时所遇到的情况与得到的教训. 摘要 激活函数是神经网络的 ...

  4. 深度学习基础——激活函数以及什么时候使用它们?

    作者:Dishashree Gupta 翻译:王紫岳 校对:王琦 本文约5200字,建议阅读20分钟 本文简要介绍了作者在初次进行机器学习的操作时所遇到的情况与得到的教训. 摘要 激活函数是神经网络的 ...

  5. 深度学习之激活函数小结

    深度学习之激活函数小结 激活函数的作用和意义:引入非线性,增加网络表达能力: 基本激活函数介绍 首先看一下一些常见的激活函数: Sigmoid: 总结:第一个出现的激活函数,存在以下问题,所以后面基本 ...

  6. 深度学习-非线性激活函数

    本文总结深度学习的损失函数及其优缺点. 激活函数是深度学习模型的重要成分,目的是将线性输入转换为非线性.常见的激活函数有sigmoid,tanh,ReLU等 目录 1.sigmoid 2.tanh 3 ...

  7. 计算机视觉面试宝典--深度学习机器学习基础篇(四)

    计算机视觉面试宝典–深度学习机器学习基础篇(四) 本篇主要包含SVM支持向量机.K-Means均值以及机器学习相关常考内容等相关面试经验. SVM-支持向量机 支持向量机(support vector ...

  8. 深度学习 常见激活函数MATLAB 实现

    本文实现ReLU, Leaky ReLU, Expotential Linear unit, Sigmoid, tanh 激活函数的实现和可视化. clear all;close all;clc%% ...

  9. 机器视觉面试宝典--深度学习补缺补漏篇

    机器视觉面试宝典–深度学习补缺补漏篇 一.深入理解Batch Normalization批标准化 机器学习领域有个很重要的假设:IID独立同分布假设,就是假设训练数据和测试数据是满足相同分布的,这是通 ...

最新文章

  1. python【力扣LeetCode算法题库】100-相同的树
  2. Linux command: dos2unix
  3. javaweb学习总结九(xml解析以及调整JVM内存大小)
  4. 帆软 JAVA扩展_java报表开发工具FineReport教程之报表设计:单元格扩展
  5. 第四届CocoaChina开发者大会官网上线
  6. yum安装php f,yum安装LNMP
  7. 5G让万物互联成为可能 大连接时代谋划物联网
  8. 检查Linux服务器受到DDOS攻击
  9. “菜鸟”和“大神”de区别
  10. 基于java的网络电子通讯录的设计_网络电子通讯录管理系统
  11. 现在90后程序员有必要考证吗?
  12. ffmpeg录制电脑内部声音(如内部歌曲声音)
  13. PDF连接服务器信息,远程连接服务器.pdf
  14. 马上跨年了,用Python带你看一场跨年烟花秀
  15. 虚拟机域渗透环境搭建
  16. 论一个程序员的自我修养
  17. arm linux 内核崩溃,用sysrq-trigger实现ARM Linux一键内核崩溃、一键关机、一键dump信息等...
  18. HTML 表格与表单 个人简历
  19. 微信小程序:enablePullDownRefresh、onReachBottomDistance 、动态设置窗口的背景色、动态设置下拉背景字体
  20. 计算机课app开发,毕业设计(论文)-基于Android的《计算机网络基础》课程App的设计与开发.doc...

热门文章

  1. LiveVideoStackCon 2018技术培训 — 从FFmpeg视频编码到抖音式视频特效实现
  2. iPhone 13怎么投屏?苹果13连接电视投屏教程
  3. 基于微星x370gameplus主板安装w10+Ubuntu16.04双系统(后续再更新)
  4. Barsetto百胜图咖啡机引领办公咖啡潮流
  5. 自动回复html模板邮件,HTML邮件模板制作规范
  6. 人工智能导论(概要)
  7. html网页改兼容模型,浏览器兼容、CSS hack、normalize.css及盒模型基础知识问答
  8. 【Ex.】打印出菱形图案的简易方法
  9. c语言分量运算符举例,第2章C语言基础-运算符及其表达式摘要.ppt
  10. 浅谈jQuery属性获取