神经网络常见激活函数 4-LeakyReLU函数

LeakyReLU

  • LeakyReLU: Leaky Rectified Linear Unit

函数+导函数

  • LeakyReLU函数
    L e a k y R e L U = { x x > = 0 p x x < 0 p ∈ ( 0 , 1 ) \rm Leaky{ReLU} = \left\{ \begin{array}{} x \quad x>=0 \\ px \quad x<0 \end{array} \right. \quad p \in (0,1) LeakyReLU={xx>=0pxx<0p(0,1)

  • LeakyReLU函数导数
    d d x L e a k y R e L U = { 1 x ≥ 1 p x < 0 p ∈ ( 0 , 1 ) \frac{d}{dx} \rm LeakyReLU = \left\{ \begin{array}{} 1 \quad x \ge1 \\ p \quad x < 0 \end{array} \right. \quad p \in (0,1) dxdLeakyReLU={1x1px<0p(0,1)
    它和 ReLU 函数的不同之处在于,当 x 小于零时,LeakyReLU 函数的导数值并不为 0,而 是常数𝑝,p 一般设置为某较小的数值,如 0.01 或 0.02


函数和导函数图像

  • 画图

    下面是的 p = 0.5 p=0.5 p=0.5 时候的情况,请注意,p 一般设置为较小值。

    import numpy as np
    from matplotlib import pyplot as plt
    
    # 定义 PReLU 函数
    def prelu(x, alpha=0.25):
        return np.where(x < 0, alpha * x, x)
    
    # 定义 PReLU 的导数
    def prelu_derivative(x, alpha=0.25):
        d = np.where(x < 0, alpha, 1)
        return d
    
    # 生成数据
    x = np.linspace(-2, 2, 1000)
    alpha = 0.5  # 可以调整 alpha 的值
    y = prelu(x, alpha)
    y1 = prelu_derivative(x, alpha)
    
    # 绘制图形
    plt.figure(figsize=(12, 8))
    ax = plt.gca()
    plt.plot(x, y, label='PReLU')
    plt.plot(x, y1, label='Derivative')
    plt.title(f'PReLU (alpha={alpha}) and Partial 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()
    

    image-20250122173136461

    LeakyReLU 函数有效的克服了 ReLU 函数的缺陷,使用也比较广泛。


优缺点

  • Leaky Relu 的优点(相对 ReLU的改进)

    1. 与 ReLU 函数相比,Leaky ReLU 通过在负半轴引入一个小的线性分量(如 0.01x)来调整负值的梯度问题;这有助于扩大 ReLU 函数的范围,通常斜率 p 的值为 0.01 左右;函数范围是负无穷到正无穷。
    2. Leaky ReLU 激活函数通过在负半轴添加一个小的正斜率(如 0.01),使得负轴的信息不会全部丢失。通过这种方式,Leaky ReLU 激活函数可以确保模型训练过程中神经元的权重在输入小于 0 的情况下依然会得到更新。
    3. 不会出现 Dead ReLU 问题,但关于输入函数 f(x)的部分仍然容易出现梯度爆炸的情况,因此必要时可以搭配 Sigmoid 或 Tanh 使用。
  • Leaky Relu 的缺点

    1. 经典(以及广泛使用的)ReLU 激活函数的变体,带泄露修正线性单元(Leaky ReLU)的输出对负值输入有很小的坡度。由于导数总是不为零,这能减少静默神经元的出现,允许基于梯度的学习(虽然会很慢)。
    2. 从理论上讲,Leaky ReLU 具有 ReLU 的所有优点,而且 Dead ReLU 不会有任何问题,但在实际应用中,尚未完全证明 Leaky ReLU 总是比 ReLU 更好。

pytorchLeakyReLU_100">pytorch中的LeakyReLU函数

  • 代码

    import torch
    
    x = torch.randn(2)
    f = torch.nn.LeakyReLU(negative_slope=0.1) # negative_slope是个常数,即负值部分的斜率
    
    leakyRelu_x = f(x)
    
    print(f"x: \n{x}")
    print(f"leakyRelu_x:\n{leakyRelu_x}")
    
    """输出"""
    x: 
    tensor([-1.7098,  0.3351])
    leakyRelu_x:
    tensor([-0.1710,  0.3351])
    

    为了便于演示,这里的 p设置成了0.1,即代码中的negative_slope,我们可以看到输出,当x小于0 的时候,leakyRelu_x的结果被乘以0.1。


tensorflow 中的LeakyReLU函数

  • 代码

    python: 3.10.9

    tensorflow: 2.18.0

    import tensorflow as tf
    
    
    alpha = 0.1  # 定义 LeakyReLU 函数,alpha 是负值部分的斜率
    f = lambda x: tf.nn.leaky_relu(x, alpha=alpha)
    
    
    x = tf.random.normal([2])
    leaky_relu_x = f(x)
    
    print(f"x: \n{x}")
    print(f"leaky_relu_x:\n{leaky_relu_x}")
    
    """输出"""
    x: 
    [-0.733668    0.06844683]
    leaky_relu_x:
    [-0.07336681  0.06844683]
    

    同上,这里的 p设置成了0.1,即代码中的alpha,我们可以看到输出,当x小于0 的时候,leakyRelu_x的结果被乘以0.1。



http://www.niftyadmin.cn/n/5845493.html

相关文章

LeetCode 每日一题 2025/1/27-2025/2/2

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 1/27 45. 跳跃游戏 II1/28 119. 杨辉三角 II1/29 219. 存在重复元素 II1/30 350. 两个数组的交集 II1/31 541. 反转字符串 II2/1 81. 搜索旋转排序数组 II2/2 598. 区间加法…

Kotlin协程详解——协程取消与超时

目录 一、协程取消 1.取消协程的执行 2.使计算代码可取消 3.在finally中释放资源 4.运行不能取消的代码块 二、协程超时 异步超时与资源管理 一、协程取消 1.取消协程的执行 在一个长时间运行的应用程序中&#xff0c;你也许需要对你的后台协程进行细粒度的控制。 比如…

LeetCode 72.编辑距离

要解决LeetCode 72题“编辑距离”问题&#xff0c;我们可以使用动态规划的方法。以下是详细的C解题思路和实现过程&#xff1a; 解题思路 问题分析 编辑距离问题要求将字符串 word1 转换为 word2 所需的最少操作次数&#xff0c;允许的操作包括插入、删除和替换字符。动态规划…

零基础学习书生.浦语大模型--基础岛

第二关:玩转书生[多模态对话]和[AI搜索]产品 任务一&#xff1a;使用MindSearch 任务二&#xff1a;尝试使用书生.浦语 尝试让其写一段Self-Attention网络模块代码 import torch import torch.nn as nn import torch.nn.functional as Fclass SelfAttention(nn.Module):def _…

Explain 是 SQL 查询优化中非常重要的工具,它用于分析 SQL 查询的执行计划

Explain 是 SQL 查询优化中非常重要的工具&#xff0c;它用于分析 SQL 查询的执行计划https://mp.weixin.qq.com/s/QKra-Sp5JoaEPSCqfffOtA

Spring Cloud 01 - 微服务概述

微服务概述 文章目录 微服务概述一&#xff1a;分布式和微服务1、什么是微服务&#xff1f;2&#xff1a;什么是分布式3、联系与区别是什么&#xff1f; 2&#xff1a;最终技术搭配方案 一&#xff1a;分布式和微服务 1、什么是微服务&#xff1f; 微服务架构是团队面对互联网…

centos虚拟机迁移没有ip的问题

故事背景&#xff0c;我们的centos虚拟机本来是好好的&#xff0c;但是拷贝到其他电脑上就不能分配ip&#xff0c;我个人觉得这个vmware他们软件应该搞定这个啊&#xff0c;因为这个问题是每次都会出现的。 网络选桥接 网络启动失败 service network restart Restarting netw…

数据库基础练习4(有关索引,视图完整解答)

建立需要的表 学生表 mysql> create table studnet(sno int primary key auto_increment,sname varchar(30) not null unique,ssex varchar(2) check (ssex男 or ssex女) not null ,sage int not null,sdept varchar(10) default 计算机 not null); Query OK, 0 rows affe…