橘智橘智
FakeOrange
预计阅读时间:6分钟7秒

如何为神经网络选择合适的激活函数

分析各种激活函数及其可视化表示 —— 摘自《神经网络与深度学习课程:第5部分》

0
0


前言



本文属于搬运内容,原作者:Rukshan Pramoditha 致敬~!


了解各种激活函数的特性有助于构建属于自己的网络架构哦,或者做适时的调整!



简介



在之前的文章中,我们讨论了激活函数在神经网络模型中的主要用途。


激活函数在每个隐藏层节点和输出层中,作用于输入的加权和(通常表示为 z),输入可以是原始数据或前一层的输出。


今天,我们将详细探讨神经网络中使用的以下几种常见激活函数:


通过可视化图示,您将更容易理解这些激活函数的定义及其不同的使用场景。


data/78df2c1f-e442-415d-a382-fa7925af0c4b/af74c5b2-0742-410f-87c3-8add7b810931image.png



神经网络中不同层的激活函数



一个典型的神经网络通常由三种层组成:输入层、隐藏层和输出层。


1. 输入层


输入层仅用来保存输入数据,并不进行任何计算,因此不需要激活函数。


2. 隐藏层


在神经网络的隐藏层中必须使用非线性激活函数。这是因为:


  • 非线性激活函数能够为网络引入非线性,从而使其能够学习复杂模式。


  • 如果没有非线性激活函数,即使神经网络有多个隐藏层,也只会退化为一个巨大的线性回归模型,这对于学习真实世界数据中的复杂关系毫无意义。


隐藏层中激活函数的选择会显著影响神经网络模型的性能。


3. 输出层


在神经网络的输出层中,我们也需要使用激活函数。


  • 输出层的激活函数选择取决于要解决的问题类型。


  • 不同问题(如回归、分类、多分类)需要使用不同的激活函数,以确保模型输出符合预期的范围或格式。


接下来的内容将详细分析每种激活函数的定义、特性以及适用场景。继续阅读,深入了解如何选择适合您神经网络的激活函数!



线性与非线性函数



大多数激活函数是非线性的。然而,在神经网络中,我们也使用线性激活函数。例如,在解决回归问题的神经网络模型的输出层中,我们使用线性激活函数。有些激活函数由两个或三个线性组成部分构成,这些函数也被归类为非线性函数。


区分线性函数和非线性函数非常有用。线性函数(称为 f)接受输入 z,并返回输出 cz,即输入与常数 ccc 的乘积。数学上可以表示为:f(z)=cz


当 c=1 时,函数返回输入值本身,不对输入进行任何更改。线性函数的图像是一条直线。


任何不是线性的函数都可以归类为非线性函数。非线性函数的图像不是一条直线,它可以是复杂的模式,或者是两个或多个线性组件的组合。



不同类型的激活函数



我们将讨论神经网络中常用的激活函数。



1. Sigmoid 激活函数




data/78df2c1f-e442-415d-a382-fa7925af0c4b/8a9d46b8-f201-4bdf-8780-f4356f8d4e78image.png


关键特性:


  • 也称为逻辑函数,常用于逻辑回归模型。


  • Sigmoid 函数的图形呈 S 形。


  • 显然,这是一个非线性函数。


  • Sigmoid 函数将输入转换为介于 0 和 1 之间的概率值。


  • 它将较大的负值压缩到接近 0,将较大的正值压缩到接近 1。


  • 输入为 0 时,返回 0.5。该值 0.5 被称为阈值,用于判断给定输入属于哪个类别。


使用场景:


  • 在早期,Sigmoid 函数被用作 MLP(多层感知器)、CNN(卷积神经网络)和 RNN(递归神经网络)中隐藏层的激活函数。


  • 然而,Sigmoid 函数现在仍然在 RNN 中使用。


  • 目前,我们通常不再在 MLP 和 CNN 的隐藏层中使用 Sigmoid 函数,而是使用 ReLU 或 Leaky ReLU。


  • 当我们构建一个二分类器时,Sigmoid 函数必须用于输出层,其中输出根据函数返回的概率值解释为类别标签。


