比特派下载官方app|silu

作者: 比特派下载官方app
2024-03-07 21:07:03

激活函数ReLU和SiLU的区别_silu激活函数-CSDN博客

>

激活函数ReLU和SiLU的区别_silu激活函数-CSDN博客

激活函数ReLU和SiLU的区别

帅帅帅.

已于 2023-03-31 14:32:28 修改

阅读量1.6w

收藏

49

点赞数

5

分类专栏:

学习笔记

文章标签:

机器学习

人工智能

深度学习

于 2023-03-23 20:39:09 首次发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_44902604/article/details/129738773

版权

学习笔记

专栏收录该内容

12 篇文章

0 订阅

订阅专栏

文章目录

前言ReLU(Rectified Linear Unit)Leaky ReLUFReLU(Flatten ReLU)SiLU(Sigmoid Linear Unit)总结

前言

在这里,我就简单写一下两个激活函数的概念以及区别,详细的过程可以看看其他优秀的博主,他们写的已经非常好了,我就不必再啰嗦了。 ReLU(Rectified Linear Unit)和SiLU(Sigmoid Linear Unit)都是常用的激活函数,它们的主要区别在于非线性形状不同。

ReLU(Rectified Linear Unit)

概念: ReLU函数在输入大于0时直接输出,否则输出0。它的数学形式为f(x) = max(0, x),可以看作是一个分段函数,具有非常好的计算性质,使得神经网络的训练更加高效。

Leaky ReLU

概念: Leaky ReLU是ReLU的一种变体,改变之处在于 负数的输出不再是0了,而是一个很小的数值,比如0.1或0.01。 优点: Leaky ReLU的优点在于可以避免出现“神经元死亡”的情况,即在训练过程中某些神经元的输出始终为0,从而导致无法更新其权重,而Leaky ReLU可以在一定程度上解决这个问题。

FReLU(Flatten ReLU)

概念: FReLU将输入展平(flatten)成一个一维向量,然后对每个元素应用ReLU激活函数,最后再将输出重新恢复成原来的形状。

优点:

减少参数量:FReLU不需要额外的参数,因此可以减少模型的参数量。具有更好的表示能力:由于FReLU可以将输入展平成一维向量,因此可以在不增加参数量的情况下提高模型的表示能力。提高模型的鲁棒性:由于FReLU对输入进行了展平操作,因此可以提高模型对输入的鲁棒性,从而减少过拟合的风险。

SiLU(Sigmoid Linear Unit)

相对于ReLU函数,SiLU函数在接近零时具有更平滑的曲线,并且由于其使用了sigmoid函数,可以使网络的输出范围在0和1之间。这使得SiLU在一些应用中比ReLU表现更好,例如在语音识别中使用SiLU比ReLU可以取得更好的效果。

------------注意----------:

在使用SiLU时,如果数据存在过大或过小的情况,可能会导致梯度消失或梯度爆炸,因此需要进行一些调整,例如对输入数据进行归一化等。而ReLU在这方面较为稳定,不需要过多的处理。

总结

相较于ReLU函数,SiLU函数可能会更适合一些需要保留更多输入信息的场景。ReLU和SiLU都是常用的激活函数,具有各自的优点和适用范围,需要根据具体情况进行选择。

图片来自于: https://blog.csdn.net/long630576366/article/details/128854678

优惠劵

帅帅帅.

关注

关注

5

点赞

49

收藏

觉得还不错?

一键收藏

知道了

1

评论

激活函数ReLU和SiLU的区别

在这里,我就简单写一下两个激活函数的概念以及区别,详细的过程可以看看其他优秀的博主,他们写的已经非常好了,我就不必再啰嗦了

复制链接

扫一扫

专栏目录

21种激活函数的对比

06-09

激活函数描述和对比,帮助了解激活函数的效果和作用。

23种激活函数示例及可视化代码

03-18

1、pytorch激活函数示例及其可视化代码;

1 条评论

您还未登录,请先

登录

后发表或查看评论

激活函数-SwiGLU

Elvira521yan的博客

12-18

1853

fxx∗σxfxx∗σxσx11e−xσx1e−x1​正数区域内,SiLU 函数的输出与 ReLU 函数的输出相同。在负数区域内,SiLU 函数的输出与 sigmoid 函数的输出相同。SiLU 函数在整个定义域内都是可微的,这使得在反向传播过程中的梯度计算更加稳定。SiLU函数不是单调递增的,而是在x≈−1.28时达到全局最小值−0.28,这可以起到一个隐式正则化的作用,抑制过大的权重。

【PyTorch】SiLU激活函数

算法与编程之美

08-26

6039

SiLU激活函数

SiLu激活函数解释

m0_63260018的博客

06-04

8544

在yolo v5中,我们使用了SiLu激活函数。

深度学习网络各种激活函数 Sigmoid、Tanh、ReLU、Leaky_ReLU、SiLU、Mish

MAX的专栏

02-02

3084

激活函数的目的就是:梯度为0, 无法反向传播,导致参数得不到更新:随着数据的变化,梯度没有明显变化:梯度越来越大,无法收敛梯度消失问题:1、反向传播链路过长,累积后逐渐减小2、数据进入梯度饱和区如何解决:1、选正确激活函数,relu, silu2、BN 归一化数据3、 resnet 较短反向传播路径4、LSTM 记忆网络。

深度学习中的激活函数

Jad_Goh的博客

08-19

7912

深度学习中常用的激活函数优缺点分析:sigmoid、tanh、ReLU...

[杂记]激活函数SiLU和Swish的区别

热门推荐

卷子的博客

01-14

1万+

从代码和公式来看,SiLU是Swish的一种,换句话说SiLU是Swish的一种情况。

SiLU(x)=x⋅Sigmoid(x)

SiLU(x) = x \cdot Sigmoid(x)

SiLU(x)=x⋅Sigmoid(x)

Swish(x)=x⋅Sigmoid(βx)

Swish(x) = x \cdot Sigmoid(\beta x)

Swish(x)=x⋅Sigmoid(βx)

Swish原文:https://arxiv.org/pdf/1710.05941.pdf

SiLU的出处没有找到。

一文搞懂激活函数

ytusdc的博客

08-01

1万+

1、什么是激活函数

神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值,并将输入值传递给下一层,输入层神经元节点会将输入属性值直接传递给下一层(隐层或输出层)。在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数(又称激励函数)。

2、激活函数的用途(为什么需要激活函数)?

1. 对于y=ax+b 这样的函数,当x的输入很大时,y的输出也是无限大小的,经过多层网络叠加后,值更加膨胀的没边了,这显然不符合我们的预期,很多情况下我们希...

【卷积神经网络】12、激活函数 | Tanh / Sigmoid / ReLU / Leaky ReLU / ELU / SiLU / Mish

呆呆的猫的博客

03-08

3629

本文主要介绍神经网络中常用的激活函数

ReLU激活函数杂谈

01-06

在实现多层感知机代码实现中使用了ReLU激活函数: ReLU(x)=max(x,0)ReLU(x)=max(x,0)ReLU(x)=max(x,0) 形状大概是这样的 这里根据几个问题来进行回答解释 为什么要使用激活函数呢? 简单来说激活函数的作用就是将...

pytorch方法测试——激活函数(ReLU)详解

09-18

今天小编就为大家分享一篇pytorch方法测试——激活函数(ReLU)详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

激活函数(ReLU、sigmoid、tanh)的简单理解

01-20

ReLU函数 ReLU(rectified linear unit)函数提供了⼀个很简单的⾮线性变换。给定元素 ,该函数定义为: 可以看出,ReLU函数只保留正数元素,并将负数元素清零。函数图像如下图: 显然,当输⼊为负数时,ReLU函数...

Keras 中Leaky ReLU等高级激活函数的用法

09-16

主要介绍了Keras 中Leaky ReLU等高级激活函数的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

你说什么是机器学习呢

qing_tong_tong的博客

03-05

801

假设我跟小Y约过5次,他迟到的次数是1次,那么他按时到的比例为80%,我心中的阈值为70%,我认为这次小Y应该不会迟到,因此我按时出门。如果小Y在5次迟到的次数中占了4次,也就是他按时到达的比例为20%,由于这个值低于我的阈值,因此我选择推迟出门的时间。这个例子来源于我真实的生活经验,我在思考这个问题的时候突然发现它的过程可以被扩充化为一个完整的机器学习的过程,因此我决定使用这个例子作为所有介绍的开始。再更复杂一点,小Y的迟到跟天气也有一定的原因,例如下雨的时候,这时候我需要考虑三个自变量。

机器学习中的 K-均值聚类算法及其优缺点

最新发布

智光工作室

03-05

344

K-均值聚类算法是一种常用的无监督学习算法,用于将数据集划分为K个不同的类别。在使用K-均值聚类算法时,需要根据具体问题的需求和数据集的特点来选择合适的参数和评估聚类结果。3. 需要事先确定簇的数量:K-均值聚类算法需要事先确定要划分的簇的数量K,这对于一些情况来说可能是一个困难的任务。1. 对初始中心点选择敏感:K-均值聚类算法对初始中心点的选择非常敏感,不同的初始中心点可能会得到不同的聚类结果。2. 对噪声和异常值敏感:K-均值聚类算法对噪声和异常值非常敏感,这些点可能会导致聚类结果的错误。

机器学习的算法及原理

super_Dev_OP的博客

03-05

387

机器学习算法原理是一种让计算机通过数据学习并做出预测或决策的方法。这些算法可以分为几种主要类型,包括监督学习、无监督学习和强化学习。以下是这些类型中一些常见的算法及其基本原理,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。

机器学习流程—数据预处理 清洗

03-05

146

这里我们需要说明一下,虽然这里我们讲的是数据预处理,但是我们这里为了更加充分的理解我们后面的数据预处理,这里我们说明一下我们要解决什么样的问题,也就是定义问题。itanic数据集作为kaggle比赛中的经典数据集,今天我们使用的数据也是这个数据集,这个数据集描述的主要是泰坦尼克号邮轮上乘客的数据,我们要做的事情就是根据乘客的数据预测乘客在泰坦尼克号沉没的时候时候可以活下来。

yolov5 中LeakyReLU 激活函数与Silu激活函数的关系

05-03

在 YOLOv5 中,LeakyReLU 和 Silu 都是激活函数,它们都是用来处理神经网络中的非线性变换。它们的主要区别在于形状和计算方式。

具体来说,LeakyReLU 是一个具有斜率的修正线性单元,它可以通过在输入小于0的时候使用小的斜率来解决神经元死亡的问题。而 Silu 是一个新的激活函数,也称为 Swish 函数,它是一个光滑的非线性变换函数,类似于 Sigmoid 函数,但它的计算方式更加高效。

在 YOLOv5 中,LeakyReLU 和 Silu 经常被用于卷积层后面的非线性变换,可以帮助网络更好地学习特征。通常情况下,Silu 比 LeakyReLU 更加高效,但在某些情况下,LeakyReLU 可能会更好。

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

帅帅帅.

CSDN认证博客专家

CSDN认证企业博客

码龄5年

暂无认证

28

原创

72万+

周排名

3万+

总排名

9万+

访问

等级

584

积分

1006

粉丝

210

获赞

131

评论

969

收藏

私信

关注

热门文章

激活函数ReLU和SiLU的区别

16628

注意力机制SE、CBAM、ECA、CA的优缺点

14698

YOLOv5部署到web端(flask+js简单易懂)

11064

用Git工具上传本地代码文件(最详细的教程,简简单单)

10753

Decoupled head(解耦合头)和Coupled head(耦合头)

7272

分类专栏

小小小项目

3篇

学习笔记

12篇

令人头疼的Bug

3篇

论文阅读

2篇

最新评论

YOLOv5部署到web端(flask+js简单易懂)

如何水paper:

我这个用的是copy过来的yolov5 6.0版本代码;但自己的训练模型是7.0,下面时出现的问题

(pytorch) D:\myspace\yolov5-7.0>python flask_app.py

