【深度学习】2、Pytorch自行实现常见的11个激活函数的Fashion Minist项目实践对比(你需要的这里都有了!)(二)

简介: 【深度学习】2、Pytorch自行实现常见的11个激活函数的Fashion Minist项目实践对比(你需要的这里都有了!)(二)

5、整流线性单元(ReLU)


  整流线性单元是我们解决梯度消失问题的方法,但这是否会导致其它问题呢?请往下看。ReLU 的公式如下:

f0a0d2c1302704a1ecbe373b8a866e8e.png

   ReLU 公式表明:如果输入 x 小于 0,则令输出等于 0;如果输入 x 大于 0,则令输出等于输入。


   尽管我们没法用大多数工具绘制其图形,但你可以这样用图解释 ReLU。x 值小于零的一切都映射为 0 的 y 值,但 x 值大于零的一切都映射为它本身。也就是说,如果我们输入 x=1,我们得到 y=1。

74b7235f4d9b7cc046458168ba0900ed.png

   这很好,但这与梯度消失问题有什么关系?首先,我们必须得到其微分方程:

502b696aec26dab8804f8c75b21989af.png

   其意思是:如果输入 x 大于 0,则输出等于 1;如果输入小于或等于 0,则输出变为 0。用下图表示:

   现在我们得到了答案:当使用 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自定义如下:

aaf34b80df38dc79db4020ea53028d65.png


6、死亡 ReLU:优势和缺点


   当我们将 ReLU 函数引入神经网络时,我们也引入了很大的稀疏性。那么稀疏性这个术语究竟是什么意思?


   稀疏:数量少,通常分散在很大的区域。在神经网络中,这意味着激活的矩阵含有许多 0。这种稀疏性能让我们得到什么?当某个比例(比如 50%)的激活饱和时,我们就称这个神经网络是稀疏的。这能提升时间和空间复杂度方面的效率——常数值(通常)所需空间更少,计算成本也更低。


   Yoshua Bengio 等人发现 ReLU 这种分量实际上能让神经网络表现更好,而且还有前面提到的时间和空间方面的效率。论文地址:https://www.utc.fr/~bordesan/dokuwiki/_media/en/glorot10nipsworkshop.pdf


torch.nn.ReLU(inplace=False)

torch.nn.ReLU6(inplace=False)


优点:相比于 sigmoid,由于稀疏性,时间和空间复杂度更低;不涉及成本更高的指数运算;能避免梯度消失问题。


缺点:引入了死亡 ReLU 问题,即网络的大部分分量都永远不会更新。但这有时候也是一个优势;ReLU 不能避免梯度爆炸问题。


7、Softplus函数


   Softplus函数是Logistic-Sigmoid函数原函数。

d994983d208bedfaec5b83c5adb1f218.png

加了1是为了保证非负性。Softplus可以看作是强制非负校正函数max(0,x)平滑版本。红色的即为ReLU。

c675d8d20ce857b50239ab4f9867b261.png

   softplus可以看作是ReLu的平滑。根据神经科学家的相关研究,softplus和ReLu与脑神经元激活频率函数有神似的地方。也就是说,相比于早期的激活函数,softplus和ReLu更加接近脑神经元的激活模型,而神经网络正是基于脑神经科学发展而来,这两个激活函数的应用促成了神经网络研究的新浪潮。


   Softplus自定义实现如下:

302f92dafcb32cee49ff5de44cbe1817.png


8、指数线性单元(ELU)


   指数线性单元激活函数解决了 ReLU 的一些问题,同时也保留了一些好的方面。这种激活函数要选取一个 α 值;常见的取值是在 0.1 到 0.3 之间。


如果你数学不好,ELU 的公式看起来会有些难以理解:

966ff26d4fd3e4fa12c06534d786d5d6.png

   如果你输入的 x值大于0,则结果与 ReLU 一样——即 y 值等于 x 值;但如果输入的 x 值小于 0,则我们会得到一个稍微小于 0 的值。


   所得到的 y 值取决于输入的 x 值,但还要兼顾参数 α——可以根据需要来调整这个参数。更进一步,我们引入了指数运算 e^x,因此 ELU 的计算成本比 ReLU 高。下面绘出了α值为 0.2 的 ELU 函数的图:

d383d9c1fae69eea89227cde4aa7e21f.png

   上图很直观,我们应该还能很好地应对梯度消失问题,因为输入值没有映射到非常小的输出值。


   但 ELU 的导数又如何呢?这同样也很重要。

ebbae8105bead58c866d494bddbccc0b.png

   看起来很简单。如果输入 x 大于 0,则 y 值输出为 1;如果输入 x 小于或等于 0,则输出是 ELU 函数(未微分)加上 α 值。可绘出图为:

b6da4d9b4b16544aa0e77f556c7b9cea.png

   你可能已经注意到,这里成功避开了死亡 ReLU 问题,同时仍保有 ReLU 激活函数的一些计算速度增益——也就是说,网络中仍还有一些死亡的分量。


