【深度学习】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

相关文章
|
3天前
|
机器学习/深度学习 算法
揭秘深度学习中的对抗性网络:理论与实践
【5月更文挑战第18天】 在深度学习领域的众多突破中,对抗性网络(GANs)以其独特的机制和强大的生成能力受到广泛关注。不同于传统的监督学习方法,GANs通过同时训练生成器与判别器两个模型,实现了无监督学习下的高效数据生成。本文将深入探讨对抗性网络的核心原理,解析其数学模型,并通过案例分析展示GANs在图像合成、风格迁移及增强学习等领域的应用。此外,我们还将讨论当前GANs面临的挑战以及未来的发展方向,为读者提供一个全面而深入的视角以理解这一颠覆性技术。
|
4天前
|
机器学习/深度学习 PyTorch TensorFlow
深度学习:Pytorch 与 Tensorflow 的主要区别(2)
深度学习:Pytorch 与 Tensorflow 的主要区别(2)
8 0
|
4天前
|
机器学习/深度学习 人工智能 算法
【AI】从零构建深度学习框架实践
【5月更文挑战第16天】 本文介绍了从零构建一个轻量级的深度学习框架tinynn,旨在帮助读者理解深度学习的基本组件和框架设计。构建过程包括设计框架架构、实现基本功能、模型定义、反向传播算法、训练和推理过程以及性能优化。文章详细阐述了网络层、张量、损失函数、优化器等组件的抽象和实现,并给出了一个基于MNIST数据集的分类示例,与TensorFlow进行了简单对比。tinynn的源代码可在GitHub上找到,目前支持多种层、损失函数和优化器,适用于学习和实验新算法。
59 2
|
6天前
|
机器学习/深度学习 人工智能 测试技术
深度学习中损失函数和激活函数的选择
深度学习中损失函数和激活函数的选择
10 0
|
6天前
|
机器学习/深度学习 PyTorch TensorFlow
Pytorch 与 Tensorflow:深度学习的主要区别(1)
Pytorch 与 Tensorflow:深度学习的主要区别(1)
19 2
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
深度理解深度学习:从理论到实践的探索
【5月更文挑战第3天】 在人工智能的浪潮中,深度学习以其卓越的性能和广泛的应用成为了研究的热点。本文将深入探讨深度学习的核心理论,解析其背后的数学原理,并通过实际案例分析如何将这些理论应用于解决现实世界的问题。我们将从神经网络的基础结构出发,逐步过渡到复杂的模型架构,同时讨论优化算法和正则化技巧。通过本文,读者将对深度学习有一个全面而深刻的认识,并能够在实践中更加得心应手地应用这些技术。
|
6天前
|
机器学习/深度学习 PyTorch API
pytorch与深度学习
【5月更文挑战第3天】PyTorch,Facebook开源的深度学习框架,以其动态计算图和灵活API深受青睐。本文深入浅出地介绍PyTorch基础,包括动态计算图、张量和自动微分,通过代码示例演示简单线性回归和卷积神经网络的实现。此外,探讨了模型架构、自定义层、数据加载及预处理等进阶概念,并分享了实战技巧、问题解决方案和学习资源,助力读者快速掌握PyTorch。
34 5
|
6天前
|
机器学习/深度学习 PyTorch 算法框架/工具
【Python机器学习专栏】PyTorch在深度学习中的应用
【4月更文挑战第30天】PyTorch是流行的开源深度学习框架,基于动态计算图,易于使用且灵活。它支持张量操作、自动求导、优化器和神经网络模块,适合快速实验和模型训练。PyTorch的优势在于易用性、灵活性、社区支持和高性能(利用GPU加速)。通过Python示例展示了如何构建和训练神经网络。作为一个强大且不断发展的工具,PyTorch适用于各种深度学习任务。
|
6天前
|
机器学习/深度学习 人工智能 缓存
安卓应用性能优化实践探索深度学习在图像识别中的应用进展
【4月更文挑战第30天】随着智能手机的普及,移动应用已成为用户日常生活的重要组成部分。对于安卓开发者而言,确保应用流畅、高效地运行在多样化的硬件上是一大挑战。本文将探讨针对安卓平台进行应用性能优化的策略和技巧,包括内存管理、多线程处理、UI渲染效率提升以及电池使用优化,旨在帮助开发者构建更加健壮、响应迅速的安卓应用。 【4月更文挑战第30天】 随着人工智能技术的迅猛发展,深度学习已成为推动计算机视觉领域革新的核心动力。本篇文章将深入分析深度学习技术在图像识别任务中的最新应用进展,并探讨其面临的挑战与未来发展趋势。通过梳理卷积神经网络(CNN)的优化策略、转移学习的实践应用以及增强学习与生成对
|
6天前
|
机器学习/深度学习 自然语言处理 算法
PyTorch与NLP:自然语言处理的深度学习实战
随着人工智能技术的快速发展,自然语言处理(NLP)作为其中的重要分支,日益受到人们的关注。PyTorch作为一款强大的深度学习框架,为NLP研究者提供了强大的工具。本文将介绍如何使用PyTorch进行自然语言处理的深度学习实践,包括基础概念、模型搭建、数据处理和实际应用等方面。