激活函数大汇总(二十)(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(xti)xtr+bi(xtr) for xti for ti<x<tr for xtr
其中, t i t_i ti t r t_r tr分别是左侧和右侧饱和阈值, a i a_i ai b i b_i bi分别是左侧和右侧的斜率。这些参数都是可学习的,使得SReLU可以自适应地调整其形状以适应特定的数据分布。
【DL经典回顾】激活函数大汇总(二十)(SReLU附代码和详细公式)-LMLPHP

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 xti for ti<x<tr for xtT
导数显示了在不同区间内,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在两个饱和阈值titr之间时,保持其值不变,这部分相当于标准的线性单元(ReLU)的行为,保持输入的原始值。

  • 右侧饱和处理:当x大于或等于右侧饱和阈值tr时,应用公式tr + bi * (x - tr),模拟右侧的饱和性质。与左侧类似,但是用于处理正较大的输入值。

示例输出解释

给定从-11的输入值,输出展示了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的动机、定义、以及在多个基准数据集上的应用结果。
03-19 07:12