• 背景知识

    • 反向传播算法
    • 梯度消失与梯度爆炸
  • 激活函数的作用
  • 七种常用激活函数
    • Sigmoid型函数
    • tanh(x)型函数
    • 修正线性单元(ReLU)
    • Leaky ReLU
    • 参数化 ReLU
  • 总结
  • 参考资料

我们在项目中可能实际上就常用relu作为卷积层和全连接层的激活函数,但是,其他激活函数的特性和relu激活函数的问题及优点在哪也是我们需要知道的。本文为学习笔记,主要参考魏秀参的《CNN卷积神经网络》这本书和网上部分资料,加以自己理解,然后写的文章。

背景知识

反向传播算法

一文搞懂反向传播

梯度消失与梯度爆炸

左边是生物神经元,右边是数学模型。

激活函数的作用

激活函数实现去线性化。神经元的结构的输出为所有输入的加权和,这导致神经网络是一个线性模型。如果将每一个神经元(也就是神经网络的节点)的输出通过一个非线性函数,那么整个神经网络的模型也就不再是线性的了,这个非线性函数就是激活函数。 常见的激活函数有:ReLU函数、sigmoid函数、tanh函数

七种常用激活函数

神经网络中常用的激活函数有七种:Sigmoid 型函数、 tanh(x) 型函数、修正线性单元(ReLU)、Leaky ReLu、参数化 ReLU、随机化 ReLU 和指数化线性单元(ELU)。

Sigmoid型函数

Sigmoid型函数也称Logistic函数:σ(x)=11+exp(−x)\sigma (x) = \frac{1}{1+exp(-x)}σ(x)=1+exp(−x)1​。函数形状和函数梯度图,如下图所示:

从上图可以看出,经过sigmoid型函数作用后,输出响应的值被压缩到 [0,1] 之间,而 0 对应了生物神经元的“抑制状态”,1 则恰好对应了“兴奋状态”。但对于Sigmoid 梯度函数两端大于 5(或小于 −5)的区域,这部分输出会被压缩到 1(或 0)。这样的处理会带来梯度的“饱和效应”(saturation effect),也就是梯度消失现象。所谓梯度消失现象,可以对照 Sigmoid型函数的梯度图观察,会发现大于 5(或小于 −5)部分的梯度接近 0,这会导致在误差反向传播过程中导数处于该区域的误差很难甚至无法传递至前层,进而导致整个网络无法正常训练

另外,还有一个问题是,Sigmoid型函数值域的均值并非为 0 而是全为正,这样的结果实际上并不符合我们对神经网络内权重参数数值的期望(均值)应为0的设想。

tanh(x)型函数

tanh(x)型函数是在 Sigmoid 型函数基础上为解决均值问题提出的激活函数:
tanh(x)=2σ(2x)−1tanh(x) = 2\sigma(2x)-1tanh(x)=2σ(2x)−1

函数形状如下图所示:

