
一、概述
神经网络中的激活函数是用于增加网络的非线性特性的函数,没有激活函数,神经网络将仅仅是一个线性模型,无法解决复杂的非线性问题。激活函数的选择对神经网络的性能有很大的影响。
基础激活函数是神经网络中使用较早、较为简单的激活函数,主要包括Sigmoid、Tanh、ReLU、ELU、SELU等,具体请参考老猿在CSDN博文《神经网络激活函数列表大全及keras中的激活函数定义 https://blog.csdn.net/LaoYuanPython/article/details/142731106 》的介绍。
随着深度学习的发展,为了解决基础激活函数的一些问题(如梯度消失、梯度爆炸、计算复杂度等),研究者们提出了一些高级激活函数,如Leaky ReLU、Parametric ReLU (PReLU)等。高级激活函数是在基础激活函数的基础上发展起来的,继承了基础激活函数的某些特性,同时引入了新的机制来改进性能,通常是为了解决基础激活函数在实际应用中遇到的问题。
高级激活函数通常比基础激活函数更复杂,可能包含更多的参数或计算步骤,通常旨在解决基础激活函数的某些限制,如梯度消失或激活函数的非单调性。基础激活函数适用于大多数情况,但高级激活函数可能在特定任务或网络结构中表现更好。
选择哪种激活函数通常取决于具体任务的需求、数据的特性以及实验的结果。在实践中,可能需要尝试不同的激活函数来找到最适合特定问题的激活函数。
二、常见的高级激活函数
2.1、LeakyReLU
Leaky ReLU(Leaky Rectified Linear Unit)是一种改进的ReLU(Rectified Linear Unit)激活函数,旨在解决ReLU在处理负输入值时的梯度消失问题,以提高训练的稳定性和性能。
2.1.1、LeakyReLU计算方法
当输入大于0时,输出等于输入;当输入小于0时,输出是一个小的非零值,通常由一个小的正数斜率(如0.01)乘以输入值。
计算公式:LeakyReLU(x)=max(0,x)+α×min(0,x),其中α 是负斜率,通常设置为一个小的正数。
2.1.2、LeakyReLU优缺点
LeakyReLU优点:
- Leaky ReLU避免了神经元死亡问题,因为对于负输入,它仍然允许梯度流动,使得权重可以更新
- 在正输入时保持了ReLU的快速计算特性
LeakyReLU缺点:
- 对于α 的选择比较敏感,需要适当的调整
- 在某些情况下,可能不如其他激活函数(如ELU或PReLU)表现好。
2.1.3、Keras中的LeakyReLU函数定义
函数定义:keras.layers.LeakyReLU(x,α =0.3)
输入:x为输入张量,α 为一个大于等于0的浮点数标量,表示负数部分的斜率,如果将该层作为模型的第一层, 则需要指定 input_shape 参数 (整数元组,不包含样本数量的维度),实际调用时x是不用传参的,因为处理的数据就是神经网络的权重参数
输出:与输入相同维度的张量
使用LeakyReLU示例代码请参考《使用mnist数据集和LeakyReLU高级激活函数训练神经网络示例代码 https://blog.csdn.net/LaoYuanPython/article/details/142893487》的介绍。
2.2、PReLU
与LeakyReLU类似,PReLU(Parametric ReLU)也是对ReLU(Rectified Linear Unit)的改进和扩展,老猿认为这也是对LeakReLU的改进。PReLU的目的同样是解决ReLU在训练过程中可能遇到的“死亡ReLU”问题,即当输入为负数时,ReLU的梯度为零,导致网络在反向传播过程中无法更新那些只接收负输入的神经元的权重。
与LeakyReLU类似,为解决“死亡ReLU”问题,PReLU通过为负输入值引入一个可学习的参数α来允许小的梯度,只不过PReLU与LeakyReLU不同的是,在α值的处理上有2点差异:
- PReLU的α值是与输入值有相同维度和形状大小,而LeakyReLU的α值为固定的浮点数,类似于 PReLU的α值的每个值都相等的特殊情况;
- PReLU的α值在训练过程中与模型参数采用相同的优化算法进行调整
PReLU的公式如下:PReLU(x,α ) = max(0,x)+αmin(0,x)
其中:x 是输入值,即模型的参数,α 是一个可学习的参数,通常是一个介于0和1之间的小数,用于控制负输入值的梯度大小。
PReLU的特点:
- 参数化:PReLU的关键在于参数 α 是通过训练数据学习得到的,而不是固定的。这使得PReLU能够自适应地调整其行为以适应特定的任务
- 稀疏激活:与ReLU一样,PReLU在正输入值时也是稀疏激活的,有助于减少模型的复杂性和过拟合
- 减少死亡神经元:通过为负输入值引入非零梯度,PReLU减少了神经元死亡的风险,有助于梯度流动和网络的收敛
- 灵活性:PReLU允许每个神经元或每个特征图通道有自己的α参数,这增加了模型的灵活性
- 实现简单:PReLU可以很容易地在现有的深度学习框架中实现,如TensorFlow和Keras。
PReLU在许多视觉任务中被证明是有效的,尤其是在需要复杂特征提取的网络中,如图像分类、目标检测和语义分割等。
keras中PReLU函数定义:
keras.layers.PReLU(alpha_initializer=‘zeros’, alpha_regularizer=None, alpha_constraint=None, shared_axes=None)
在Keras中,keras.layers.PReLU是一个激活层,用于添加Parametric ReLU激活功能
其中:
- alpha 是一个可学习的数组,维度大小与输入数据相同
- alpha_initializer:initializer类型,默认值:‘zeros’,用于初始化PReLU中的参数α(alpha),类似模型权重参数的初始化,具体初始化方法请参考老猿博文《Keras中initializers模块常见模型初始化方法详解 https://blog.csdn.net/LaoYuanPython/article/details/142140285》的介绍
- alpha_regularizer:用于指定应用于α的正则化器。默认值:None,表示不应用正则化,其他选项:可以是l1、l2、l1_l2等正则化器。
- 老猿注:正则化是一种防止过拟合的技术,它通过添加一个惩罚项到损失函数来工作,正则化相关的处理请参考老猿付费专栏博文《机器学习中结构风险最小化的正则化项用途及原理详解 https://blog.csdn.net/LaoYuanPython/article/details/141722434》的介绍。
- alpha_constraint:用于约束α的取值范围,这可以防止α在训练过程中偏离某个范围,有助于模型的泛化能力。默认值:None,表示不应用约束,可以是min_max、non_neg等约束。关于约束的介绍在老猿后续的博文中将有介绍;
- shared_axes:元祖类型,指定应该共享α的轴。如果指定了共享轴,那么在这些轴上的所有神经元将共享相同的α值。默认值为None,表示每个神经元都有自己的α值。其他选项:可以是一个轴的元组,例如(1,)表示在第一个轴上的所有神经元共享相同的α值。
2.3、ThresholdedReLU带阈值的修正线性单元
ThresholdedReLU是ReLU(Rectified Linear Unit)的一个变种。ReLU函数的定义是当输入x大于0时,输出x;当输入x小于或等于0时,输出0。而ThresholdedReLU则在此基础上增加了一个阈值(threshold)参数,只有当输入x大于这个阈值时,函数才输出x;如果输入x小于或等于这个阈值,函数输出0。threshold 是一个浮点数,表示激活的阈值,默认值为1.0。
这种激活函数的主要优势是可以保留大于阈值的输入信息,同时将小于等于阈值的输入置为0,有助于网络在学习过程中筛选出对模型贡献较小或者不重要的输入信息,同时突出对模型贡献较大的输入。ThresholdedReLU激活函数的使用场景相对有限,通常用于稀疏化计算、特征选择或减少网络参数等任务中。
keras中PReLU函数定义:
keras.layers.ThresholdedReLU(theta=1.0),其中theta为阈值。
2.4、其他高级激活函数
在keras官方文档中,同时介绍了ELU、Softmax、ReLU三个激活函数,而这三个激活函数在其激活函数的官方文档中也包括了,在这里就不展开进行介绍了,大家可以参考老猿博文《神经网络激活函数列表大全及keras中的激活函数定义 https://blog.csdn.net/LaoYuanPython/article/details/142731106》的相关介绍。
##、三、小结
本文介绍了神经网络中常用的高级激活函数以及Keras中的具体函数,高级激活函数通常比基础激活函数更复杂,可能包含更多的参数或计算步骤,通常旨在解决基础激活函数的某些限制,如梯度消失或激活函数的非单调性。基础激活函数适用于大多数情况,但高级激活函数可能在特定任务或网络结构中表现更好。选择哪种激活函数通常取决于具体任务的需求、数据的特性以及实验的结果。在实践中,可能需要尝试不同的激活函数来找到最适合特定问题的激活函数。
更多人工智能知识学习请关注专栏《零基础机器学习入门》后续的文章。
更多人工智能知识学习过程中可能遇到的疑难问题及解决办法请关注专栏《机器学习疑难问题集》后续的文章。
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
关于老猿的付费专栏
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 https://blog.csdn.net/LaoYuanPython/article/details/107580932 使用PyQt开发图形界面Python应用专栏目录》;
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy音视频开发专栏文章目录》;
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》为《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的伴生专栏,是笔者对OpenCV-Python图形图像处理学习中遇到的一些问题个人感悟的整合,相关资料基本上都是老猿反复研究的成果,有助于OpenCV-Python初学者比较深入地理解OpenCV,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/109713407 OpenCV-Python初学者疑难问题集专栏目录 》
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10762553.html Python爬虫入门 》站在一个互联网前端开发小白的角度介绍爬虫开发应知应会内容,包括爬虫入门的基础知识,以及爬取CSDN文章信息、博主信息、给文章点赞、评论等实战内容。
前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。