引言
在机器学习中,
Sigmoid
和ReLU
是两种常用的激活函数,它们在神经网络中扮演着重要的角色,但各有特点和适用场景
一、Sigmoid激活函数
1.1 公式
f ( x ) = 1 1 + e − x f(x) = \frac{1}{1 + e^{-x}} f(x)=1+e−x1
1.2 特点
将输入值映射到0到1之间的概率值,适用于二分类问题的输出层
1.3 优点
输出值介于0和1之间,可以解释为概率
1.4 缺点
- 当输入值非常大或非常小的时候,梯度几乎接近于0,导致梯度消失问题
- 输出不是零中心,可能影响训练稳定性
二、ReLU激活函数
2.1 公式
f ( x ) = max ( 0 , x ) f(x) = \max(0, x) f(x)=max(0,x)
2.2 特点
在正值范围内具有线性特性,计算速度快
2.3 优点
计算简单,输出是零中心,有助于加速训练过程和改善训练稳定性
2.4 缺点
在负值域内梯度为零,可能导致“死亡ReLU
”问题,即某些神经元可能永远不会被激活
三、sigmoid和ReLU的区别
3.1 计算效率
ReLU
的计算效率高于Sigmoid
,因为ReLU
的计算更简单
3.2 梯度消失/弥散问题
Sigmoid
存在梯度消失问题,尤其是在深度神经网络中;而ReLU在负值域内没有梯度,但相对较少出现梯度弥散问题
3.3 模型收敛速度
ReLU
有助于加快模型收敛速度,而Sigmoid
可能需要更长的训练时间
3.4 适用场景
Sigmoid
适用于二分类问题,而ReLU
在处理多分类问题、图像识别、自然语言处理等任务时更为常见
3.5 总结
Sigmoid
和ReLU
各有优缺点,选择哪种激活函数取决于具体的应用场景和需求
四、深层网络中用哪种激活函数好
4.1 结论
在深层网络中,ReLU
通常是比Sigmoid
更受欢迎的选择
4.2 原因
4.2.1 梯度消失问题
Sigmoid函数在输入非常大或非常小的时候,其输出接近于0或1,导致梯度接近于0。在深层网络中,这种梯度消失问题会随着层数的增加而加剧,使得网络难以训练。而ReLU函数在正值域内的梯度恒为1,能有效减少梯度消失问题。
4.2.2 计算效率
ReLU
函数的计算比Sigmoid
简单,因为它主要涉及阈值操作,这有助于加速深层网络的训练过程。
4.2.3 收敛速度
ReLU
函数有助于网络更快地收敛,因为它提供了更直接的梯度信息。
4.3 ReLU的局限性
ReLU
会有“死亡ReLU
”问题,即某些神经元可能因为输入始终为负而永远不被激活。为了解决这个问题,出现了几种改进的ReLU
变体,如Leaky ReLU
、Parametric ReLU
(PReLU
) 和ELU
等
4.4 总结
对于深层网络,ReLU
或其变体通常是更合适的选择,因为它们更能应对深层网络训练中的挑战。但是,最终的选择还应该基于具体的应用场景和数据集,有时也可能需要通过实验来确定最佳的激活函数
五、如何解决ReLU的死亡问题
ReLU激活函数的“死亡问题”(也称为“ReLU消失”或“ReLU饱和”)是指在某些情况下,神经元可能因为输入始终为负而输出始终为零,导致这些神经元在训练过程中停止学习
以下是一些解决或减轻ReLU死亡问题的方法:
5.1 Leaky ReLU
Leaky ReLU
为ReLU
添加了一个小的负斜率,通常设定为0.01。这意味着当输入小于零时,输出不再是零,而是输入的一个小倍数- 公式: f ( x ) = max ( 0.01 x , x ) f(x) = \max(0.01x, x) f(x)=max(0.01x,x)
5.2 Parametric ReLU (PReLU)
PReLU
与Leaky ReLU
类似,但负斜率是一个可学习的参数,可以在训练过程中被优化
5.3 Exponential Linear Units (ELU)
ELU
函数在负值域内具有指数衰减的特性,且在x=0时导数为1,有助于缓解梯度消失问题- 公式: f ( x ) = { x if x > 0 α ( e x − 1 ) if x ≤ 0 f(x) = \begin{cases} x & \text{if } x > 0 \\ \alpha(e^x - 1) & \text{if } x \leq 0 \end{cases} f(x)={xα(ex−1)if x>0if x≤0
- α是超参数,通常设定为1
5.4 Softplus
Softplus
是ReLU
的一个平滑版本- 公式: log ( 1 + e x ) \log(1 + e^x) log(1+ex)
- 它没有ReLU的硬拐点,但计算成本较高
5.5 使用批量归一化(Batch Normalization)
- 批量归一化可以减少内部协变量偏移,使激活函数的输入分布在训练过程中保持稳定,这有助于减少
ReLU
死亡问题
5.6 初始化策略
- 使用合适的权重初始化策略,如He初始化或Xavier初始化,可以帮助减少神经元在前向传播中激活为负值的概率
5.7 调整学习率
- 使用适当的学习率可以帮助网络更好地逃离局部最小值,减少神经元死亡的可能性
5.8 使用较小的网络或结构
- 较小的网络结构可能减少神经元死亡的问题,因为每个神经元的输入范围更易于控制
5.9 混合使用不同的激活函数
- 在网络的某些层使用
ReLU
,而在其他层使用不同的激活函数,如Sigmoid
或Tanh
,可以结合不同激活函数的优点。
5.10 总结
通过这些方法,可以在一定程度上减轻或解决ReLU
的死亡问题,从而提高神经网络训练的稳定性和性能
六、Tanh激活函数
在机器学习中,Tanh
(双曲正切)激活函数是另一种常用的非线性激活函数
6.1 公式
f ( x ) = tanh ( x ) = e x − e − x e x + e − x f(x) = \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} f(x)=tanh(x)=ex+e−xex−e−x
6.2 特点
6.2.1 输出范围
Tanh
函数的输出范围在-1到1之间,这意味着它的输出是零中心的,这有助于在训练过程中保持输入数据的均值接近于零
6.2.2 非线性
Tanh
函数在其定义域内是严格单调递增的,并且是非线性的,这使得它能够引入模型中的非线性因素,这对于学习复杂的函数映射至关重要
6.2.3 计算复杂度
Tanh
函数的计算复杂度高于ReLU
和Sigmoid
,因为它涉及指数运算
6.3 优点
- 输出是零中心的,这有助于加速学习过程,特别是在使用梯度下降算法时
- 比
Sigmoid
函数更广的输出范围可以提供更强的表达能力
6.4 缺点
- 仍然存在梯度消失问题,尤其是在深层网络中
- 计算成本高于
ReLU
6.5 应用场景
Tanh
激活函数常用于隐藏层,尤其是在处理需要零中心输出的场景- 在某些情况下,它可以用作输出层激活函数,尤其是在输出值需要在-1到1之间的情况
6.6 总结
- 在选择激活函数时,通常需要根据具体问题和网络架构来决定
ReLU
由于其简单性和在许多任务中的有效性,通常是最常用的选择,尤其是在深层网络中Tanh
在某些情况下仍然是一个不错的选择,特别是当网络的输入或输出需要零中心化时