神经网络常见激活函数 6-RReLU函数

文章目录

    • RReLU
      • 函数+导函数
      • 函数和导函数图像
      • 优缺点
      • pytorch中的RReLU函数
      • tensorflow 中的RReLU函数

RReLU

  • 随机修正线性单元:Randomized Leaky ReLU

函数+导函数

  • RReLU函数
    R R e L U = { x x ≥ 0 a x x < 0 \rm RReLU = \left\{ \begin{array}{} x \quad x \ge 0 \\ a x \quad x < 0 \end{array} \right. RReLU={xx0axx<0
    其中,( a ) 是一个在训练过程中随机从均匀分布 ( U(l, u) ) 中采样的值,( l ) 和 ( u ) 是预先设定的下界和上界,通常 ( 0 < l < u < 1 )。

  • RReLU函数导数
    d d x R R e L U = { 1 x ≥ 0 a x < 0 \frac{d}{dx} \rm RReLU = \left\{ \begin{array}{} 1 \quad x \ge 0 \\ a \quad x < 0 \end{array} \right. dxdRReLU={1x0ax<0
    在 RReLU 中,当 ( x < 0 ) 时,导数是一个随机变量 ( a ),这个随机变量在每次训练时都会从 ( U(l, u) ) 中重新采样。与 LeakyReLU 不同,RReLU 的斜率 ( a ) 是随机的,而不是固定的。


函数和导函数图像

  • 画图

    分为两张图了,上面是训练阶段,在训练阶段,负值部分的斜率P是随机从区间[lower, upper]中采样的。在测试阶段,负值部分的斜率P是区间[lower, upper]的平均值((lower + upper) / 2)

    import numpy as np
    from matplotlib import pyplot as plt
    
    # 定义 RReLU 函数
    def rrelu_train(x, lower=0.125, upper=0.333):
        P = np.random.uniform(lower, upper)  # 训练阶段:随机化负值部分的斜率
        return np.where(x < 0, P * x, x)
    
    def rrelu_test(x, lower=0.125, upper=0.333):
        P = (lower + upper) / 2  # 测试阶段:使用负值部分的平均斜率
        return np.where(x < 0, P * x, x)
    
    # 定义 RReLU 的导数
    def rrelu_derivative_train(x, lower=0.125, upper=0.333):
        P = np.random.uniform(lower, upper)  # 训练阶段:随机化负值部分的斜率
        return np.where(x < 0, P, 1)
    
    def rrelu_derivative_test(x, lower=0.125, upper=0.333):
        P = (lower + upper) / 2  # 测试阶段:使用负值部分的平均斜率
        return np.where(x < 0, P, 1)
    
    # 生成数据
    x = np.linspace(-2, 2, 1000)
    lower = 1/8  # 负值部分斜率的下限
    upper = 1/3  # 负值部分斜率的上限
    
    # 训练阶段
    y_train = [rrelu_train(xi, lower, upper) for xi in x]
    y1_train = [rrelu_derivative_train(xi, lower, upper) for xi in x]
    
    # 测试阶段
    y_test = [rrelu_test(xi, lower, upper) for xi in x]
    y1_test = [rrelu_derivative_test(xi, lower, upper) for xi in x]
    
    # 绘制图形
    fig, axs = plt.subplots(2, 1, figsize=(12, 12))
    
    # 训练阶段
    axs[0].plot(x, y_train, label='RReLU (Train)', color='blue')
    axs[0].plot(x, y1_train, label='Derivative (Train)', color='orange')
    axs[0].set_title(f'RReLU (Train) and Derivative (lower={lower}, upper={upper})')
    axs[0].legend(loc='upper left')
    axs[0].spines['right'].set_color('none')
    axs[0].spines['top'].set_color('none')
    axs[0].spines['bottom'].set_position(('data', 0))
    axs[0].spines['left'].set_position(('data', 0))
    
    # 测试阶段
    axs[1].plot(x, y_test, label='RReLU (Test)', color='blue', linestyle='--')
    axs[1].plot(x, y1_test, label='Derivative (Test)', color='orange', linestyle='--')
    axs[1].set_title(f'RReLU (Test) and Derivative (lower={lower}, upper={upper})')
    axs[1].legend(loc='upper left')
    axs[1].spines['right'].set_color('none')
    axs[1].spines['top'].set_color('none')
    axs[1].spines['bottom'].set_position(('data', 0))
    axs[1].spines['left'].set_position(('data', 0))
    
    plt.tight_layout()
    plt.show()
    

    image-20250205111957796


优缺点

  • RReLU函数相对于PeLU函数的改进
    1. RReLU函数和PReLU函数的表达式一样,但是参数 α \alpha α 不一样,这里的 α \alpha α 是个随机震荡的数,范围是 1 8 − 1 3 \frac{1}{8} - \frac{1}{3} 8131
    2. 负部分的斜率在训练中被随机化到给定的范围内,然后再测试中被固定。而PReLU训练中的斜率是训练出来的。
  • RReLU 的优点

    1. 缓解“死亡ReLU”问题:与ReLU不同,RReLU在负输入时引入了一个随机的斜率,这使得神经元不会因为负输入而完全失去梯度,从而避免了“死亡ReLU”问题。
    2. 增强梯度流:RReLU通过在负输入时提供一个非零梯度,有助于改善梯度消失问题,使得网络在训练过程中能够更好地更新权重。
    3. 增加模型的灵活性:RReLU的随机斜率在训练过程中可以动态调整,这增加了模型的灵活性和适应性,使其能够更好地处理复杂的模式。
    4. 提高模型的泛化能力:由于RReLU在训练时引入了随机性,这可以作为一种正则化手段,有助于提高模型的泛化能力。
  • RReLU 的缺点

    1. 计算复杂度增加:RReLU的随机斜率需要在每次训练时进行计算,这增加了计算复杂度和训练时间。
    2. 参数选择敏感:RReLU的随机斜率范围需要合理选择,如果选择不当,可能会导致模型训练不稳定。
    3. 测试时的确定性问题:在训练阶段,RReLU使用随机斜率,而在测试阶段,通常会使用一个固定的斜率(通常是训练阶段随机斜率的期望值)。这种从随机到确定性的转换可能会导致测试时的性能与训练时略有差异。
    4. 可能的过拟合风险:由于RReLU引入了额外的随机性,如果数据集较小或模型复杂度较高,可能会增加过拟合的风险。

pytorch中的RReLU函数

  • 代码

    这里仅仅演示训练阶段 α \alpha α 为随机值的时候

    l o w e r = 1 / 8 \mathrm lower = 1/8 lower=1/8

    u p p e r = 1 / 3 \mathrm upper = 1/3 upper=1/3

    # 定义 RReLU 函数
    f = torch.nn.RReLU(lower=0.125,upper=0.333)  # PyTorch 提供的 RReLU 激活函数模块
    x = torch.randn(2)    # 生成一个随机张量作为输入
    
    rrelu_x = f(x)        # 应用 RReLU 函数
    
    print(f"x: \n{x}")
    print(f"rrelu_x:\n{rrelu_x}")
    
    """输出"""
    

tensorflow 中的RReLU函数

  • 代码

    python: 3.10.9

    tensorflow: 2.18.0

    rrelu并不是tensorflow标准库的一部分,为此我们实现一个RReLU函数,包含训练阶段和推理阶段

    这里仅仅演示训练阶段 α \alpha α 为随机值的时候

    l o w e r = 1 / 8 \mathrm lower = 1/8 lower=1/8

    u p p e r = 1 / 3 \mathrm upper = 1/3 upper=1/3

    import tensorflow as tf
    
    class RReLU(tf.keras.layers.Layer):
        def __init__(self, lower=0.125, upper=0.333, **kwargs):
            super(RReLU, self).__init__(**kwargs)
            self.lower = lower
            self.upper = upper
    
        def call(self, inputs, training=None):
            if training:
                # 在训练模式下,随机选择一个斜率
                alpha = tf.random.uniform(shape=inputs.shape, minval=self.lower, maxval=self.upper)
            else:
                # 在推理模式下,使用平均斜率
                alpha = (self.lower + self.upper) / 2.0
            return tf.where(inputs >= 0, inputs, alpha * inputs)
    
    # 创建 RReLU 激活函数层
    rrelu = RReLU()
    
    # 生成随机输入
    x = tf.random.normal([2])
    
    # 应用 RReLU 激活函数
    rrelu_x = rrelu(x, training=True)
    
    print(f"x: \n{x}")
    print(f"rrelu_x:\n{rrelu_x}")
    
    
    """输出"""
    x: 
    [-0.97807205  0.9327775 ]
    rrelu_x:
    [-0.26978785  0.9327775 ]
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/966798.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java基础5(黑马)

一、面向对象基础 1.面相对象编程快速入门 计算机是用来处理数据的。 单个变量 数组变量 对象数据 Student类&#xff1a; package cn.chang.object;public class Student {String name; double chinese_score; double math_score; public void printTotalScor…

C++ 继承(1)

1.继承概念 我们平时有时候在写多个有内容重复的类的时候会很麻烦 比如我要写Student Teacher Staff 这三个类 里面都要包含 sex name age成员变量 唯一不同的可能有一个成员变量 但是这三个成员变量我要写三遍 太麻烦了 有没有好的方式呢&#xff1f; 有的 就是继承…

C++入门基础篇:内存管理

本文是C内存管理部分的学习分享 希望能够对你有所帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 1. 内存分布 1.1 引入 在开始之前&#xff0c;我们先来看一道题目&#xff1a; int globalVar 1; static int staticGlobalVar 1; void Test() {static int st…

DeepSeek开源多模态大模型Janus-Pro部署

DeepSeek多模态大模型部署 请自行根据电脑配置选择合适环境配置安装conda以及gitJanus 项目以及依赖安装运行cpu运行gpu运行 进入ui界面 请自行根据电脑配置选择合适 本人家用电脑为1060&#xff0c;因此部署的7B模型。配置高的可以考虑更大参数的模型。 环境配置 安装conda…

Chrome谷歌多开教程:实用方法与工具

不管是电子商务、技术测试、空投等不同专业领域&#xff0c;还是个人的工作和生活账号管理&#xff0c;使用不同的独立账户往往需要借助Chrome谷歌浏览器多开来提高效率。Chrome谷歌多开有哪些方法和工具&#xff1f;可以来参考以下实用内容。 一、Chrome谷歌多开方法与工具 1…

Hdoop之MapReduce的原理

简单版本 AppMaster: 整个Job任务的核心协调工具 MapTask: 主要用于Map任务的执行 ReduceTask: 主要用于Reduce任务的执行 一个任务提交Job --> AppMaster(项目经理)--> 根据切片的数量统计出需要多少个MapTask任务 --> 向ResourceManager(Yarn平台的老大)索要资源 --…

Palatir和它的AIP

Palantir是一家成立于2001年的美国大数据分析公司&#xff0c;由彼得Thiel创立&#xff0c;最初专注于反恐数据分析&#xff0c;后来逐步扩展到政府、金融、医疗等多个领域。其核心产品包括Gotham&#xff08;面向政府&#xff09;、Foundry&#xff08;面向商业&#xff09;、…

html 列动态布局

样式说明&#xff1a; /* 列动态布局&#xff0c;列之间以空格填充 */ li {display: flex;/* flex-direction: column; */justify-content: space-between; }

【C++高并发服务器WebServer】-13:多线程服务器开发

本文目录 一、多线程服务器开发二、TCP状态转换三、端口复用 一、多线程服务器开发 服务端代码如下。 #include <stdio.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <pthread.h>s…

活动预告 | 为 AI 新纪元做好准备:助力安全的业务转型

课程介绍 随着现代办公模式的不断演变和 AI 技术的迅速发展&#xff0c;企业在享受效率提升的同时&#xff0c;也面临着信息安全与数据保护的严峻挑战。在利用 AI 技术释放业务潜力的同时&#xff0c;如何确保数据质量与安全已成为企业发展的关键议题。 在本次线上课程中&…

鸿蒙harmony 手势密码

1.效果图 2.设置手势页面代码 /*** 手势密码设置页面*/ Entry Component struct SettingGesturePage {/*** PatternLock组件控制器*/private patternLockController: PatternLockController new PatternLockController()/*** 用来保存提示文本信息*/State message: string …

紧跟潮流,将 DeepSeek 集成到 VSCode

Visual Studio Code&#xff08;简称 VSCode&#xff09;是一款由微软开发的免费开源代码编辑器&#xff0c;自 2015 年发布以来&#xff0c;凭借其轻便、强大、且拥有丰富扩展生态的特点&#xff0c;迅速成为了全球开发者的首选工具。VSCode 支持多平台操作系统&#xff0c;包…

21.2.6 字体和边框

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 通过设置Rang.Font对象的几个成员就可以修改字体&#xff0c;设置Range.Borders就可以修改边框样式。 【例 21.6】【项目&#xff…

Windows下AMD显卡在本地运行大语言模型(deepseek-r1)

Windows下AMD显卡在本地运行大语言模型 本人电脑配置第一步先在官网确认自己的 AMD 显卡是否支持 ROCm下载Ollama安装程序模型下载位置更改下载 ROCmLibs先确认自己显卡的gfx型号下载解压 替换替换rocblas.dll替换library文件夹下的所有 重启Ollama下载模型运行效果 本人电脑配…

node.js + html + Sealos容器云 搭建简易多人实时聊天室demo 带源码

node.js html Sealos容器云 搭建简易多人实时聊天室demo 带源码 前言功能介绍&#xff08;demo演示&#xff09;sealos官网配置node.js 编写服务端代码前端ui 调用接口整体项目目录部署到服务器 前言 hello哦盆友们&#xff0c;这次我们来十几行代码做一个超简单的多人聊天…

MYSQL索引与视图

一、新建数据库 mysql> create database mydb15_indexstu; mysql> use mydb15_indexstu; 二、新建表 &#xff08;1&#xff09;学生表Student mysql> create table Student(-> Sno int primary key auto_increment,-> Sname varchar(30) not null unique,-…

win10向windows server服务器传输文件

win10向windows server服务器传输文件 遇到无法直接拖动文件进行传输时 解决方案&#xff1a; 1.点击显示选项 2.点击本地资源-详细信息 3.在窗口中选择你需要共享的磁盘 4.然后远程连接到Windows server服务器 5.登录Windows server服务器后&#xff0c;在此电脑下就能看…

【教程】docker升级镜像

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 自动升级 手动升级 无论哪种方式&#xff0c;最重要的是一定要通过-v参数做数据的持久化&#xff01; 自动升级 使用watchtower&#xff0c;可…

HTML应用指南:利用GET请求获取全国盒马门店位置信息

随着新零售业态的发展,门店位置信息的获取变得至关重要。作为新零售领域的先锋,盒马鲜生不仅在商业模式创新上持续领先,还积极构建广泛的门店网络,以支持其不断增长的用户群体。本篇文章,我们将继续探究GET请求的实际应用,我们使用Python的requests库通过GET请求,从盒马…

Linux内核数据结构之链表

对于链表的优缺点,我们对比数组可以说出一些,但在随机存储的情况下,我们会选择链表来处理,而我们使用双向链表时,经常会定义成如下形式: struct list_node {TYPE data;struct list_node *prev,*next; }; 相对应的链表结构如下: 对于该数据结构定义,存在一个局限,整个…