当前位置: 首页 > news >正文

神经网络常见激活函数 8-SELU函数

SELU

  • 缩放指数线性单元:SELU(Scaled Exponential Linear Unit)

函数+导函数

  • SELU函数
    S E L U ( x ) = { λ x x > 0 λ α ( e x − 1 ) x ≤ 0 \rm SELU(x) = \left\{ \begin{array}{} \lambda x \quad & x > 0 \\ \lambda \alpha (e^x - 1) \quad & x \le 0 \end{array} \right. SELU(x)={λxλα(ex1)x>0x0

  • SELU函数导数
    d d x S E L U ( x ) = { λ x > 0 λ α e x x ≤ 0 \frac{d}{dx} \rm SELU(x) = \left\{ \begin{array}{} \lambda \quad & x > 0 \\ \lambda \alpha e^x \quad & x \le 0 \end{array} \right. dxdSELU(x)={λλαexx>0x0
    其中, λ \lambda λ α \alpha α 是预先定义的常数,通常取值 为
    λ ≈ 1.0507 α ≈ 1.6732 \lambda \approx 1.0507 \\ \alpha \approx 1.6732 λ1.0507α1.6732


函数和导函数图像

  • 画图

    下面代码中的scale对应 λ \lambda λ, alpha 对应 α \alpha α

    import numpy as np
    from matplotlib import pyplot as plt
    
    # 定义 SELU 函数
    def selu(x, alpha=1.6732, scale=1.0507):
        return scale * np.where(x > 0, x, alpha * (np.exp(x) - 1))
    
    # 定义 SELU 的导数
    def selu_derivative(x, alpha=1.6732, scale=1.0507:
        return scale * np.where(x > 0, 1, alpha * np.exp(x))
    
    # 生成数据
    x = np.linspace(-2, 2, 1000)
    y = selu(x)
    y1 = selu_derivative(x)
    
    # 绘制图形
    plt.figure(figsize=(12, 8))
    ax = plt.gca()
    plt.plot(x, y, label='SELU')
    plt.plot(x, y1, label='Derivative')
    plt.title('SELU and Derivative')
    
    # 设置上边和右边无边框
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    
    # 设置 x 坐标刻度数字或名称的位置
    ax.xaxis.set_ticks_position('bottom')
    
    # 设置边框位置
    ax.spines['bottom'].set_position(('data', 0))
    ax.yaxis.set_ticks_position('left')
    ax.spines['left'].set_position(('data', 0))
    
    plt.legend(loc=2)
    plt.show()
    

    SELU


优缺点

  • SELU函数针对ReLU函数的改进
    1. 当其中参数 $\lambda \approx 1.0507 ,\alpha \approx 1.6732 $ 时候,在网络权重服从正态分布的条件下,各层输出的分布会向标准正太分布靠拢。这种【自我标准化】的特性可以避免梯度消失和爆炸。
    2. SELU激活函数是在自归一化网络中定义的,通过调整均值和方差来实现内部的归一化,这种内部归一化比外部归一化更快,这使得网络收敛的更快。
    3. SELU是给ELU乘上一个系数,该系数大于 1 。在这篇paper Self-Normalizing Neural Networks中,作者提到,SELU可以使得输入在经过一定层数之后变为固定的分布。以前的 ReLU,P-ReLU,ELU等激活函数都是在负半轴坡度平缓,这样在激活的方差过大时可以让梯度减小,防止了梯度爆炸,但是在正半轴其梯度简答的设置为了 1 。而 SELU的正半轴大于 1 ,在方差过小的时候可以让它增大,但是同时防止了梯度消失。这样激活函数就有了一个不动点,网络深了之后每一层的输出都是均值为 0 ,方差为 1 。
  • SELU 的优点

    1. 自归一化:SELU具有自归一化特性,能够自动调整网络中的激活值,使其均值和方差保持稳定。这有助于避免梯度爆炸和梯度消失问题。
    2. 解决“死亡ReLU”问题:与ReLU不同,SELU允许负输入,并通过参数α对其进行缩放,确保所有输入都对模型有贡献。
    3. 加速收敛:SELU通常能够更快地收敛,并在训练的早期阶段实现更好的准确率。
    4. 减少对批量归一化的依赖:由于SELU的自归一化特性,它减少了对批量归一化的需求,从而简化了模型结构。
    5. 适用于多种任务:SELU可以用于多分类和二分类任务,并且在深度神经网络中表现出色。
  • SELU 的缺点

    1. 对权重初始化敏感:SELU需要特定的权重初始化方法(LeCun正态初始化)才能发挥最佳效果。其他初始化方法可能会导致性能下降。
    2. 计算复杂度较高:SELU的指数运算比ReLU及其变体更复杂,计算成本更高。
    3. 资源有限:SELU不如ReLU广泛使用,这可能会使寻找基于SELU的架构的库或资源更具挑战性。
    4. 可能的过拟合风险:在某些情况下,SELU可能会导致模型过拟合,尤其是在数据集较小或模型复杂度较高时。

pytorch中的SELU函数

  • 代码

    import torch
    
    # 定义 SELU 函数
    f = torch.nn.SELU()  # PyTorch 提供的 SELU 激活函数模块
    x = torch.randn(2)   # 生成一个随机张量作为输入
    
    selu_x = f(x)        # 应用 SELU 函数
    
    print(f"x: \n{x}")
    print(f"selu_x:\n{selu_x}")
    
    """输出"""
    x: 
    tensor([ 0.1895, -0.8333])
    selu_x:
    tensor([ 0.1991, -0.9940])
    

tensorflow 中的SELU函数

  • 代码

    python: 3.10.9

    tensorflow: 2.18.0

    import tensorflow as tf
    
    # 创建 SELU 激活函数
    selu = tf.keras.activations.selu
    
    # 生成随机输入
    # x = tf.random.normal([2])
    x = x = [ 0.1895, -0.8333]
    
    # 应用 SELU 激活函数
    selu_x = selu(x)
    
    print(f"x: \n{x}")
    print(f"selu_x:\n{selu_x}")
    
    """输出"""
    x: 
    [0.1895, -0.8333]
    selu_x:
    [ 0.19910784 -0.99400705]
    

相关文章:

  • 【MyBatis】预编译SQL与即时SQL
  • 数据结构:串
  • 2025年如何选择合适的微服务工具
  • datasets: PyTorch version 2.5.1+cu124 available 这句话是什么意思
  • DeepSeek 遭 DDoS 攻击背后:DDoS 攻击的 “千层套路” 与安全防御 “金钟罩”_deepseek ddos
  • EMC测试中的环境噪声控制:为什么6dB是关键?
  • HCIA项目实践--动态路由的相关知识
  • 使用python脚本提取html网页上的所有文本信息
  • 【Linux】nmcli命令详解
  • 如何提升插屏广告在游戏APP广告变现表现,增加变现收益
  • 上位机知识篇---SSHSCP密钥与密钥对
  • LVS集群模式
  • linux笔记3----防火墙(ubuntu)
  • IoTDB 集群节点 IP 改变,如何更新集群
  • 更加通用的Hexo多端部署原理及实现,适用于各种系统之间
  • Apollo 9.0 速度动态规划决策算法 – path time heuristic optimizer
  • 关于 IoT DC3 中设备(Device)的理解
  • OpenCL实现深度图生成点云功能
  • Python的web框架Flask适合哪些具体的应用开发?
  • StartDT 刘莹:四大行业先锋的数据破局实践
  • 吴勇强、高颜已任南京市委常委
  • 圆桌丨权威专家解读中俄关系:在新形势下共同应对挑战、共创发展机遇
  • 公募基金行业迎系统性变革:基金公司业绩差必须少收费
  • 【社论】三个“靠谱”为市场注入确定性
  • 水中托举救出落水孩童后遇难,42岁退役军人高武被确认为见义勇为
  • 打造多元文旅消费场景,第四届长三角城市戏剧节启幕