神经网络中激活函数的选择

在神经网络的世界里,激活函数是一个神秘而关键的角色。
它虽然不像神经元那样引人注目,也不像网络架构那样复杂多变,但它却在神经网络的运行中起着至关重要的作用。

它赋予了神经网络强大的非线性拟合能力,让神经网络能够处理各种复杂的任务。
今天,就让我们一起揭开激活函数的神秘面纱,探索它背后的奥秘。
一、为什么需要激活函数?
在神经网络中,激活函数的存在并非偶然,而是有着深刻的数学和逻辑意义。
首先,我们需要理解神经网络的基本结构:它由多个神经元组成,每个神经元接收输入信号,经过加权求和后输出信号。

如果没有激活函数,神经网络无论有多少层,其本质仍然是一个线性模型。因为多层线性变换的组合仍然是线性的,即:
y
=
W
2
(
W
1
x
+
b
1
)
+
b
2
=
(
W
1
W
2
)
x
+
(
W
2
b
1
+
b
2
)
y = W_2(W_1x + b_1) + b_2 = (W_1W_2)x + (W_2b_1 + b_2)
y=W2(W1x+b1)+b2=(W1W2)x+(W2b1+b2)
式中, W 1 W_1 W1、 W 2 W_2 W2 是权重矩阵, b 1 b_1 b1、 b 2 b_2 b2 是偏置向量。可以看到,最终的输出仍然是输入 x x x 的线性组合。
换句话说,无论网络有多复杂,它都无法处理非线性问题,其功能将被大大限制。然而,现实世界中的问题大多是复杂的非线性问题。
例如,图像识别中,像素之间的关系是非线性的;自然语言处理中,单词之间的语义关系也是非线性的。

因此,我们需要激活函数来引入非线性,使神经网络能够学习和处理复杂的非线性关系。
从数学角度看,激活函数将输入信号映射到一个非线性的输出空间,从而能够学习和拟合各种复杂的模式。
这就好比给神经网络安装了一个“非线性引擎”,让它能够应对各种复杂的任务。
二、常见激活函数的数学形式
激活函数是神经网络中非常重要的组成部分,它能够为神经网络引入非线性能力,使神经网络可以逼近任意复杂的函数。
接下来,我们将详细介绍几种常见的激活函数:
2.1 Sigmoid 函数
Sigmoid 函数是最早被广泛使用的激活函数之一。它的数学形式为:
f ( x ) = 1 1 + e x f(x) = \frac{1}{1 + e^x} f(x)=1+ex1
Sigmoid 函数的输出范围在 0 到 1 之间,具有平滑的“S”曲线形状。它在输入接近 0 时变化较快,而在输入远离 0 时变化较慢。
这种特性使得 Sigmoid 函数能够很好地处理概率问题,例如二分类任务。