Serving HTTP on :: port 8888 (http://[::]:8888/) ...

Traceback (most recent call last):

File "flask_app.py", line 9, in

from backend.predict import predict

File "D:\myspace\yolov5-7.0\backend\predict.py", line 9, in

from utils.general import check_img_size, non_max_suppression, scale_coords, xyxy2xywh

ImportError: cannot import name 'scale_coords' from 'utils.general' (D:\myspace\yolov5-7.0\utils\general.py)

YOLOv5部署到web端(flask+js简单易懂)

m0_72055143:

请问可以实时检测rstp视频流吗

激活函数ReLU和SiLU的区别

Double_Ken:

“并且由于其使用了sigmoid函数,可以使网络的输出范围在0和1之间”

前面的x也会影响的

Decoupled head(解耦合头)和Coupled head(耦合头)

风的暖色调:

博主,为什么解耦之后位置信息与类别信息可以融合?

YOLOv5部署到web端(flask+js简单易懂)

沐丶春风:

我到现在也没解决,你呢

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

工业产品缺陷检测系统(YOLOv5s+PyQT5)

语义信息简单理解

YOLOv7训练:_pickle.UnpicklingError: STACK_GLOBAL requires str

2024年1篇

2023年25篇

2022年2篇

目录

目录

分类专栏

小小小项目

3篇

学习笔记

12篇

令人头疼的Bug

3篇

论文阅读

2篇

目录

评论 1

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

[CV - Image Classification]图像分类之激活函数SiLU - YOLOv7使用的激活函数 - 知乎

[CV - Image Classification]图像分类之激活函数SiLU - YOLOv7使用的激活函数 - 知乎切换模式写文章登录/注册[CV - Image Classification]图像分类之激活函数SiLU - YOLOv7使用的激活函数Pascal算法摆渡人Hi,大家好!我是Pascal_M。主要分享过往历史中经典模型文献和目前正在创新的模型文献,当然过往与现在对比阅读会发现新的体会和不一样的认识角度。希望大家以一种轻松心态来看过往的模型,一定是不尽人如意。但文献中提出宝贵想法是我们再次阅读动力,也是我们看到解决问题过程中出现的困难和不确定性。标题:Sigmoid-weighted linear units for neural network function approximation in reinforcement learning时间:2017被引用次数:433 (截止目前)1 遇到问题强化学习中的神经网络函数逼近提出了两种激活函数: sigmoid 加权线性单元 (SiLU)及其导数函数 (dSiLU)。问题来了,这类激活函数有什么特点以及导数有什么特点?2 前情提要1)激活函数2)性质激活函数(activation functions)的目标是,将神经网络非线性化。激活函数是连续(continuous),且可导的(differential)。连续:当输入值发生较小的改变时,输出值也发生较小的改变;可导:在定义域中,每一处都是存在导数;3 解决方案1)SiLU函数SiLU函数就是Sigmoid 加权线性组合SiLU 与 ReLUSiLU 被提议作为强化学习中神经网络函数逼近的激活函数。输入z_k的第k个 SiLU的激活ak由 sigmoid 函数乘以其输入计算得出:其中 sigmoid 函数是:对于较大的z_k值,SiLU 的激活大约等于ReLU的激活。与 ReLU(以及其他常用的激活单元,如 sigmoid 和 tanh 单元)不同,SiLU 的激活不是单调递增的。相反,对于zk ≈ -1.28,它的全局最小值约为-0.28。SiLU 的一个吸引人的特点是它具有自稳定特性。导数为零的全局最小值在权重上起到“软地板”的作用,作为隐式正则化器,抑制了大数量权重的学习。2)SiLU的导数(dSiLU)dSiLU 与 SigmoidSiLU 的导数函数(即 EE-RBM 中隐藏节点对输出的贡献的导数)看起来像是sigmoid 函数的更陡峭且“过冲”的版本:它被提议作为sigmoid 函数的竞争替代方案。对于 zk ≈ ±2.4, dSiLU 的最大值约为1.1,最小值约为-0.1,即方程zk =-log(( zk -2)/( zk +2))的解。4 实验结论四种浅层神经网络代理的随机 SZ-Tetris 学习曲线SiLU 和 dSiLU 获得了更好的分数。在随机 SZ-俄罗斯方块中获得的平均分数(±标准偏差),计算所有运行和最佳单次运行的最后 1000 集使用 SiLU 和 dSiLU 可以获得更好的性能。5 Pascal曰1)激活函数SiLU是Sigmoid 加权线性单元。该激活函数是在强化学习中提出来的。2)YOLOv7 也使用该激活函数。图像分类历史文献:网络模型:Pascal:[CV - Image Classification]图像分类 VGG模型 - 2014 年ILSVRC图像分类任务亚军Pascal:[CV-图像分类]ResNet模型 -- Deep Residual Learning for Image RecognitionPascal:[CV - Image Classification]图像分类 MobileNetV1模型 - 轻量化网络Pascal:[CV - Image Classification]图像分类 MobileNetV2模型 - 轻量化网络MobileNet系列Pascal:[CV - Image Classification]图像分类 DenseNet模型 - 2017 年 CVPR获得最佳论文奖的论文Pascal:[CV-图像分类]ViT模型----An Image Is Worth 16X16 Words: Transformers for Image Recognition at ScalePascal:[CV - Backbone] Swin Transformer模型Pascal:[CV - Image Classification]图像分类 MoblieViT模型 - 混合CNN和Transformer的轻量化网络数据增强:Pascal:[CV - Image Classification]图像分类之数据增强Mixup方法 - 超越经验风险最小化Pascal:[CV - Image Classification]图像分类之数据增强Cutout方法 - 改善的卷积神经网络正则化Pascal:[CV - Image Classification]图像分类之数据增强CutMix方法 - 正则化策略应用:Pascal:[CV - Application(Image Classification)] 生物医学图像分类- 识别COVID-19汇总历史文献:Pascal:计算机视觉CV- 任务总览图像分类、目标检测、图像分割(2022.6.17 - 持续更新中)编辑于 2022-09-07 17:37图像识别深度学习(Deep Learning)激活函数​赞同 24​​2 条评论​分享​喜欢​收藏​申请

从ReLU到GELU,一文概览神经网络的激活函数 - 知乎

