好的,我们来详细地讲解一下人工神经网络中激活函数的作用,以及为什么 ReLU 通常优于 tanh 和 sigmoid 函数。
人工神经网络中激活函数(Activation Function)的作用
在人工神经网络中,激活函数是连接神经网络的神经元(也称为节点)的关键组成部分。它的主要作用是:
1. 引入非线性: 这是激活函数最核心的作用。如果没有激活函数,多层神经网络本质上就相当于一个单一的线性变换。无论有多少层,输入都会通过一系列的线性组合得到输出。而现实世界中的许多问题,例如图像识别、自然语言处理等,都具有高度的非线性关系。激活函数通过引入非线性,使得神经网络能够学习和表示这些复杂的模式。
举例说明: 想象一下,如果你有一个有两个线性层的网络,第一层将输入 `x` 线性变换为 `y = W1x + b1`,第二层将 `y` 线性变换为 `z = W2y + b2`。将它们合并后,`z = W2(W1x + b1) + b2 = (W2W1)x + (W2b1 + b2)`。这仍然只是一个线性的 `z = W_total x + b_total` 的形式。但是,如果我们在中间层加入一个非线性激活函数 `f`,那么 `y = f(W1x + b1)`,然后 `z = W2y + b2 = W2f(W1x + b1) + b2`。此时,即使 `W2` 和 `W1` 都是线性变换,但由于 `f` 的非线性,整个网络的输出就变得非线性了。
2. 控制神经元的输出范围: 许多激活函数会将神经元的输出限制在一个特定的范围内,例如 [0, 1](Sigmoid)或 [1, 1](tanh)。这有助于稳定训练过程,防止数值溢出,并使得网络更容易收敛。
3. 模拟生物神经元行为(一定程度上): 虽然人工神经网络只是对生物神经元的简化模型,但激活函数在某种程度上模拟了生物神经元“是否激活”的机制。当输入信号的总和超过某个阈值时,神经元就会“激活”并传递信号。激活函数的形状和特性可以被看作是对这个阈值和传递强度的一种抽象表示。
4. 决定神经元是否“活跃”: 激活函数决定了在给定输入下,一个神经元是否会产生一个显著的输出。例如,ReLU 在输入为负时输出为零,意味着该神经元在该输入下是“不活跃”的。
总结来说,激活函数是神经网络学习能力的关键,它赋予了神经网络处理复杂、非线性问题的能力。
为什么 ReLU 比 tanh 和 sigmoid 函数更好?
ReLU(Rectified Linear Unit)及其变种在现代深度学习中之所以如此流行,并且通常优于传统的 tanh 和 sigmoid 函数,主要有以下几个原因:
1. 解决了梯度消失问题 (Vanishing Gradient Problem)
这是 ReLU 最显著的优势。
Sigmoid 函数:
函数形式:`σ(x) = 1 / (1 + exp(x))`
输出范围:(0, 1)
问题: Sigmoid 函数的导数在输入值很大或很小时会非常接近于零。
当 `x` 趋向正无穷时,`σ(x)` 趋向 1,导数趋向 0。
当 `x` 趋向负无穷时,`σ(x)` 趋向 0,导数趋向 0。
梯度消失: 在多层神经网络中,梯度是通过链式法则反向传播的。如果每一层都乘以一个小于 1 的导数(例如 Sigmoid 的导数),那么当梯度传播到更早的层时,它会变得越来越小,甚至趋于零。这意味着早期层的权重更新会非常缓慢,导致网络难以训练,尤其是深度网络。
tanh 函数:
函数形式:`tanh(x) = (exp(x) exp(x)) / (exp(x) + exp(x))`
输出范围:(1, 1)
问题: tanh 函数也存在梯度消失问题,尽管它的输出范围是 [1, 1],零点对称,在输入为零时导数最大(为 1),这比 Sigmoid 好一些。但当输入值远离零时,导数同样会趋向于零。
ReLU 函数:
函数形式:`ReLU(x) = max(0, x)`
输出范围:[0, ∞)
优势:
对于 `x > 0`,ReLU 的导数恒为 1。这意味着在正区域,梯度不会在反向传播过程中衰减。
当 `x < 0` 时,ReLU 的导数为 0。虽然这是 ReLU 的一个潜在缺点(导致“死亡 ReLU”问题),但在大部分情况下,如果神经元能够接收到正向输入,其梯度就不会消失。
解决梯度消失: 由于其在正区域的恒定导数 1,ReLU 显著缓解了梯度消失问题,使得更深的网络能够更有效地训练。
2. 计算效率高
ReLU: 其计算非常简单,就是取输入值与零的最大值 (`max(0, x)`)。这只需要一个简单的比较和赋值操作。
Sigmoid 和 tanh: 这两个函数都涉及到指数运算 (`exp(x)`),这些运算在计算上比简单的比较和加法要昂贵得多,尤其是在大规模神经网络的训练中,计算效率的差异会非常明显。
3. 避免了输出饱和(对于正向输入)
Sigmoid 和 tanh: 这两个函数都会在输入值过大时达到饱和状态,即输出值趋于最大值(1 或 1),并且此时的梯度也非常小。这意味着当输入值较大时,神经元对输入的微小变化不再敏感,学习效率低下。
ReLU: 对于正向输入,ReLU 不会饱和,其输出会随着输入线性增长。这使得神经元在接收到正向信号时能够更有效地学习和更新。
4. 引入了“稀疏激活” (Sparsity)
ReLU: 当输入小于零时,ReLU 的输出为零,导数也为零。这意味着一部分神经元在给定输入下不会被激活,也不会对计算产生贡献。这种“稀疏激活”可以提高模型的效率,并可能带来更好的泛化能力,因为模型不必依赖于所有神经元来处理每一个输入。
Sigmoid 和 tanh: 即使输入很小或为负,它们的输出也总是一个非零值(尽管很接近零),并且有非零梯度。因此,它们不会产生稀疏激活。
ReLU 的潜在缺点和解决方案
尽管 ReLU 有诸多优点,但它也有一个主要的缺点:
“死亡 ReLU”问题 (Dying ReLU Problem): 如果一个神经元的权重被更新得如此之大,以至于在任何输入下,其计算出的线性组合值都小于零,那么这个神经元就永远不会被激活(输出为零,导数为零)。这意味着这个神经元在整个训练过程中将不再更新,相当于“死亡”了。
为了解决“死亡 ReLU”问题,出现了一些 ReLU 的变种:
Leaky ReLU: 在输入小于零时,不输出零,而是输出一个很小的负斜率(例如 `max(0.01x, x)`)。这样,即使输入为负,也仍然有微小的梯度可以传播,使得神经元不会完全死亡。
Parametric ReLU (PReLU): Leaky ReLU 的一个推广,其中负斜率作为一个参数进行学习。
Exponential Linear Unit (ELU): 当输入小于零时,它输出一个指数衰减的值。这有助于将平均激活值趋近于零,从而可能加速学习。
但是,即使存在“死亡 ReLU”问题,在实践中,通过合理的初始化、学习率选择和正则化,ReLU 仍然是许多任务的首选激活函数,因为它在解决梯度消失和计算效率方面带来的好处通常远大于其潜在的缺点。
总结对比
| 特性 | Sigmoid | tanh | ReLU (max(0, x)) |
| : | : | : | : |
| 输出范围 | (0, 1) | (1, 1) | [0, ∞) |
| 非线性 | 是 | 是 | 是 |
| 梯度消失 | 严重 | 较严重 | 缓解(正区域导数为 1) |
| 计算效率 | 较低(指数运算) | 较低(指数运算) | 非常高(简单比较) |
| 饱和性 | 饱和(输入过大或过小) | 饱和(输入过大或过小) | 仅在负区域饱和(导数为 0) |
| 稀疏激活 | 否 | 否 | 是 |
| “死亡 ReLU”问题 | 无 | 无 | 有 |
| 中心化输出 | 否(输出总是正的) | 是(输出围绕零对称) | 否(输出非负) |
因此,ReLU 的核心优势在于其能够有效地缓解深度网络中的梯度消失问题,并具有很高的计算效率,这使得它在训练深度神经网络时表现出色。 尽管存在“死亡 ReLU”的潜在问题,但通过变种和良好的训练策略,这些问题可以被有效地管理。