Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【激活函数合集】盘点当前最流行的激活函数及选择经验

【激活函数合集】盘点当前最流行的激活函数及选择经验

作者头像
BBuf
发布于 2020-02-26 05:22:40
发布于 2020-02-26 05:22:40
2.9K0
举报
文章被收录于专栏:GiantPandaCVGiantPandaCV

前言

在阅读DarkNet源码的时候发现作者定义了大量从古至今流行的损失函数,本着科普的态度我打算做一个全面的总结,所以就有了这篇文章。

激活函数有什么用?

提到激活函数,最想问的一个问题肯定是它是干什么用的?激活函数的主要作用是提供网络的非线性表达建模能力,想象一下如果没有激活函数,那么神经网络只能表达线性映射,此刻即便是有再多的隐藏层,其整个网络和单层的神经网络都是等价的。因此正式由于激活函数的存在,深度神经网络才具有了强大的非线性学习能力。接下来我们就来盘点一下当前有哪些流行的激活函数吧,这是一件非常有意义的事,希望你能接着读下去。

1. Sigmoid激活函数

  • 函数表达式:
  • 函数图像:

Sigmoid激活函数

  • 导数:
  • 优点:Sigmoid激活函数是应用范围最广的一类激活函数,具有指数形状,它在物理意义上最为接近生物神经元。另外,Sigmoid的输出是(0,1),具有很好的性质,可以被表示为概率或者用于输入的归一化等。可以看出,Sigmoid函数连续,光滑,严格单调,以(0,0.5)中心对称,是一个非常良好的阈值函数。当x趋近负无穷时,y趋近于0x趋近于正无穷时,y趋近于1x=0时,y=0.5。当然,在x超出[-6,6]的范围后,函数值基本上没有变化,值非常接近,在应用中一般不考虑。Sigmoid函数的导数是其本身的函数,即f′(x)=f(x)(1−f(x)),计算非常方便,也非常节省计算时间。
  • 缺点:Sigmoid最明显的缺点就是饱和性。从曲线图中看到,其两侧的导数逐渐趋近于0,即: 。我们将具有这种性质的激活函数叫作软饱和激活函数。具体的,饱和又可分为左饱和与右饱和。与软饱和对应的是硬饱和, 即f′(x)=0,当|x|>c,其中c为常数。sigmoid 的软饱和性,使得深度神经网络在二三十年里一直难以有效的训练,是阻碍神经网络发展的重要原因。另外,Sigmoid函数的输出均大于0,使得输出不是0均值,这称为偏移现象,这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。

2. TanH

  • 函数表达式:
  • 函数图像:

Tanh激活函数和它的导数

  • 导数:
  • 优点:与Sigmoid相比,它的输出均值是0,使得其收敛速度要比Sigmoid快,减少迭代次数。
  • 缺点:该导数在正负饱和区的梯度都会接近于0值(仍然具有软饱和性),会造成梯度消失。还有其更复杂的幂运算。

3. ReLU

  • 函数表达式:
  • 函数图像:

ReLU激活函数

  • 导数:当时,当时
  • 优点:ReLU的全称是Rectified Linear Units,是一种AlexNet时期才出现的激活函数。可以看到,当x<0时,ReLU硬饱和,而当x>0时,则不存在饱和问题。所以,ReLU 能够在x>0时保持梯度不衰减,从而缓解梯度消失问题。这让我们能够直接以监督的方式训练深度神经网络,而无需依赖无监督的逐层预训练。
  • 缺点:随着训练的推进,部分输入会落入硬饱和区,导致对应权重无法更新。这种现象被称为“神经元死亡”。与Sigmoid类似,ReLU的输出均值也大于0,偏移现象和神经元死亡会共同影响网络的收敛性。

4. Leaky ReLU & PReLU

  • 函数表达式和导数:

Leaky ReLU

  • 函数图像:

Leaky ReLU激活函数

  • 特点:为了改善ReLU在时梯度为造成Dead ReLU,提出了Leaky ReLU使得这一问题得到了缓解。例如在我们耳熟能详的YOLOV3网络中就使用了Leaky ReLU这一激活函数,一般取。另外PReLU就是将Leaky ReLU公式里面的当成可学习参数参与到网络训练中。

