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

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

11、SELU的特例


   SELU激活能够对神经网络进行自归一化(self-normalizing)。这是什么意思?


   首先,我们先看看什么是归一化(normalization)。简单来说,归一化首先是减去均值,然后除以标准差。因此,经过归一化之后,网络的组件(权重、偏置和激活)的均值为 0,标准差为 1。而这正是 SELU 激活函数的输出值。


   均值为 0 且标准差为 1 又如何呢?在初始化函数为 lecun_normal 的假设下,网络参数会被初始化一个正态分布(或高斯分布),然后在 SELU 的情况下,网络会在论文中描述的范围内完全地归一化。本质上看,当乘或加这样的网络分量时,网络仍被视为符合高斯分布。我们就称之为归一化。反过来,这又意味着整个网络及其最后一层的输出也是归一化的。


   均值 μ 为 0 且标准差 σ 为 1 的正态分布看起来是怎样的?

e7ac71e035aa60035d78157d6386bc56.png

   SELU 的输出是归一化的,这可称为内部归一化(internal normalization),因此事实上其所有输出都是均值为 0 且标准差为 1。这不同于外部归一化(external normalization)——会用到批归一化或其它方法。


   很好,也就是说所有分量都会被归一化。但这是如何做到的?


   简单解释一下,当输入小于 0 时,方差减小;当输入大于 0 时,方差增大——而标准差是方差的平方根,这样我们就使得标准差为 1。


   我们通过梯度得到零均值。我们需要一些正值和负值才能让均值为 0。我的上一篇文章介绍过,梯度可以调整神经网络的权重和偏置,因此我们需要这些梯度输出一些负值和正值,这样才能控制住均值。


   均值 μ 和方差 ν 的主要作用是使我们有某个域 Ω,让我们总是能将均值和方差映射到预定义的区间内。这些区间定义如下:

a7d16bc727afff19e4e55e21f547a52b.png

   ∈ 符号表示均值和方差在这些预定义的区间之内。反过来,这又能避免网络出现梯度消失和爆炸问题。


   下面引述一段论文的解释,说明了他们得到这个激活函数的方式,我认为这很重要:SELU 允许构建一个映射 g,其性质能够实现 SNN(自归一化神经网络)。SNN 不能通过(扩展型)修正线性单元(ReLU)、sigmoid 单元、tanh 单元和 Leaky ReLU 实现。这个激活函数需要有:

(1)负值和正值,以便控制均值;

(2)饱和区域(导数趋近于零),以便抑制更低层中较大的方差;

   (3)大于 1 的斜率,以便在更低层中的方差过小时增大方差;

(4)连续曲线。


   后者能确保一个固定点,其中方差抑制可通过方差增大来获得均衡。我们能通过乘上指数线性单元(ELU)来满足激活函数的这些性质,而且 λ>1 能够确保正值净输入的斜率大于 1。

我们再看看 SELU 的微分函数:

c52583103536ed6aaa984bc8c210566d.png

   很好,不太复杂,我们可以简单地解释一下。如果 x 大于 0,则输出值为 λ;如果 x 小于 0,则输出为 α 乘以 x 的指数再乘 λ。

   其图形如下所示,看起来很特别:

   注意 SELU 函数也需要 lecun_normal 进行权重初始化;而且如果你想使用 dropout,你也必须使用名为 Alpha Dropout 的特殊版本。


自定义实现:


优点:内部归一化的速度比外部归一化快,这意味着网络能更快收敛;不可能出现梯度消失或爆炸问题,见 SELU 论文附录的定理 2 和 3。


缺点:这个激活函数相对较新——需要更多论文比较性地探索其在 CNN 和 RNN 等架构中应用。这里有一篇使用SELU 的CNN 论文:https://arxiv.org/pdf/1905.01338.pdf


