微信登录

神经网络基础 - 激活函数 - Sigmoid、ReLU 等

TensorFlow 《神经网络基础 - 激活函数 - Sigmoid、ReLU 等》

一、引言

在神经网络中,激活函数扮演着至关重要的角色。它们为神经网络引入了非线性特性,使得神经网络能够学习和表示复杂的模式和关系。如果没有激活函数,无论神经网络有多少层,其整体都只能表示线性变换,这极大地限制了网络的表达能力。TensorFlow 作为一个强大的深度学习框架,提供了多种激活函数供我们使用。本文将详细介绍几种常见的激活函数,包括 Sigmoid 和 ReLU,并探讨它们在 TensorFlow 中的实现和应用。

二、Sigmoid 激活函数

2.1 数学定义

Sigmoid 函数也被称为逻辑斯谛函数,其数学表达式为:
[ \sigma(x) = \frac{1}{1 + e^{-x}} ]
其中,(x) 是输入值。Sigmoid 函数的输出范围在 ( (0, 1) ) 之间,它可以将任意实数映射到这个区间内。

2.2 函数特性

  • 非线性:Sigmoid 函数是非线性的,这使得神经网络能够学习复杂的非线性关系。
  • 概率解释:由于其输出范围在 ( (0, 1) ) 之间,Sigmoid 函数的输出可以被解释为概率。例如,在二分类问题中,可以将输出大于 0.5 的样本分类为正类,小于 0.5 的样本分类为负类。
  • 平滑性:Sigmoid 函数是连续可导的,这使得它在使用梯度下降等优化算法时可以计算导数。

2.3 TensorFlow 实现

在 TensorFlow 中,可以使用 tf.nn.sigmoid 函数来实现 Sigmoid 激活函数。以下是一个简单的示例:

  1. import tensorflow as tf
  2. # 定义输入张量
  3. x = tf.constant([-2.0, -1.0, 0.0, 1.0, 2.0])
  4. # 应用 Sigmoid 激活函数
  5. y = tf.nn.sigmoid(x)
  6. # 打印结果
  7. print(y.numpy())

2.4 缺点

Sigmoid 函数存在一些缺点,主要包括:

  • 梯度消失问题:当输入值非常大或非常小时,Sigmoid 函数的导数趋近于 0。在深度神经网络中,这会导致梯度在反向传播过程中逐渐消失,使得网络难以训练。
  • 输出不是零中心的:Sigmoid 函数的输出总是大于 0,这会导致在反向传播过程中,参数更新的方向总是相同的,可能会导致收敛速度变慢。

三、ReLU 激活函数

3.1 数学定义

ReLU(Rectified Linear Unit)即修正线性单元,其数学表达式为:
[ ReLU(x) = \max(0, x) ]
也就是说,当输入 ( x ) 小于 0 时,输出为 0;当输入 ( x ) 大于等于 0 时,输出等于输入。

3.2 函数特性

  • 计算简单:ReLU 函数的计算非常简单,只需要比较输入和 0 的大小,这使得它的计算效率很高。
  • 缓解梯度消失问题:当输入大于 0 时,ReLU 函数的导数恒为 1,避免了梯度消失的问题,使得深度神经网络更容易训练。
  • 稀疏性:ReLU 函数会使得一部分神经元的输出为 0,从而引入了稀疏性,这有助于减少过拟合。

3.3 TensorFlow 实现

在 TensorFlow 中,可以使用 tf.nn.relu 函数来实现 ReLU 激活函数。以下是一个示例:

  1. import tensorflow as tf
  2. # 定义输入张量
  3. x = tf.constant([-2.0, -1.0, 0.0, 1.0, 2.0])
  4. # 应用 ReLU 激活函数
  5. y = tf.nn.relu(x)
  6. # 打印结果
  7. print(y.numpy())

3.4 缺点

ReLU 函数也存在一些缺点,主要是 神经元死亡问题。当输入小于 0 时,ReLU 函数的导数为 0,这可能导致一些神经元在训练过程中永远不会被激活,从而无法更新其参数。

四、其他激活函数

4.1 Tanh 函数

Tanh 函数的数学表达式为:
[ \tanh(x) = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}} ]
Tanh 函数的输出范围在 ( (-1, 1) ) 之间,它是零中心的,相比于 Sigmoid 函数,在一定程度上缓解了输出不是零中心的问题。在 TensorFlow 中,可以使用 tf.nn.tanh 函数来实现。

4.2 Leaky ReLU 函数

Leaky ReLU 是对 ReLU 函数的改进,其数学表达式为:
[ LeakyReLU(x) = \begin{cases} x, & \text{if } x \geq 0 \ \alpha x, & \text{if } x < 0 \end{cases} ]
其中,( \alpha ) 是一个小的正数,通常取 0.01。Leaky ReLU 函数在输入小于 0 时,不会将输出置为 0,而是乘以一个小的系数,从而避免了神经元死亡问题。在 TensorFlow 中,可以使用 tf.nn.leaky_relu 函数来实现。

五、总结

激活函数是神经网络中不可或缺的一部分,不同的激活函数具有不同的特性和适用场景。Sigmoid 函数适用于需要将输出解释为概率的场景,但存在梯度消失和非零中心的问题;ReLU 函数计算简单,能够缓解梯度消失问题,但可能会导致神经元死亡;Tanh 函数是零中心的,但也存在梯度消失问题;Leaky ReLU 函数是对 ReLU 函数的改进,避免了神经元死亡问题。在实际应用中,需要根据具体的任务和数据集选择合适的激活函数。TensorFlow 提供了丰富的激活函数库,方便我们在不同的场景中使用。