如何为神经网络选择合适的激活函数
分析各种激活函数及其可视化表示 —— 摘自《神经网络与深度学习课程:第5部分》
前言
本文属于搬运内容,原作者:Rukshan Pramoditha 致敬~!
了解各种激活函数的特性有助于构建属于自己的网络架构哦,或者做适时的调整!
简介
在之前的文章中,我们讨论了激活函数在神经网络模型中的主要用途。
激活函数在每个隐藏层节点和输出层中,作用于输入的加权和(通常表示为 z),输入可以是原始数据或前一层的输出。
今天,我们将详细探讨神经网络中使用的以下几种常见激活函数:
通过可视化图示,您将更容易理解这些激活函数的定义及其不同的使用场景。

神经网络中不同层的激活函数
一个典型的神经网络通常由三种层组成:输入层、隐藏层和输出层。
1. 输入层
输入层仅用来保存输入数据,并不进行任何计算,因此不需要激活函数。
2. 隐藏层
在神经网络的隐藏层中必须使用非线性激活函数。这是因为:
- 非线性激活函数能够为网络引入非线性,从而使其能够学习复杂模式。
- 如果没有非线性激活函数,即使神经网络有多个隐藏层,也只会退化为一个巨大的线性回归模型,这对于学习真实世界数据中的复杂关系毫无意义。
隐藏层中激活函数的选择会显著影响神经网络模型的性能。
3. 输出层
在神经网络的输出层中,我们也需要使用激活函数。
- 输出层的激活函数选择取决于要解决的问题类型。
- 不同问题(如回归、分类、多分类)需要使用不同的激活函数,以确保模型输出符合预期的范围或格式。
接下来的内容将详细分析每种激活函数的定义、特性以及适用场景。继续阅读,深入了解如何选择适合您神经网络的激活函数!
线性与非线性函数
大多数激活函数是非线性的。然而,在神经网络中,我们也使用线性激活函数。例如,在解决回归问题的神经网络模型的输出层中,我们使用线性激活函数。有些激活函数由两个或三个线性组成部分构成,这些函数也被归类为非线性函数。
区分线性函数和非线性函数非常有用。线性函数(称为 f)接受输入 z,并返回输出 cz,即输入与常数 ccc 的乘积。数学上可以表示为:f(z)=cz
当 c=1 时,函数返回输入值本身,不对输入进行任何更改。线性函数的图像是一条直线。
任何不是线性的函数都可以归类为非线性函数。非线性函数的图像不是一条直线,它可以是复杂的模式,或者是两个或多个线性组件的组合。
不同类型的激活函数
我们将讨论神经网络中常用的激活函数。
1. Sigmoid 激活函数

关键特性:
- 也称为逻辑函数,常用于逻辑回归模型。
- 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 函数:

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

缺点:
由于以下缺点,我们通常不在隐藏层中使用 Sigmoid 函数:
- Sigmoid 函数存在梯度消失问题,也称为梯度饱和问题。
- Sigmoid 函数收敛速度较慢。
- 它的输出不是零中心的,因此使得优化过程更加困难。
- 由于包含 e^z 项,因此该函数计算开销较大。
2. Tanh 激活函数

关键特性:
- 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 激活函数

关键特性:
- 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 激活函数

关键特性:
- 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) 激活函数

关键特性:
- 这是 ReLU 函数的另一种变体。
- 它几乎与 Leaky ReLU 函数相似,唯一的区别是 α ( alpha ) 变成了一个可学习的参数(因此得名)。我们将 α 作为网络中每个神经元的参数。因此,α 的最优值从网络中学习得到。
6. ReLU6 激活函数

关键特性:
- ReLU 与 ReLU6 之间的主要区别是,ReLU 允许正侧有非常高的值,而 ReLU6 限制正侧的最大值为 6。任何输入值大于或等于 6 的值都会被限制为 6(因此得名)。
- ReLU6 函数由三个线性组件组成。它是一个非线性函数。
7. Softmax 激活函数

关键特性:
- 这也是一个非线性激活函数。
- Softmax 函数计算事件(类别)在 KKK 个不同事件(类别)中的概率值。它计算每个类别的概率值,所有概率的总和为 1,意味着所有事件(类别)是互斥的。
使用场景:
- 在多分类问题的输出层,我们必须使用 Softmax 函数。
- 我们从不在隐藏层使用 Softmax 函数。

8. 二元阶跃激活函数

关键特性:
- 该函数也被称为阈值激活函数。我们可以设置任意值作为阈值,在这里我们指定为 0。
- 如果输入大于阈值,则此函数输出值 1。如果输入等于阈值或小于阈值,则此函数输出值 0。
- 它输出二进制值,0 或 1。
- 二元阶跃函数由两个线性组件组成,因此它是一个分段线性函数。实际上,二元阶跃函数是一个非线性函数。
- 该函数不是平滑函数。
使用场景:
- 在现代神经网络模型中,我们通常不使用此函数。
- 然而,我们可以使用此函数来解释一些理论概念,如“神经元激活”、“感知机的内部工作原理”。因此,阶跃函数在理论上是重要的。
9. 恒等激活函数

关键特性:
- 也被称为线性激活函数。
- 这是唯一被认为是线性函数的激活函数。
- 该函数输出输入值本身,不对输入进行任何更改。
使用场景:
- 该函数仅用于解决回归问题的神经网络模型的输出层。(ResNet中的residual可以使用 nn.Identity(X))
- 我们从不在隐藏层使用恒等函数。

10. Swish 激活函数

关键特性:
- 该函数是通过将 Sigmoid 函数与输入 z 相乘得到的。
- 这是一个非线性函数。
- 其图形与 ReLU 激活函数的图形非常相似。
- 曲线比 ReLU 激活函数更加平滑。这种平滑性对于训练模型非常重要,模型训练时容易收敛。
使用场景:
- 该函数仅用于隐藏层。
- 我们从不在神经网络模型的输出层使用此函数。
缺点:
- Swish 函数的主要缺点是计算开销较大,因为函数中包含了 e^z 项。可以通过使用一种叫做“Hash Swish”的特殊函数来避免这一点,定义如下。
11. Hard Swish (H-Swish) 激活函数

关键特性:
- 其图形与 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 激活函数是最近研究中发现的。
感谢您的阅读!如果能帮到你,那真的太好咯!