二分类中的 Sigmoid 函数:


data/78df2c1f-e442-415d-a382-fa7925af0c4b/eeeb9946-08f8-4234-9208-fa8ab76bba22image.png


  • Sigmoid 函数也用于构建多标签分类模型,在该模型中,每个互斥类有两个结果。请不要将其与多类分类模型混淆。


多标签分类中的 Sigmoid 函数:


data/78df2c1f-e442-415d-a382-fa7925af0c4b/7c32f18c-1d28-4afe-bb58-99e0fc5ebe66image.png


缺点:


由于以下缺点,我们通常不在隐藏层中使用 Sigmoid 函数:


  • Sigmoid 函数存在梯度消失问题,也称为梯度饱和问题。


  • Sigmoid 函数收敛速度较慢。


  • 它的输出不是零中心的,因此使得优化过程更加困难。


  • 由于包含 e^z 项,因此该函数计算开销较大。



2. Tanh 激活函数



data/78df2c1f-e442-415d-a382-fa7925af0c4b/691a8517-bc77-4fc3-bcaa-0a1f8c2832eeimage.png


关键特性:


  • Tanh(双曲正切)函数的输出始终在 -1 和 +1 之间。


  • 与 Sigmoid 函数类似,Tanh 函数也呈 S 形图像。它也是一个非线性函数。


  • 使用 Tanh 函数相对于 Sigmoid 函数的一个优势是,Tanh 函数是零中心的,这使得优化过程更加容易。


  • Tanh 函数的梯度比 Sigmoid 函数更陡峭。


使用场景:


  • 直到最近,Tanh 函数曾被用作 MLP(多层感知器)、CNN(卷积神经网络)和 RNN(递归神经网络)隐藏层的激活函数。


  • 然而,Tanh 函数仍在 RNN 中使用。


  • 当前,我们通常不再在 MLP 和 CNN 的隐藏层中使用 Tanh 函数,而是使用 ReLU 或 Leaky ReLU。


  • 我们从不在输出层中使用 Tanh 函数。


缺点:


由于以下缺点,我们通常不在隐藏层中使用 Tanh 函数:


  • Tanh 函数存在梯度消失问题。


  • 由于包含 e^z 项,该函数计算开销较大。



3. ReLU 激活函数



data/78df2c1f-e442-415d-a382-fa7925af0c4b/8691c488-c697-48ad-a2cb-884d6d028d41image.png


关键特性:


  • ReLU(Rectified Linear Unit,整流线性单元)激活函数是 Sigmoid 和 Tanh 激活函数的一个很好的替代方案。


  • ReLU 的发明是深度学习中的一个重要突破。


  • 该函数没有梯度消失问题。


  • ReLU 函数计算开销小,被认为其收敛速度比 Sigmoid 和 Tanh 函数快 6 倍。


  • 如果输入值大于或等于 0,ReLU 函数将输入原样输出;如果输入值小于 0,则输出 0。


  • ReLU 函数由两个线性组件组成,因此它是分段线性函数。实际上,ReLU 函数是一个非线性函数。


  • ReLU 函数的输出可以从 0 到正无穷。


  • 由于 ReLU 函数有一个固定的导数(斜率)对于一个线性分量,另一个线性分量的导数为零,因此学习过程比 Sigmoid 和 Tanh 函数要快得多。


  • 由于 ReLU 函数中不包含指数项,因此计算速度较快。


使用场景:


  • ReLU 函数是现代 MLP 和 CNN 神经网络模型中隐藏层的默认激活函数。


  • 我们通常不在 RNN 模型的隐藏层中使用 ReLU 函数,而是使用 Sigmoid 或 Tanh 函数。


  • 我们从不在输出层中使用 ReLU 函数。


缺点:


