点击上方“视学算法”,选择“星标”公众号

重磅干货,第一时间送达

本文转载自:AI科技评论

作者 |  Vandit Jain 

编译 | 龚倩    编辑 | 丛末

激活函数是神经网络中一个至关重要的概念,决定了某个神经元是否被激活,判断该神经元获得的信息是否有用,并决定该保留还是该去掉此神经元。

本文作者 Vandit Jain 对激活函数的相关知识进行了一个较为全面的总结,重点聚焦于以下几个方面:

1. 激活函数是什么,它在网络中有什么作用?

2. 为什么需要激活函数而不使用线性函数?

3. 理想的激活函数有哪些特征?

4. 目前使用的各种非线性函数。

5. 在最新研究中涌现的值得关注的非线性激活函数。

6. 在深层神经网络中应该使用哪些激活函数以及如何使用它们?

一、激活函数是什么?

简单地说,激活函数就是加入到人工神经网络中的一个函数,目的在于帮助神经网络从数据中学习复杂模式。

相比于人类大脑中基于神经元的模型,激活函数是决定向下一个神经元传递何种信息的单元,这也正是激活函数在人工神经网络中的作用。激活函数接收前一个单元输出的信号,并将其转换成某种可以被下一个单元接收的形式。

下图总结了两者的区别:

资料来源:斯坦福大学的cs231n 课程

二、为什么需要激活函数?

在神经网络中使用非线性激活函数的原因有很多。

1. 除了前面讨论过的生物学方面的相似性外,激活函数还有助于我们根据要求将神经元的输出值限定在一定的范围内。这一点很重要,因为激活函数的输入是 W*x+b,其中 W 是单元的权重,x 是输入值,然后加上偏置 b。如果输出值不被限定在某个范围内,它可能会变得非常大,特别是在具有数百万个参数的深层神经网络中,从而导致计算量过大。例如,有一些激活函数(如 softmax)对于不同的输入值(0 或 1)会输出特定的值。

2. 激活函数最重要的特点是它具有在神经网络中加入非线性的能力。为了便于理解,我们不妨考虑一下多维数据,如下图所示:

线性函数有三个属性(在这个图中分别是体重,收缩压和年龄),它使我们得到一条贯穿三维空间的直线,但它永远也无法学会一种模式来将一个人准确地区分为吸烟者和不吸烟者(以手头上现有的分类问题为例)。原因很简单,定义这个分类的模式根本不是线性的。

那在人工神经网络中,如果我们使用只有一个单元而没有激活函数的神经网络会怎样?这种情况下我们所得到的输出基本上还是 W*x+b,这并不好,因为 W*x 也是 x 的一次方,因此函数仍然是线性的,基本等同于线性函数。

如果我们叠加多层呢?假如我们用一个函数 f(x)来表示 nᵗʰ层,那么可以得出:

然而,这还不够复杂,特别是在计算机视觉或自然语言处理等有着复杂模式的问题中。

为了使模型能够学习非线性模式(或者说具有更高的复杂度),特定的非线性层(激活函数)被加入其中。

三、理想的激活函数具有的特点

1. 梯度消失问题:神经网络是利用梯度下降过程来训练的。

梯度下降由基于链式规则的反向传播组成,链式规则用于获取权值变化以减少每次训练后的损失。考虑一个两层网络,第一层表示为 f₁(x),第二层表示为 f₂(x)。整个网络为 o(x)= f₂(f₁(x))。