12、GELU


   高斯误差线性单元激活函数在最近的 Transformer 模型(谷歌的 BERT 和 OpenAI 的 GPT-2)中得到了应用。GELU 的论文来自 2016 年,但直到最近才引起关注。


   这种激活函数的形式为:

   看得出来,这就是某些函数(比如双曲正切函数 tanh)与近似数值的组合。没什么过多可说的。有意思的是这个函数的图形:

   可以看出,当 x 大于 0 时,输出为 x;但 x=0 到 x=1 的区间除外,这时曲线更偏向于 y 轴。


   我没能找到该函数的导数,所以我使用了 WolframAlpha 来微分这个函数。结果如下:

   和前面一样,这也是双曲函数的另一种组合形式。但它的图形看起来很有意思:

自定义实现:

优点:似乎是 NLP 领域的当前最佳;尤其在 Transformer 模型中表现最好;能避免梯度消失问题。


缺点:尽管是 2016 年提出的,但在实际应用中还是一个相当新颖的激活函数。


13、MaxOut激活函数


   Maxout是对ReLU和leaky ReLU的一般化归纳,函数公式是:

   Maxout非线性函数图像如下图所示。Maxout具有ReLU的优点,如计算简单,不会 saturation,同时又没有ReLU的一些缺点,如容易go die。

   存在问题:每个神经元的参数double,这就导致整体参数的数量激增。


14、Swish激活函数


   Swish 的设计受到 LSTM 和 highway network 中使用 sigmoid 函数进行门控的启发。我们使用同样的值进行门控来简化门控机制,称为自门控(self-gating)。自门控的优势是它仅需要一个简单的标量输入,而正常的门控需要多个标量输入。该特性令使用自门控的激活函数如 Swish 能够轻松替换以单个标量作为输入的激活函数(如 ReLU),无需改变参数的隐藏容量或数量。


   Swish 是一种新型激活函数,公式为:

Swish (f(x) = x · sigmoid(x))具备无上界有下界、平滑、非单调的特性。Swish激活函数图像:

Swish激活函数的导数图像:

精度比较:在正确率方面,我发现 Swish 激活函数的性能比 ReLU 激活函数好一点。

Swish自定义实现:


15、梯度消失/爆炸原因及解决办法


原因,浅层的梯度计算需要后面各层的权重及激活函数导数的乘积,因此可能出现前层比后层的学习率小(vanishing gradient)或大(exploding)的问题,所以具有不稳定性.那么如何解决呢?


需要考虑几个方面:

1.权重初始化

2.使用合适的方式初始化权重, 如ReLU使用MSRA的初始化方式, tanh使用xavier初始化方式.

3.激活函数选择

4.激活函数要选择ReLU等梯度累乘稳定的.

5.学习率


