在神经网络中,激活函数(Activation Function)扮演着至关重要的角色,它为神经网络引入非线性因素,使得网络能够学习和模拟复杂的非线性函数关系,从而具备处理各种复杂问题的能力。如果没有激活函数,多层神经网络将仅仅是一个线性组合模型,其表达能力会受到极大限制。以下是几种常见的激活函数汇总。
1. Sigmoid 函数
Sigmoid 函数也称为 Logistic 函数,是一种常用的激活函数,它将输入值压缩到 (0, 1) 区间内,表达式为
函数图像为
Sigmoid 函数的图像是一条平滑的 S 形曲线,当 x 趋近于负无穷时,函数值趋近于 0;当 x 趋近于正无穷时,函数值趋近于 1。在 x=0 处,函数值是 0.5 。
优点
输出范围固定:输出值在 (0, 1) 之间,适合用于二分类问题的输出层,可将输出解释为概率。
平滑可导:函数处处连续可导,便于使用梯度下降等基于梯度的优化算法进行参数更新。
缺点
梯度消失问题:在 x 绝对值较大时,函数的梯度趋近于 0,导致在反向传播过程中,梯度很难传递到前面的层,使得网络难以训练,即出现梯度消失现象。
非零均值输出:输出值恒大于 0,这会导致后一层神经元的输入是非零均值的信号,可能会使梯度更新出现偏移,影响训练效果。
计算复杂度较高:涉及指数运算,在计算资源有限或大规模网络中,计算效率相对较低。
2. Tanh 函数
Tanh 函数(双曲正切函数)将输入值压缩到 (-1, 1) 区间内,表达式为
函数图像为
tanh 函数的图像是 S 形曲线,关于原点对称,在x=0处,函数值为 0 。
优点
零均值输出:输出值以 0 为中心,相比 Sigmoid 函数,能缓解后一层神经元输入的偏移问题,使得梯度更新更加合理。
比 Sigmoid 函数收敛速度快:在一定程度上缓解了梯度消失问题。
缺点
仍存在梯度消失:在 x 绝对值较大时,函数的梯度同样趋近于 0,深层网络训练时依然会面临梯度消失的挑战。
计算复杂度较高:同样涉及指数运算,计算效率有待提升。
3. ReLU 函数
ReLU(Rectified Linear Unit,修正线性单元)函数是目前神经网络中使用最为广泛的激活函数之一,表达式为
即当时,函数值为x;当时,函数值为0。
函数图像为
ReLU 函数图像在 时,输出为 0;在 时,是一条斜率为 1 的直线。
优点
有效缓解梯度消失:在 时,梯度恒为 1,不会出现梯度消失问题,使得网络能够更有效地进行反向传播和训练。
计算简单高效:仅需进行一次比较和一次取值操作,相比 Sigmoid 和 Tanh 函数,大大减少了计算量,提高了训练速度。
加速网络收敛:在实际应用中,使用 ReLU 函数的神经网络通常收敛速度更快。
缺点
神经元 “死亡” 问题:当 时,神经元的梯度为 0,在反向传播过程中,如果参数更新导致某些神经元的输入始终小于等于 0,那么这些神经元将不再更新权重,就像 “死亡” 了一样,无法恢复。
输出非零均值:与 Sigmoid 函数类似,输出不是以 0 为中心,可能影响梯度更新。
4. Leaky ReLU 函数
Leaky ReLU 是对 ReLU 函数的改进,旨在解决 ReLU 函数中神经元 “死亡” 的问题,表达式为
其中 是一个很小的正数,如 0.01,使得 时,函数依然有一个很小的梯度。
示意的函数图像为
优点
解决神经元 “死亡” 问题:通过引入一个小的非零斜率,避免了在 时神经元 “死亡” 的情况,保证了所有神经元在一定程度上都能参与训练。
保留 ReLU 的优点:继承了 ReLU 计算简单、缓解梯度消失等优点。
缺点
超参数问题: 的值需要人为设定,不同的 值可能对网络性能产生不同影响,需要通过调参来确定合适的值。
5. PReLU 函数
PReLU(Parametric ReLU)是对 Leaky ReLU 的进一步改进,它将 作为可学习的参数,在训练过程中与网络其他参数一起进行更新,表达式为
其中 是针对每个神经元的可学习参数。
优点
自适应调整:通过让 成为可学习参数,使得网络能够根据数据自适应地调整负半轴的斜率,提高了网络的表达能力。
性能更优:相比 Leaky ReLU,在一些情况下能取得更好的训练效果和性能表现。
缺点
增加训练参数:引入了额外的可学习参数,增加了网络的复杂度和训练参数的数量,可能会导致过拟合风险增加。
6. ELU 函数
ELU(Exponential Linear Unit,指数线性单元)函数结合了 Sigmoid 和 ReLU 的优点,表达式为
其中 是一个固定的超参数,通常取 0.1 或 0.2 。
优点
加快收敛速度:在 时,函数值会取到负数,使得输出均值接近 0,从而加快网络的收敛速度。
缓解梯度消失:在 时,函数的导数不为 0,缓解了在负半轴的梯度消失问题。
缺点
计算复杂度增加:在 时涉及指数运算,相比 ReLU 函数,计算复杂度有所提高。
超参数问题: 的值需要手动设定,合适的 值需要通过实验来确定。
不同的激活函数适用于不同的场景和任务,在构建神经网络时,需要根据具体问题、网络结构和数据特点,合理选择激活函数,以达到更好的训练效果和性能表现。