激活函数大汇总(二十)(SReLU附代码和详细公式)
更多激活函数见激活函数大汇总列表
一、引言
欢迎来到我们深入探索神经网络核心组成部分——激活函数的系列博客。在人工智能的世界里,激活函数扮演着不可或缺的角色,它们决定着神经元的输出,并且影响着网络的学习能力与表现力。鉴于激活函数的重要性和多样性,我们将通过几篇文章的形式,本篇详细介绍两种激活函数,旨在帮助读者深入了解各种激活函数的特点、应用场景及其对模型性能的影响。
在接下来的文章中,我们将逐一探讨各种激活函数,从经典到最新的研究成果。
限于笔者水平,对于本博客存在的纰漏和错误,欢迎大家留言指正,我将不断更新。(今天好累…难)
二、SReLU
SReLU(S-shaped Rectified Linear Activation Unit)是一种自适应的激活函数,旨在结合线性和非线性特性,通过引入可学习的参数来增强模型的表达能力。SReLU通过为每个神经元引入四个可学习参数,自适应地调整激活函数的形状。
1. 数学定义
SReLU由三个部分组成:左侧饱和线性部分、中间非线性部分和右侧饱和线性部分。给定输入 x x x,SReLU的数学表达式定义为:
SReLU ( x ) = { t i + a i ( x − t i ) for x ≤ t i x for t i < x < t r t r + b i ( x − t r ) for x ≥ t r \operatorname{SReLU}(x)= \begin{cases}t_i+a_i\left(x-t_i\right) & \text { for } x \leq t_i \\ x & \text { for } t_i<x<t_r \\ t_r+b_i\left(x-t_r\right) & \text { for } x \geq t_r\end{cases} SReLU(x)=⎩ ⎨ ⎧ti+ai(x−ti)xtr+bi(x−tr) for x≤ti for ti<x<tr for x≥tr
其中, t i t_i ti和 t r t_r tr分别是左侧和右侧饱和阈值, a i a_i ai和 b i b_i bi分别是左侧和右侧的斜率。这些参数都是可学习的,使得SReLU可以自适应地调整其形状以适应特定的数据分布。
2. 函数特性
- 自适应性:SReLU的核心特点是其自适应性,可通过训练学习最佳的激活形状。
- 结合线性和非线性:SReLU结合了线性和非线性特性,旨在捕获数据中的复杂模式,同时保持一定的信息流动性。
- 饱和性:在输入值极大或极小时,SReLU表现出饱和性,这有助于模型稳定。
3. 导数
SReLU函数的导数依赖于输入 x x x的范围:
d SReLU ( x ) d x = { a i for x ≤ t i 1 for t i < x < t r b i for x ≥ t T \frac{d \operatorname{SReLU}(x)}{d x}= \begin{cases}a_i & \text { for } x \leq t_i \\ 1 & \text { for } t_i<x<t_r \\ b_i & \text { for } x \geq t_T\end{cases} dxdSReLU(x)=⎩ ⎨ ⎧ai1bi for x≤ti for ti<x<tr for x≥tT
导数显示了在不同区间内,SReLU激活对输入变化的敏感度。
4. 使用场景与局限性
使用场景:
- 复杂模式学习:在需要模型学习复杂或非标准数据分布的应用中,SReLU的自适应性能提供优势。
- 深层网络:SReLU的结合线性和非线性特性有助于深层网络中的梯度流动和信息保留。
局限性:
- 参数增加:SReLU引入了额外的可学习参数,增加了模型的复杂度和训练成本。
- 优化难度:由于参数数量的增加,SReLU可能需要更细致的调优策略和更长的训练时间。
5.代码实现
下面是SReLU激活函数的Python实现,以及对该实现的详细解读:
import numpy as np
def srelu(x, ti, ai, tr, bi):
"""
实现SReLU(S-shaped Rectified Linear Activation Unit)激活函数。
参数:
x -- 输入的数值或NumPy数组。
ti -- 左侧饱和阈值。
ai -- 左侧斜率。
tr -- 右侧饱和阈值。
bi -- 右侧斜率。
返回:
经过SReLU激活的输出。
"""
# 对输入x应用SReLU激活函数
left_sat = np.where(x <= ti, ti + ai * (x - ti), x) # 左侧饱和段
right_sat = np.where(x >= tr, tr + bi * (x - tr), left_sat) # 右侧饱和段加上原始中间部分
return right_sat
# 示例参数
ti = -0.5 # 左侧饱和阈值
ai = 0.1 # 左侧斜率
tr = 0.5 # 右侧饱和阈值
bi = 0.1 # 右侧斜率
# 示例输入
x = np.linspace(-1, 1, 10) # 生成从-1到1的10个点
# 应用SReLU激活函数
output = srelu(x, ti, ai, tr, bi)
print("SReLU Output:", output)
详细解读
-
函数定义:
srelu
函数接受输入数组x
和四个参数:ti
(左侧饱和阈值),ai
(左侧斜率),tr
(右侧饱和阈值),bi
(右侧斜率)。这些参数允许SReLU函数在输入数据的不同区间内具有不同的行为。 -
左侧饱和处理:当
x
小于或等于左侧饱和阈值ti
时,应用公式ti + ai * (x - ti)
,模拟左侧的饱和性质。这允许激活函数在负较大的输入值时接近一个固定斜率ai
的线性函数。 -
中间非线性部分:当
x
在两个饱和阈值ti
和tr
之间时,保持其值不变,这部分相当于标准的线性单元(ReLU)的行为,保持输入的原始值。 -
右侧饱和处理:当
x
大于或等于右侧饱和阈值tr
时,应用公式tr + bi * (x - tr)
,模拟右侧的饱和性质。与左侧类似,但是用于处理正较大的输入值。
示例输出解释
给定从-1
到1
的输入值,输出展示了SReLU如何在不同的输入区间应用不同的行为。对于较小(负)的输入值,函数应用了左侧饱和处理,而对于较大(正)的输入值,则应用了右侧饱和处理。在两个饱和阈值之间的输入值保持不变,显示了中间的线性特性。
三、参考文献
- Jin, X., Xu, C., Feng, J., Wei, Y., Xiong, J., & Yan, S. (2016). “Deep Learning with S-shaped Rectified Linear Activation Units.” 在计算机视觉与模式识别会议(CVPR)上提出。这篇论文是SReLU激活函数的原始文献,详细介绍了SReLU的动机、定义、以及在多个基准数据集上的应用结果。