从ReLU到GELU,一文概览神经网络的激活函数 - 知乎首发于机器之心切换模式写文章登录/注册从ReLU到GELU,一文概览神经网络的激活函数机器之心​数学等 2 个话题下的优秀答主激活函数对神经网络的重要性自不必多言,机器之心也曾发布过一些相关的介绍文章,比如《一文概览深度学习中的激活函数》。本文同样关注的是激活函数。来自丹麦技术大学的 Casper Hansen 通过公式、图表和代码实验介绍了 sigmoid、ReLU、ELU 以及更新的 Leaky ReLU、SELU、GELU 这些激活函数,并比较了它们的优势和短板。选自mlfromscratch,作者:Casper Hansen,机器之心编译,参与:熊猫、杜伟。在计算每一层的激活值时,我们要用到激活函数,之后才能确定这些激活值究竟是多少。根据每一层前面的激活、权重和偏置,我们要为下一层的每个激活计算一个值。但在将该值发送给下一层之前,我们要使用一个激活函数对这个输出进行缩放。本文将介绍不同的激活函数。在阅读本文之前,你可以阅读我前一篇介绍神经网络中前向传播和反向传播的文章,其中已经简单地提及过激活函数,但还未介绍其实际所做的事情。本文的内容将建立在你已了解前一篇文章知识的基础上。前一篇文章地址:https://mlfromscratch.com/neural-networks-explained/Casper Hansen目录1.概述2.sigmoid 函数是什么?3.梯度问题:反向传播梯度消失问题梯度爆炸问题梯度爆炸的极端案例避免梯度爆炸:梯度裁剪/范数4.整流线性单元(ReLU)死亡 ReLU:优势和缺点5.指数线性单元(ELU)6.渗漏型整流线性单元(Leaky ReLU)7.扩展型指数线性单元(SELU)SELU:归一化的特例权重初始化+dropout 8.高斯误差线性单元(GELU)9.代码:深度神经网络的超参数搜索10.扩展阅读:书籍与论文概述激活函数是神经网络中一个至关重要的部分。在这篇长文中,我将全面介绍六种不同的激活函数,并阐述它们各自的优缺点。我会给出激活函数的方程和微分方程,还会给出它们的图示。本文的目标是以简单的术语解释这些方程以及图。我会介绍梯度消失和爆炸问题;对于后者,我将按照 Nielsen 提出的那个很赞的示例来解释梯度爆炸的原因。最后,我还会提供一些代码让你可以自己在 Jupyter Notebook 中运行。我会在 MNIST 数据集上进行一些小型代码实验,为每个激活函数都获得一张损失和准确度图。sigmoid 函数是什么?sigmoid 函数是一个 logistic 函数,意思就是说:不管输入是什么,得到的输出都在 0 到 1 之间。也就是说,你输入的每个神经元、节点或激活都会被缩放为一个介于 0 到 1 之间的值。sigmoid 函数图示。sigmoid 这样的函数常被称为非线性函数,因为我们不能用线性的项来描述它。很多激活函数都是非线性或者线性和非线性的组合(有可能函数的一部分是线性的,但这种情况很少见)。这基本上没什么问题,但值恰好为 0 或 1 的时候除外(有时候确实会发生这种情况)。为什么这会有问题?这个问题与反向传播有关(有关反向传播的介绍请参阅我的前一篇文章)。在反向传播中,我们要计算每个权重的梯度,即针对每个权重的小更新。这样做的目的是优化整个网络中激活值的输出,使其能在输出层得到更好的结果,进而实现对成本函数的优化。在反向传播过程中,我们必须计算每个权重影响成本函数(cost function)的比例,具体做法是计算成本函数相对于每个权重的偏导数。假设我们不定义单个的权重,而是将最后一层 L 中的所有权重 w 定义为 w^L,则它们的导数为:注意,当求偏导数时,我们要找到 ∂a^L 的方程,然后仅微分 ∂z^L,其余部分保持不变。我们用撇号「'」来表示任意函数的导数。当计算中间项 ∂a^L/∂z^L 的偏导数时,我们有:则 sigmoid 函数的导数就为:当我们向这个 sigmoid 函数输入一个很大的 x 值(正或负)时,我们得到几乎为 0 的 y 值——也就是说,当我们输入 w×a+b 时,我们可能得到一个接近于 0 的值。sigmoid 函数的导数图示。当 x 是一个很大的值(正或负)时,我们本质上就是用一个几乎为 0 的值来乘这个偏导数的其余部分。如果有太多的权重都有这样很大的值,那么我们根本就没法得到可以调整权重的网络,这可是个大问题。如果我们不调整这些权重,那么网络就只有细微的更新,这样算法就不能随时间给网络带来多少改善。对于针对一个权重的偏导数的每个计算,我们都将其放入一个梯度向量中,而且我们将使用这个梯度向量来更新神经网络。可以想象,如果该梯度向量的所有值都接近 0,那么我们根本就无法真正更新任何东西。这里描述的就是梯度消失问题。这个问题使得 sigmoid 函数在神经网络中并不实用,我们应该使用后面介绍的其它激活函数。梯度问题梯度消失问题我的前一篇文章说过,如果我们想更新特定的权重,则更新规则为:但如果偏导数 ∂C/∂w^(L) 很小,如同消失了一般,又该如何呢?这时我们就遇到了梯度消失问题,其中许多权重和偏置只能收到非常小的更新。可以看到,如果权重的值为 0.2,则当出现梯度消失问题时,这个值基本不会变化。因为这个权重分别连接了第一层和第二层的首个神经元,所以我们可以用的表示方式将其记为假设这个权重的值为 0.2,给定一个学习率(具体多少不重要,这里使用了 0.5),则新的权重为:这个权重原来的值为 0.2,现在更新为了 0.199999978。很明显,这是有问题的:梯度很小,如同消失了一样,使得神经网络中的权重几乎没有更新。这会导致网络中的节点离其最优值相去甚远。这个问题会严重妨碍神经网络的学习。人们已经观察到,如果不同层的学习速度不同,那么这个问题还会变得更加严重。层以不同的速度学习,前面几层总是会根据学习率而变得更差。出自 Nielsen 的书《Neural Networks and Deep Learning》。在这个示例中,隐藏层 4 的学习速度最快,因为其成本函数仅取决于连接到隐藏层 4 的权重变化。我们看看隐藏层 1;这里的成本函数取决于连接隐藏层 1 与隐藏层 2、3、4 的权重变化。如果你看过了我前一篇文章中关于反向传播的内容,那么你可能知道网络中更前面的层会复用后面层的计算。同时,如前面介绍的那样,最后一层仅取决于计算偏导时出现的一组变化:最终,这就是个大问题了,因为现在权重层的学习速度不同。这意味着网络中更后面的层几乎肯定会被网络中更前面的层受到更多优化。而且问题还在于反向传播算法不知道应该向哪个方向传递权重来优化成本函数。梯度爆炸问题梯度爆炸问题本质上就是梯度消失问题的反面。研究表明,这样的问题是可能出现的,这时权重处于「爆炸」状态,即它们的值快速增长。我们将遵照以下示例来进行说明:http://neuralnetworksanddeeplearning.com/chap5.html#what's_causing_the_vanishing_gradient_problem_unstable_gradients_in_deep_neural_nets注意,这个示例也可用于展示梯度消失问题,而我是从更概念的角度选择了它,以便更轻松地解释。本质上讲,当 01 时,我们可能遇到梯度爆炸问题。但是,当一个层遇到这个问题时,必然有更多权重满足梯度消失或爆炸的条件。我们从一个简单网络开始。这个网络有少量权重、偏置和激活,而且每一层也只有一个节点。这个网络很简单。权重表示为 w_j,偏置为 b_j,成本函数为 C。节点、神经元或激活表示为圆圈。Nielsen 使用了物理学上的常用表示方式 Δ 来描述某个值中的变化(这不同于梯度符号 ∇)。举个例子,Δb_j 描述的是第 j 个偏置的值变化。我前一篇文章的核心是我们要衡量与成本函数有关的权重和偏置的变化率。先不考虑层,我们看看一个特定的偏置,即第一个偏置 b_1。然后我们通过下式衡量变化率:下面式子的论据和上面的偏导一样。即我们如何通过偏置的变化率来衡量成本函数的变化率?正如刚才介绍的那样,Nielsen 使用 Δ 来描述变化,因此我们可以说这个偏导能大致通过 Δ 来替代:权重和偏置的变化可以进行如下可视化:动图出自 3blue1brown,视频地址:https://www.youtube.com/watch?v=tIeHLnjs5U8。我们先从网络的起点开始,计算第一个偏置 b_1 中的变化将如何影响网络。因为我们知道,在上一篇文章中,第一个偏置 b_1 会馈入第一个激活 a_1,我们就从这里开始。我们先回顾一下这个等式:如果 b_1 改变,我们将这个改变量表示为 Δb_1。因此,我们注意到当 b_1 改变时,激活 a_1 也会改变——我们通常将其表示为 ∂a_1/∂b_1。因此,我们左边有偏导的表达式,这是 b_1 中与 a_1 相关的变化。但我们开始替换左边的项,先用 z_1 的 sigmoid 替换 a_1:上式表示当 b_1 变化时,激活值 a_1 中存在某个变化。我们将这个变化描述为 Δa_1。我们将变化 Δa_1 看作是与激活值 a_1 中的变化加上变化 Δb_1 近似一样。这里我们跳过了一步,但本质上讲,我们只是计算了偏导数,并用偏导的结果替代了分数部分。a_1 的变化导致 z_2 的变化所描述的变化 Δa_1 现在会导致下一层的输入 z_2 出现变化。如果这看起来很奇怪或者你还不信服,我建议你阅读我的前一篇文章。表示方式和前面一样,我们将下一个变化记为 Δz_2。我们又要再次经历前面的过程,只是这次要得到的是 z_2 中的变化:我们可以使用下式替代 Δa_1:我们只计算这个式子。希望你清楚地明白到这一步的过程——这与计算 Δa_1 的过程一样。这个过程会不断重复,直到我们计算完整个网络。通过替换 Δa_j 值,我们得到一个最终函数,其计算的是成本函数中与整个网络(即所有权重、偏置和激活)相关的变化。基于此,我们再计算 ∂C/∂b_1,得到我们需要的最终式:梯度爆炸的极端案例据此,如果所有权重 w_j 都很大,即如果很多权重的值大于 1,我们就会开始乘以较大的值。举个例子,所有权重都有一些非常高的值,比如 100,而我们得到一些在 0 到 0.25 之间、 sigmoid 函数导数的随机输出:最后一个偏导为,可以合理地相信这会远大于 1,但为了方便示例展示,我们将其设为 1。使用这个更新规则,如果我们假设 b_1 之前等于 1.56,而学习率等于 0.5。尽管这是一个极端案例,但你懂我的意思。权重和偏置的值可能会爆发式地增大,进而导致整个网络爆炸。现在花点时间想想网络的权重和偏置以及激活的其它部分,爆炸式地更新它们的值。这就是我们所说的梯度爆炸问题。很显然,这样的网络学不到什么东西,因此这会完全毁掉你想要解决的任务。避免梯度爆炸:梯度裁剪/规范解决梯度爆炸问题的基本思路就是为其设定一个规则。这部分我不会深入进行数学解释,但我会给出这个过程的步骤:选取一个阈值——如果梯度超过这个值,则使用梯度裁剪或梯度规范;定义是否使用梯度裁剪或规范。如果使用梯度裁剪,你就指定一个阈值,比如 0.5。如果这个梯度值超过 0.5 或 -0.5,则要么通过梯度规范化将其缩放到阈值范围内,要么就将其裁剪到阈值范围内。但是要注意,这些梯度方法都不能避免梯度消失问题。所以我们还将进一步探索解决这个问题的更多方法。通常而言,如果你在使用循环神经网络架构(比如 LSTM 或 GRU),那么你就需要这些方法,因为这种架构常出现梯度爆炸的情况。整流线性单元(ReLU)整流线性单元是我们解决梯度消失问题的方法,但这是否会导致其它问题呢?请往下看。ReLU 的公式如下:ReLU 公式表明:如果输入 x 小于 0,则令输出等于 0;如果输入 x 大于 0,则令输出等于输入。尽管我们没法用大多数工具绘制其图形,但你可以这样用图解释 ReLU。x 值小于零的一切都映射为 0 的 y 值,但 x 值大于零的一切都映射为它本身。也就是说,如果我们输入 x=1,我们得到 y=1。ReLU 激活函数图示。这很好,但这与梯度消失问题有什么关系?首先,我们必须得到其微分方程:其意思是:如果输入 x 大于 0,则输出等于 1;如果输入小于或等于 0,则输出变为 0。用下图表示:已微分的 ReLU。现在我们得到了答案:当使用 ReLU 激活函数时,我们不会得到非常小的值(比如前面 sigmoid 函数的 0.0000000438)。相反,它要么是 0(导致某些梯度不返回任何东西),要么是 1。但这又催生出另一个问题:死亡 ReLU 问题。如果在计算梯度时有太多值都低于 0 会怎样呢?我们会得到相当多不会更新的权重和偏置,因为其更新的量为 0。要了解这个过程的实际表现,我们反向地看看前面梯度爆炸的示例。我们在这个等式中将 ReLU 记为 R,我们只需要将每个 sigmoid σ 替换成 R:现在,假如说这个微分后的 ReLU 的一个随机输入 z 小于 0——则这个函数会导致偏置「死亡」。假设是 R'(z_3)=0:反过来,当我们得到 R'(z_3)=0 时,与其它值相乘自然也只能得到 0,这会导致这个偏置死亡。我们知道一个偏置的新值是该偏置减去学习率减去梯度,这意味着我们得到的更新为 0。死亡 ReLU:优势和缺点当我们将 ReLU 函数引入神经网络时,我们也引入了很大的稀疏性。那么稀疏性这个术语究竟是什么意思?稀疏:数量少,通常分散在很大的区域。在神经网络中,这意味着激活的矩阵含有许多 0。这种稀疏性能让我们得到什么?当某个比例(比如 50%)的激活饱和时,我们就称这个神经网络是稀疏的。这能提升时间和空间复杂度方面的效率——常数值(通常)所需空间更少,计算成本也更低。Yoshua Bengio 等人发现 ReLU 这种分量实际上能让神经网络表现更好,而且还有前面提到的时间和空间方面的效率。论文地址:https://www.utc.fr/~bordesan/dokuwiki/_media/en/glorot10nipsworkshop.pdf优点:相比于 sigmoid,由于稀疏性,时间和空间复杂度更低;不涉及成本更高的指数运算;能避免梯度消失问题。缺点:引入了死亡 ReLU 问题,即网络的大部分分量都永远不会更新。但这有时候也是一个优势;ReLU 不能避免梯度爆炸问题。指数线性单元(ELU)指数线性单元激活函数解决了 ReLU 的一些问题,同时也保留了一些好的方面。这种激活函数要选取一个 α 值;常见的取值是在 0.1 到 0.3 之间。如果你数学不好,ELU 的公式看起来会有些难以理解:我解释一下。如果你输入的 x 值大于 0,则结果与 ReLU 一样——即 y 值等于 x 值;但如果输入的 x 值小于 0,则我们会得到一个稍微小于 0 的值。所得到的 y 值取决于输入的 x 值,但还要兼顾参数 α——你可以根据需要来调整这个参数。更进一步,我们引入了指数运算 e^x,因此 ELU 的计算成本比 ReLU 高。下面绘出了 α 值为 0.2 的 ELU 函数的图:ELU 激活函数图示。上图很直观,我们应该还能很好地应对梯度消失问题,因为输入值没有映射到非常小的输出值。但 ELU 的导数又如何呢?这同样也很重要。看起来很简单。如果输入 x 大于 0,则 y 值输出为 1;如果输入 x 小于或等于 0,则输出是 ELU 函数(未微分)加上 α 值。可绘出图为:微分的 ELU 激活函数。你可能已经注意到,这里成功避开了死亡 ReLU 问题,同时仍保有 ReLU 激活函数的一些计算速度增益——也就是说,网络中仍还有一些死亡的分量。优点:能避免死亡 ReLU 问题;能得到负值输出,这能帮助网络向正确的方向推动权重和偏置变化;在计算梯度时能得到激活,而不是让它们等于 0。缺点:由于包含指数运算,所以计算时间更长;无法避免梯度爆炸问题;神经网络不学习 α 值。渗漏型整流线性单元激活函数(Leaky ReLU)渗漏型整流线性单元激活函数也有一个 α 值,通常取值在 0.1 到 0.3 之间。Leaky ReLU 激活函数很常用,但相比于 ELU 它也有一些缺陷,但也比 ReLU 具有一些优势。Leaky ReLU 的数学形式如下:因此,如果输入 x 大于 0,则输出为 x;如果输入 x 小于或等于 0,则输出为 α 乘以输入。这意味着能够解决死亡 ReLU 问题,因为梯度的值不再被限定为 0——另外,这个函数也能避免梯度消失问题。尽管梯度爆炸的问题依然存在,但后面的代码部分会介绍如何解决。下面给出了 Leaky ReLU 的图示,其中假设 α 值为 0.2:Leaky ReLU 图示。和在公式中看到的一样,如果 x 值大于 0,则任意 x 值都映射为同样的 y 值;但如果 x 值小于 0,则会多一个系数 0.2。也就是说,如果输入值 x 为 -5,则映射的输出值为 -1。因为 Leaky ReLU 函数是两个线性部分组合起来的,所以它的导数很简单:第一部分线性是当 x 大于 0 时,输出为 1;而当输入小于 0 时,输出就为 α 值,这里我们选择的是 0.2。微分的 Leaky ReLU 图示。从上图中也能明显地看出来,输入 x 大于或小于 0,微分的 Leaky ReLU 各为一个常量。优点:类似 ELU,Leaky ReLU 也能避免死亡 ReLU 问题,因为其在计算导数时允许较小的梯度;由于不包含指数运算,所以计算速度比 ELU 快。缺点:无法避免梯度爆炸问题;神经网络不学习 α 值;在微分时,两部分都是线性的;而 ELU 的一部分是线性的,一部分是非线性的。扩展型指数线性单元激活函数(SELU)扩展型指数线性单元激活函数比较新,介绍它的论文包含长达 90 页的附录(包括定理和证明等)。当实际应用这个激活函数时,必须使用 lecun_normal 进行权重初始化。如果希望应用 dropout,则应当使用 AlphaDropout。后面的代码部分会更详细地介绍。论文作者已经计算出了公式的两个值:α 和 λ;如下所示:可以看到,它们的小数点后还有很多位,这是为了绝对精度。而且它们是预先确定的,也就是说我们不必担心如何为这个激活函数选取合适的 α 值。说实话,这个公式看起来和其它公式或多或少有些类似。所有新的激活函数看起来就像是其它已有的激活函数的组合。SELU 的公式如下:也就是说,如果输入值 x 大于 0,则输出值为 x 乘以 λ;如果输入值 x 小于 0,则会得到一个奇异函数——它随 x 增大而增大并趋近于 x 为 0 时的值 0.0848。本质上看,当 x 小于 0 时,先用 α 乘以 x 值的指数,再减去 α,然后乘以 λ 值。SELU 函数图示。SELU 的特例SELU 激活能够对神经网络进行自归一化(self-normalizing)。这是什么意思?首先,我们先看看什么是归一化(normalization)。简单来说,归一化首先是减去均值,然后除以标准差。因此,经过归一化之后,网络的组件(权重、偏置和激活)的均值为 0,标准差为 1。而这正是 SELU 激活函数的输出值。均值为 0 且标准差为 1 又如何呢?在初始化函数为 lecun_normal 的假设下,网络参数会被初始化一个正态分布(或高斯分布),然后在 SELU 的情况下,网络会在论文中描述的范围内完全地归一化。本质上看,当乘或加这样的网络分量时,网络仍被视为符合高斯分布。我们就称之为归一化。反过来,这又意味着整个网络及其最后一层的输出也是归一化的。均值 μ 为 0 且标准差 σ 为 1 的正态分布看起来是怎样的?SELU 的输出是归一化的,这可称为内部归一化(internal normalization),因此事实上其所有输出都是均值为 0 且标准差为 1。这不同于外部归一化(external normalization)——会用到批归一化或其它方法。很好,也就是说所有分量都会被归一化。但这是如何做到的?简单解释一下,当输入小于 0 时,方差减小;当输入大于 0 时,方差增大——而标准差是方差的平方根,这样我们就使得标准差为 1。我们通过梯度得到零均值。我们需要一些正值和负值才能让均值为 0。我的上一篇文章介绍过,梯度可以调整神经网络的权重和偏置,因此我们需要这些梯度输出一些负值和正值,这样才能控制住均值。均值 μ 和方差 ν 的主要作用是使我们有某个域 Ω,让我们总是能将均值和方差映射到预定义的区间内。这些区间定义如下:∈ 符号表示均值和方差在这些预定义的区间之内。反过来,这又能避免网络出现梯度消失和爆炸问题。下面引述一段论文的解释,说明了他们得到这个激活函数的方式,我认为这很重要:SELU 允许构建一个映射 g,其性质能够实现 SNN(自归一化神经网络)。SNN 不能通过(扩展型)修正线性单元(ReLU)、sigmoid 单元、tanh 单元和 Leaky ReLU 实现。这个激活函数需要有:(1)负值和正值,以便控制均值;(2)饱和区域(导数趋近于零),以便抑制更低层中较大的方差;(3)大于 1 的斜率,以便在更低层中的方差过小时增大方差;(4)连续曲线。后者能确保一个固定点,其中方差抑制可通过方差增大来获得均衡。我们能通过乘上指数线性单元(ELU)来满足激活函数的这些性质,而且 λ>1 能够确保正值净输入的斜率大于 1。我们再看看 SELU 的微分函数:很好,不太复杂,我们可以简单地解释一下。如果 x 大于 0,则输出值为 λ;如果 x 小于 0,则输出为 α 乘以 x 的指数再乘 λ。其图形如下所示,看起来很特别:微分的 SELU 函数。注意 SELU 函数也需要 lecun_normal 进行权重初始化;而且如果你想使用 dropout,你也必须使用名为 Alpha Dropout 的特殊版本。优点:内部归一化的速度比外部归一化快,这意味着网络能更快收敛;不可能出现梯度消失或爆炸问题,见 SELU 论文附录的定理 2 和 3。缺点:这个激活函数相对较新——需要更多论文比较性地探索其在 CNN 和 RNN 等架构中应用。这里有一篇使用 SELU 的 CNN 论文:https://arxiv.org/pdf/1905.01338.pdfGELU高斯误差线性单元激活函数在最近的 Transformer 模型(谷歌的 BERT 和 OpenAI 的 GPT-2)中得到了应用。GELU 的论文来自 2016 年,但直到最近才引起关注。这种激活函数的形式为:看得出来,这就是某些函数(比如双曲正切函数 tanh)与近似数值的组合。没什么过多可说的。有意思的是这个函数的图形:GELU 激活函数。可以看出,当 x 大于 0 时,输出为 x;但 x=0 到 x=1 的区间除外,这时曲线更偏向于 y 轴。我没能找到该函数的导数,所以我使用了 WolframAlpha 来微分这个函数。结果如下:和前面一样,这也是双曲函数的另一种组合形式。但它的图形看起来很有意思:微分的 GELU 激活函数。优点:似乎是 NLP 领域的当前最佳;尤其在 Transformer 模型中表现最好;能避免梯度消失问题。缺点:尽管是 2016 年提出的,但在实际应用中还是一个相当新颖的激活函数。用于深度神经网络的代码假如说你想要尝试所有这些激活函数,以便了解哪种最适合,你该怎么做?通常我们会执行超参数优化——这可以使用 scikit-learn 的 GridSearchCV 函数实现。但是我们想要进行比较,所以我们的想法是选取一些超参数并让它们保持恒定,同时修改激活函数。说明一下我这里要做的事情:使用本文提及的激活函数训练同样的神经网络模型;使用每个激活函数的历史记录,绘制损失和准确度随 epoch 的变化图。本代码也发布在了 GitHub 上,并且支持 colab,以便你能够快速运行。地址:https://github.com/casperbh96/Activation-Functions-Search我更偏好使用 Keras 的高级 API,所以这会用 Keras 来完成。首先导入我们所需的一切。注意这里使用了 4 个库:tensorflow、numpy、matplotlib、 keras。import tensorflow as tf

