来源:AI有道

本文约2800字,建议阅读6分钟

本文为大家总结一下常用激活函数 Sigmoid、tanh、ReLU、Leaky ReLU、ELU、Maxout 的关键知识点。

我们知道,神经网络模型中,各隐藏层、包括输出层都需要激活函数(Activation Function)。我们比较熟悉的、常用的激活函数也有 ReLU、Sigmoid 等等。但是,对于各个激活函数的选取方法、区别特点还有几点需要特别注意的地方。今天我们就和大家一起来总结一下常用激活函数 Sigmoid、tanh、ReLU、Leaky ReLU、ELU、Maxout 的关键知识点。

为什么需要激活函数

神经网络单个神经元的基本结构由线性输出 Z 和非线性输出 A 两部分组成。如下图所示:

其中,f(x) 即为线性输出 Z,g(x) 即为非线性输出,g() 表示激活函数。通俗来说,激活函数一般是非线性函数,其作用是能够给神经网络加入一些非线性因素,使得神经网络可以更好地解决较为复杂的问题。

举个简单的例子,二分类问题,如果不使用激活函数,例如使用简单的逻辑回归,只能作简单的线性划分,如下图所示:

如果使用激活函数,则可以实现非线性划分,如下图所示:

可见,激活函数能够帮助我们引入非线性因素,使得神经网络能够更好地解决更加复杂的问题。

有个问题,为什么激活函数一般都是非线性的,而不能是线性的呢?从反面来说,如果所有的激活函数都是线性的,则激活函数 g(z)=z,即 a=z。那么,以两层神经网络为例,最终的输出为:

经过推导我们发现网络输出仍是 X 的线性组合。这表明,使用神经网络与直接使用线性模型的效果并没有什么两样。即便是包含多层隐藏层的神经网络,如果使用线性函数作为激活函数,最终的输出仍然是线性模型。这样的话神经网络就没有任何作用了。因此,隐藏层的激活函数必须要是非线性的。

值得一提的是,如果所有的隐藏层全部使用线性激活函数,只有输出层使用非线性激活函数,那么整个神经网络的结构就类似于一个简单的逻辑回归模型,效果与单个神经元无异。另外,如果是拟合问题而不是分类问题,输出层的激活函数可以使用线性函数。

Sigmoid

激活函数 Sigmoid 的图形表达式如下所示:

Sigmoid 函数的取值范围在 (0,1) 之间,单调连续,求导容易,一般用于二分类神经网络的输出层。

下面重点谈一下 Sigmoid 函数的缺点。

首先,Sigmoid 函数饱和区范围广,容易造成梯度消失。饱和区如下图所示:

上图中红色椭圆标注的饱和区曲线平缓,梯度的值很小,近似为零。而且 Sigmoid 函数的饱和区范围很广,例如除了 [-5,5],其余区域都近似饱和区。这种情况很容易造成梯度消失,梯度消失会增大神经网络训练难度,影响神经网络模型的性能。

其次,Sigmoid 函数输出是非零对称的,即输出恒大于零。这会产生什么影响呢?我们来看,假如 Sigmoid 函数的输出为 σ(Wx+b),且满足 0<σ(Wx+b)<1。在反向求导过程中,令损失函数 J 对 σ(Wx+b) 的求导为 dσ,现在计算 J 对 W 的偏导数:

其中,σ(Wx+b)>0,1-σ(Wx+b)>0。

若神经元的输入 x>0,则无论 dσ 正负如何,总能得到 dW 恒为正或者恒为负。也就是说参数矩阵 W 的每个元素都会朝着同一个方向变化,同为正或同为负。这对于神经网络训练是不利的,所有的 W 都朝着同一符号方向变化会减小训练速度,增加模型训练时间。就好比我们下楼梯的所需的时间总比直接滑梯下来的时间要长得多,如下图所示:

图中,红色折线是上文讨论的情况,蓝色斜线是 W 不全朝同一方向变化的情况。

值得一提的是,针对 Sigmoid 函数的这一问题,神经元的输入 x 常会做预处理,即将均值归一化到零值。这样也能有效避免 dW 恒为正或者恒为负。

最后还有一点,Sigmoid 函数包含 exp 指数运算,运算成本也比较大。

tanh

激活函数 tanh 的图形表达式如下所示:

tanh 函数的取值范围在 (-1,1) 之间,单调连续,求导容易。

相比于 Sigmoid 函数,tanh 函数的优点主要有两个:其一,收敛速度更快,如下图所示,tanh 函数线性区斜率较 Sigmoid 更大一些。在此区域内训练速度会更快。其二,tanh 函数输出均值为零,也就不存在 Sigmoid 函数中 dW 恒为正或者恒为负,从而影响训练速度的问题。

