转载自:https://my.oschina.net/amui/blog/1633904

激活函数的意义(需要激活函数的理由)

激活函数是神经网络的一个重要组成部分。如果不用激活函数(即相当于激活函数为f(x)=x),在这种情况下,网络的每一层的输入都是上一层的线性输出,因此,无论该神经网络有多少层,最终的输出都是输入的线性组合,与没有隐藏层的效果相当,这种情况就是最原始的感知机。

正因为上面的原因,才需要引入非线性函数作为激活函数,这样深层神经网络才有意义,输出不再是输入的线性组合,就可以逼近任意函数。

各类激活函数的优缺点

绝大多数神经网络借助某种形式的梯度下降进行优化,激活函数需要是可微分(或者至少是几乎完全可微分的)。此外,复杂的激活函数也许产生一些梯度消失或爆炸的问题。因此,神经网络倾向于部署若干个特定的激活函数。

Identity

通过激活函数 Identity,节点的输入等于输出。它完美适合于潜在行为是线性(与线性回归相似)的任务。当存在非线性,单独使用该激活函数是不够的,但它依然可以在最终输出节点上作为激活函数用于回归任务。

Sigmoid函数

Sigmoid函数,也就是logistic函数,对于任意输入,它的输出范围都是(0,1)。公式如下:

Sigmoid的函数图如上所示,很像平滑版的阶跃函数。但是,sigmoid 有很多好处,例如:

1. 它是非线性的

2. 不同于二值化输出,sigmoid 可以输入 0 到 1 之间的任意值。对,跟你猜的一样,这可以用来表示概率值。

3. 与 2 相关,sigmoid 的输出值在一个范围内,这意味着它不会输出无穷大的数。

但是,sigmoid 激活函数并不完美:

梯度消失。如前面的图片所示,当输入值 z 趋近负无穷时,sigmoid 函数的输出几乎为 0 . 相反,当输入 z 趋近正无穷时,输出值几乎为 1 . 那么这意味着什么?

在这两个极端情况下,对应的梯度很小,甚至消失了。梯度消失在深度学习中是一个十分重要的问题,我们在深度网络中加了很多层这样的非线性激活函数,这样的话,即使第一层的参数有很大的变化,也不会对输出有太大的影响。换句话讲,就是网络不再学习了,通常训练模型的过程会变得越来越慢,尤其是使用梯度下降算法时。

sigmoid 的另一个弊端就是实际运用中指数运算开销太大。尽管有人说,与矩阵乘法或卷积相比,激活函数在深度网络的计算是非常小的一部分,所以这可能不会成为一个大问题。不过,我认为这值得一提。

Tanh函数

Tanh 或双曲正切是另一个深度神经网络中常用的激活函数。类似于 sigmoid 函数,它也将输入转化到良好的输出范围内。具体点说就是对于任意输入,tanh 将会产生一个介于 -1 与 1 之间的值。

Tanh函数图

如前面提及的,tanh 激活函数有点像 sigmoid 函数。非线性且输出在某一范围,此处为 (-1, 1)。不必意外,它也有跟 sigmoid 一样的缺点。从数学表达式就可以看出来,它也有梯度消失的问题,以及也需要进行开销巨大的指数运算。

ReLU

终于讲到了 Relu,人们起初并不觉得它的效果会好过 sigmoid 和 tanh。但是,实战中它确实做到了。事实上,cs231n 课程甚至指出,应该默认使用 Relu 函数。

ReLU 从数学表达式来看,运算十分高效。对于某一输入,当它小于 0 时,输出为 0,否则不变。下面是 ReLU 的函数表达式。Relu(z) = max(0,z)

那么你可能会问,「它是线性函数吧?为何我们说它是非线性函数?」

在线代中,线性函数就是两个向量空间进行向量加和标量乘的映射。

给定上面的定义,我们知道 max(0, x) 是一个分段线性函数。之所以说是分段线性,是因为它在 (−∞, 0] 或 [0,+∞) 上符合线性函数的定义。但是在整个定义域上并不满足线性函数的定义。例如f(−1) + f(1) ≠f (0)

所以 Relu 就是一个非线性激活函数且有良好的数学性质,并且比 sigmoid 和 tanh 都运算得快。除此以外,Relu 还因避免了梯度消失问题而闻名。然而,ReLU 有一个致命缺点,叫「ReLU 坏死」。ReLu 坏死是指网络中的神经元由于无法在正向传播中起作用而永久死亡的现象。

更确切地说,当神经元在向前传递中激活函数输出为零时,就会出现这个问题,导致它的权值将得到零梯度。因此,当我们进行反向传播时,神经元的权重将永远不会被更新,而特定的神经元将永远不会被激活。

还有件事值得一提。你可能注意到,不像 sigmoid 和 tanh,Relu 并未限定输出范围。这通常会成为一个很大的问题,它可能在另一个深度学习模型如递归神经网络(RNN)中成为麻烦。具体而言,由 ReLU 生成的无界值可能使 RNN 内的计算在没有合理的权重的情况下发生数值爆炸。因此反向传播期间权重在错误方向上的轻微变化都会在正向传递过程中显著放大激活值,如此一来学习过程可能就非常不稳定。我会尝试在下一篇博客文章中详细介绍这一点。

Leak ReLU

经典(以及广泛使用的)ReLU 激活函数的变体,带泄露修正线性单元(Leaky ReLU)的输出对负值输入有很小的坡度。由于导数总是不为零,这能减少静默神经元的出现,允许基于梯度的学习(虽然会很慢)。

