在深度学习领域,卷积神经网络(CNN)因其复杂的架构而有很大的改进空间。研究人员尝试了多种方法来提高模型的效果,包括不同的图像分类方法、调整学习率、使用Dropout等正则化技术等。这些不同的方法都取得了更好的结果,但对于CNN模型来说,激活函数始终是其核心。因此,考虑到激活函数在CNN中的重要性,正确使用激活函数是非常必要的。
激活函数可以是线性或非线性的,根据其代表的函数类型,用于控制神经网络的输出。它们被用于从对象识别和分类到语音识别、分割、癌症检测系统、指纹检测、天气预报、自动驾驶汽车等多个领域。
在实现过程中,对使用哪种激活函数存在疑问。本文将逐一探讨不同的激活函数,并深入探讨它们的优缺点。
神经网络的输入层接收训练数据,这些数据以不同的格式出现,如图像、音频或文本。从数据集中,输入特征与权重和偏差一起用于计算线性函数。然后,这个线性函数的结果被用作激活函数的输入,计算出的激活进一步作为输入传递给下一层。
在深度神经架构的单次迭代中,基本上发生了三个重要的步骤:前向传播、反向传播和梯度下降(优化)。
1. 前向传播:在这一步中,输入数据被向前传递通过神经网络的每层。在这一步中进行线性计算,并应用激活函数。
2. 反向传播:这一步有助于计算所有将用于优化或更新参数的导数。
3. 优化:这一步有助于通过在每次迭代中不断更新参数来收敛损失函数。一些优化算法如下:梯度下降、动量、Adam、AdaGrad、RMSProp等。
1. Sigmoid函数
f(x) = 1 / (1 + e^(-x))
Sigmoid函数的最大优势在于其非线性。该函数范围在0到1之间,呈S形。也被称为逻辑或压缩函数。Sigmoid函数用于DNN的输出层,用于基于概率的输出。其主要缺点是反向传播期间梯度急剧减弱,梯度饱和,收敛速度慢,非零中心输出导致梯度更新在不同方向传播。
其他变体:
- I. Hard Sigmoid函数
- II. Sigmoid加权线性单元(SiLU)
2. TanH函数
f(x) = (e^x - e^(-x)) / (e^x + e^(-x))
双曲正切函数是一个零中心函数,其范围在-1到1之间。由于这个函数是零中心的,这使得它更容易模拟具有强烈负、中性和强烈正值的输入。如果输出不是0和1,建议使用tanh函数而不是sigmoid函数。tanh函数主要用于RNN的自然语言处理和语音识别任务。
3. 修正线性单元(ReLU)
f(x) = x if x ≥ 0 and 0 if x < 0
ReLU是深度学习应用中最广泛使用的激活函数,取得了最先进的结果。它在性能和泛化方面比Sigmoid和Tanh激活函数有优势。除了提高整体计算速度外,ReLU还提供了更快的计算速度,因为它不计算指数和除法。它比sigmoid函数更容易过拟合,这是其主要限制之一。一些技术如dropout用于减少过拟合。
其他变体:
- I. Leaky ReLU(LReLU)
- II. 参数化ReLU(PReLU)
- III. 随机Leaky ReLU(RReLU)
- IV. S形ReLU(SReLU)
4. Softplus函数
f(x) = log(1 + e^x)
Softplus由Dugas在2001年提出,具有平滑和非零梯度特性,从而增强了设计有软加单元的DNN的稳定性和性能。与ReLU和Sigmoid函数相比,Softplus函数在训练期间显示出更好的性能,并且收敛所需的迭代次数更少。
5. 指数线性单元(ELUs)
f(x) = x if x > 0 and f(x) = α(e^x - 1) if x < 0
指数线性单元由Clevert在2015年提出。由于它通过在训练期间将均值激活推向零来减少偏差偏移,ELU是ReLU的一个好替代品。ELU的一个限制是ELU不将值居中于零。
其他变体:
- I. 参数化ELU(PELU)
- II. 缩放ELU(SELU)
6. Swish函数
f(x) = x * sigmoid(x) = x / (1 + e^(-x))
Swish激活函数由Ramachandran在2017年提出。它是第一个由sigmoid函数和输入函数组合提出的复合函数之一。平滑属性使其在训练深度学习架构时产生更好的优化和泛化结果。这个函数不受消失梯度问题的影响。
- 1.仅在隐藏层中使用ReLU函数
- 2.在二元分类中记得在输出层使用Sigmoid函数
- 3.在多类分类问题(当要预测的类别超过2个)中使用Softmax函数在输出层
- 4.由于消失梯度问题,有时在深度神经网络架构中避免使用‘Sigmoid’和‘Tanh’激活函数
- 5.永远记住也可以发明自己的激活函数,并可以检查其与其他函数的性能