一种训练优化方式是对输入做白化操作(包括正规化和去相关), 目的是可以选择更大的学习率. 现代深度学习网络中常使用Batch Normalization(包括正规化步骤,但不含去相关). (All you need is a good init. If you can't find the good init, use Batch Normalization.)


   由于梯度的公式包含每层激励的导数以及权重的乘积,因此让中间层的乘积约等于1即可.但是sigmoid这种函数的导数值又与权重有关系(最大值1/4,两边对称下降),所以含有sigmoid的神经网络不容易解决,输出层的activation大部分饱和,因此不建议使用sigmoid.


   ReLU在自变量大于0时导数为1,小于0时导数为0,因此可以解决上述问题.


   梯度爆炸:由于sigmoid,ReLU等函数的梯度都在[0,1]以内,所以不会引发梯度爆炸问题。而梯度爆炸需要采用梯度裁剪、BN、设置较小学习率等方式解决。


16、激活函数选择


 1.首先尝试ReLU,速度快,但要注意训练的状态.

   2.如果ReLU效果欠佳,尝试Leaky ReLU或Maxout等变种。

   3.尝试tanh正切函数(以零点为中心,零点处梯度为1)

   4.sigmoid/tanh在RNN(LSTM、注意力机制等)结构中有所应用,作为门控或者概率值.

   5.在浅层神经网络中,如不超过4层的,可选择使用多种激励函数,没有太大的影响。

   6. Sigmoid函数以及它们的联合通常在分类器的中有更好的效果

   7. 由于梯度崩塌的问题,在某些时候需要避免使用Sigmoid和Tanh激活函数

   8. ReLU函数是一种常见的激活函数,在目前使用是最多的 

   9. 如果遇到了一些死的神经元,我们可以使用Leaky ReLU函数

   10. ReLU永远只在隐藏层中使用

   11. 根据经验,一般可以从ReLU激活函数开始,但是如果ReLU不能很好的解决问题,再去尝试其他的激活函数

   12. 如果使用 ReLU,要小心设置 learning rate,不要让网络出现很多 “dead” 神经元,如果不好解决,可以试试 Leaky ReLU、PReLU 或者 Maxout。


基于Fashion Minist数据集的实践对比


1、Fashion-MNIST数据集介绍

   Fashion-MNIST是一个替代MNIST手写数字集的图像数据集。它是由Zalando(一家德国的时尚科技公司)旗下的研究部门提供。其涵盖了来自10种类别的共7万个不同商品的正面图片。Fashion-MNIST的大小、格式和训练集/测试集划分与原始的MNIST完全一致。60000/10000的训练测试数据划分,28x28的灰度图片。你可以直接用它来测试你的机器学习和深度学习算法性能,且不需要改动任何的代码。


这个数据集的样子大致如下(每个类别占三行):



取代MNIST数据集的原因由如下几个:


   1、MNIST太简单了。很多深度学习算法在测试集上的准确率已经达到99.6%!不妨看看我们基于scikit-learn上对经典机器学习算法的评测 和这段代码:"Most pairs of MNIST digits can be distinguished pretty well by just one pixel"


   2、MNIST被用烂了。参考:"Ian Goodfellow wants people to move away from mnist"


   3、MNIST数字识别的任务不代表现代机器学习。参考:"François Cholle: Ideas on MNIST do not transfer to real CV"


获取数据集:

git clone git@github.com:zalandoresearch/fashion-mnist.git


每个训练和测试样本都按照以下类别进行了标注:

2、项目代码

基于不同激活函数的对比执行结果:

目录
打赏
0
0
0
0
34
分享
相关文章
深度学习实践技巧:提升模型性能的详尽指南
深度学习模型在图像分类、自然语言处理、时间序列分析等多个领域都表现出了卓越的性能,但在实际应用中,为了使模型达到最佳效果,常规的标准流程往往不足。本文提供了多种深度学习实践技巧,包括数据预处理、模型设计优化、训练策略和评价与调参等方面的详细操作和代码示例,希望能够为应用实战提供有效的指导和支持。
PyTorch生态系统中的连续深度学习:使用Torchdyn实现连续时间神经网络
神经常微分方程(Neural ODEs)是深度学习领域的创新模型,将神经网络的离散变换扩展为连续时间动力系统。本文基于Torchdyn库介绍Neural ODE的实现与训练方法,涵盖数据集构建、模型构建、基于PyTorch Lightning的训练及实验结果可视化等内容。Torchdyn支持多种数值求解算法和高级特性,适用于生成模型、时间序列分析等领域。
226 77
PyTorch生态系统中的连续深度学习:使用Torchdyn实现连续时间神经网络
深度学习在故障检测中的应用:从理论到实践
深度学习在故障检测中的应用:从理论到实践
331 6
ModelScope深度学习项目低代码开发
低代码开发平台通过丰富的预训练模型库、高度灵活的预训练模型和强大的微调训练功能,简化深度学习项目开发。以阿里魔搭为例,提供大量预训练模型,支持快速迭代与实时反馈,减少从头训练的时间和资源消耗。开发者可轻松调整模型参数,适应特定任务和数据集,提升模型性能。ModelScope平台进一步增强这些功能,提供模型搜索、体验、管理与部署、丰富的模型和数据资源、多模态任务推理及社区协作,助力高效、环保的AI开发。
260 65
PyTorch PINN实战:用深度学习求解微分方程
物理信息神经网络(PINN)是一种将深度学习与物理定律结合的创新方法,特别适用于微分方程求解。传统神经网络依赖大规模标记数据,而PINN通过将微分方程约束嵌入损失函数,显著提高数据效率。它能在流体动力学、量子力学等领域实现高效建模,弥补了传统数值方法在高维复杂问题上的不足。尽管计算成本较高且对超参数敏感,PINN仍展现出强大的泛化能力和鲁棒性,为科学计算提供了新路径。文章详细介绍了PINN的工作原理、技术优势及局限性,并通过Python代码演示了其在微分方程求解中的应用,验证了其与解析解的高度一致性。
115 5
PyTorch PINN实战:用深度学习求解微分方程
深度学习工具和框架详细指南:PyTorch、TensorFlow、Keras
在深度学习的世界中,PyTorch、TensorFlow和Keras是最受欢迎的工具和框架,它们为研究者和开发者提供了强大且易于使用的接口。在本文中,我们将深入探索这三个框架,涵盖如何用它们实现经典深度学习模型,并通过代码实例详细讲解这些工具的使用方法。
探索深度学习的奥秘:从理论到实践的技术感悟
本文深入探讨了深度学习技术的核心原理、发展历程以及在实际应用中的体验与挑战。不同于常规摘要,本文旨在通过作者个人的技术实践经历,为读者揭示深度学习领域的复杂性与魅力,同时提供一些实用的技术见解和解决策略。
86 0
9个主流GAN损失函数的数学原理和Pytorch代码实现:从经典模型到现代变体
生成对抗网络(GAN)的训练效果高度依赖于损失函数的选择。本文介绍了经典GAN损失函数理论,并用PyTorch实现多种变体,包括原始GAN、LS-GAN、WGAN及WGAN-GP等。通过分析其原理与优劣,如LS-GAN提升训练稳定性、WGAN-GP改善图像质量,展示了不同场景下损失函数的设计思路。代码实现覆盖生成器与判别器的核心逻辑,为实际应用提供了重要参考。未来可探索组合优化与自适应设计以提升性能。
101 7
9个主流GAN损失函数的数学原理和Pytorch代码实现:从经典模型到现代变体
从零开始用Pytorch实现LLaMA 4的混合专家(MoE)模型
近期发布的LLaMA 4模型引入混合专家(MoE)架构,以提升效率与性能。尽管社区对其实际表现存在讨论,但MoE作为重要设计范式再次受到关注。本文通过Pytorch从零实现简化版LLaMA 4 MoE模型,涵盖数据准备、分词、模型构建(含词元嵌入、RoPE、RMSNorm、多头注意力及MoE层)到训练与文本生成全流程。关键点包括MoE层实现(路由器、专家与共享专家)、RoPE处理位置信息及RMSNorm归一化。虽规模小于实际LLaMA 4,但清晰展示MoE核心机制:动态路由与稀疏激活专家,在控制计算成本的同时提升性能。完整代码见链接,基于FareedKhan-dev的Github代码修改而成。
42 9
从零开始用Pytorch实现LLaMA 4的混合专家(MoE)模型
比扩散策略更高效的生成模型:流匹配的理论基础与Pytorch代码实现
扩散模型和流匹配是生成高分辨率数据(如图像和机器人轨迹)的先进技术。扩散模型通过逐步去噪生成数据,其代表应用Stable Diffusion已扩展至机器人学领域形成“扩散策略”。流匹配作为更通用的方法,通过学习时间依赖的速度场将噪声转化为目标分布,适用于图像生成和机器人轨迹生成,且通常以较少资源实现更快生成。 本文深入解析流匹配在图像生成中的应用,核心思想是将图像视为随机变量的实现,并通过速度场将源分布转换为目标分布。文中提供了一维模型训练实例,展示了如何用神经网络学习速度场,以及使用最大均值差异(MMD)改进训练效果。与扩散模型相比,流匹配结构简单,资源需求低,适合多模态分布生成。
65 13
比扩散策略更高效的生成模型:流匹配的理论基础与Pytorch代码实现