1. 引言

通常情况下,激活函数往往返回0到1的数值。在神经元中,输入的input经过一系列加权求和后作用于另一个函数,这个函数就是这里的激活函数。激活函数通常由各种各样的种类,但是他们一般的特点在于倒数简单,方便计算可以节省求导和网络训练时间。

2. 常见的激活函数

这里推荐一个有意思的图,使用小人描绘了各种各样的激活函数,如下所示:

接下来,我们从中挑选重要的激活函数由浅入深地进行讲解。

3. 二元阶跃函数

二元阶跃函数是最简单的激活函数之一,它基于这样一个事实:如果求和的结果大于或等于0,则结果为1,如果小于0,则结果为0。

f(x) = 1, x >= 0= 0, x < 0

上述激活函数的图示如下:

4. 线性激活函数

线性激活函数是输出与输入成比例的函数。
该函数对输入的加权和不做任何处理,只返回给定的值。

5. Sigmoid 激活函数

Sigmoid函数将输入的值转换为(0,1),如果输入是非常小的负数,那么输出就是0;如果输入是非常大的正数,输出就是1。其计算公式如下:

f(x) = 1 / (1 - e^(-x))

该函数图例如下:

同时该激活函数的特点如下:

  • 收敛缓慢
  • 边界介于0和1之间
  • 梯度反向传递时可能会导致梯度消失

我们重点观察其导数图像,如下所示:

上述图像中,梯度值仅在-3到3范围内有效,而该曲线图在其他区域变得非常平坦。这意味着,对于大于3或小于-3的值,函数将具有非常小的梯度。当梯度值接近零时,网络将停止学习,此时将导致梯度消失问题。

6. Tanh 激活函数

双曲正切激活函数将输入的值转换为(-1,1),如果输入是非常小的负数,那么输出就是-1;如果输入是非常大的正数,输出就是1。其计算公式如下:

f(x) = (e^x - e^(-x)) / (e^x + e^(-x))

该函数图例如下:

同时该激活函数的特点如下:

  • 输出均值为0,其收敛速度相比sigmoid更快
  • 边界基于-1和1之间
  • 在循环神经网络中表现良好

我们重点观察其导数图像,如下所示:

观察上图,可以发现该函数依旧面临着类似于sigmoid激活函数梯度消失的问题。同时tanh函数的梯度相比sigmoid函数陡峭得多,梯度消失问题相比sigmoid函数有所缓解。

7. ReLU 激活函数

ReLU激活函数为改进后的线性激活函数,通过取消x<0 即只在输入保留正值来转换输入的值,其计算公式如下:

f(x) = max(0, x) = 0 for x < 0x for x >= 0

样例图像如下:

同时该激活函数的特点如下:

  • 稀疏激活,仅在x>0时进行激活
  • 没有上边界
  • 梯度值在x<0是为零。由于这个原因,在反向传播过程中,一些神经元的权重和偏差没有更新。该特性对图像表现良好。
  • 在卷积网络中表现良好。
  • 由于只有一定数量的神经元被激活,与sigmoid和tanh函数相比,ReLU函数的计算效率要高得多。

8. SoftMax 激活函数

Softmax函数将输出转换为概率形式的表示,使得输出的所有概率之和为1。

在多类分类的情况下,它最常用作神经网络最后一层的激活函数。

SoftMax激活函数的特点如下:

  • 当我们想要以概率的形式输出时,就使用它
  • 边界介于0和1之间
  • 它用于归一化多类类别预测输出值
  • 用于多分类最后一层性能良好

9. 如何选择激活函数

针对不同类型的网络来进行针对性的选择,常用的归纳如下所示:

针对需要解决问题本身来针对性的选择,归纳如下:

10. 总结

本文重点介绍了几种常见的激活函数,并给出了相应的计算公式和图例说明,同时最后针对不同的网络类型和任务类型进行了相应的归纳。

您学废了吗?


关注公众号《AI算法之道》,获取更多AI算法资讯。

