激活函数(Activation Function)是人工神经网络中的一个关键组件,它的作用是为神经网络引入非线性因素。如果没有激活函数,神经网络无论有多少层,都只能表示输入和输出之间的线性关系,这大大限制了网络处理复杂问题的能力。激活函数通常在神经网络的每个神经元或节点上应用,它们帮助网络学习和表示复杂的函数

发展历史:

1. Sigmoid

Sigmoid 函数是最早被广泛使用的激活函数之一,它的公式为:

Sigmoid 函数的输出范围在 0 到 1 之间,Sigmoid 函数的主要问题是在输入很大或很小的情况下,梯度会变得很小,这会导致梯度消失的问题,从而影响网络的训练效果

2. Softmax

Softmax 函数是一种常用的多分类激活函数,它的公式为:

Softmax 函数的输出是一个概率分布,它将输入映射到一个概率分布上,使得每个类别的概率之和为 1。Softmax 函数通常用于多分类问题中的输出层

3. Tanh

Tanh 函数是双曲正切函数,它的公式为:

Tanh 函数的输出范围在 -1 到 1 之间,Tanh 函数相对于 Sigmoid 函数来说,输出的范围更广,可以将输入映射到 -1 到 1 之间,从而减少梯度消失的问题

4. ReLU

ReLU 函数是修正线性单元函数,它的公式为:

ReLU 函数在输入大于 0 时输出等于输入,否则输出为 0。ReLU 函数的优点是计算简单,收敛速度快,但它也存在一个问题,就是在输入小于 0 时,梯度为 0,这会导致神经元无法更新权重,从而出现“神经元死亡”的问题

除了 ReLU 之外,还有许多类似的激活函数,它们在 ReLU 的基础上进行了一些改进,以解决 ReLU 存在的一些问题。这些类 ReLU 激活函数包括:

  • Leaky ReLU:Leaky ReLU 是对 ReLU 的改进,当输入为负时,Leaky ReLU 引入了一个小的斜率,而不是直接输出 0。这有助于解决 ReLU 在负区间的输出为 0 的问题
  • Parametric ReLU (PReLU):PReLU 是 Leaky ReLU 的一种扩展,它引入了一个可学习的参数,用于控制负区间的斜率。这使得神经网络能够自适应地学习负区间的激活函数
  • Exponential Linear Unit (ELU):ELU 是一种类似 ReLU 的激活函数,它在负区间引入了一个指数项,使得负区间的输出更加平滑。ELU 在一些情况下可以提供更好的性能
  • Scaled Exponential Linear Unit (SELU):SELU 是 ELU 的一种变种,它引入了缩放参数,使得 SELU 在一定条件下能够保持输入的均值和方差不变,从而有助于稳定训练
  • GELU:GELU 是一种基于高斯误差线性单元的激活函数,它在一些情况下能够提供更好的性能。GELU 的数学形式是一个带有误差函数的平滑函数

这些类 ReLU 激活函数在实践中都得到了广泛的应用,它们在一定程度上改进了 ReLU 的性能,并且在不同的场景下可能会有不同的表现。选择合适的激活函数取决于具体的任务和模型结构

5. Leaky ReLU

Leaky ReLU 函数是 ReLU 函数的改进版本,它的公式为:

其中 是一个小于 1 的常数,通常取 0.01。Leaky ReLU 函数在输入小于 0 时,不再输出 0,而是输出一个很小的值 ,这样可以避免 ReLU 函数的“神经元死亡”问题

6. PReLU

PReLU 函数是带参数的 ReLU 函数,它的公式为:

其中 是一个可学习的参数,通常在训练过程中通过反向传播来更新。PReLU 函数在输入小于 0 时,不再输出 0,而是输出一个由参数 控制的值,这样可以更灵活地调整激活函数的形状

7. ELU

ELU 函数是指数线性单元函数,它的公式为:

其中 是一个大于 0 的常数,通常取 1。ELU 函数在输入大于 0 时输出等于输入,否则输出一个由参数 控制的值,这样可以避免 ReLU 函数的“神经元死亡”问题,并且在输入小于 0 时,输出的值是连续的,有助于提高网络的稳定性

8. GLU

GLU 函数是门控线性单元函数,它的公式为:

其中 是 Sigmoid 函数, 表示元素级乘法。GLU 函数在输入上应用了门控机制,通过 Sigmoid 函数来控制输入的信息流动,从而提高网络的表达能力

9. SELU

SELU 函数是自归一化指数线性单元函数,它的公式为:

其中 是两个常数,通常取 1.0507 和 1.6733。SELU 函数在输入大于 0 时输出等于输入,否则输出一个由参数 控制的值,这样可以避免 ReLU 函数的“神经元死亡”问题,并且在输入小于 0 时,输出的值是连续的,有助于提高网络的稳定性。SELU 函数还具有自归一化的性质,可以使得网络的输出保持稳定

10. GELU

GELU 函数是高斯误差线性单元函数,它的公式为:

GELU 函数在输入大于 0 时输出等于输入,否则输出一个由参数 控制的值,这样可以避免 ReLU 函数的“神经元死亡”问题,并且在输入小于 0 时,输出的值是连续的,有助于提高网络的稳定性。GELU 函数在很多实际应用中表现出了比 ReLU 函数更好的性能

11. Swish

Swish 函数是自门控激活函数,它的公式为:

Swish 函数在输入大于 0 时输出等于输入,否则输出一个由 Sigmoid 函数控制的值,这样可以避免 ReLU 函数的“神经元死亡”问题,并且在输入小于 0 时,输出的值是连续的,有助于提高网络的稳定性。Swish 函数在很多实际应用中表现出了比 ReLU 函数更好的性能

12. Mish

Mish 函数是自门控激活函数,它的公式为:

Mish 函数在输入大于 0 时输出等于输入,否则输出一个由 Sigmoid 函数控制的值,这样可以避免 ReLU 函数的“神经元死亡”问题,并且在输入小于 0 时,输出的值是连续的,有助于提高网络的稳定性。Mish 函数在很多实际应用中表现出了比 ReLU 函数更好的性能

13. SwiGLU

SwiGLU 函数是自门控激活函数,它的公式为:

SwiGLU 函数在输入大于 0 时输出等于输入,否则输出一个由 Sigmoid 函数控制的值,这样可以避免 ReLU 函数的“神经元死亡”问题,并且在输入小于 0 时,输出的值是连续的,有助于提高网络的稳定性。SwiGLU 函数在很多实际应用中表现出了比 ReLU 函数更好的性能