但是,tanh 函数与 Sigmoid 函数一样,也存在饱和区梯度消失问题。其饱和区甚至比 Sigmoid 还要大一些,但不明显。

ReLU

激活函数 ReLU 的全称是 Rectified Linear Unit,其图形表达式如下所示:

ReLU 函数是最近几年比较火热的激活函数之一。相比 Sigmoid 和 tanh 函数,其主要优点包括以下几个方面:

  • 没有饱和区,不存在梯度消失问题。

  • 没有复杂的指数运算,计算简单、效率提高。

  • 实际收敛速度较快,大约是 Sigmoid/tanh 的 6 倍。

  • 比 Sigmoid 更符合生物学神经激活机制。

下面这张图对比了 ReLU 与 tanh 的收敛速度差异性。数据集是 CIFAR 10,模型是四层的卷积神经网络。图中,实线代表 ReLU,虚线代表 tanh,ReLU 比 tanh 更快地到达了错误率 0.25 处。(引自论文《ImageNet Classification with Deep Convolutional Neural Networks》)

但是,ReLU 函数的缺点也比较明显。首先,ReLU 的输出仍然是非零对称的,可能出现 dW 恒为正或者恒为负,从而影响训练速度。

其次,也是最为重要的,当 x<0 时,ReLU 输出总为零。该神经元输出为零,则反向传播时,权重、参数的梯度横为零,造成权重、参数永远不会更新,即造成神经元失效,形成了“死神经元”。所以,针对这一问题,有时候会将 ReLU 神经元初始化为正偏值,例如 0.01。

Leaky ReLU

Leaky ReLU 对 ReLU 进行了改进,其图形表达式如下所示:

Leaky ReLU 的优点与 ReLU 类似:

  • 没有饱和区,不存在梯度消失问题。

  • 没有复杂的指数运算,计算简单、效率提高。

  • 实际收敛速度较快,大约是 Sigmoid/tanh 的 6 倍。

  • 不会造成神经元失效,形成了“死神经元”。

当然,0.01 的系数是可调的,一般不会太大。

ELU

ELU(Exponential Linear Units)也是 ReLU 的一个变种,其图形表达式如下所示:

ELU 继承了 Leaky ReLU 的所有优点:

  • 没有饱和区,不存在梯度消失问题。

  • 没有复杂的指数运算,计算简单、效率提高。

  • 实际收敛速度较快,大约是 Sigmoid/tanh 的 6 倍。

  • 不会造成神经元失效,形成了“死神经元”。

  • 输出均值为零

  • 负饱和区的存在使得 ELU 比 Leaky ReLU 更加健壮,抗噪声能力更强。

但是,ELU 包含了指数运算,存在运算量较大的问题。

Maxout

Maxout 最早出现在 ICML2013 上,由 Goodfellow 提出。其表达式如下所示:

Maxout 的拟合能力是非常强的,它可以拟合任意的的凸函数。最直观的解释就是任意的凸函数都可以由分段线性函数以任意精度拟合,而 Maxout 又是取 k 个隐藏层节点的最大值,这些”隐藏层"节点也是线性的,所以在不同的取值范围下,最大值也可以看做是分段线性的(上面的公式中 k = 2)。

上图引自论文《Maxout Networks.  Ian J. Goodfellow, David Warde-Farley, Mehdi Mirza, Aaron Courville, Yoshua Bengio》,可以说,Maxout 可以拟合任意凸函数,k 值越大,分段越多,拟合效果也就越好。

Maxout 保证了始终是线性区域,没有饱和区,训练速度快,而且不会出现坏死神经元。

如何选择合适的激活函数

  • 首选 ReLU,速度快,但是要注意学习速率的调整,

  • 如果 ReLU 效果欠佳,尝试使用 Leaky ReLU、ELU 或 Maxout 等变种。

  • 可以尝试使用 tanh。

  • Sigmoid 和 tanh 在 RNN(LSTM、注意力机制等)结构中有所应用,作为门控或者概率值。其它情况下,减少 Sigmoid 的使用。

  • 在浅层神经网络中,选择使用哪种激励函数影响不大。

