html
深度学习中激活函数的全面指南
目录
什么是激活函数?
在神经网络中,激活函数决定了神经元在给定输入或一组输入下的输出。它们为网络引入了非线性特性,使其能够对数据中的复杂关系进行建模。如果没有激活函数,神经网络基本上会表现得像线性回归模型,严重限制了它们在解决现实问题中的适用性。
激活函数的关键作用:
- 非线性: 使网络能够学习复杂的模式。
- 归一化: 有助于缩放输出,防止梯度爆炸或消失等问题。
- 可微性: 对于训练期间的反向传播至关重要。
二元阶跃/阈值激活函数
定义:
二元阶跃函数是最简单的激活函数之一。它根据输入是否高于或低于某个阈值来输出二元值。
数学表示:
1234
f(z) = { 0 & if z < 0 1 & if z ≥ 0}
图示:

优点:
- 计算简单。
缺点:
- 在z = 0处不可微,使其不适用于基于梯度的优化。
- 不提供梯度信息,阻碍深层网络的学习。
使用场景:
主要用于早期的神经网络模型和具有简单数据集的二分类任务。
逻辑Sigmoid激活函数
定义:
Sigmoid函数将输入值映射到0到1之间的范围,适用于涉及概率的场景。
数学表示:
1
f(z) = 1 / (1 + e^{-z})
图示:

优点:
- 平滑的梯度,防止突变。
- 输出可以解释为概率,适用于二分类。
缺点:
- 容易出现梯度消失,尤其是输入值较大时。
- 不是以零为中心,这可能会减慢训练期间的收敛速度。
使用场景:
用于二分类模型的输出层以及浅层神经网络的隐藏层中。
双曲正切(Tanh)激活函数
定义:
Tanh函数类似于Sigmoid,但输出值在-1到1之间,能够对数据进行中心化,通常能带来更好的性能。
数学表示:
1
f(z) = tanh(z) = (e^{z} - e^{-z}) / (e^{z} + e^{-z})
图示:

优点:
- 以零为中心的输出,有助于基于梯度的优化。
- 相比Sigmoid,梯度更陡峭,减少梯度消失的可能性。
缺点:
- 对于大输入幅度仍然容易出现梯度消失。
- 计算上比ReLU更为复杂。
使用场景:
常用于神经网络的隐藏层,尤其是在处理序列数据的循环神经网络(RNN)中。
线性整流单元(ReLU)
定义:
ReLU是当前深度学习中最流行的激活函数,因其简单性和高效性而广受欢迎。它如果输入为正,则直接输出该输入;否则,输出零。
数学表示:
1
f(z) = max(0, z)
图示:

优点:
- 计算高效,易于实现。
- 缓解了梯度消失问题,使模型更快收敛。
- 鼓励激活的稀疏性,提高模型效率。
缺点:
- “死亡ReLU”问题:如果输入持续小于零,神经元可能会一直输出零。
- 不是以零为中心。
使用场景:
广泛用于深层神经网络的隐藏层,包括卷积神经网络(CNN)和深度前馈网络。
高级激活函数
虽然上述激活函数被广泛使用,但已经开发出多种高级变体,以解决它们的局限性并增强神经网络的性能。
带泄漏的ReLU
定义:
带泄漏的ReLU允许在单元不活跃时有一个小的非零梯度,解决了“死亡ReLU”问题。
数学表示:
12345
f(z) = { z & if z > 0 αz & if z ≤ 0}其中α是一个小常数(例如0.01)。
图示:

优点:
- 通过允许负输入的微小梯度,防止神经元死亡。
缺点:
- 引入了超参数(α),增加了复杂性。
使用场景:
在“死亡ReLU”问题明显的深层网络中更受欢迎。
指数线性单元(ELU)
定义:
ELU通过允许负输出扩展了ReLU,帮助使激活的均值更接近零。
数学表示:
12345
f(z) = { z & if z > 0 α(e^{z} - 1) & if z ≤ 0}其中α是一个正的常数。
图示:

优点:
- 产生带负值的输出,有助于更快的收敛。
- 减轻梯度消失问题。
缺点:
- 由于指数部分,计算上比ReLU更为复杂。
使用场景:
用于需要快速收敛的深层网络。
高斯误差线性单元(GELU)
定义:
GELU是ReLU的平滑版本,通过结合类似于dropout的行为引入随机正则化。
数学表示:
12
f(z) = z ⋅ Φ(z)其中Φ(z)是标准正态分布的累积分布函数。
图示:

优点:
- 提供非线性、平滑的激活,在某些架构如Transformer中表现更好。
缺点:
- 由于其复杂的公式,计算成本更高。
使用场景:
在自然语言处理模型中广泛使用,如BERT和GPT架构。
Softplus
定义:
Softplus是ReLU函数的平滑近似,确保在各处都可微。
数学表示:
1
f(z) = ln(1 + e^{z})
图示:

优点:
- 平滑且可微,便于基于梯度的优化。
- 避免了ReLU的尖锐过渡。
缺点:
- 比ReLU的计算成本更高。
使用场景:
在需要平滑性的场景中使用,如某些类型的生成模型。
缩放指数线性单元(SELU)
定义:
SELU自动将输出缩放为零均值和单位方差,促进神经网络的自我归一化特性。
数学表示:
12345
f(z) = λ { z & if z > 0 α(e^{z} - 1) & if z ≤ 0}其中λ和α是预定义的常数。
图示:

优点:
- 促进自我归一化的神经网络,减少对其他归一化技术的需求。
- 提高训练速度和模型性能。
缺点:
- 需要仔细的初始化和架构设计以保持自我归一化特性。
使用场景:
在旨在实现自我归一化的深度前馈网络中效果显著。
平方线性单元(SQLU)
定义:
SQLU在保持正输入的平方关系的同时引入非线性。
数学表示:
1234
f(z) = { z² & if z > 0 αz & if z ≤ 0}
图示:

优点:
- 通过引入多项式非线性增强了模型的容量。
缺点:
- 由于平方项,容易出现梯度爆炸。
- 使用较少,导致社区支持和资源有限。
使用场景:
在探索增强非线性变换的实验性模型中使用。
选择合适的激活函数
选择合适的激活函数对于神经网络的性能和效率至关重要。选择时应考虑以下因素:
- 问题的性质:
- 二分类: Sigmoid或Softmax(用于多分类)。
- 隐藏层: 通常首选ReLU及其变体。
- 网络深度:
- 由于其对梯度消失问题的抵抗,较深的网络更适合使用ReLU及其变体。
- 计算效率:
- 与ELU或GELU等函数相比,ReLU的计算成本更低。
- 归一化需求:
- SELU适用于自我归一化的网络。
- 经验性能:
- 通常,最佳的激活函数选择通过实验和交叉验证来确定。
最佳实践:
- 从ReLU开始: 由于其在各种场景中的简单性和有效性。
- 尝试变体: 如果遇到诸如神经元死亡的问题,可以考虑带泄漏的ReLU或ELU。
- 保持更新: 新的激活函数不断涌现,保持信息更新能带来性能提升。
结论
激活函数是神经网络成功的关键,能够使其从复杂的数据中学习和泛化。从二元阶跃的简单性到GELU和SELU的复杂性,每种激活函数都有其独特的优势和权衡。理解这些函数的数学基础和实际意义,使从业者能够设计出更有效和高效的深度学习模型。
常见问题解答(FAQs)
1. 为什么激活函数在神经网络中很重要?
激活函数为网络引入了非线性,使其能够对复杂关系进行建模,并执行超出简单线性变换的任务。
2. 深度学习中最常用的激活函数是什么?
线性整流单元(ReLU)是最广泛使用的激活函数,因其计算效率高且在缓解梯度消失问题方面有效。
3. 我可以在同一网络的不同层使用不同的激活函数吗?
可以,通常根据层的角色和问题的需求在不同层使用不同的激活函数。
4. Sigmoid和Tanh激活函数有什么区别?
虽然两者都是S形曲线,Sigmoid输出值在0到1之间,适合概率预测;Tanh输出值在-1到1之间,提供以零为中心的数据,有助于加速收敛。
5. 有哪些激活函数更适用于循环神经网络(RNN)?
Tanh和Sigmoid函数传统上更适合RNN,因为它们的有界输出有助于在训练期间保持梯度的稳定。
参考文献
作者注:
本文所提供的信息基于2023年10月的最新知识。欲了解激活函数的最新进展和研究,请始终参考深度学习领域的最新出版物和可信来源。