import numpy as np

import matplotlib.pyplot as plt

from keras.datasets import mnist

from keras.utils.np_utils import to_categorical

from keras.models import Sequential

from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D, Activation, LeakyReLU

from keras.layers.noise import AlphaDropout

from keras.utils.generic_utils import get_custom_objects

from keras import backend as K

from keras.optimizers import Adam现在加载我们运行实验所需的数据集;这里选择了 MNIST 数据集。我们可以直接从 Keras 导入它。(x_train, y_train), (x_test, y_test) = mnist.load_data()很好,但我们想对数据进行一些预处理,比如归一化。我们需要通过很多函数来做这件事,主要是调整图像大小(.reshape)并除以最大的 RGB 值 255(/= 255)。最后,我们通过 to_categorical() 对数据进行 one-hot 编码。def preprocess_mnist(x_train, y_train, x_test, y_test):

# Normalizing all images of 28x28 pixels

x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)

x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)

input_shape = (28, 28, 1)

# Float values for division

x_train = x_train.astype('float32')

x_test = x_test.astype('float32')

# Normalizing the RGB codes by dividing it to the max RGB value

x_train /= 255

x_test /= 255

# Categorical y values

y_train = to_categorical(y_train)

y_test= to_categorical(y_test)

return x_train, y_train, x_test, y_test, input_shape

x_train, y_train, x_test, y_test, input_shape = preprocess_mnist(x_train, y_train, x_test, y_test)现在我们已经完成了数据预处理,可以构建模型以及定义 Keras 运行所需的参数了。首先从卷积神经网络模型本身开始。SELU 激活函数是一个特殊情况,我们需要使用核初始化器 'lecun_normal' 和特殊形式的 dropout AlphaDropout(),其它一切都保持常规设定。def build_cnn(activation,

dropout_rate,

optimizer):

model = Sequential()if(activation == 'selu'):

model.add(Conv2D(32, kernel_size=(3, 3),

activation=activation,

input_shape=input_shape,

kernel_initializer='lecun_normal'))

model.add(Conv2D(64, (3, 3), activation=activation,

kernel_initializer='lecun_normal'))

model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(AlphaDropout(0.25))

model.add(Flatten())

model.add(Dense(128, activation=activation,

kernel_initializer='lecun_normal'))

model.add(AlphaDropout(0.5))

model.add(Dense(10, activation='softmax'))else:

model.add(Conv2D(32, kernel_size=(3, 3),

activation=activation,

input_shape=input_shape))

model.add(Conv2D(64, (3, 3), activation=activation))

model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Dropout(0.25))

model.add(Flatten())

model.add(Dense(128, activation=activation))

model.add(Dropout(0.5))

model.add(Dense(10, activation='softmax'))

model.compile(

loss='binary_crossentropy',

optimizer=optimizer,

metrics=['accuracy'])return model使用 GELU 函数有个小问题;Keras 中目前还没有这个函数。幸好我们能轻松地向 Keras 添加新的激活函数。# Add the GELU function to Keras

def gelu(x):

return 0.5 * x * (1 + tf.tanh(tf.sqrt(2 / np.pi) * (x + 0.044715 * tf.pow(x, 3))))

get_custom_objects().update({'gelu': Activation(gelu)})

# Add leaky-relu so we can use it as a string

get_custom_objects().update({'leaky-relu': Activation(LeakyReLU(alpha=0.2))})

act_func = ['sigmoid', 'relu', 'elu', 'leaky-relu', 'selu', 'gelu']现在我们可以使用 act_func 数组中定义的不同激活函数训练模型了。我们会在每个激活函数上运行一个简单的 for 循环,并将结果添加到一个数组:result = []for activation in act_func:print('\nTraining with -->{0}<-- activation function\n'.format(activation))

model = build_cnn(activation=activation,

dropout_rate=0.2,

optimizer=Adam(clipvalue=0.5))

history = model.fit(x_train, y_train,

validation_split=0.20,

batch_size=128, # 128 is faster, but less accurate. 16/32 recommended

epochs=100,

verbose=1,

validation_data=(x_test, y_test))

result.append(history)

K.clear_session()del model

print(result)基于此,我们可以为每个激活函数绘制从 model.fit() 得到的历史图,然后看看损失和准确度结果的变化情况。现在我们可以为数据绘图了,我用 matplotlib 写了一小段代码:new_act_arr = act_func[1:]

new_results = result[1:]def plot_act_func_results(results, activation_functions = []):

plt.figure(figsize=(10,10))

plt.style.use('dark_background')# Plot validation accuracy valuesfor act_func in results:

plt.plot(act_func.history['val_acc'])

plt.title('Model accuracy')

plt.ylabel('Test Accuracy')

plt.xlabel('Epoch')

plt.legend(activation_functions)

plt.show()# Plot validation loss values

plt.figure(figsize=(10,10))for act_func in results:

plt.plot(act_func.history['val_loss'])

plt.title('Model loss')

plt.ylabel('Test Loss')

plt.xlabel('Epoch')

plt.legend(activation_functions)

plt.show()

plot_act_func_results(new_results, new_act_arr)这会得到如下图表:扩展阅读下面是四本写得很赞的书:Deep Learning,作者:Ian Goodfellow、Yoshua Bengio、Aaron CourvilleThe Hundred-Page Machine Learning Book,作者:Andriy BurkovHands-On Machine Learning with Scikit-Learn and TensorFlow,作者:Aurélien GéronMachine Learning: A Probabilistic Perspective,作者:Kevin P. Murphy下面是本文讨论过的重要论文:Leaky ReLU 论文:https://ai.stanford.edu/~amaas/papers/relu_hybrid_icml2013_final.pdfELU 论文:https://arxiv.org/pdf/1511.07289.pdfSELU 论文:https://arxiv.org/pdf/1706.02515.pdfGELU 论文:https://arxiv.org/pdf/1606.08415.pdf发布于 2019-12-23 10:29深度学习(Deep Learning)神经网络人工智能​赞同 1200​​23 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录机器之心关注人工智能学术和技

大模型基础|激活函数|从ReLU 到SwiGLU - 知乎

大模型基础|激活函数|从ReLU 到SwiGLU - 知乎首发于建模控制与机器学习切换模式写文章登录/注册大模型基础|激活函数|从ReLU 到SwiGLU养生的控制人​浙江大学 控制科学与工程博士Google的PaLM和Meta的LLaMA都使用了SwiGLU来增强Transformer架构中的FFN层的性能。SwiGLU是Gated Linear Units(GLU)激活函数的一种变体,由Noam Shazeer在论文《GLU Variants Improve Transformer》的论文中提出。本文主要介绍不同激活函数(如ReLU、GELU和Swish)在FFN层中的应用。使用ReLU激活的FFNTransformer模型通过多头注意力层和FFN层交替工作。FFN层存在于Transformer架构的编码器和解码器部分中。例如,下方的编码器块由多头注意力层和一个FFN层组成。FFN层包括两个线性变换,中间插入一个非线性激活函数。最初的Transformer架构采用了ReLU激活函数。\text{FFN}(x, W_1, W_2, b_1, b_2) = \text{ReLU}(xW_1 + b_1) W_2 + b_2 \\其中ReLU的定义为\text{ReLU}(x) = \max(0, x)在他们的实验中使用了不包含bias项的FFN,T5其实也是这么搞的\text{FFN}_{\text{ReLU}}(x, W_1, W_2) = \text{ReLU}(xW_1) W_2 \\ 使用GELU激活的FFN论文《Gaussian Error Linear Units(GELUs)》提出了GELU,这是ReLU的平滑版本。import numpy as np

import matplotlib.pyplot as plt

from scipy.stats import norm

def gelu(x):

return x * norm.cdf(x)

def relu(x):

return np.maximum(0, x)

x_values = np.linspace(-5, 5, 500)

y_values = gelu(x_values)

gelu_values = gelu(x_values)

relu_values = relu(x_values)

plt.plot(x_values, gelu_values, label='GELU')

plt.plot(x_values, relu_values, label='ReLU')

plt.title("GELU and ReLU Activation Functions")

plt.xlabel("x")

plt.ylabel("Activation")

plt.grid()

plt.legend()

plt.show()这是一个处处可微的非线性函数,因此使用GELU的FFN层可以表示为\text{FFN}_{\text{GELU}}(x, W_1, W_2) = \text{GELU}(xW_1) W_2 \\在GELU论文中,作者使用了标准正态分布的累积分布函数(cdf)的近似计算来提高计算速度。使用Swish激活的FFN论文《Swish: a Self-Gated Activation Function》提出了Swish,这也是对带有非零负值梯度的ReLU平滑版本。import numpy as np

import matplotlib.pyplot as plt

from scipy.stats import norm

def gelu(x):

return x * norm.cdf(x)

def relu(x):

return np.maximum(0, x)

def swish(x, beta=1):

return x * (1 / (1 + np.exp(-beta * x)))

x_values = np.linspace(-5, 5, 500)

gelu_values = gelu(x_values)

relu_values = relu(x_values)

swish_values = swish(x_values)

swish_values2 = swish(x_values, beta=0.5)

plt.plot(x_values, gelu_values, label='GELU')

plt.plot(x_values, relu_values, label='ReLU')

plt.plot(x_values, swish_values, label='Swish')

plt.plot(x_values, swish_values2, label='Swish (beta=0.5)')

plt.title("GELU, ReLU, and Swish Activation Functions")

plt.xlabel("x")

plt.ylabel("Activation")

plt.grid()

plt.legend()

plt.show()Swish同样是个处处可微的非线性函数,且有一个参数beta用于控制函数的形状,带有Swish的FFN层可以表示为\text{FFN}_{\text{Swish}}(x, W_1, W_2) = \text{Swish}_1(xW_1) W_2 \\其中\text{Swish}_{\beta}(x) = x \sigma(\beta x),在他们的实验中,beta取为1。GLU及其变体GLU(Gated Linear Units)其实不算是一种激活函数,而是一种神经网络层。它是一个线性变换后面接门控机制的结构。其中门控机制是一个sigmoid函数用来控制信息能够通过多少。\text{GLU}(x, W, V, b, c) = \sigma(xW + b) \otimes (xV + c) \\其中 \sigma 为sigmoid函数,\otimes 为逐元素乘。通过使用其他的激活函数我们就能够得到GLU的各种变体了。比如说现在LLM中常用的SwiGLU其实就是采用Swish作为激活函数的GLU变体\text{SwiGLU}(x,W, V, b, c) = \text{Swish}_1(xW + b) \otimes (xV + c) \\由于引入了更多的权重矩阵,通常会对隐藏层的大小做一个缩放,从而保证整体的参数量不变。代码的实现如下class FeedForward(nn.Module):

def __init__(self, dim: int, hidden_dim: int, multiple_of: int, dropout: float):

super().__init__()