torch.nn.ELU(alpha=1.0,inplace=False)

ELU自定义实现如下:

5033a0fd0c665c626bbc75da312bfafb.png

优点:能避免死亡 ReLU 问题;能得到负值输出,这能帮助网络向正确的方向推动权重和偏置变化;在计算梯度时能得到激活,而不是让它们等于 0。


缺点:由于包含指数运算,所以计算时间更长;无法避免梯度爆炸问题;神经网络不学习α值。


9、渗漏型整流线性单元激活函数(Leaky ReLU)


   渗漏型整流线性单元激活函数也有一个α值,通常取值在 0.1 到 0.3 之间。Leaky ReLU 激活函数很常用,但相比于 ELU 它也有一些缺陷,但也比 ReLU 具有一些优势。

   Leaky ReLU 的数学形式如下:

   因此,如果输入x大于 0,则输出为x;如果输入x小于或等于 0,则输出为 α 乘以输入。


   这意味着能够解决死亡 ReLU 问题,因为梯度的值不再被限定为 0——另外,这个函数也能避免梯度消失问题。尽管梯度爆炸的问题依然存在,但后面的代码部分会介绍如何解决。下面给出了 Leaky ReLU 的图示,其中假设 α 值为 0.2:

   和在公式中看到的一样,如果 x 值大于 0,则任意 x 值都映射为同样的 y 值;但如果 x 值小于 0,则会多一个系数 0.2。也就是说,如果输入值 x为 -5,则映射的输出值为 -1。


   因为 Leaky ReLU 函数是两个线性部分组合起来的,所以它的导数很简单:

1afe9ba69b06f4329477c9f7be2dd6a9.png

第一部分线性是当 x 大于 0 时,输出为 1;而当输入小于 0 时,输出就为 α 值,这里我们选择的是 0.2。

0d7b05a75727f7055042ff84fe2a9de9.png

   从上图中也能明显地看出来,输入 x 大于或小于 0,微分的 Leaky ReLU 各为一个常量。


torch.nn.LeakyReLU(negative_slope=0.01,inplace=False)

自定义实现:

84fa420c10d9e41d34392f83e1ad1b94.png

优点:类似 ELU,Leaky ReLU 也能避免死亡 ReLU 问题,因为其在计算导数时允许较小的梯度;由于不包含指数运算,所以计算速度比 ELU 快。


缺点:无法避免梯度爆炸问题;神经网络不学习 α 值;在微分时,两部分都是线性的;而 ELU 的一部分是线性的,一部分是非线性的。


10、扩展型指数线性单元激活函数(SELU)


   扩展型指数线性单元激活函数比较新,介绍它的论文包含长达90页的附录(包括定理和证明等)。当实际应用这个激活函数时,必须使用 lecun_normal 进行权重初始化。如果希望应用 dropout,则应当使用 AlphaDropout。后面的代码部分会更详细地介绍。

   论文作者已经计算出了公式的两个值:α 和 λ;如下所示:

dec159d6575cb2c2f5ad9d1a0dc7e472.png

   可以看到,它们的小数点后还有很多位,这是为了绝对精度。而且它们是预先确定的,也就是说我们不必担心如何为这个激活函数选取合适的 α 值。

   说实话,这个公式看起来和其它公式或多或少有些类似。所有新的激活函数看起来就像是其它已有的激活函数的组合。


   SELU 的公式如下:

1023d88443122132b2eecbb3c0d6e2b2.png

   也就是说,如果输入值 x 大于 0,则输出值为 x 乘以 λ;如果输入值 x 小于 0,则会得到一个奇异函数——它随 x 增大而增大并趋近于 x 为 0 时的值 0.0848。本质上看,当 x 小于 0 时,先用 α 乘以 x 值的指数,再减去 α,然后乘以 λ 值。

e2d7d9cf8eca00f56b73489291bfca2f.png

自定义实现SELU激活函数:

29d8538f211789eff4f014d15163e970.png