tanh 型函数又称作双曲正切函数(hyperbolic tangent function)`,其函数范围是 (−1, +1),输出响应的均值为 y。但由于 tanh(x) 型函数仍基于Sigmoid型函数,使用 tanh(x) 型函数依然会发生 “梯度消失” 现象。

修正线性单元(ReLU)

ReLU是Nair和Hinton于 2010 年引入神经网络的,是截止目前为止深度卷积神经网络中最为常用的激活函数之一,其定义如下:
ReLU(x)=max{0,x}={xifx⩾00ifx<0ReLU(x) = max\{0,x\} = \left\{\begin{matrix} x & if x\geqslant 0 \\ 0 & if x< 0 \end{matrix}\right.ReLU(x)=max{0,x}={x0​ifx⩾0ifx<0​

函数及函数梯度形状如下图所示:

与前两个激活函数相比:

  • ReLU 函数的梯度在x >= 0 时为 1,反之则为 0;对 x >= 0 部分完全消除了sigmoid型函数的梯度消失现象。
  • 计算复杂度上,ReLU 函数也相对前两者更简单。
  • 同时,实验中还发现 ReLU 函数有助于随机梯度下降方法收敛,收敛速度约快 6 倍左右。

但是,ReLU函数也有自身缺陷,即在 x < 0 时,梯度便为 0。换句话说,对于小于 0 的这部分卷积结果响应,它们一旦变为负值将再无法影响网络训练——这种现象被称作“死区"

Leaky ReLU

为缓解死区现象,研究者将 ReLU 函数中 x < 0 的部分调整为 f(x)=α⋅xf(x) = \alpha\cdot xf(x)=α⋅x,其中 α\alphaα 为 0.01 或 0.001 数量级的较小正数,称其为 “Leaky ReLU”:

LeakyReLU(x)={xifx>=0α⋅xifx<0Leaky ReLU(x) = \left\{\begin{matrix} x & if x>=0\\ \alpha\cdot x & if x < 0 \end{matrix}\right.LeakyReLU(x)={xα⋅x​ifx>=0ifx<0​

可以发现原始 ReLU 函数实际上是 Leaky ReLU 函数的一个特例,即α=0\alpha=0α=0,但是实际项目中发现,由于 Leaky ReLU 中 α\alphaα 为超参数,合适的值较难设定且很敏感,所以 Leaky ReLU函数在实际使用中性能并不十分稳定

参数化 ReLU

参数化 ReLU 直接将 α\alphaα 也作为一个网络中可以学习的变量融入模型的整体训练过程。具体怎么做,可参考相关文献。万事具有两面性,参数化 ReLU 在带来更大自由度的同时,也增加了网络模型过拟合的风险,在实际使用中需要格外注意。

总结

  • 建议首先使用目前最常用的 ReLU 激活函数,但需注意模型参数初始化和学习率的设置;
  • 为了进一步提高模型精度,可尝试 Leaky ReLU、参数化 ReLU、随机化 ReLU 和 ELU。但四者之间实际性能优劣并无一致性结论,需具体问题具体对待

参考资料

魏秀参-CNN解析神经网络

CNN 基本部件-常用激活函数详解相关推荐

  1. [Python图像识别] 五十.Keras构建AlexNet和CNN实现自定义数据集分类详解

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  2. Linux常用命令详解(最全)

    Linux命令目录 Linux命令集合 系统信息 关机 (系统的关机.重启以及登出 ) 文件和目录 文件搜索 挂载一个文件系统 磁盘空间 用户和群组 文件的权限 - 使用 "+" ...

  3. docker常用命令详解

    docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...

  4. Samtools(CentOS Linux)安装及常用命令详解

    序列比对(将测序reads与已知序列信息的基因或基因组进行比对)是高通量测序数据分析中最重要的一环,无论是转录组还是重测序都是基于比对结果来进行后续各项分析的,比对结果格式比较常见的是sam和bam文 ...

  5. python对输入的字符串进行解析_python数据类型_字符串常用操作(详解)

    这次主要介绍字符串常用操作方法及例子 1.python字符串 在python中声明一个字符串,通常有三种方法:在它的两边加上单引号.双引号或者三引号,如下: name = 'hello' name1 ...

  6. router linux命令,router os 常用命令详解

    router os 常用命令详解 发布时间:2006-04-20 01:17:30来源:红联作者:[Hl.y] 看了很多router os 的资料都是关于如何安装的,却很少见到关于router os的 ...

  7. Ansible基本使用及常用模块详解

    一.ansible基本使用 定义主机组 定义被管理节点列表的文件/etc/ansible/hosts,在定义被管理节点的时候,可以单独基于主机做定义,也可以将多个主机定义成一个主机组. 在上篇博文安装 ...

  8. QT:常用函数详解--常用操作记录(个人笔记)

    QT:常用函数详解(个人笔记) PS:一下内容个人笔记,要求自己看懂,随笔,阅读体验会很差很差! Qt setContentsMargins()函数 函数原型:void QLayout::setCon ...

  9. python的shutil模块是内置的_Python之shutil模块11个常用函数详解,python内置函数是什么...

    Python之shutil模块11个常用函数详解,python内置函数是什么 shutil 是 Python 中的高级文件操作模块,与os模块形成互补的关系,os主要提供了文件或文件夹的新建.删除.查 ...

最新文章

  1. js端调用android端同步方法,JS怎样调用Android本地原生方法
  2. 【错误记录】Java 中 ArrayList 排序 ( 使用 Comparator 接口时注意 compare 返回值是 -1 和 +1 )
  3. Android图片查看支持双击放大缩小、多点触摸(多机型测试,长期使用很稳定)
  4. 烟台农业走进物联网大数据时代
  5. 学计算机等级考试电脑版软件,计算机二级考试宝典电脑版
  6. CF1305E Kuroni and the Score Distribution
  7. python:单元测试框架pytest的一个简单例子
  8. 工作86:防抖和节流的问题
  9. python在工作中怎么用_如何用python在工作中“偷懒”
  10. android判断点击次数_Android应用统计-使用时长及次数统计(一)
  11. 面试官:原生GAN都没搞清楚,自己走还是我送你
  12. 豪横C4D电商实用素材,从此横着走
  13. testng教程_TestNG教程
  14. 【ICLR2020】通过强化学习和稀疏奖励进行模仿学习
  15. linux查看磁盘io最多的进程,Linux 查看磁盘IO并找出占用IO读写很高的进程,磁盘占用很高...
  16. Web API应用架构在Winform混合框架中的应用(5)--系统级别字典和公司级别字典并存的处理方式...
  17. sir模型初始值_经典传染病的SIR模型(基于MATLAB)
  18. matlab 以10为底的对数
  19. The seventh Word-Day
  20. MySQL之——基本操作汇总

热门文章

  1. 离散数学---期末复习题库(上)
  2. acm算法有用吗?写给自己。
  3. AD软件中,如何解决同一局域网下license冲突问题
  4. MySQL索引创建语法
  5. MySQL创建索引,各种索引的创建及举例
  6. session存在哪里?如何实现以及session超时设置
  7. python 创建对象时自动调用的函数_Python自动测试(6)——类和对象,python,自动化,六类...
  8. 好用的Mac虚拟机 Parallels Desktop
  9. tensorflow2.3.0迁移学习案例分析(以猫狗识别为例)
  10. Mybatis的入门详解