Cos

如同正弦函数,余弦激活函数(Cos/Cosine)为神经网络引入了周期性。它的值域为 [-1,1],且导数处处连续。和 Sinusoid 函数不同,余弦函数为不以零点对称的偶函数。

Sinc

Sinc 函数(全称是 Cardinal Sine)在信号处理中尤为重要,因为它表征了矩形函数的傅立叶变换(Fourier transform)。作为一种激活函数,它的优势在于处处可微和对称的特性,不过它比较容易产生梯度消失的问题。

神经网络的激活函数总结相关推荐

  1. 为什么神经网络的激活函数必须使用线性函数?

    什么是线性函数? 函数本来是输入某个值后会返回一个值的转换器.向这个转换器输入某个值后,输出值是输入值的常数倍的函数称为线性函数(用数学式表示为h(x) = cx. c为常数).因此,线性函数是一条笔 ...

  2. 神经网络中激活函数的真正意义?

    神经网络中激活函数的真正意义?一个激活函数需要具有哪些必要的属性?还有哪些属性是好的属性但不必要的? (1)非线性:即导数不是常数.这个条件是多层神经网络的基础,保证多层网络不退化成单层线性网络.这也 ...

  3. 神经网络之激活函数面面观

    转载自: [机器学习]神经网络之激活函数面面观 - 仙道菜 - 博客频道 - CSDN.NET http://blog.csdn.net/cyh_24/article/details/50593400 ...

  4. 神经网络的激活函数、并通过python实现激活函数

    神经网络的激活函数.并通过python实现 what is 激活函数 激活函数的python实现 python实现阶跃函数 python实现sigmoid函数 python实现ReLU函数 激活函数的 ...

  5. 【机器学习算法面试题】四.深度神经网络中激活函数有哪些?

    欢迎订阅本专栏:<机器学习算法面试题> 订阅地址:https://blog.csdn.net/m0_38068876/category_11810806.html [机器学习算法面试题]一 ...

  6. 为什么神经网络的激活函数必须使用非线性函数?

    什么是线性函数? 函数本来是输入某个值后会返回一个值的转换器.向这个转换器输入某个值后,输出值是输入值的常数倍的函数称为线性函数(用数学式表示为h(x) = cx. c为常数).因此,线性函数是一条笔 ...

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

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

  8. 【深度学习技术】卷积神经网络常用激活函数总结

    本文记录了神经网络中激活函数的学习过程,欢迎学习交流. 神经网络中如果不加入激活函数,其一定程度可以看成线性表达,最后的表达能力不好,如果加入一些非线性的激活函数,整个网络中就引入了非线性部分,增加了 ...

  9. 神经网络的激活函数为什么必须使用非线性函数

    神经网络的激活函数必须使用非线性函数.换句话说,激活函数不能使 用线性函数.为什么不能使用线性函数呢?因为使用线性函数的话,加深神 经网络的层数就没有意义了. 线性函数的问题在于,不管如何加深层数,总 ...

  10. 神经网络常用激活函数

    激活函数:只是一个抽象概念,使用激活函数时为了让中间输出多样化,能够处理更复杂的问题. 激活函数给神经元引入了非线性因素,若无激活函数,则每一层最后输出的都是上一层输入的线性函数,不管加多少层神经网络 ...

最新文章

  1. MPB:中科院城环所杨军组-​​水体浮游植物采集与鉴定
  2. Android 拨号器
  3. 这是一个不完整的详细Java多线程,但对于初学者足够了,相信我,你会爱上她的
  4. 【中继协助频谱切换】基于中继协助的频谱切换机制的MATLAB仿真
  5. android四中启动模式
  6. solidworks无法获得下列许可standard_SolidWorks2020安装无法获得下列许可SOLIDWORKS Standard怎么解决?...
  7. 中标麒麟/NeoKylin 安装QT开发环境
  8. laravel修改.env不生效原因以及解决办法
  9. 使用ASP.NET Core开始使用gRPC客户端和服务器
  10. JAVA线程池的创建
  11. java 登陆拦截_登录拦截 - java代码库 - 云代码
  12. pip换源及指令的使用
  13. 虚拟局域网软件开源_基于开源AUTOSAR的高级驾驶员辅助系统的设计与实现过程...
  14. vue 倒计时 插件_VUE-倒计时插件使用(订单,砍价,拼团,倒计时使用)
  15. Linux stty 指令设置串口参数
  16. c语言url下载文件,C/C++轻松实现文件下载
  17. 论文笔记:Stacked Hourglass Networks for Human Pose Estimation
  18. 基于多尺度稀疏表示的视网膜OCT图像阴影修复
  19. mysql中数据处理小技巧
  20. Xray安全评估工具使用

热门文章

  1. 原子物理与原子核物理知识结构(含链接)
  2. 数码相机和单反相机有什么区别?(已解决)
  3. Java爬虫抓取网页数据(抓取慕课网论坛为实例)
  4. Excel数据透视表经典教程六《报表布局》
  5. 一分钟告诉你究竟DevOps是什么鬼?
  6. vscode使用问题合集
  7. OpenCV3 5.3 用形态学滤波器开启和闭合图像
  8. 灵备CDM的技术及原理
  9. python教程 -- 廖雪峰
  10. ubuntu wps缺少字体_一个字体:系统风汜霰汜源圆