然而,Sigmoid 函数也有其缺点。它的导数形式为:
f ′ ( x ) = f ( x ) ⋅ ( 1 − f ( x ) ) f'(x) = f(x) \cdot (1 - f(x)) f′(x)=f(x)⋅(1−f(x))
当输入 x x x 的绝对值较大时,Sigmoid函数的导数会趋近于 0,这会导致梯度消失问题。
2.2 ReLU 函数
ReLU(Rectified Linear Unit)函数是近年来被广泛使用的激活函数。它的数学形式为:
f ( x ) = max ( 0 , x ) f(x) = \max(0, x) f(x)=max(0,x)
ReLU 函数的输出在输入为正时为输入值本身,在输入为负时为 0。这种简单的非线性特性使得 ReLU 函数在计算上非常高效。
ReLU 函数的导数特性也非常简单:
f ( x ) = { 1 , if x > 0 0 , if x ≤ 0 f(x) = \begin{cases} 1, & \text{if } x > 0 \\ 0, & \text{if } x \leq 0 \end{cases} f(x)={1,0,if x>0if x≤0
ReLU 函数的一个显著优点是它能够有效缓解梯度消失问题。由于其导数在输入为正时恒为 1,因此在反向传播过程中,梯度不会因为输入值的增大而衰减。
这使得 ReLU 函数在深度神经网络中表现出色,训练速度更快,性能更好。

然而,ReLU 函数也有其缺点。当输入为负时,ReLU 函数的导数为 0,这可能导致一些神经元在训练过程中“死亡”,即这些神经元的输出始终为 0,无法再被激活。
为了解决这个问题,人们提出了 ReLU 的变体,如 Leaky ReLU 和 Parametric ReLU(PReLU)。Leaky ReLU 是 ReLU 函数的一个改进版本。它的数学形式为:
f ( x ) = { x , if x > 0 α x , if x ≤ 0 f(x) = \begin{cases} x, & \text{if } x > 0 \\ \alpha x , & \text{if } x \leq 0 \end{cases} f(x)={x,αx,if x>0if x≤0
式中, α \alpha α 是一个小的正数,通常取值为 0.01。
Leaky ReLU 函数在输入为负时仍然有非零的导数,这使得神经元在训练过程中不会完全“死亡”,从而提高了网络的稳定性和性能。
2.3 Tanh 函数
Tanh 函数是另一种常用的激活函数。它的数学形式为:
f ( x ) = e x − e − x e x + e − x f(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} f(x)=ex+e−xex−e−x
Tanh 函数的输出范围在 -1 到 1 之间,形状类似于 Sigmoid 函数,但它是以 0 为中心的。

这种特性使得 Tanh 函数在某些情况下比 Sigmoid 函数表现更好,因为它能够更好地处理输入数据的正负对称性。
Tanh 函数的导数形式为:
f ( x ) = 1 − f ( x ) 2 f(x) = 1 - f(x)^2 f(x)=1−f(x)2
与 Sigmoid 函数类似,Tanh 函数也存在梯度消失问题。当输入 x x x 的绝对值较大时,Tanh 函数的导数会趋近于 0,从而导致梯度消失。
因此,在深度神经网络中使用 Tanh 函数时,也需要特别注意梯度消失问题。
三、激活函数对神经网络的影响
激活函数的选择对神经网络的性能有着深远的影响。不同的激活函数具有不同的数学特性,适用于不同的场景。
以下是激活函数对神经网络的几个关键影响:
3.1 梯度消失与梯度爆炸问题
梯度消失和梯度爆炸是神经网络训练过程中常见的问题。
梯度消失问题是指:在反向传播过程中,梯度值变得非常小,使得权重更新缓慢,甚至无法更新。这会导致神经网络的训练效率低下,甚至无法收敛。
例如,Sigmoid 函数和 Tanh 函数在输入值的绝对值较大时,导数趋近于0,导致梯度消失。

为了解决梯度消失问题,研究人员提出了多种改进方法。
例如,使用 ReLU 函数可以有效缓解梯度消失问题,因为它在输入值大于0时,导数始终为1。
此外,还有一些改进的激活函数,如 Leaky ReLU 和 Parametric ReLU,它们在输入值小于等于0时,导数不为0,从而避免了神经元“死亡”的问题。

与梯度消失相对的是梯度爆炸问题。
当神经网络的权重更新过快时,可能会导致梯度值变得非常大,从而使权重更新过大,导致网络训练不稳定。
虽然激活函数本身不会直接导致梯度爆炸,但合理的权重初始化和梯度裁剪等技术可以有效缓解梯度爆炸问题。
3.2 计算复杂度与收敛速度
激活函数的计算复杂度也会影响神经网络的训练效率。
例如,Sigmoid 函数和 Tanh 函数的计算复杂度较高,因为它们需要计算指数函数。
而 ReLU 函数的计算复杂度较低,因为它只需要进行简单的比较和取值操作。

此外,激活函数的输出范围也会影响神经网络的收敛速度。
例如,Tanh 函数的输出是零中心的,这有助于提高神经网络的收敛速度。
而 Sigmoid 函数的输出范围在 0 到 1 之间,不是零中心的,这会导致神经网络的收敛速度较慢。
激活函数是神经网络中不可或缺的一部分,它通过引入非线性,赋予了神经网络强大的学习能力。
不同的激活函数在不同的任务和网络结构中表现各异,选择合适的激活函数对于提高神经网络的性能至关重要。
Sigmoid、ReLU、Leaky ReLU 和 Tanh 等激活函数各有优缺点,我们需要根据具体任务和网络结构进行选择。
注:本文中未声明的图片均来源于互联网