相关文章
|
6月前
|
机器学习/深度学习 PyTorch API
PyTorch量化感知训练技术:模型压缩与高精度边缘部署实践
本文深入探讨神经网络模型量化技术,重点讲解训练后量化(PTQ)与量化感知训练(QAT)两种主流方法。PTQ通过校准数据集确定量化参数,快速实现模型压缩,但精度损失较大;QAT在训练中引入伪量化操作,使模型适应低精度环境,显著提升量化后性能。文章结合PyTorch实现细节,介绍Eager模式、FX图模式及PyTorch 2导出量化等工具,并分享大语言模型Int4/Int8混合精度实践。最后总结量化最佳策略,包括逐通道量化、混合精度设置及目标硬件适配,助力高效部署深度学习模型。
991 21
PyTorch量化感知训练技术:模型压缩与高精度边缘部署实践
|
4月前
|
机器学习/深度学习 存储 监控
基于深度学习YOLO框架的城市道路损伤检测与评估项目系统【附完整源码+数据集】
本项目基于深度学习的YOLO框架,成功实现了城市道路损伤的自动检测与评估。通过YOLOv8模型,我们能够高效地识别和分类路面裂缝、井盖移位、坑洼路面等常见的道路损伤类型。系统的核心优势在于其高效性和实时性,能够实时监控城市道路,自动标注损伤类型,并生成损伤评估报告。
259 0
基于深度学习YOLO框架的城市道路损伤检测与评估项目系统【附完整源码+数据集】
|
4月前
|
机器学习/深度学习 自动驾驶 算法
基于深度学习的YOLO框架的7种交通场景识别项目系统【附完整源码+数据集】
在智慧交通和智能驾驶日益普及的今天,准确识别复杂交通场景中的关键元素已成为自动驾驶系统的核心能力之一。传统的图像处理技术难以适应高动态、复杂天气、多目标密集的交通环境,而基于深度学习的目标检测算法,尤其是YOLO(You Only Look Once)系列,因其检测速度快、精度高、可部署性强等特点,在交通场景识别中占据了重要地位。
542 0
基于深度学习的YOLO框架的7种交通场景识别项目系统【附完整源码+数据集】
|
9月前
|
机器学习/深度学习 数据采集 自然语言处理
深度学习实践技巧:提升模型性能的详尽指南
深度学习模型在图像分类、自然语言处理、时间序列分析等多个领域都表现出了卓越的性能,但在实际应用中,为了使模型达到最佳效果,常规的标准流程往往不足。本文提供了多种深度学习实践技巧,包括数据预处理、模型设计优化、训练策略和评价与调参等方面的详细操作和代码示例,希望能够为应用实战提供有效的指导和支持。
|
11月前
|
机器学习/深度学习 传感器 数据采集
深度学习在故障检测中的应用:从理论到实践
深度学习在故障检测中的应用:从理论到实践
953 6
|
9月前
|
机器学习/深度学习 人工智能 自然语言处理
ModelScope深度学习项目低代码开发
低代码开发平台通过丰富的预训练模型库、高度灵活的预训练模型和强大的微调训练功能,简化深度学习项目开发。以阿里魔搭为例,提供大量预训练模型,支持快速迭代与实时反馈,减少从头训练的时间和资源消耗。开发者可轻松调整模型参数,适应特定任务和数据集,提升模型性能。ModelScope平台进一步增强这些功能,提供模型搜索、体验、管理与部署、丰富的模型和数据资源、多模态任务推理及社区协作,助力高效、环保的AI开发。
499 65
|
10月前
|
机器学习/深度学习 数据可视化 PyTorch
PyTorch FlexAttention技术实践:基于BlockMask实现因果注意力与变长序列处理
本文介绍了如何使用PyTorch 2.5及以上版本中的FlexAttention和BlockMask功能,实现因果注意力机制与填充输入的处理。通过attention-gym仓库安装相关工具,并详细展示了MultiheadFlexAttention类的实现,包括前向传播函数、因果掩码和填充掩码的生成方法。实验设置部分演示了如何组合这两种掩码并应用于多头注意力模块,最终通过可视化工具验证了实现的正确性。该方法适用于处理变长序列和屏蔽未来信息的任务。
387 17
|
11月前
|
机器学习/深度学习 人工智能 自然语言处理
揭秘人工智能:深度学习的奥秘与实践
在本文中,我们将深入浅出地探索深度学习的神秘面纱。从基础概念到实际应用,你将获得一份简明扼要的指南,助你理解并运用这一前沿技术。我们避开复杂的数学公式和冗长的论述,以直观的方式呈现深度学习的核心原理和应用实例。无论你是技术新手还是有经验的开发者,这篇文章都将为你打开一扇通往人工智能新世界的大门。
|
11月前
|
机器学习/深度学习 算法 TensorFlow
深度学习中的自编码器:从理论到实践
在这篇文章中,我们将深入探讨深度学习的一个重要分支——自编码器。自编码器是一种无监督学习算法,它可以学习数据的有效表示。我们将首先介绍自编码器的基本概念和工作原理,然后通过一个简单的Python代码示例来展示如何实现一个基本的自编码器。最后,我们将讨论自编码器的一些变体,如稀疏自编码器和降噪自编码器,以及它们在实际应用中的优势。
|
11月前
|
机器学习/深度学习 存储 人工智能
探索深度学习的奥秘:从理论到实践的技术感悟
本文深入探讨了深度学习技术的核心原理、发展历程以及在实际应用中的体验与挑战。不同于常规摘要,本文旨在通过作者个人的技术实践经历,为读者揭示深度学习领域的复杂性与魅力,同时提供一些实用的技术见解和解决策略。
218 0

热门文章

最新文章

推荐镜像

更多