浅谈CNN中的激活函数相关推荐

  1. 激活函数设计vhdl_浅谈神经网络中激活函数的设计

    激活函数是神经网络中非线性的来源,因为如果去掉这些函数,那么整个网络就只剩下线性运算,线性运算的复合还是线性运算的,最终的效果只相当于单层的线性模型. 那么,常见的激活函数有哪些呢?或者说,激活函数的 ...

  2. 浅谈caffe中train_val.prototxt和deploy.prototxt文件的区别

    浅谈caffe中train_val.prototxt和deploy.prototxt文件的区别 标签: caffe深度学习CaffeNet 2016-11-02 16:10 1203人阅读 评论(1) ...

  3. java 中的单元测试_浅谈Java 中的单元测试

    单元测试编写 Junit 单元测试框架 对于Java语言而言,其单元测试框架,有Junit和TestNG这两种, 下面是一个典型的JUnit测试类的结构 package com.example.dem ...

  4. mybatis与php,浅谈mybatis中的#和$的区别

    浅谈mybatis中的#和$的区别 发布于 2016-07-30 11:14:47 | 236 次阅读 | 评论: 0 | 来源: 网友投递 MyBatis 基于Java的持久层框架MyBatis 本 ...

  5. 浅谈CSS3中display属性的Flex布局,关于登陆页面属性框的设置

    声明:本文转发自三里屯柯南的浅谈CSS3中display属性的Flex布局http://www.cnblogs.com/xuyuntao/articles/6391728.html 基本概念 采用Fl ...

  6. python sys模块作用_浅谈Python中的模块

    模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件就称之为一个模块(Mod ...

  7. python生成器和迭代器作用_浅谈Python中的生成器和迭代器

    迭代器 迭代器协议 对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么返回一个异常来终止本次迭代.(只能往前走,不能往后退!) 迭代器对象 遵循了(实现了)迭代器协议的对象.(对象内 ...

  8. oracle hash join outer,CSS_浅谈Oracle中的三种Join方法,基本概念 Nested loop join: Outer - phpStudy...

    浅谈Oracle中的三种Join方法 基本概念 Nested loop join: Outer table中的每一行与inner table中的相应记录join,类似一个嵌套的循环. Sort mer ...

  9. python中 是什么类型_浅谈python中的变量默认是什么类型

    浅谈python中的变量默认是什么类型 1.type(变量名),输出的结果就是变量的类型: 例如 >>> type(6) 2.在Python里面变量在声明时,不需要指定变量的类型,变 ...

最新文章

  1. 使用Pycharm创建一个Django项目
  2. Linux 小知识翻译 - 「NTP」
  3. 【云音乐】从手游APP到云音乐视频标签分类,时隔3个月再次面对多标签任务,终于摸索出了一些小经验。附自定义评估函数代码
  4. ITK:Voronoi图
  5. 如何通过使用注册项 (.reg) 文件添加、修改或删除注册表子项和值
  6. bzoj 3343 教主的魔法 分块
  7. c++ winpcap开发(3)
  8. 初级菜鸟程序员浅谈开源和共享精神
  9. 使用Linq时要注意的事项
  10. openSearch支持mysql版本_OpenSearch 使用二三事-阿里云开发者社区
  11. 解析WINDOWS中的DLL文件---经典DLL解读
  12. 方舟生存 服务器修改器,【修改贴】关于单机版gg修改器的应用。
  13. access查询女教师所有的信息_[转载]ACCESS2007查询操作案例补充
  14. 汉宁窗+matlab,m汉宁窗hanning汉明窗hamming矩形窗-read.ppt
  15. 这一本《电子工程师技术手册》,你要不要?
  16. 一次苦中作乐的追码过程(上)
  17. 关于 CVE-2021-44228 Log4j2 漏洞的相关应对汇总说明(包含中英文客户公告)
  18. delphi 域名解析IP 域名转为IP地址
  19. statis关键字的使用
  20. 弄懂这56个Python使用技巧,掌握Python高效开发

热门文章

  1. Thinkphp5汉字转拼音
  2. 《论文阅读》BALM: Bundle Adjustment for Lidar Mapping
  3. mac连不上wi-fi_如何在Mac上确定Wi-Fi网络的优先级
  4. php五秒盾规则之树,杰奇cms章节分页实现原理,附代码
  5. 简报 | 俄罗斯下议院计划年底通过加密货币监管法案
  6. 如何看懂音频文件谱分析图
  7. 数据库系统概论——函数依赖、码和范式(1NF、2NF、3NF、BCNF)详解
  8. “加里敦大学”第7天总结
  9. 搭建HBase + Phoenix大数据平台
  10. 【数据库安全】_SQL实验