5. ReLU6

  • 函数表达式:
  • 特点:ReLU6就是普通的ReLU但是限制最大输出值为6(对输出值做clip),这是为了在移动端设备float16的低精度的时候,也能有很好的数值分辨率,如果对ReLU的激活范围不加限制,输出范围为0到正无穷,如果激活值非常大,分布在一个很大的范围内,则低精度的float16无法很好地精确描述如此大范围的数值,带来精度损失。

6. ELU

  • 函数表达式:

ELU表达式

  • 函数图像:

ELU激活函数

  • 导数:当时,,当时,。
  • 特点:融合了sigmoid和ReLU,左侧具有软饱和性,右侧无饱和性。右侧线性部分使得ELU能够缓解梯度消失,而左侧软饱能够让ELU对输入变化或噪声更鲁棒。ELU的输出均值接近于零,所以收敛速度更快。在 ImageNet上,不加Batch Normalization 30层以上的ReLU网络会无法收敛,PReLU网络在MSRA的Fan-in (caffe )初始化下会发散,而 ELU 网络在Fan-in/Fan-out下都能收敛。关于Fan-in/Fan-out初始化请看附录的参考2链接。

7. SoftSign

  • 函数表达式:
  • 函数图像:

Softsign激活函数和它的导数

  • 导数:图中已经求出。
  • 特点:Softsign是tanh激活函数的另一个替代选择,从图中可以看到它和tanh的曲线极其相似,不过相比于tanh,Softsign的曲线更平坦,导数下降的更慢一点,这个特性使得它可以缓解梯度消失问题,可以更高效的学习。

8. SoftPlus

  • 函数表达式:
  • 函数图像:

SoftPlus激活函数及导数

  • 函数导数:SoftPlus激活函数的导数恰好就是sigmoid激活函数,即。
  • 优点:SoftPlus可以作为ReLu的一个不错的替代选择,可以看到与ReLU不同的是,SoftPlus的导数是连续的、非零的、无处不在的,这一特性可以防止出现ReLU中的“神经元死亡”现象。
  • 缺点:SoftPlus是不对称的,不以0为中心,存在偏移现象;而且,由于其导数常常小于1,也可能会出现梯度消失的问题。

9. SELU

  • 函数表达式:,也即是:
  • 特点:这个激活函数来自论文:https://arxiv.org/abs/1706.02515 。而这篇论文就是提出了这一激活函数,然后论文写了93页公式来证明只需要把激活函数换成SELU就能使得输入在经过一定层数之后变成固定的分布。。而这个函数实际上就是在ELU激活函数的基础上乘以了一个,但需要注意的是这个是大于1的。
  • 更详细的讨论可以见这里:https://www.zhihu.com/question/60910412

10. Swish

  • 函数表达式:,其中是个常数或可训练的参数.Swish 具备无上界有下界、平滑、非单调的特性。
  • 函数图像:

Swish激活函数

Swish激活函数导数

  • 特点:Swish 在深层模型上的效果优于 ReLU。例如,仅仅使用 Swish 单元替换 ReLU 就能把 Mobile NASNetA 在 ImageNet 上的 top-1 分类准确率提高 0.9%,Inception-ResNet-v的分类准确率提高 0.6%。当时,Swish激活函数变成线性函数.而当时,为0或1,这个时候Swish激活函数变成ReLU激活函数。因此Swish激活函数可以看做是介于线性函数与ReLU函数之间的平滑函数。

11. Maxout

  • 函数表达式:
  • 特点:Maxout模型实际上也是一种新型的激活函数,在前馈式神经网络中,Maxout的输出即取该层的最大值,在卷积神经网络中,一个Maxout特征图可以是由多个特征图取最值得到。Maxout的拟合能力是非常强的,它可以拟合任意的的凸函数。但是它和Dropout一样需要人为设定一个值。为了便于理解,假设有一个在第层有个节点层有个节点构成的神经网络。即:

神经网络

激活值,其中是激活函数,在这里代表內积。然后,。那么当我们对层使用Maxout(设定)然后再输出的时候,情况就发生了改变。网络就变成了:

使用了Maxout后的网络

此时网络形式上就变成上面的样子,用公式表现出来就是: 也就是说第层的激活值计算了次,可我们明明只需要个激活值,那么我们该怎么办?其实上面的叙述中已经给出了答案,取这个的最大值来作为最终的结果。

可以看到采用Maxout的话参数个数也增加了倍,计算开销会增大。