干货 | 6 种激活函数核心知识点,请务必掌握!相关推荐

  1. 6 种激活函数核心知识点,请务必掌握!

    点击上方"AI有道",选择"置顶公众号" 关键时刻,第一时间送达! 我们知道,神经网络模型中,各隐藏层.包括输出层都需要激活函数(Activation Func ...

  2. 7 种回归方法!请务必掌握!

    点击上方"AI有道",选择"置顶公众号" 关键时刻,第一时间送达! 阅读本文需要 12 分钟 线性回归和逻辑回归通常是人们学习预测模型的第一个算法.由于这二者的 ...

  3. MapReduce 的核心知识点,你都 get 到了吗 ?(干货文章,建议收藏!)

    本文已收录github:https://github.com/BigDataScholar/TheKingOfBigData,里面有大数据高频考点,Java一线大厂面试题资源,上百本免费电子书籍,作者 ...

  4. 七万字,151张图,通宵整理消息队列核心知识点总结!这次彻底掌握MQ!

    前言 本文主要涵盖了关于消息队列的大部分核心知识点,涉及的消息队列有 RocketMQ.Kafka. 本文很长,所有内容都为博主原创,纯手打,如果觉得不错的话,来个点赞评论收藏三连呀! 之后还会有迭代 ...

  5. 8个非常重要的公式,请务必转给你身边的人

    8个非常重要的公式,请务必转给你身边的人 原创 paperClub paperClub 2022-07-05 23:58 发表于江苏 这18个非常重要的公式,请务必转给你的好朋友. 1. 方差: 组内 ...

  6. Java 面试全解析:核心知识点与典型面试题

    课程背景 又逢"金九银十",年轻的毕业生们满怀希望与忐忑,去寻找.竞争一个工作机会.已经在职的开发同学,也想通过社会招聘或者内推的时机争取到更好的待遇.更大的平台. 然而,面试人群 ...

  7. 深度学习最常见的 26 个模型汇总,请务必掌握!

    点击上方"AI有道",选择"置顶"公众号 重磅干货,第一时间送达 本文转载自公众号:AI部落联盟(AI_Tribe) 本文首先从4个方面(张量.生成模型.序列学 ...

  8. Redis 面霸篇:高频问题横扫核心知识点

    「码哥字节」从高频面试问题跟大家一起横扫 Redis 核心知识点,从根本上理解 Redis ,不做八股文的工具人,做扭转乾坤的大神. 码哥到如今已经写了 9 篇 Redis 连载,后台有小伙伴也让我写 ...

  9. Java面试详解(2020版):500+ 面试题和核心知识点详解

    与其在网上拼命的找面试题,不如加入我们畅快的阅读. 为了写好这些面试题,我先后拜访了一二十家互联网公司,与不同的面试官和面试者进行面对面探讨,深入了解了企业对于面试者的要求和常见的 Java 面试题型 ...

最新文章

  1. 编写EasyCluster V2.0 Portal主界面时的HTML心得(NOWRAP)
  2. VC中使用全局变量的2种办法及防错措施
  3. P1582 倒水(二进制)
  4. excel的宏与VBA入门(三)——流程控制
  5. 灵魂拷问:用移位来代替除法运算真的效率高吗?Java 编译器到底有没有做除法优化?
  6. java为什么还需要分布式锁?
  7. SQL Tree解法
  8. [转载] 朴素贝叶斯python实现预测_Python实现朴素贝叶斯分类器的方法详解
  9. 修改hosts文件,解决端口占用方法
  10. Linux - 增加用户、添加用户组
  11. 开启Windows 10隐藏的电源卓越性能模式
  12. iPhone和iPad适配
  13. CSS峰会圆桌论道丨共享产业数字化升级中的安全探索
  14. 计算机无法访问u盘,U盘“无法访问” 也能轻松修复
  15. 武汉男人一个月要赚多少钱,老婆才不用上班?心碎成渣……
  16. 100%正确率识别票据从金融领域切入挖掘文字识别的巨大价值
  17. 懂计算机word的博主,2010 word 如何新建目录
  18. 使用Systemctl命令来管理系统服务
  19. springboot处理参数再转发请求_Springboot 2.0---WebFlux请求处理流程
  20. mysql数据库用户建立_Mysql数据库之创建用户

热门文章

  1. AD回收站功能的使用
  2. MySQL存储写入速度慢分析
  3. js中push和pop的用法
  4. sourcetree下回退
  5. nginx日志通过rsyslog传入到日志服务器指定目录
  6. Unity3d游戏开发之漫游场景的制作
  7. 2011年8月51CTO壁纸点评活动获奖名单【已结束】
  8. 在线CSS工具及相关资源收集
  9. python访问数据库如何解决高并发_怎样解决数据库高并发的问题
  10. java 判断当前时间是否为节假日_最近公司招人,研发组商量了下,暂时定下这么多java面试题!...