使用 ReLU 函数的主要缺点是“死亡 ReLU”问题:


  • 对于某些输入,ReLU 的输出可能会始终为零,导致神经元无法更新,进而“死亡”。


  • ReLU 函数的正侧输出值可能会非常大,这可能在训练过程中导致计算问题。



4. Leaky ReLU 激活函数



data/78df2c1f-e442-415d-a382-fa7925af0c4b/2a4b1328-69c4-43ff-8665-ae9c4f4d4c89image.png


关键特性:


  • Leaky ReLU 激活函数是默认 ReLU 函数的修改版本。


  • 与 ReLU 激活函数类似,Leaky ReLU 函数没有梯度消失问题。


  • 如果输入值大于或等于 0,Leaky ReLU 函数将输入原样输出,像默认的 ReLU 函数一样。然而,如果输入值小于 0,Leaky ReLU 函数输出一个由 αz 定义的小负值(其中 α ( alpha ) 是一个小常数,通常为 0.01,z 是输入值)。


  • 它没有任何具有零导数(斜率)的线性组件,因此可以避免 ReLU 死亡问题。


  • 使用 Leaky ReLU 进行学习的过程比默认的 ReLU 更快。


使用场景:


Leaky ReLU 函数的使用方式与 ReLU 函数相同。



5. Parametric ReLU (PReLU) 激活函数



data/78df2c1f-e442-415d-a382-fa7925af0c4b/061bc04d-c4a9-4d5c-9a9a-6500ababa68aimage.png


关键特性:


  • 这是 ReLU 函数的另一种变体。


  • 它几乎与 Leaky ReLU 函数相似,唯一的区别是 α ( alpha ) 变成了一个可学习的参数(因此得名)。我们将 α 作为网络中每个神经元的参数。因此,α 的最优值从网络中学习得到。



6. ReLU6 激活函数



data/78df2c1f-e442-415d-a382-fa7925af0c4b/0545d982-d7a3-4463-a6c4-2cc5acf8a0afimage.png


关键特性:


  • ReLU 与 ReLU6 之间的主要区别是,ReLU 允许正侧有非常高的值,而 ReLU6 限制正侧的最大值为 6。任何输入值大于或等于 6 的值都会被限制为 6(因此得名)。


  • ReLU6 函数由三个线性组件组成。它是一个非线性函数。



7. Softmax 激活函数



data/78df2c1f-e442-415d-a382-fa7925af0c4b/1c9104fb-9cac-44ba-b26d-19aba97fd15aimage.png


关键特性:


  • 这也是一个非线性激活函数。


  • Softmax 函数计算事件(类别)在 KKK 个不同事件(类别)中的概率值。它计算每个类别的概率值,所有概率的总和为 1,意味着所有事件(类别)是互斥的。


使用场景:


  • 在多分类问题的输出层,我们必须使用 Softmax 函数。


  • 我们从不在隐藏层使用 Softmax 函数。


data/78df2c1f-e442-415d-a382-fa7925af0c4b/011edf3c-6e98-4b8f-8a27-2845720dfabcimage.png



8. 二元阶跃激活函数



data/78df2c1f-e442-415d-a382-fa7925af0c4b/d2d17dda-a715-48f3-84cc-747cb66bd9b4image.png


关键特性:


  • 该函数也被称为阈值激活函数。我们可以设置任意值作为阈值,在这里我们指定为 0。


  • 如果输入大于阈值,则此函数输出值 1。如果输入等于阈值或小于阈值,则此函数输出值 0。


  • 它输出二进制值,0 或 1。


  • 二元阶跃函数由两个线性组件组成,因此它是一个分段线性函数。实际上,二元阶跃函数是一个非线性函数。


  • 该函数不是平滑函数。


使用场景:


  • 在现代神经网络模型中,我们通常不使用此函数。


  • 然而,我们可以使用此函数来解释一些理论概念,如“神经元激活”、“感知机的内部工作原理”。因此,阶跃函数在理论上是重要的。



9. 恒等激活函数



data/78df2c1f-e442-415d-a382-fa7925af0c4b/1e1cf5dd-d0b4-4309-9ba9-7019051c6971image.png