如果我们反过来计算权重,可以得到 o`(x)= f₂(x)*f₁`(x)。这里 f₁(x)本身是由 Act(W₁*x₁+b₁)组成的复合函数,其中 Act 是第 1 层之后的激活函数。再次应用链式规则,可以得到 f₁`(x)=Act(W₁*x₁+b₁)*x₁,这意味着此结果也直接依赖于激活值。现在可以看到, 这样一个链式规则在反向传播时会经过很多个层。

如果 Act()的值介于 0 和 1 之间,那么它会乘以几个这样的值来计算初始层的梯度。这个过程会降低初始层的梯度值,并且这些层也无法正确学习。

换言之,因为网络的深度和激活过程将值转变为趋近于 0,它们的梯度逐渐消失,这就是所谓的梯度消失问题。所以我们希望理想的激活函数不要使梯度逐渐变为零。

2. 以零为中心:激活函数的输出应对称于零,这样梯度就不会向特定方向移动。

3. 计算成本:网络的每一层都会应用激活函数,它在深层网络中需要计算数百万次。因此,激活函数的计算成本应该很低。

4. 可微性:如前所述,神经网络使用梯度下降过程进行训练,因此模型中的层需要可微或至少部分可微。这是一个函数可以作为激活函数层的必要条件。

四、目前使用的各种非线性函数

1、Sigmoid 函数

函数如下图所示:

这种激活函数从未在实际模型中使用,仅由于历史原因罗列在此。Sigmoid 函数计算量大,会导致梯度消失问题且不以零为中心,通常在二进制分类问题中才会使用。

  • Softmax 逻辑回归模型: softmax 逻辑回归模型是 Sigmoid 函数在多分类问题上的一种推广形式。与 Sigmoid 函数相似,它也产生 0-1 范围内的值,因此被用作分类模型的最后一层。

2、双曲正切函数 tanh

如图所示:

相比于 Sigmoid 函数,它仅仅解决了以零为中心这个问题。

3、线性整流函数(Rectified Linear Unit, ReLU)

该函数又称修正线性单元,定义为 f(x)=max(0,x):

这是一个使用十分广泛的激活函数,尤其是在卷积神经网络中。它计算简单,不会饱和,不产生梯度消失问题,但不以零为中心。它也存在「dying ReLU」问题,即当输入的是负数时,输出都会变成零,这样就导致一些节点完全「死掉」,神经元也不会进行学习。

ReLU 的另一个问题是激活爆炸,因为它的上限是 inf,有时会产生不可用的节点。

4、Leaky ReLU 和 Parametric ReLU 函数

函数的定义为 f(x)=max(αx,x),如下图所示:

当α为0.1时

这里α是一个通常设置为 0.01 的超参数。显然,Leaky ReLU 在一定程度上解决了「dying ReLU」这一问题。请注意,如果我们将α设为 1,那么 Leaky ReLU 将成为线性函数 f(x)=x,并且没有任何用处。

因此,α的值永远不会设置为趋近于 1 的值。如果我们分别将α设为每个神经元的超参数,则得到 Parametric ReLU 或 PReLU。

5、ReLU6 函数

ReLU6 在 x>0 的区域基本上等同于 ReLU,定义为 f(x)=min(max(0,x),6)

这有助于阻止激活增长,从而防止梯度爆炸(趋近无限时)以及正常 ReLUs 发生的其他小问题。

我们通常的想法是,为什么不把 ReLU6 和 Leaky ReLU 结合起来,以解决现在的激活函数的所有已知的问题。流行的 DL 框架没有提供现成的这样的激活函数,但我认为这是一个很好的想法。

五、在最新研究中涌现的值得关注的非线性激活函数

1、Swish 函数

Swish 由 Ramachandran 等人在 2017 年提出,定义为 f(x)=x*sigmoid(x)。

与 ReLU 相比,尽管图形非常相似,Swish 的性能却要稍好一些。然而,ReLU 在 x=0 时会突然发生改变,而 Swish 与此不同,它不会在某个点上突然改变,这使得训练时 Swish 更容易收敛。

但是,Swish 的缺点是它的计算成本很高,为了解决这个问题,我们来看看下一个版本的 Swish。

2、Hard-Swish 或 H-Swish函数

函数定义如下:

它最大的优点是几乎类似于 swish 函数,但计算成本却比 swish 更低,因为它用线性类型的 ReLU 函数取代了指数类型的 sigmoid 函数。

六、在深层神经网络中如何使用这些激活函数?

首先,Tanh 和 sigmoid 函数会引起巨大的梯度消失问题,因此一般不推荐使用。

神经网络中一开始尝试引入 ReLU 函数。如上文所述,在权重层(诸如 CNN、RNN、LSTM 或线性感知层)之后添加激活层。如果你认为模型已经停止学习,那么可以用 Leaky ReLU 替换它,以避免「Dying ReLU」问题。但 Leaky ReLU 会稍微增加计算时间。

如果网络中也有 Batch-Norm 层(批标准化层),则需要在执行激活函数之前添加该层,顺序是先进行 CNN-Batch(卷积神经网络批处理),再进行 Norm-Act(标准化动作)。虽然 Batch-Norm(批标准化)和激活函数的运行顺序是一个备受争议的话题,也有人说顺序其实无关紧要,为了与 Batch-Norm 的原论文保持一致,作者使用的是以上提到的这种顺序。

激活函数的默认超参数如果是在如 Tensorflow 和 Pytorch等框架中使用,则效果最好。然而,你可以调整 Leaky ReLU 中的负斜率并将其设置为 0.02 以加快学习速度。

via https://towardsdatascience.com/everything-you-need-to-know-about-activation-functions-in-deep-learning-models-84ba9f82c253

---End---

神经网络为何非激活函数不可?相关推荐

  1. 基于Matlab的多层BP神经网络在非线性函数拟合中的应用

    本图文详细介绍了如何利用Matlab神经网络工具箱实现多层BP神经网络对非线性函数的拟合.

  2. 基于Matlab的BP神经网络在非线性函数拟合中的应用

    本图文详细介绍了如何利用Matlab神经网络工具箱实现BP神经网络对非线性函数的拟合.

  3. BP神经网络的非线性函数拟合

    BP神经网络主要用到newff,sim 和train3个神经网络函数,各函数解释如下. 1.newff:BP神经网络参数设置函数 函数功能:构建一个BP神经网络. 函数形式:net= newff(P, ...

  4. 遗传算法优化BP神经网络在非线性函数拟合中的应用

    遗传算法优化BP神经网络在非线性函数拟合中的应用 在工程应用中经常会遇到一些复杂的非线性系统,这些系统状态方程复杂,难以用数学方法精确建模.在这种情况下,可以建立BP神经网络表达这些非线性系统.通常B ...

  5. 利用BP神经网络逼近sin函数

    利用神经网络逼近sin函数 代码被改得面目全非就不贴了,思路很简单,(1,5,1)的网络,从-pi到pi取1000个点,单个往网络里扔,误差值直接用预测与真实值差值决定,保留正负号,正常求导,速率0. ...

  6. 基于BP神经网络的非线性函数拟合(一维高斯函数)研究-含Matlab代码

    目录 一.引言 二.BP神经网络的结构与原理 2.1 信息前向传播 2.2 误差的反向传播过程 三.基于BP神经网络的非线性函数拟合 3.1 数据生成 3.2 神经网络拟合结果 四.参考文献 五.Ma ...

  7. python神经网络包_使用Python实现神经网络的成本函数(第5周Coursera)

    基于Coursera Course for Machine Learning,我正在尝试在python中实现神经网络的成本函数.有一个类似于这个的question – 有一个可接受的答案 – 但答案中 ...

  8. 【智能控制实验】基于MATLAB的BP神经网络实现非线性函数拟合设计

    基于MATLAB的BP神经网络实现非线性函数拟合设计 一.实验要求: 重点是掌握BP神经网络的学习算法原理,掌握matlab工具箱设计BP神经网络拟合非线性模型的方法(m文件):掌握在图形用户界面下设 ...

  9. tensorflow神经网络拟合非线性函数与操作指南

    本实验通过建立一个含有两个隐含层的BP神经网络,拟合具有二次函数非线性关系的方程,并通过可视化展现学习到的拟合曲线,同时随机给定输入值,输出预测值,最后给出一些关键的提示. 源代码如下: # -*- ...

最新文章

  1. 怎样才能高效的在家办公或者远程办公呢?
  2. 热烈庆祝 ubuntu10.10发布
  3. StringBuffer与StringBuilder的区别
  4. 电脑知识--Windows一片
  5. SpringBatch 写文件JSON(JsonFileItemWriter)用法(十二)
  6. docker 容器基础技术
  7. excel合并计算_【Excel】合并计算和模拟分析的应用
  8. 3000米排名预测(全排列+判断)
  9. 学习笔记(06):Python网络编程并发编程-在简单套接字基础上加上通信循环
  10. 第三章 JVM内存回收区域+对象存活的判断+引用类型+垃圾回收线程
  11. 2019年网络规划设计师下午真题及答案解析
  12. java程序开发个人笔记_Java程序开发入门笔记
  13. 删除HTML标签的正则表达式
  14. 【股价预测】基于matlab BP神经网络股票价格预测【含Matlab源码 345期】
  15. 数据库系统概论知识点总结(附期末考试题库)
  16. plsql使用很卡的情况
  17. IIS无法启动计算机上的服务W3SVC如何修复、万维网发布服务(w3svc)已停止解决办法
  18. 服务器安全防护措施有哪些?
  19. Flutter-防京东商城项目-提交订单、去支付页面制作-44
  20. k8s安装tekton,编写task

热门文章

  1. adaptiveThreshold 阈值化的实现
  2. 【ACM】杭电OJ 1106 函数atoi
  3. 使复选框选中_勾选复选框单元格变色,自动计数,在Excel中是如何实现的?
  4. GitHub 热榜:来膜拜这个流弊的 AI 框架!
  5. 构筑超异构计算时代,英特尔 AI 全布局
  6. 打通语言理论和统计NLP,Transformers/GNNs架构能做到吗?
  7. 适合小团队作战,奖金+招聘绿色通道,这一届算法大赛关注下?
  8. Google AI骗过了Google,工程师竟无计可施?
  9. 进击的Waymo,掘进无人驾驶深水区
  10. 专访 | 商汤HPC负责人刘文志(风辰):未来战略的两大方向及招人的4个标准