hidden_dim = multiple_of * ((2 * hidden_dim // 3 + multiple_of - 1) // multiple_of)

self.w1 = nn.Linear(dim, hidden_dim)

self.w2 = nn.Linear(hidden_dim, dim)

self.w3 = nn.Linear(dim, hidden_dim)

self.dropout = nn.Dropout(dropout)

def forward(self, x: torch.Tensor) -> torch.Tensor:

return self.dropout(self.w2(F.silu(self.w1(x)) * self.w3(x)))为什么这里使用的是silu激活函数? 因为SiLU其实就是beta为1时的Swish激活函数f(x) = x \cdot \sigma(x) \\ 编辑于 2023-11-02 21:03・IP 属地广东激活函数LLM(大型语言模型)Llama 2​赞同 102​​13 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录建模控制与机器学习科研道路打怪升级,自学成菜

SiLU — PyTorch 2.2 documentation

SiLU — PyTorch 2.2 documentation

Get Started

Ecosystem

Edge

About PyTorch Edge

ExecuTorch

Blog

Tutorials

Docs

PyTorch

torchaudio

torchtext

torchvision

torcharrow

TorchData

TorchRec

TorchServe

TorchX

PyTorch on XLA Devices

Resources

About

Learn about PyTorch’s features and capabilities

PyTorch Foundation

Learn about the PyTorch foundation

Community

Join the PyTorch developer community to contribute, learn, and get your questions answered.

Community Stories

Learn how our community solves real, everyday machine learning problems with PyTorch.

Developer Resources

Find resources and get questions answered

Events

Find events, webinars, and podcasts

Forums

A place to discuss PyTorch code, issues, install, research

Models (Beta)

Discover, publish, and reuse pre-trained models

GitHub

Table of Contents

2.2 ▼

Community

PyTorch Governance | Build + CI

PyTorch Contribution Guide

PyTorch Design Philosophy

PyTorch Governance | Mechanics

PyTorch Governance | Maintainers

Developer Notes

CUDA Automatic Mixed Precision examples

Autograd mechanics

Broadcasting semantics

CPU threading and TorchScript inference

CUDA semantics

Distributed Data Parallel

Extending PyTorch

Extending torch.func with autograd.Function

Frequently Asked Questions

Gradcheck mechanics

HIP (ROCm) semantics

Features for large-scale deployments

Modules

MPS backend

Multiprocessing best practices

Numerical accuracy

Reproducibility

Serialization semantics

Windows FAQ

Language Bindings

C++

Javadoc

torch::deploy

Python API

torch

torch.nn

torch.nn.functional

torch.Tensor

Tensor Attributes

Tensor Views

torch.amp

torch.autograd

torch.library

torch.cpu

torch.cuda

Understanding CUDA Memory Usage

Generating a Snapshot

Using the visualizer

Snapshot API Reference

torch.mps

torch.backends

torch.export

torch.distributed

torch.distributed.algorithms.join

torch.distributed.elastic

torch.distributed.fsdp

torch.distributed.optim

torch.distributed.tensor.parallel

torch.distributed.checkpoint

torch.distributions

torch.compiler

torch.fft

torch.func

torch.futures

torch.fx

torch.hub

torch.jit

torch.linalg

torch.monitor

torch.signal

torch.special

torch.overrides

torch.package

torch.profiler

torch.nn.init

torch.onnx

torch.optim

Complex Numbers

DDP Communication Hooks

Pipeline Parallelism

Quantization

Distributed RPC Framework

torch.random

torch.masked

torch.nested

torch.sparse

torch.Storage

torch.testing

torch.utils

torch.utils.benchmark

torch.utils.bottleneck

torch.utils.checkpoint

torch.utils.cpp_extension

torch.utils.data

torch.utils.deterministic

torch.utils.jit

torch.utils.dlpack

torch.utils.mobile_optimizer

torch.utils.model_zoo

torch.utils.tensorboard

Type Info

Named Tensors

Named Tensors operator coverage

torch.__config__

torch._logging

Libraries

torchaudio

TorchData

TorchRec

TorchServe

torchtext

torchvision

PyTorch on XLA Devices

Docs

>

torch.nn >

SiLU

Shortcuts

SiLU¶

class torch.nn.SiLU(inplace=False)[source]¶

Applies the Sigmoid Linear Unit (SiLU) function, element-wise.

The SiLU function is also known as the swish function.

silu(x)=x∗σ(x),where σ(x) is the logistic sigmoid.\text{silu}(x) = x * \sigma(x), \text{where } \sigma(x) \text{ is the logistic sigmoid.}

silu(x)=x∗σ(x),where σ(x) is the logistic sigmoid.

Note

See Gaussian Error Linear Units (GELUs)

where the SiLU (Sigmoid Linear Unit) was originally coined, and see

Sigmoid-Weighted Linear Units for Neural Network Function Approximation

in Reinforcement Learning and Swish:

a Self-Gated Activation Function

where the SiLU was experimented with later.

Shape:

Input: (∗)(*)(∗), where ∗*∗ means any number of dimensions.

Output: (∗)(*)(∗), same shape as the input.

Examples:

>>> m = nn.SiLU()

>>> input = torch.randn(2)

>>> output = m(input)

Next

Previous

© Copyright 2023, PyTorch Contributors.

Built with Sphinx using a theme provided by Read the Docs.

SiLU

SiLU

Docs

Access comprehensive developer documentation for PyTorch

View Docs

Tutorials

Get in-depth tutorials for beginners and advanced developers

View Tutorials

Resources

Find development resources and get your questions answered

View Resources

PyTorch

Get Started

Features

Ecosystem

Blog

Contributing

Resources

Tutorials

Docs

Discuss

Github Issues

Brand Guidelines

Stay up to date

Facebook

Twitter

YouTube

LinkedIn

PyTorch Podcasts

Spotify

Apple

Google

Amazon

Terms

|

Privacy

© Copyright The Linux Foundation. The PyTorch Foundation is a project of The Linux Foundation.

For web site terms of use, trademark policy and other policies applicable to The PyTorch Foundation please see

www.linuxfoundation.org/policies/. The PyTorch Foundation supports the PyTorch open source

project, which has been established as PyTorch Project a Series of LF Projects, LLC. For policies applicable to the PyTorch Project a Series of LF Projects, LLC,

please see www.lfprojects.org/policies/.

To analyze traffic and optimize your experience, we serve cookies on this site. By clicking or navigating, you agree to allow our usage of cookies. As the current maintainers of this site, Facebook’s Cookies Policy applies. Learn more, including about available controls: Cookies Policy.

Get Started

Ecosystem

Mobile

Blog

Tutorials

Docs

PyTorch

torchaudio

torchtext

torchvision

torcharrow

TorchData

TorchRec

TorchServe

TorchX

PyTorch on XLA Devices

Resources

About

PyTorch Foundation

Community

Community Stories

Developer Resources

Events

Forums

Models (Beta)

Github

【PyTorch】教程:torch.nn.SiLU_nn.silu()-CSDN博客

>

【PyTorch】教程:torch.nn.SiLU_nn.silu()-CSDN博客

【PyTorch】教程:torch.nn.SiLU

最新推荐文章于 2023-08-22 09:41:46 发布

黄金旺铺

最新推荐文章于 2023-08-22 09:41:46 发布

阅读量1.3k

收藏

1

点赞数

分类专栏:

PyTorch

文章标签:

pytorch

深度学习

python

by: JW

本文链接:https://blog.csdn.net/zhoujinwang/article/details/129603111

版权

PyTorch

专栏收录该内容

52 篇文章

9 订阅

订阅专栏

torch.nn.SiLU

原型

CLASS torch.nn.SiLU(inplace=False)

定义

s

i

l

u

(

x

)

=

x

σ

(

x

)

,

where 

σ

(

x

)

 is logistic sigmoid

silu(x)=x*\sigma(x), \text{where } \sigma(x) \text{ is logistic sigmoid}

silu(x)=x∗σ(x),where σ(x) is logistic sigmoid

代码

import torch

import torch.nn as nn

m = nn.SiLU()

input = torch.randn(4)

output = m(input)

print("input: ", input) # input: tensor([ 0.3852, -0.5519, 0.8902, 2.1292])

print("output: ", output) # output: tensor([ 0.2292, -0.2017, 0.6311, 1.9029])

【参考】

SiLU — PyTorch 2.0 documentation

关注博主即可阅读全文

优惠劵

黄金旺铺

关注

关注

0

点赞

1

收藏

觉得还不错?

一键收藏

打赏

知道了

0

评论

【PyTorch】教程:torch.nn.SiLU

原型定义silu(x)=x∗σ(x),where σ(x) is logistic sigmoidsilu(x)=x*\sigma(x), \text{where } \sigma(x) \text{ is logistic sigmoid}silu(x)=x∗σ(x),where σ(x) is logistic sigmoid图代码【参考】SiLU — PyTorch 2.0 documentation

复制链接

扫一扫

专栏目录

pytorch:torch.mm()和torch.matmul()的使用

09-18

今天小编就为大家分享一篇pytorch:torch.mm()和torch.matmul()的使用,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

pytorch中SiLU激活函数

热门推荐

qq_45690024的博客

07-22

1万+

silu (x)=x∗ sigmoid(x)

参与评论

您还未登录,请先

登录

后发表或查看评论

【PyTorch】SiLU激活函数

算法与编程之美

08-26

6039

SiLU激活函数

Lnton羚通云算力平台【PyTorch】教程:torch.nn.SiLU

最新发布

LNTON羚通科技

08-22

278

是 PyTorch 深度学习框架中的一个激活函数,它代表 Sigmoid-Weighted Linear Unit(SiLU),也称为 Swish 激活函数。SiLU 激活函数在深度学习中被广泛使用,因为它在计算复杂度相对较低的情况下,在某些任务上比常用的激活函数(如 ReLU)具有更好的性能。公司基于视频分析技术、视频智能传输技术、远程监测技术以及智能语音融合技术等, 拥有多款可支持ONVIF、RTSP、GB/T28181等多协议、多路数的音视频智能分析服务器/云平台。

PyTorch里面的torch.nn.Parameter()详解

09-18

今天小编就为大家分享一篇PyTorch里面的torch.nn.Parameter()详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

yolox中的一些基本组件【network_blocks】

乐亦亦乐的博客

07-28

1833

Sigmoid Weighted Liner Unit(SiLU)

f(x)=x⋅σ(x) f′(x)=f(x)+σ(x)(1−f(x))

【图片来源:https://blog.csdn.net/GrayOnDream/article/details/102955297】

class SiLU(nn.Module):

"""

e...

torch.nn操作

weixin_43848456的博客

07-05

695

nn.Identity

源码如下:

class Identity(Module):

r"""A placeholder identity operator that is argument-insensitive.

Args:

args: any argument (unused)

kwargs: any keyword argument (unused)

Examples::

>>> m = nn.Identi

pytorch常见问题

weixin_44591652的博客

02-15

1789

Pytorch常见问题

1.问题1: SiLU

问题一.Can‘t get attribute ‘SiLU‘ on <module ‘torch.nn.modules.activation

报错信息:

Traceback (most recent call last):

File "detect_test.py", line 87, in

conf_thres_base=0.6,

File "/home/default/Documents/caibaojun/y

YOLOv5S网络框架设计-CSC&C3&SPPF模块

weixin_57379543的博客

08-03

1814

CBS: C代表Conv,B代表,S代表SiLu激活函数CBS模块封装了卷积、批归一化和激活函数的组合操作self.conv: 用nn.Conv2d创建了一个二维卷积层self.bn:使用创建了一个二维批归一化层self.act:根据act参数确定是否应用激活函数,默认为nn.SiLU(),如果act既不是True也不是nn.Module类型,则应用恒等函数。运算顺序由前向传播方法中,先对输入x进行卷积操作,然后应用批归一化和激活函数,并返回结果。在融合正向传播方法。

‘torch.nn‘ has no attribute ‘SiLU‘

jacke121的专栏

05-02

1万+

'torch.nn' has no attribute 'SiLU'

解决方法:

pip installpytorch torchvision -U

pytorch1.0中torch.nn.Conv2d用法详解

01-20

Conv2d的简单使用

torch 包 nn 中 Conv2d 的用法与 tensorflow 中类似,但不完全一样。

在 torch 中,Conv2d 有几个基本的参数,分别是

in_channels 输入图像的深度

out_channels 输出图像的深度

kernel_size 卷积核大小,正方形卷积只为单个数字

stride 卷积步长,默认为1

padding 卷积是否造成尺寸丢失,1为不丢失

与tensorflow不一样的是,pytorch中的使用更加清晰化,我们可以使用这种方法定义输入与输出图像的深度并同时指定使用的卷积核的大小。

而我们的输入则由经由 Conv2d 定义的参数传入

yolov5笔记(2)——训练自己的数据模型(yolov8更新)

weixin_45569617的博客

08-21

1万+

1. 下载yolov5

2. 安装所需的库

3. 运行

yolov5的记录贴

qq_44224801的博客

09-07

318

其中FRelu达到的最好的效果,但是针对与yolov5s小模型比较友好,会增加计算量。

【PyTorch】教程:torch.nn.SELU

03-14

253

原型参数定义Applied element-wise, as:SELU(x)=scale∗(max⁡⁡(0,x)+min⁡⁡(0,α∗(exp⁡⁡(x)−1)))

\text{SELU}(x)=scale∗(\max⁡(0,x)+\min⁡(0, \alpha∗(\exp⁡(x)−1)))

SELU(x)=scale∗(max⁡(0,x)+min⁡(0,α∗(exp⁡(x)−1)))图代码

【参考】

SELU — PyTorch 1.13 documentation

YOLOv5(PyTorch)目标检测:原理与源码解析

12-07

【为什么要学习这门课】 Linux创始人Linus Torvalds有一句名言:Talk is cheap. Show me the code. 冗谈不够,放码过来!代码阅读是从基础到提高的必由之路。 YOLOv5是最近推出的轻量且高性能的实时目标检测方法。YOLOv5使用PyTorch实现,含有很多业界前沿和常用的技巧,可以作为很好的代码阅读案例,让我们深入探究其实现原理,其中不少知识点的代码可以作为相关项目的借鉴。 【课程内容与收获】 本课程将详细解析YOLOv5的实现原理和源码,对关键代码使用PyCharm的debug模式逐行分析解读。 本课程将提供注释后的YOLOv5的源码程序文件。   【相关课程】 本人推出了有关YOLOv5目标检测的系列课程。请持续关注该系列的其它视频课程,包括:《YOLOv5(PyTorch)目标检测实战:训练自己的数据集》Ubuntu系统 https://edu.csdn.net/course/detail/30793 Windows系统 https://edu.csdn.net/course/detail/30923 《YOLOv5(PyTorch)目标检测:原理与源码解析》https://edu.csdn.net/course/detail/31428 《YOLOv5(PyTorch)目标检测实战:Flask Web部署》https://edu.csdn.net/course/detail/31087 《YOLOv5(PyTorch)目标检测实战:TensorRT加速部署》https://edu.csdn.net/course/detail/32303

激活函数 Relu,Gelu,Mish,SiLU,Swish,Tanh,Sigmoid

weixin_38649779的博客

11-02

7412

激活函数 总结

PyTorch教程(5)激活函数

weixin_43229348的博客

08-04

3411

问题

激活函数是什么?它们在实际项目中是如何工作的?如何使用PyTorch实现激活函数?

解答

激活函数是一个数学公式,它根据数学转换函数的类型将二进制、浮点或整数格式的向量转换为另一种格式。神经元存在于不同的层——输入层、隐藏层和输出层,它们通过一个称为激活函数的数学函数相互连接。激活函数有不同的变体,下面将对此进行解释。理解激活函数有助于准确地实现神经网络模型。

作用原理

神经网络模型中所有的激活函数可以大致分为线性函数和非线性函数。PyTorch的torch.nn模块创建任何类型的神经网络模型。让我们

AttributeError: module 'torch.nn' has no attribute 'SiLU'

07-27

这个错误是因为您正在尝试使用torch.nn模块中的SiLU函数,但该函数在较旧的版本中可能不可用。SiLU函数(也称为Swish函数)是在较新的PyTorch版本(1.7.0及更高版本)中引入的。

要解决此问题,您可以尝试更新您的PyTorch版本以获得SiLU函数的支持。请确保您的PyTorch版本与您所需功能的要求相匹配。您可以使用以下命令升级PyTorch:

```

pip install --upgrade torch

```

如果您仍然遇到问题,请检查您所使用的PyTorch版本及其相应的文档,以了解是否支持SiLU函数或有其他替代方法可用。

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

黄金旺铺

CSDN认证博客专家

CSDN认证企业博客

码龄16年

暂无认证

192

原创

6346

周排名

1万+

总排名

16万+

访问

等级

2088

积分

9924

粉丝

113

获赞

72

评论

648

收藏

私信

关注

热门文章

【环境配置】安装 Visual Studio 2022 Community 卡住了&& 安装 Windows SDK (Software Development Kits)卡住了

4393

【PyTorch】教程:torch.nn.GELU

4303

【边缘设备】yolov5训练与rknn模型导出并在RK3588部署~总结(亲测有效)

4162

【操作系统】WSL 常用命令

3830

【环境配置】Windows 11 的 WSL(Ubuntu2204) 安装OpenCV 4.5.4 (亲测有效)

3586

分类专栏

工具代码

1篇

Android

1篇

OpenCV

73篇

PyTorch

52篇

项目及产品管理

48篇

pandas

13篇

C++C

7篇

Python

5篇

最新评论

【环境配置】Windows10-YOLOv8运行报错

LeeJiEuniu5:

This probably means that you are not using fork to start your

child processes and you have forgotten to use the proper idiom

in the main module:

if __name__ == '__main__':

freeze_support()

...

The "freeze_support()" line can be omitted if the program

is not going to be frozen to produce an executable.

To fix this issue, refer to the "Safe importing of main module"

section in https://docs.python.org/3/library/multiprocessing.html

【环境配置】Windows10-YOLOv8运行报错

LeeJiEuniu5:

File "E:\Anaconda3\envs\y8\Lib\multiprocessing\context.py", line 224, in _Popen

return _default_context.get_context().Process._Popen(process_obj)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "E:\Anaconda3\envs\y8\Lib\multiprocessing\context.py", line 336, in _Popen

return Popen(process_obj)

^^^^^^^^^^^^^^^^^^

File "E:\Anaconda3\envs\y8\Lib\multiprocessing\popen_spawn_win32.py", line 46, in __init__

prep_data = spawn.get_preparation_data(process_obj._name)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "E:\Anaconda3\envs\y8\Lib\multiprocessing\spawn.py", line 164, in get_preparation_data

_check_not_importing_main()

File "E:\Anaconda3\envs\y8\Lib\multiprocessing\spawn.py", line 140, in _check_not_importing_main

raise RuntimeError('''

RuntimeError:

An attempt has been made to start a new process before the

current process has finished its bootstrapping phase.

【环境配置】Windows10-YOLOv8运行报错

LeeJiEuniu5:

File "e:\y8\ultralytics-main\ultralytics\data\build.py", line 107, in build_dataloader

return InfiniteDataLoader(dataset=dataset,

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "e:\y8\ultralytics-main\ultralytics\data\build.py", line 33, in __init__

self.iterator = super().__iter__()

^^^^^^^^^^^^^^^^^^

File "E:\Anaconda3\envs\y8\Lib\site-packages\torch\utils\data\dataloader.py", line 438, in __iter__

return self._get_iterator()

^^^^^^^^^^^^^^^^^^^^

File "E:\Anaconda3\envs\y8\Lib\site-packages\torch\utils\data\dataloader.py", line 386, in _get_iterator

return _MultiProcessingDataLoaderIter(self)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "E:\Anaconda3\envs\y8\Lib\site-packages\torch\utils\data\dataloader.py", line 1039, in __init__

w.start()

File "E:\Anaconda3\envs\y8\Lib\multiprocessing\process.py", line 121, in start

self._popen = self._Popen(self)

^^^^^^^^^^^^^^^^^

【环境配置】Windows10-YOLOv8运行报错

LeeJiEuniu5:

File "e:\y8\ultralytics-main\ultralytics\engine\model.py", line 338, in train

self.trainer.train()

File "e:\y8\ultralytics-main\ultralytics\engine\trainer.py", line 190, in train

self._do_train(world_size)

File "e:\y8\ultralytics-main\ultralytics\engine\trainer.py", line 290, in _do_train

self._setup_train(world_size)

File "e:\y8\ultralytics-main\ultralytics\engine\trainer.py", line 259, in _setup_train

self.train_loader = self.get_dataloader(self.trainset, batch_size=batch_size, rank=RANK, mode='train')

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "e:\y8\ultralytics-main\ultralytics\models\yolo\detect\train.py", line 52, in get_dataloader

return build_dataloader(dataset, batch_size, workers, shuffle, rank) # return dataloader

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

【环境配置】Windows10-YOLOv8运行报错

LeeJiEuniu5:

有一千字符限制

大家在看

Linux 相关命令

220

C++关于socket中收发数据不完整问题

java剧本杀分享社区网站(ssm)

CalledProcessError: Command ‘[‘git’,‘submodule--helper’,‘list’]’ returned non-zero exit status 129.

293

【无标题】

360

最新文章

【工具】raw与jpg互转python-cpp

【代码管理】TortoiseGit 图标没有显示

【代码管理】一键更新一堆的 git 代码仓库

2024年3篇

2023年89篇

2022年100篇

目录

目录

分类专栏

工具代码

1篇

Android

1篇

OpenCV

73篇

PyTorch

52篇

项目及产品管理

48篇

pandas

13篇

C++C

7篇

Python

5篇

目录

评论

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

打赏作者

黄金旺铺

你的鼓励将是我创作的最大动力

¥1

¥2

¥4

¥6

¥10

¥20

扫码支付:¥1

获取中

扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

有哪些好用的激活函数? - 知乎

有哪些好用的激活函数? - 知乎首页知乎知学堂发现等你来答​切换模式登录/注册机器学习深度学习(Deep Learning)PyTorch激活函数有哪些好用的激活函数?关注者54被浏览38,073关注问题​写回答​邀请回答​好问题 3​1 条评论​分享​12 个回答默认排序知乎用户ReLU 的各种光滑近似的自门控的激活函数,例如 GELU [1]、SiLU [2]、Mish [3] 和 TanhExp [4]。\mathrm{GELU}(x) = x \ast \Phi(x) = \frac{x}{2}\left[1+\mathrm{erf}(\frac{x}{\sqrt{2}})\right] \approx \frac{x}{2}\left[1+\tanh\left(\sqrt{\frac{2}{\pi}}(x+0.044715x^3)\right)\right]. \mathrm{SiLU}(x) = x \ast \mathrm{sigmoid}(x) = \frac{x}{1+\exp(-x)}. \mathrm{Mish}(x) = x \ast \tanh(\mathrm{softplus}(x)) = x \ast \tanh(\log(1 + \exp(x))). \operatorname{TanhExp}{(x)} = x \ast \tanh(\exp(x)). Figure 1. Landscapes on a 5‐layer network with different activation functionsReference[1] Hendrycks, D., & Gimpel, K. (2016). Gaussian Error Linear Units (GELUs). ArXiv Preprint ArXiv: Arxiv-1606. 08415.[2] Prajit Ramachandran, Q. V. L., Barret Zoph. (2018). Searching for Activation Functions. ICLR 2018 Workshop Track.[3] Misra, D. (2020). Mish: A Self Regularized Non-Monotonic Activation Function. BMVC.[4] Liu, X., & Di, X. (2021). TanhExp: A smooth activation function with high convergence speed for lightweight neural networks. IET Computer Vision, 15(2), 136–150.编辑于 2023-04-13 21:39​赞同 107​​9 条评论​分享​收藏​喜欢收起​知乎用户1.激活函数使用频率2. 激活函数类型(1) RELU类激活函数对比(2) S形激活函数对比3. 激活函数公式与曲线(后期会不定期进行更新)(1) 恒等函数(2)单位阶跃函数(3)sigmoid函数/逻辑函数(4)hard_sigmoid(5)tanh函数/双曲正切函数(6)反正切函数(7)Softsign函数(8)反平方根函数(ISRU)(9)线性整流函数(ReLU)(10) 带泄露线性整流函数(Leaky ReLU)(11)参数化线性整流函数(PReLU)(12)带泄露随机线性整流函数(RReLU)(13)指数线性函数(ELU)(14)扩展指数线性函数(SELU)(15)S型线性整流激活函数(SReLU)(16)反平方根线性函数(ISRLU)(17)自适应分段线性函数(APL)(18)SoftPlus函数(19)弯曲恒等函数(20)SigmoidWeightedLinerUnit(SiLU)(21)SoftExponential(22)正弦函数(23)Sinc函数(24)高斯函数(25)自门控激活函数(swish)(26)hard-Swish(27)Mish(28)ReLU6(29)Maxout(30)FReLU(31)ACONC(32)GELU发布于 2022-05-20 16:45​赞同 20​​1 条评论​分享​收藏​喜欢

[1702.03118] Sigmoid-Weighted Linear Units for Neural Network Function Approximation in Reinforcement Learning

[1702.03118] Sigmoid-Weighted Linear Units for Neural Network Function Approximation in Reinforcement Learning

Skip to main content

We gratefully acknowledge support from the Simons Foundation, member institutions, and all contributors. Donate

> cs > arXiv:1702.03118

Help | Advanced Search

All fields

Title

Author

Abstract

Comments

Journal reference

ACM classification

MSC classification

Report number

arXiv identifier

DOI

ORCID

arXiv author ID

Help pages

Full text

Search

open search

GO

open navigation menu

quick links

Login

Help Pages

About

Computer Science > Machine Learning

arXiv:1702.03118 (cs)

[Submitted on 10 Feb 2017 (v1), last revised 2 Nov 2017 (this version, v3)]

Title:Sigmoid-Weighted Linear Units for Neural Network Function Approximation in Reinforcement Learning

Authors:Stefan Elfwing, Eiji Uchibe, Kenji Doya Download a PDF of the paper titled Sigmoid-Weighted Linear Units for Neural Network Function Approximation in Reinforcement Learning, by Stefan Elfwing and 1 other authors

Download PDF

Abstract:In recent years, neural networks have enjoyed a renaissance as function approximators in reinforcement learning. Two decades after Tesauro's TD-Gammon achieved near top-level human performance in backgammon, the deep reinforcement learning algorithm DQN achieved human-level performance in many Atari 2600 games. The purpose of this study is twofold. First, we propose two activation functions for neural network function approximation in reinforcement learning: the sigmoid-weighted linear unit (SiLU) and its derivative function (dSiLU). The activation of the SiLU is computed by the sigmoid function multiplied by its input. Second, we suggest that the more traditional approach of using on-policy learning with eligibility traces, instead of experience replay, and softmax action selection with simple annealing can be competitive with DQN, without the need for a separate target network. We validate our proposed approach by, first, achieving new state-of-the-art results in both stochastic SZ-Tetris and Tetris with a small 10$\times$10 board, using TD($\lambda$) learning and shallow dSiLU network agents, and, then, by outperforming DQN in the Atari 2600 domain by using a deep Sarsa($\lambda$) agent with SiLU and dSiLU hidden units.

Comments:

18 pages, 22 figures; added deep RL results for SZ-Tetris

Subjects:

Machine Learning (cs.LG)

Cite as:

arXiv:1702.03118 [cs.LG]

 

(or

arXiv:1702.03118v3 [cs.LG] for this version)

 

https://doi.org/10.48550/arXiv.1702.03118

Focus to learn more

arXiv-issued DOI via DataCite

Submission history From: Stefan Elfwing PhD [view email] [v1]

Fri, 10 Feb 2017 10:04:30 UTC (499 KB)

[v2]

Thu, 23 Feb 2017 07:40:05 UTC (501 KB)

[v3]

Thu, 2 Nov 2017 02:48:38 UTC (555 KB)

Full-text links:

Access Paper:

Download a PDF of the paper titled Sigmoid-Weighted Linear Units for Neural Network Function Approximation in Reinforcement Learning, by Stefan Elfwing and 1 other authorsDownload PDFTeX SourceOther Formats

view license

Current browse context: cs.LG

< prev

  |  

next >

new

|

recent

|

1702

Change to browse by:

cs

References & Citations

NASA ADSGoogle Scholar

Semantic Scholar

DBLP - CS Bibliography

listing | bibtex

Stefan ElfwingEiji UchibeKenji Doya

a

export BibTeX citation

Loading...

BibTeX formatted citation

×

loading...

Data provided by:

Bookmark

Bibliographic Tools

Bibliographic and Citation Tools

Bibliographic Explorer Toggle

Bibliographic Explorer (What is the Explorer?)

Litmaps Toggle

Litmaps (What is Litmaps?)

scite.ai Toggle

scite Smart Citations (What are Smart Citations?)

Code, Data, Media

Code, Data and Media Associated with this Article

Links to Code Toggle

CatalyzeX Code Finder for Papers (What is CatalyzeX?)

DagsHub Toggle

DagsHub (What is DagsHub?)

GotitPub Toggle

Gotit.pub (What is GotitPub?)

Links to Code Toggle

Papers with Code (What is Papers with Code?)

ScienceCast Toggle

ScienceCast (What is ScienceCast?)

Demos

Demos

Replicate Toggle

Replicate (What is Replicate?)

Spaces Toggle

Hugging Face Spaces (What is Spaces?)

Spaces Toggle

TXYZ.AI (What is TXYZ.AI?)

Related Papers

Recommenders and Search Tools

Link to Influence Flower

Influence Flower (What are Influence Flowers?)

Connected Papers Toggle

Connected Papers (What is Connected Papers?)

Core recommender toggle

CORE Recommender (What is CORE?)

IArxiv recommender toggle

IArxiv Recommender

(What is IArxiv?)

Author

Venue

Institution

Topic

About arXivLabs

arXivLabs: experimental projects with community collaborators

arXivLabs is a framework that allows collaborators to develop and share new arXiv features directly on our website.

Both individuals and organizations that work with arXivLabs have embraced and accepted our values of openness, community, excellence, and user data privacy. arXiv is committed to these values and only works with partners that adhere to them.

Have an idea for a project that will add value for arXiv's community? Learn more about arXivLabs.

Which authors of this paper are endorsers? |

Disable MathJax (What is MathJax?)

About

Help

contact arXivClick here to contact arXiv

Contact

subscribe to arXiv mailingsClick here to subscribe

Subscribe

Copyright

Privacy Policy

Web Accessibility Assistance

arXiv Operational Status

Get status notifications via

email

or slack

YOLOv5改进系列(二) 更换激活函数SiLU,ReLU,ELU,Hardswish,Mish,Softplus,AconC等_hardswishme-CSDN博客

>

YOLOv5改进系列(二) 更换激活函数SiLU,ReLU,ELU,Hardswish,Mish,Softplus,AconC等_hardswishme-CSDN博客

YOLOv5改进系列(二) 更换激活函数SiLU,ReLU,ELU,Hardswish,Mish,Softplus,AconC等

VIP文章

小酒馆燃着灯

已于 2023-12-29 12:55:47 修改

阅读量1.9k

收藏

26

点赞数

17

分类专栏:

YOLOv5改进

深度学习

文章标签:

YOLO

深度学习

人工智能

pytorch

于 2023-12-14 19:09:31 首次发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_44302770/article/details/135002328

版权

文章目录

一、激活函数的简介

1.1 什么是激活函数?

1.2 激活函数有什么用?

二、一些常见的激活函数

2.1 sigmoid函数

2.2 tanh / 双曲正切激活函数

2.3 ReLU激活函数

2.4 SiLU

2.5 swish激活函数

2.6 hardswish激活函数

2.7 Mish激活函数

2.8 ELU激活函数

2.9 AconC/MetaAconC激活函数

2.10 Softplus激活函数

2.11 Leaky ReLU、 PReLU

2.12 代码复现

复现一

复现二

三、更换激活函数的步骤

第①步 打开activations.py文件,查看已有函数

第②步 在common.py中更换激活函数

四、如何选择合适的激活函数

一、激活函数的简介

1.1 什么是激活函数?

在接触到深度学习(Deep Learning)后,特别是神经网络中,我们会发现在每一层的神经网络输出后都会使用一个函数(比如sigmoid,tanh,Relu等等)对结果进行运算,这个函数就是激活函数(Activation Function)。那么为什么需要添加激活函数呢?如果不添加又会产生什么问题呢?

首先,我们知道神经网络模拟了人类神经元的工作机理,**激活函数(Activation Function)是一种添加到人工神经网络中的函数,旨在帮助网络学习数据中的复杂模式。**在神经元中,输入的input经过一系列加权求和后作用于另一个函数,这个函数就是这里的激活函数。**激活函数是一种特殊的非线性函数,它能够在神经网络中使用,其作用是将输入信号转化成输出信号。**类似于人类大脑中基于神经元的模型,它将神经元中的输入信号转换为一个有意义的输出,从而使得神经网络能够学习和识别复杂的模式。激活函数最终决定了是否传递信号以及要发射给下一个神经元的内容。在人工神经网络中,一个节点的激活函数定义了该节点在给定的输入或输入集合下的输出。

激活函数可以分为线性激活函数以及**非线性激活函数,常用的激活函数有 Sigmoid、ReLU、Leaky ReLU 和 ELU 等。

1.2 激活函数有什么用?

一句话总结:为了提高模型的表达能力。

激活函数能让中间输出多样化,从而能够处理更复杂的问题。如果不使用激活函数,那么每一层的输出都是上一层输入的线性函数,最后的输出也只是最开始输入数据的线性组合而已。而激活函数可以给神经元引入非线性因素,当加入到多层神经网络时,就可以让神经网络拟合任何线性函数或非线性函数,从而使得网络可以适合更多的非线性问题,而不仅仅是线性问题。

激活函数被定义为一个几乎处处可微的函数。

二、一些常见的激活函数

2.1 sigmoid函数

sigmoid 是使用范围最广的一类激活函数,具有指数函数形状,它在物理意义上最为接近生物神经元,是一个在生物学中常见的S型的函数,也称为S型生长曲线。此外,(0, 1) 的输出还可以被表示作概率,或用于输入的归一化,代表性的如Sigmoid交叉熵损失函数。

函数的表达式如下:

图像如下:

sigmoid优点:

(1) 值域在0和1之间

(2)函数具有非常好的对称性

(3)sigmoid的优点在于输出范围有限,所以数据在传递的过程中不容易发散。当然也有相应的缺点,就是饱和的时候梯度太小

(4)求导容易

sigmoid缺点:

(1)容易出现梯度消失

(2)函数输出并不是zero-centered(零均值)

(3)幂运算相对来讲比较耗时

2.2 tanh / 双曲正切激活函数

tanh激活函数又叫作双曲正切激活函数,在sigmoid基础上做出改进,与sigmoid相比,tanh输出均值为0,能够加快网络的收敛速度。然而,tanh同样存在梯度消失现象。

函数的表达式如下:

图像如下:

tanh优点:

(1)当输入较大或较小时,输出几乎是平滑的并且梯度较小,这不利于权重更新。tanh 的输出间隔为 1,并且整个函数以 0 为中心,比 sigmoid 函数更好

(2)在 tanh 图中,负输入将被强映射为负,而零输入被映射为接近零。

tanh缺点:

(1)仍然存在梯度饱和的问题

(2)依然进行的是指数运算

2.3 ReLU激活函数

ReLU函数又称为修正线性单元(Rectified Linear Unit),是一种分段线性函数,通常指代以斜坡函数及其变种为代表的非线性函数。其弥补了sigmoid函数以及tanh函数的梯度消失问题,在目前的深度神经网络中被广泛使用。

函数的表达式如下:

图像如下:

ReLU优点:

(1)当输入为正时,导数为1,一定程度上改善了梯度消失问题,加速梯度下降的收敛速度

(2)计算速度快得多。ReLU 函数中只存在线性关系,因此它的计算速度比 sigmoid 和 tanh 更快

(3)被认为具有生物学合理性(Biological Plausibility),比如单侧抑制、宽兴奋边界(即兴奋程度可以非常高)

ReLU缺点:

(1)当输入为负时,ReLU 完全失效,在正向传播过程中,这不是问题。有些区域很敏感,有些则不敏感。但是在反向传播过程中,如果输入负数,则梯度将完全为零

(2)不以零为中心:和 Sigmoid 激活函数类似,ReLU 函数的输出不以零为中心,ReLU 函数的输出为 0 或正数,给后一层的神经网络引入偏置偏移,会影响梯度下降的效率

2.4 SiLU

SiLU激活函数(又称Sigmoid-weighted Linear Unit)是一种新型的非线性激活函数,它是Sigmoid和ReLU的改进版。SiLU具备无上界有下界、平滑、非单调的特性。SiLU在深层模型上的效果优于 ReLU。可以看做是平滑的ReLU激活函数。SiLU激活函数的特征是它在低数值区域中表现较为平滑,而在高数值区域中表现起来十分“锐利”,从而能够有效地避免过度学习的问题。

函数的表达式如下:

图像如下:

SiLU优点:

(1)相对于ReLU函数,SiLU函数在接近零时具有更平滑的曲线,并且由于其使用了sigmoid函数,可以使网络的输出范围在0和1之间。

SiLU缺点:

(1)引入了指数函数,增加了计算量。

2.5 swish激活函数

swish 是一个平滑的、非单调的函数,在深度网络上始终匹配或优于 ReLU,适用于各种具有挑战性的领域,如图像分类和机器翻译。通过self-gating,它只需要一个标量输入,而在多选通场景中,它需要多个双标量输入。

函数的表达式如下:

图像如下:

swish优点:

(1)无上界(避免过拟合)

(2)有下界(产生更强的正则化效果)

(3)平滑(处处可导 更容易训练)

(4)x<0具有非单调性(对分布有重要意义 这点也是Swish和ReLU的最大区别)

2.6 hardswish激活函数

hardswish激活函数是对swish激活函数的改进,尽管swish非线性激活函数提高了检测精度,但不适合在嵌入式移动设备上使用,因为“S”型函数在嵌入式移动设备上的计算成本更高,求导较为复杂,在量化时计算较慢。但是如果在实验中使用hardswish非线性激活函数在准确性没差别的情况下部署在嵌入式移动设备上却会具有多重优势。

函数的表达式如下:

图像如下:

hardswish优点:

(1)hardswish相较于swish函数,具有数值稳定性好,计算速度快等优点

(2)消除了由于近似Sigmoid形的不同实现而导致的潜在数值精度损失

(3)在实践中,hardswish激活函数可以实现为分段功能,以减少内存访问次数,从而大大降低了等待时间成本

2.7 Mish激活函数

两种实现方式

代码实现:

import torch

import torch.nn as nn

import torch.nn.functional as F

import matplotlib.pyplot as plt

# 定义标准的Mish激活函数

class Mish(nn.Module):

@staticmethod

def forward(x):

return x * F.softplus(x).tanh()

# 定义内存高效的Mish激活函数

class MemoryEfficientMish(nn.Module):

class F(torch.autograd.Function):

@staticmethod

def forward(ctx, x):

ctx.save_for_backward(x)

return x.mul(torch.tanh(F.softplus(x)))

@staticmethod

def backward(ctx, grad_output):

x = ctx.saved_tensors[0]

sx = torch.sigmoid(x)

fx = F.softplus(x).tanh()

return grad_output * (fx + x * sx * (1 - fx * fx))

def forward(self, x):

return self.F.apply(x)

# 创建激活函数对象

mish = Mish()

me_mish = MemoryEfficientMish()

# 生成输入数据

x = torch.linspace(-5, 5, 100)

# 计算激活函数的输出

最低0.47元/天 解锁文章

优惠劵

小酒馆燃着灯

关注

关注

17

点赞

26

收藏

觉得还不错?

一键收藏

打赏

知道了

0

评论

YOLOv5改进系列(二) 更换激活函数SiLU,ReLU,ELU,Hardswish,Mish,Softplus,AconC等

1.1 什么是激活函数?在接触到深度学习(Deep Learning)后,特别是神经网络中,我们会发现在每一层的神经网络输出后都会使用一个函数(比如sigmoid,tanh,Relu等等)对结果进行运算,这个函数就是激活函数(Activation Function)。那么为什么需要添加激活函数呢?如果不添加又会产生什么问题呢?首先,我们知道神经网络模拟了人类神经元的工作机理,**激活函数(Activation Function)是一种添加到人工神经网络中的函数,旨在帮助网络学习数据中的复杂模式。**

复制链接

扫一扫

专栏目录

YOLOv5改进系列(13)——更换激活函数之SiLU,ReLU,ELU,Hardswish,Mish,Softplus,AconC系列等

路人贾的博客

07-04

2813

手把手教你学会YOLOv5改进系列之如何更换激活函数,内含SiLU,ReLU,ELU,Hardswish,Mish,Softplus,AconC系列等详细讲解及改进方法!

pytorch方法测试——激活函数(ReLU)详解

12-23

测试代码:

import torch

import torch.nn as nn

#inplace为True,将会改变输入的数据 ,否则不会改变原输入,只会产生新的输出

m = nn.ReLU(inplace=True)

input = torch.randn(7)

print("输入处理前图片:")

print(input)

output = m(input)

print("ReLU输出:")

print(output)

print("输出的尺度:")

print(output.size())

print("输入处理后图片:")

print(input)

输出为:

输入处理前图片:

t

参与评论

您还未登录,请先

登录

后发表或查看评论

YOLOv5算法改进(18)— 手把手教你去更换激活函数(SiLU/ReLU/ELU/Hardswish/Mish/Softplus)

突然好想你

09-18

915

在YOLOv5中,使用了不同的激活函数。本节课就简单介绍一下常见的激活函数并重点讲解如何去更换激活函数!

23种激活函数示例及可视化代码

03-18

1、pytorch激活函数示例及其可视化代码;

yolov5--4.0--模型压缩

い天然呆的博客

03-16

2425

yolov5的4.0版本也是更新了有一段时间了,具体更新内容如下;

nn.SiLU() activations replace nn.LeakyReLU(0.1) and nn.Hardswish() activations throughout the model, simplifying the architecture as we now only have one single activation function used everywhere rather than the two types

深度学习中的激活函数

Jad_Goh的博客

08-19

7912

深度学习中常用的激活函数优缺点分析:sigmoid、tanh、ReLU...

激活函数ReLU和SiLU的区别

热门推荐

weixin_44902604的博客

03-23

1万+

在这里,我就简单写一下两个激活函数的概念以及区别,详细的过程可以看看其他优秀的博主,他们写的已经非常好了,我就不必再啰嗦了

激活函数-SwiGLU

Elvira521yan的博客

12-18

1853

fxx∗σxfxx∗σxσx11e−xσx1e−x1​正数区域内,SiLU 函数的输出与 ReLU 函数的输出相同。在负数区域内,SiLU 函数的输出与 sigmoid 函数的输出相同。SiLU 函数在整个定义域内都是可微的,这使得在反向传播过程中的梯度计算更加稳定。SiLU函数不是单调递增的,而是在x≈−1.28时达到全局最小值−0.28,这可以起到一个隐式正则化的作用,抑制过大的权重。

【PyTorch】SiLU激活函数

算法与编程之美

08-26

6039

SiLU激活函数

YOLOV5详解

bobchen1017的博客

03-23

4607

首先YOLOV3/V4/V5都是根据训练的数据集来生成anchor, 就是在训练之前用一个独立的程序去计算Anchor, 但是还不够好因为自动生成的anchor是拿来整个数据集去做的,但是我们知道目标检测训练的时候是分batch训练的, YOLOV5这边把这个功能嵌入到训练的流程中, 也就是说YOLOV5每一个batch会生成一次anchor更加贴近我们的数据集。

ReLU激活函数杂谈

01-06

在实现多层感知机代码实现中使用了ReLU激活函数: ReLU(x)=max(x,0)ReLU(x)=max(x,0)ReLU(x)=max(x,0) 形状大概是这样的 这里根据几个问题来进行回答解释 为什么要使用激活函数呢? 简单来说激活函数的作用就是将...

Keras 中Leaky ReLU等高级激活函数的用法

09-16

主要介绍了Keras 中Leaky ReLU等高级激活函数的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

激活函数(ReLU、sigmoid、tanh)的简单理解

01-20

ReLU函数 ReLU(rectified linear unit)函数提供了⼀个很简单的⾮线性变换。给定元素 ,该函数定义为: 可以看出,ReLU函数只保留正数元素,并将负数元素清零。函数图像如下图: 显然,当输⼊为负数时,ReLU函数...

YOLOv9 最简训练教学!

深度学习炼丹师,偶尔分享炼丹技术!

02-29

807

YOLOv9 最简训练教学!

YOLOv8独家原创改进:特征融合涨点篇 | 广义高效层聚合网络(GELAN) | YOLOv9

最新发布

各专栏持续更新中,改进创新YOLO,适用v5、v7、v8,所有博客均是原创博客,所有文章禁止转载,违者必究。 By AI小怪兽 AI&CV

03-04

609

将GELAN添加在backbone和head处,提供多个yaml改进方法

YOLOv6、YOLOv7、YOLOv8网络结构图(清晰版)

YMilton的专栏

02-26

421

YOLO系列网络结构图

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的交通信号标志识别软件(Python+PySide6界面+训练代码)

思绪无限的博客

03-02

952

开发交通信号标志识别软件对提升道路安全和辅助自动驾驶技术至关重要。介绍了使用深度学习构建该软件的方法,并提供完整资源链接。软件采用YOLOv8算法,综合YOLOv7、YOLOv6、YOLOv5进行性能对比,涵盖mAP、F1 Score等分析。深入探讨YOLOv8原理,附上Python代码、训练数据集和基于PySide6的UI界面。能精确识别交通标志,支持图片、视频及摄像头输入,具备热力图、标记框、类别统计、可调Conf、IOU参数和结果可视化功能,含SQLite数据库的用户登录注册界面,便于模型切换。

YOLOv5白皮书-第Y4周:common.py文件解读

qq_45735298的博客

03-01

992

YOLOv5白皮书-第Y4周:common.py文件解读

yolov5激活函数

08-16

Yolov5 使用的激活函数是 GELU (Gaussian Error Linear Unit) 激活函数。GELU 激活函数是一种近似于 ReLU 的非线性激活函数,它在保持较好的数值稳定性的同时提供了更好的非线性表达能力。它的定义如下:

GELU(x) = 0.5 * x * (1 + tanh(sqrt(2/pi) * (x + 0.044715 * x^3)))

相比于传统的激活函数如 ReLU 或 sigmoid,GELU 激活函数在一些深度学习任务中表现更出色,对于 Yolov5 目标检测任务来说,GELU 激活函数在模型训练和推断中都能提供较好的性能。

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

小酒馆燃着灯

CSDN认证博客专家

CSDN认证企业博客

码龄5年

暂无认证

391

原创

2902

周排名

1806

总排名

28万+

访问

等级

1万+

积分

6174

粉丝

6275

获赞

90

评论

6216

收藏

私信

关注

热门文章

YOLOv5改进系列(二) 更换激活函数SiLU,ReLU,ELU,Hardswish,Mish,Softplus,AconC等

1939

YOLOv5改进系列(五) 更换Neck之BiFPN,AFPN,BiFusion

1463

第十二章 pytorch中使用tensorboard进行可视化(工具)

1388

第十七章 解读PyTorch断点训练(工具)

1178

第五章 目标检测中K-means聚类生成Anchor box以及Kmeans和Kmeans++(工具)

1164

分类专栏

YOLOv8及其改进

2篇

YOLOv5改进

27篇

BEVFusion与nuScenes

tensorRT从零起步高性能部署

车道线检测

30篇

车道线感知最新整理

Makefile

1篇

python

1篇

MMdetection

1篇

机器学习

118篇

深度学习

214篇

YOLOv5

52篇

目标检测

7篇

小知识点

24篇

工具

58篇

杂记

20篇

手写AI

47篇

C++

1篇

图像分类

7篇

yolo

2篇

最新评论

YOLOv5改进系列(三) 本文(7万字) | 更换主干backbone | MobileNetV3 | ShuffleNetV2 | EfficientNetv2 | GhostNet | 等 |

weixin_47688342:

请问博主文章里面更换的efficientnetv2的S版本么

YOLOv8及其改进系列(五) modules.py 文件划分子集 | 标签透明化与文字大小调节 | 框粗细调节

weixin_62401489:

您好,请问怎么修改使yolov8置信度标签显示两个小数点呢

YOLOv5改进系列(二十二) 更换骨干网络之GhostNetV2

qq_42073556:

博主你好,请问有yolov7结合ghostnetv2的修改方法吗?

YOLOv5改进系列(三) 更换backbone主干MobileNetV3,ShuffleNetV2,EfficientNetv2,GhostNet,SwinTransformer

xeonphi:

请问有yolov5 efficientnet源码吗?可以私信一下吗

第三章 OpenLane,TuSimple,CULane,CurveLanes与BDD100K数据集与标注(车道线感知)

Pepslc:

博主你好,对着openlane的标签文件看了你的解析,受益匪浅。有一个疑问,我的理解uv坐标是像素坐标,应该是整数,为什么标签文件里面是小数的?

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

python4行代码实现将多张图片合成gif动图(imageio)

解读相机标定

trtpy工具介绍与使用

2024

03月

3篇

02月

2篇

01月

42篇

2023年348篇

目录

目录

分类专栏

YOLOv8及其改进

2篇

YOLOv5改进

27篇

BEVFusion与nuScenes

tensorRT从零起步高性能部署

车道线检测

30篇

车道线感知最新整理

Makefile

1篇

python

1篇

MMdetection

1篇

机器学习

118篇

深度学习

214篇

YOLOv5

52篇

目标检测

7篇

小知识点

24篇

工具

58篇

杂记

20篇

手写AI

47篇

C++

1篇

图像分类

7篇

yolo

2篇

目录

评论

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

打赏作者

小酒馆燃着灯

你的鼓励将是我创作的最大动力

¥1

¥2

¥4

¥6

¥10

¥20

扫码支付:¥1

获取中

扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

SiLU Explained | Papers With Code

SiLU Explained | Papers With Code

Browse State-of-the-Art

Datasets

Methods

More

Newsletter

RC2022

About

Trends

Portals

Libraries

Sign In

Subscribe to the PwC Newsletter

×

Stay informed on the latest trending ML papers with code, research developments, libraries, methods, and datasets.

Read previous issues

Subscribe

Join the community

×

You need to log in to edit.

You can create a new account if you don't have one.

Or, discuss a change on Slack.

Edit Method

×

Method Name:*

Method Full Name:*

Description with Markdown (optional):

** Sigmoid Linear Units**, or **SiLUs**, are activation functions for

neural networks. The activation of the SiLU is computed by the sigmoid function multiplied by its input, or $$ x\sigma(x).$$

See [Gaussian Error Linear Units](https://arxiv.org/abs/1606.08415) ([GELUs](https://paperswithcode.com/method/gelu)) where the SiLU was originally coined, and see [Sigmoid-Weighted Linear Units for Neural Network Function Approximation in Reinforcement Learning](https://arxiv.org/abs/1702.03118) and [Swish: a Self-Gated Activation Function](https://arxiv.org/abs/1710.05941v1) where the SiLU was experimented with later.

Code Snippet URL (optional):

Image

Currently: methods/Screen_Shot_2020-05-27_at_4.17.41_PM.png

Clear

Change:

Submit

Add A Method Collection

×

Attached collections:

ACTIVATION FUNCTIONS

Add:

---------

Not in the list?

Create a new collection.

New collection name:

Top-level area:

---------

Audio

Computer Vision

General

Graphs

Natural Language Processing

Reinforcement Learning

Sequential

Parent collection (if any):

---------

Description (optional):

Submit

Remove a

collection

×

ACTIVATION FUNCTIONS

-

Add A Method Component

×

Add:*

---------

Tick if this dependency is optional

Submit

Remove a

method component

×

Activation Functions

Sigmoid Linear Unit

Introduced by Elfwing et al. in Sigmoid-Weighted Linear Units for Neural Network Function Approximation in Reinforcement Learning

 

Edit

Sigmoid Linear Units, or SiLUs, are activation functions for

neural networks. The activation of the SiLU is computed by the sigmoid function multiplied by its input, or $$ x\sigma(x).$$

See Gaussian Error Linear Units (GELUs) where the SiLU was originally coined, and see Sigmoid-Weighted Linear Units for Neural Network Function Approximation in Reinforcement Learning and Swish: a Self-Gated Activation Function where the SiLU was experimented with later.

Source: Sigmoid-Weighted Linear Units for Neural Network Function Approximation in Reinforcement Learning

Read Paper

See Code

Papers

Paper

Code

Results

Date

Stars

Tasks

Task

Papers

Share

Image Classification

6

30.00%

Activation Function Synthesis

2

10.00%

Learning Theory

2

10.00%

Instance Segmentation

2

10.00%

Object Detection

2

10.00%

Quantization

1

5.00%

Graph Attention

1

5.00%

Autonomous Driving

1

5.00%

Semantic Segmentation

1

5.00%

Usage Over Time

This feature is experimental;

we are continuously improving our matching algorithm.

Components

Component

Type

Edit

Add

Remove

No Components Found

You can add them if they exist; e.g. Mask R-CNN uses RoIAlign

Categories

Edit

Add

Remove

Activation Functions

Contact us on:

hello@paperswithcode.com

.

Papers With Code is a free resource with all data licensed under CC-BY-SA.

Terms

Data policy

Cookies policy

from