关键特性:


  • 也被称为线性激活函数。


  • 这是唯一被认为是线性函数的激活函数。


  • 该函数输出输入值本身,不对输入进行任何更改。


使用场景:


  • 该函数仅用于解决回归问题的神经网络模型的输出层。(ResNet中的residual可以使用 nn.Identity(X))


  • 我们从不在隐藏层使用恒等函数。


data/78df2c1f-e442-415d-a382-fa7925af0c4b/2921ebac-d65a-44ed-a426-82d97d958b37image.png



10. Swish 激活函数



data/78df2c1f-e442-415d-a382-fa7925af0c4b/7a0838b3-c29d-4aaa-9037-3fe67bbf331bimage.png


关键特性:


  • 该函数是通过将 Sigmoid 函数与输入 z 相乘得到的。


  • 这是一个非线性函数。


  • 其图形与 ReLU 激活函数的图形非常相似。


  • 曲线比 ReLU 激活函数更加平滑。这种平滑性对于训练模型非常重要,模型训练时容易收敛。


使用场景:


  • 该函数仅用于隐藏层。


  • 我们从不在神经网络模型的输出层使用此函数。


缺点:


  • Swish 函数的主要缺点是计算开销较大,因为函数中包含了 e^z 项。可以通过使用一种叫做“Hash Swish”的特殊函数来避免这一点,定义如下。



11. Hard Swish (H-Swish) 激活函数



data/78df2c1f-e442-415d-a382-fa7925af0c4b/516de08e-3ada-44fa-8a9e-d6b7f4c65ce9image.png


关键特性:


  • 其图形与 Swish 函数的图形完全相同。


  • 计算开销较低,因为 Sigmoid 函数被一个线性类似物所替代。


使用场景:


  • Hard Swish 的使用方式与 Swish 激活函数相似。



总结



激活函数只是数学函数。激活函数应该具备的主要特性是可微分,因为这是模型训练时反向传播的必要条件。


选择正确的激活函数是一个主要挑战,它可以视为一种超参数调优,程序员通过理解问题定义并考虑模型性能和损失函数的收敛情况,手动选择激活函数。



选择正确激活函数的通用指南



以下是上述讨论的不同激活函数使用场景的总结,您在训练自己的神经网络模型时可能会发现它很有用。


  • 输入层:神经网络的输入层节点不需要激活函数。因此,在定义输入层时,您不需要担心激活函数。


  • 输出层:输出层的激活函数取决于我们想要解决的问题类型。在回归问题中,我们使用线性(恒等)激活函数,节点数为 1。在二分类问题中,我们使用 sigmoid 激活函数,节点数为 1。在多分类问题中,我们使用 softmax 激活函数,每个类别一个节点。在多标签分类问题中,我们使用 sigmoid 激活函数,每个类别一个节点。


  • 隐藏层:我们应该在隐藏层中使用非线性激活函数。选择激活函数时,可以考虑模型的性能或损失函数的收敛性。通常从 ReLU 激活函数开始,如果出现死 ReLU 问题,可以尝试使用 Leaky ReLU。


  • MLP 和 CNN 神经网络模型:在 MLP 和 CNN 神经网络模型中,ReLU 是隐藏层的默认激活函数。


  • RNN 神经网络模型:在 RNN 神经网络模型中,我们使用 sigmoid 或 tanh 函数作为隐藏层的激活函数。tanh 函数的表现更好。


  • 线性与非线性:只有恒等激活函数被认为是线性的。所有其他激活函数都是非线性的。


  • 软最大与恒等函数:我们从不在隐藏层使用 softmax 和恒等函数。


  • 隐藏层使用的激活函数:我们只在隐藏层使用 tanh、ReLU、ReLU 的变种、swish 和 hard swish 函数。


  • Swish 和 Hard Swish:Swish 和 Hard Swish 激活函数是最近研究中发现的。


感谢您的阅读!如果能帮到你,那真的太好咯!



原文链接

评论