12. Mish

  • 函数表达式:
  • 函数图像:

MisH激活函数

  • 特点:这个激活函数是最新的SOTA激活函数,我还没具体使用和了解过这个激活函数,就暂时不总结这一个了。不过论文中提到,以上无边界(即正值可以达到任何高度)避免了由于封顶而导致的饱和,理论上对负值的轻微允许更好的梯度流,而不是像ReLU中那样的硬零边界,并且整个损失函数仍然保持了平滑性。
  • 论文名为:Mish: A Self Regularized Non-Monotonic Neural Activation Function

激活函数尝试经验

  • 首先使用ReLU,速度最快,然后观察模型的表现。
  • 如果ReLU效果不是很好,可以尝试Leaky ReLU或Maxout等变种。
  • 尝试tanh正切函数(以零点为中心,零点处梯度为1)。
  • 在深度不是特别深的CNN中,激活函数的影响一般不会太大。
  • Kaggle比赛,试试Mish?

附录

  • 参考1:https://www.cnblogs.com/missidiot/p/9378079.html
  • 参考2:https://keras-cn.readthedocs.io/en/latest/other/initializations/
  • 参考3:https://zhuanlan.zhihu.com/p/70810466
  • 参考4:https://www.cnblogs.com/makefile/p/activation-function.html
  • 参考5:https://www.cnblogs.com/missidiot/p/9378079.html
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GiantPandaCV 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
邮件发送功能开发
作为一名.Net开发,"邮件发送"功能的开发和使用是必须要掌握的,因为这个功能作为“消息推送”的一种手段经常出现在各种.Net系统中,所以本文将对.Net平台下的“邮件发送”,做一个细致的分析! 一、who需要邮件功能 1、服务提供方:需提供邮件收发客户端或Web服务。如:QQ邮箱、GMail邮箱、126、163等知名邮件服务提供商。注:如果你使用的第三方不知名邮件服务商提供的邮件收发服务,通过其发出的邮件,可能会被其他知名邮件服务提供商的STMP服务器视为是"恶意邮件或垃圾邮件"! 2、消息推送:消息推送
郑小超.
2018/01/26
4.1K0
.net下发送Email的Helper类一、适用场景二、代码三、调用方法四、结束
前段时间因为业务需要自动给客户发送支持HTML格式的而且带附件的Email,而且使用的还是Office365邮箱,就抽时间看了一下这方面的内容,并写了这个帮助类。 该类是使用的SMTP服务发送Email,可以支持OFFICE365等邮箱,支持SSL、HTML邮件、附件等。目前未启用加密的常规发送和使用Office365邮箱发送都已经测试通过。 该代码目前是使用在.net 4.0环境下,理论上.net 4.0~.net 4.7都可以使用,.net core下没有测试。
徐大嘴
2019/03/21
7330
ASP.NET(C#) 发送邮件帮助类Mailhelper
using System; using System.Data; using System.Configuration; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; u
KenTalk
2018/09/11
1.4K0
结合ABP源码实现邮件发送功能
1. 前言 最近pm临时提出了多种邮件验证操作的需求,因为一时间也没有找到好的邮件收发组件,也抱着研究ABP的心态,就花了几小时时间探究了一下ABP中关于Email的处理和操作。其实邮件操作大多大同小异,这次只是希望介绍一下ABP中实现功能的代码结构而已,以下是具体过程 演示的ABP代码版本为0.9.0.0,不过后面版本对于这部分的修改较少,所以完全不影响之后版本的移植使用 2. 实现过程 ABP的Mail操作放在了Abp.Net.Mail和Abp.Net.Mail.Smtp中,第一步先让我们直接看
潘成涛
2018/01/18
1.2K0
结合ABP源码实现邮件发送功能
使用.Net发电子邮件小结
电子邮件是通过互联网发出去的,互联网中传输层协议有TCP/IP协议,邮件服务在基于TCP/IP底层协议之上的应用层实现SMTP、POP3、IMAP4等协议,通过这些协议实现了邮件的收发服务。
小蜜蜂
2019/08/06
1.7K0
使用.Net发电子邮件小结
c#发送邮件含附件
在网上巴拉巴拉找个的,然后修改了下,测试可用 using System; using System.Collections.Generic; using System.Text; using System.Net.Mail; using System.Net.Mime; using System.Net; namespace CustomerDetails { public class SendEmail { private MailMessage mailMessage;
冰封一夏
2019/09/10
1.2K0
C#接入SMTP邮件服务
功能类已经写好了,每个方法对应有注释,不需要动,除非你要更改smtp服务器,默认QQ邮箱
JanYork_简昀
2022/03/29
7970
C#接入SMTP邮件服务
c# 发送Email的2中方式
我相信大多数人发送邮件使用第二种,但是有时候第二种方式是发不出去的,那么什么情况发布出去呢???
冰封一夏
2019/09/11
5400
ASP.NET 实现发送邮件 + 多个收件人 + 多个附件
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/42011431
DannyHoo
2018/09/13
2.1K0
ASP.NET 实现发送邮件 + 多个收件人 + 多个附件
MYSQL自动备份并发送邮件工具
最近在开发小程序,由于服务器只有一台,所以不能数据库异机备份,出于数据安全的考虑,就做了一个数据库定时备份并发送邮件到自己的邮箱的小工具,先看下工具界面
code2roc
2023/07/19
3310
MYSQL自动备份并发送邮件工具
【.NET】几行代码实现自动发送邮件功能
前言:邮件自动发送功能应该场景比较多,例如遇到程序bug、或者运行报告等,补获到就发送邮件提醒。或者其他用途。
Wesky
2024/08/13
2000
【.NET】几行代码实现自动发送邮件功能
使用 MimeKit 和 MailKit 发送邮件
MimeKit 给.NET 社区带来了一流的 MIME 解析器,它能处理复杂的各种Mime, 性能好。而且开箱即用支持 S/MIME 和 PGP。MimeKit 和 MailKit 支持最新的国际化的电子邮件标准,是.NET 中为一个支持完整支持这些标准电子邮件库,最近正式发布了1.0版本。如果你想做所有与的电子邮件相关的事情,看看 MimeKit 和 MailKit。我保证你不会失望,它支持.NET/Mono的所有平台,包括移动电话、平板等。 使用方法很简单和.NET的SmtpClient 差不多,不过比
张善友
2018/01/29
2.2K0
VB.NET 发送QQ邮件,可用于发送验证码和批量文件,通知信息
首先打开邮箱的POP3/IMAP/SMTP,获取邮箱授权码,具体操作如下:
办公魔盒
2019/08/28
1.7K0
VB.NET 发送QQ邮件,可用于发送验证码和批量文件,通知信息
.Net魔法堂:发个带附件的邮件
一、前言                             由于工作需要最近把邮件发送封装成WebService,现在把代码记录在此,以便日后查阅。 二、二话不说写代码                     private void _SendMail(string form, string pw, string subject, string[] to, string[] cc, string body, string attachmentName, byte[] attachment)
^_^肥仔John
2018/01/18
6820
C#邮件发送类 简单实用 可自定义发件人名称
上图看效果 MailHelper: public class MailHelper { public bool SendMail(MailSender sender,out s
晓晨
2018/06/22
1.2K0
System.Net.Mail.SmtpClient通过SSL/TLS协议发送邮件失败问题解决
通过System.Net.Mail使用SSL协议发送邮件失败并报错 System.Net.Mail.SmtpException: Failure sending mail
KenTalk
2020/03/05
1.7K0
ASP.Net 2.0 发送邮件的代码
这两天因为要做一个可以收集用户提交信息,然后发送邮件到指定邮箱的网页。在asp.net2.0里网络
Java架构师必看
2021/03/22
2K0
ASP和ASP.NET发送邮件笔记
    这两天因公司网站邮件发不出去,然后研究了在asp网站发送邮件和在asp.net网站发送邮件的代码,把碰到的问题这里记录一下。
tandaxia
2018/09/27
7.7K0
ASP和ASP.NET发送邮件笔记
C#通过邮箱验证来找回密码
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
喜欢ctrl的cxk
2019/11/08
1.6K0
发送邮件程序(Csharp2005)
我觉得懂得编写发送邮件客服端丰常重要.这可以把它嵌入到你的软件里加强与用户的沟通与可以收集程运行的错误信息.以与我编写一小的发送邮件客服端来与在家交流. 程序如下:
Java架构师必看
2021/03/22
5970
发送邮件程序(Csharp2005)
相关推荐
邮件发送功能开发
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档