目录
[Tanh 函数](#Tanh 函数)
[ReLU(Rectified Linear Unit)函数](#ReLU(Rectified Linear Unit)函数)
[Leaky ReLU](#Leaky ReLU)
[ELU(Exponential Linear Unit)](#ELU(Exponential Linear Unit))
激活函数(Activation Function) 是神经网络中的一个关键组件,负责将输入的线性组合转化为非线性输出。它赋予神经网络模型以复杂的表达能力,使其能够处理非线性问题,比如分类、图像识别和自然语言处理等任务。
Sigmoid
Sigmoid 函数是深度学习中最早广泛使用的激活函数之一,它将输入值映射到 ( 0 , 1 ) 的区间,输出为一个概率值。其公式为:
特点 :输出值在 0 00 到 1 11 之间,因此常用于二分类问题。
缺点 :梯度消失问题,在输入值较大或较小时,Sigmoid 函数的梯度(导数)接近零,这会导致反向传播过程中梯度逐渐减小(消失),影响权重的更新,特别是在深层网络中。
图示:
Tanh 函数
Tanh(双曲正切函数)是 Sigmoid 的扩展版本,输出范围为 ( − 1 , 1 ) ,可以解决 Sigmoid 在输出上的偏移问题。其公式为
特点 :输出范围为 ( − 1 , 1 ) (-1, 1)(−1,1),相比 Sigmoid 更加居中,能够减少偏移(mean shift)问题。
缺点 :同样存在梯度消失问题,在输入值非常大或非常小时,Tanh 的梯度依然会变得很小。
图示:
ReLU(Rectified Linear Unit)函数
ReLU 是目前使用最为广泛的激活函数之一。ReLU 函数的输出在正数区域保持线性,在负数区域则为 0。其公式为:
特点 :当输入大于 0 时,ReLU 直接输出输入值;当输入小于 0 时,输出为 0。
优点 :
解决梯度消失问题:ReLU 的梯度为 1(当 x > 0 x > 0x>0 时),不会像 Sigmoid 和 Tanh 那样使梯度变小,从而有效缓解梯度消失问题。
计算效率高:ReLU 计算非常简单,只需要一个最大值操作,非常适合在深层网络中使用。
缺点:死亡 ReLU 问题,当输入的值小于 0 时,ReLU 的输出一直为 0,这意味着神经元可能会永远不再激活,这在某些情况下会导致网络性能下降。
Leaky ReLU
Leaky ReLU 是对 ReLU 的一种改进,解决了 ReLU 在负数区域输出为 0 时神经元"死亡"的问题。Leaky ReLU 在负数区域给予一个很小的正数斜率 α (通常为 0.01)而不是完全为 0,其公式为:
优点:在负数区域仍然保持一个小的斜率,使得神经元不完全失活。减少了 ReLU 函数中的死亡 ReLU 问题,确保神经元即使在负值输入时也能有一定的梯度更新。
ELU(Exponential Linear Unit)
ELU 是另一种改进的 ReLU 激活函数,在负数区域使用指数函数进行平滑。其公式为:
其中 α 是一个超参数,通常取值为 1。
- 特点:在正数区域与 ReLU 类似,但在负数区域使用指数函数进行平滑,避免了死亡 ReLU 问题。
- 优点:与 Leaky ReLU 相比,ELU 在负数区域提供的平滑曲线可以在一定程度上减少偏差。
- 缺点:计算量比 ReLU 稍大,因为负数区域的计算涉及指数运算。
SEIU
是ELU激活函数的可扩展变体,如果你构建一个仅由密集层堆叠组成的神经网络,并且如果所有隐藏层都使用SELU激活函数,则该网络是自归一化的:每层的输出倾向于在训练过程中保留平均值0和标准差1,从而解决了梯度消失/梯度爆炸的问题。
SELU激活函数通常大大优于这些神经网络(尤其是深层神经网络)的其他激活函数。但是,有一些产生自归一化的条件
- ·输入特征必须是标准化的(平均值为0,标准差为1)。
- ·每个隐藏层的权重必须使用LeCun正态初始化。在Keras中,这意味着设置kernel_initializer="lecun_normal"。·
- 网络的架构必须是顺序的。不幸的是,如果你尝试在非顺序架构(例如循环网络)中使用SELU(见第15章)或具有跳过连接的网络(即在Wide&Deep网络中跳过层的连接),将无法保证自归一化,因此SELU不一定会胜过其他激活函数。
Swish
Swish 是一种新的激活函数,由 Google 提出,它结合了 ReLU 和 Sigmoid 的优势。其公式为
特点 :Swish 在小于 0 的输入值时逐渐趋近于 0,而在大于 0 时逐渐增大,因此它在负值区域不会像 ReLU 那样硬性截断。
优点 :Swish 的非线性变化更加平滑,能够捕获更多的复杂模式,特别适合用于深度神经网络中。
缺点:计算量比 ReLU 更大,因为它涉及 Sigmoid 的计算。
激活函数的选择
神经网络中的激活函数选择取决于具体任务和网络结构。以下是一些常见的经验法则:
- ReLU 是目前最常用的激活函数,特别是在卷积神经网络(CNN)和全连接网络(FCN)中表现优异。对于大多数深度网络,ReLU 是一个很好的起点,因为它能有效避免梯度消失问题。
- Leaky ReLU 和 ELU 是 ReLU 的改进版本,适合于有负输入的场景或避免神经元失活的场景。
- Sigmoid 和 Tanh 适用于一些特殊情况,特别是在需要输出概率或对称输出的情况下(例如,输出为 [ − 1 , 1 ] [-1, 1][−1,1])。不过它们通常会导致梯度消失,因此不推荐用于深层网络。
- Swish 是一种更平滑的激活函数,在某些复杂任务(如超深网络)上可能表现优异。
通常SELU>ELU>leaky ReLU(及其变体)>ReLU>tanh>logistic
- 如果网络的架构不能自归一化,那么ELU的性能可能会优于SELU(因为SELU在z=0时不平滑)。
- 如果你非常关心运行时延迟,那么你可能更喜欢leaky ReLU。
- 如果你不想调整其他超参数,则可以使用Keras使用的默认α值(例如,leaky ReLU为0.3)。
如果你有空闲时间和计算能力,则可以使用交叉验证来评估其他激活函数,例如,如果网络过拟合,则为RReLU;如果你的训练集很大,则为PReLU。也就是说,由于ReLU是迄今为止最常用的激活函数,因此许多库和硬件加速器都提供了ReLU特定的优化。因此,如果你将速度放在首位,那么ReLU可能仍然是最佳选择。
参考文章