激活函数
Activation Function
激活函数是用于人工神经网络中的一种函数,它决定了神经元的输出是否应该被激活,从而引入非线性因素,使神经网络能够学习和表示复杂的数据模式。
决定了神经元输出,给网络引入非线性能力。
如果没有激活函数,深度网络只相当于线性变换堆叠,无法拟合复杂模式。
激活函数的主要作用是引入非线性,使得神经网络能够处理非线性问题。没有激活函数,神经网络只是线性模型的叠加,无法解决复杂的任务。激活函数使得神经网络能够逼近任何复杂的函数,从而在图像识别、自然语言处理等任务中取得优异的表现。
为什么需要激活函数?
如果没有激活函数(或者只使用线性激活函数),无论神经网络有多少层,整个网络都将退化为一个简单的线性模型。这意味着网络只能学习线性关系,无法处理非线性可分的数据。激活函数通过引入非线性,赋予了神经网络学习复杂模式的能力,使其能够逼近任何连续函数(根据通用近似定理)。
常见激活函数
Sigmoid (Logistic Sigmoid)
数学表达式:
早期神经网络(比如最早的多层感知机 MLP)
输出概率(如二分类模型最后一层)
优点: 将输出压缩到
缺点:
- 梯度消失问题:当
非常大或小,梯度趋近于0。 - 非零均值,导致更新不稳定。
- 计算成本: 涉及指数运算,相对耗时。
Tanh (Hyperbolic Tangent)
将输入值压缩到-1到1之间
Sigmoid和Tanh函数用于控制记忆单元的输入、输出和遗忘门,使模型能够捕捉长序列依赖关系。
- RNN(循环神经网络)中很常见
- 相比Sigmoid,Tanh输出均值为0,收敛更快
同样存在梯度消失问题。
ReLU(Rectified Linear Unit )
对于输入值为负时输出为0,正值时输出为该值本身。
- CNN(卷积神经网络)普遍使用
- 各类Transformer(Feed Forward层里)
- 提高训练速度,不容易梯度消失
缺点:死神经(Dead Neuron)问题:输入小于0时梯度为0,永远不会更新。
- 优点:
- 计算简单: 只需要一个阈值判断,计算效率高。
- 缓解梯度消失: 当
时,导数恒为 1,有效缓解了深层网络的梯度消失问题,加速收敛。 - 稀疏激活: 负值输入直接输出 0,导致部分神经元“死亡”,产生稀疏激活,有助于减少过拟合。
- 缺点:
- 死亡 ReLU (Dying ReLU): 当输入为负时,梯度为 0,导致神经元不再更新权重,永远“死亡”。
- 输出非零均值。
Leaky ReLU
- 解决 ReLU 的 Dead Neuron 问题。
- GANs中比较常用。
为解决“死亡 ReLU”问题,提出了多种 ReLU 的变体:
- Leaky ReLU:
,其中 是一个很小的正数(如 0.01)。当 时,输出一个小的非零斜率,避免神经元完全死亡。 - PReLU (Parametric ReLU):
,其中 是一个可学习的参数,而不是固定的常数。 - ELU (Exponential Linear Unit):
。在负值区域有平滑的曲线,且输出均值接近 0,有助于加速学习。
Softmax 函数
- 公式: 对于一个包含
个类别的输出向量 ,Softmax 函数将其转换为一个概率分布 ,其中 。 - 图像: 将多个输入值转换为和为 1 的概率分布。
- 优点: 适用于多分类任务的输出层,确保所有输出概率之和为 1。
- 缺点: 仅用于输出层,不适合作为隐藏层的激活函数。
激活函数的选择原则
- 隐藏层:
- ReLU 及其变体(Leaky ReLU, PReLU, ELU)是目前最常用的选择,因为它们能有效缓解梯度消失问题,计算效率高。
- 对于需要更平滑输出或对负值有特定处理的场景,ELU 可能是一个好选择。
- 输出层:
- 二分类: Sigmoid函数。
- 多分类: Softmax 函数。
- 回归: 通常不使用激活函数(或使用线性激活函数),因为输出需要是任意实数。