【DL经典回顾】激活函数大汇总(七)(CReLU RReLU附代码和详细公式)

激活函数大汇总(七)(CReLU & RReLU附代码和详细公式)

更多激活函数见激活函数大汇总列表

一、引言

欢迎来到我们深入探索神经网络核心组成部分——激活函数的系列博客。在人工智能的世界里,激活函数扮演着不可或缺的角色,它们决定着神经元的输出,并且影响着网络的学习能力与表现力。鉴于激活函数的重要性和多样性,我们将通过几篇文章的形式,本篇详细介绍两种激活函数,旨在帮助读者深入了解各种激活函数的特点、应用场景及其对模型性能的影响。

在接下来的文章中,我们将逐一探讨各种激活函数,从经典到最新的研究成果。

限于笔者水平,对于本博客存在的纰漏和错误,欢迎大家留言指正,我将不断更新。

二、CReLU

CReLU(Concatenated Rectified Linear Unit)是一种特殊的激活函数,它在处理深度学习模型中的特征时采用了一种创新的方法。CReLU通过对每个神经元的输入进行正向和负向的ReLU操作,并将结果拼接起来,以此来增强模型对信息的捕获能力。

1. 数学定义

对于任意输入 x x x,CReLU激活函数的输出由正的 ReLU ⁡ ( x ) \operatorname{ReLU}(x) ReLU(x)和负的 ReLU ⁡ ( − x ) \operatorname{ReLU}(-x) ReLU(x)拼接而成,可以数学表示为:

CReLU ⁡ ( x ) = [ ReLU ⁡ ( x ) ; ReLU ⁡ ( − x ) ] \operatorname{CReLU}(x)=[\operatorname{ReLU}(x) ; \operatorname{ReLU}(-x)] CReLU(x)=[ReLU(x);ReLU(x)]
其中, ReLU ⁡ ( x ) = max ⁡ ( 0 , x ) \operatorname{ReLU}(x)=\max (0, x) ReLU(x)=max(0,x)是标准的ReLU激活函数,分号表示将两个ReLU的结果在特征维度上进行拼接。
在这里插入图片描述

2. 函数特性

  • 捕获正负信息:CReLU通过同时考虑输入的正部分和负部分,使模型能够更全面地捕获输入数据的信息。
  • 增加输出维度:由于CReLU将正向和负向的ReLU结果进行拼接,它实际上增加了模型输出的维度,这有助于增强模型的表示能力。
  • 非线性激活:尽管CReLU使用了线性的ReLU函数,但拼接操作引入了额外的非线性,有助于深度学习模型学习复杂的数据表示。

3. 导数

CReLU函数的导数相对简单,对于正值输入,导数为1;对于负值输入,导数也为1,但作用于拼接后的负部分;对于零值输入,导数未定义(实践中通常视为0)。具体而言,导数可以表示为:

CReLU ⁡ ′ ( x ) = [ 1 x > 0 ; 1 x < 0 ] \operatorname{CReLU}^{\prime}(x)=\left[1_{x>0} ; 1_{x<0}\right] CReLU(x)=[1x>0;1x<0]
其中, 1 x > 0 1_{x>0} 1x>0 1 x < 0 1_{x<0} 1x<0分别是正部分和负部分的指示函数。

4. 使用场景与局限性

使用场景

  • 增强模型表示能力:在需要模型具有捕获输入正负信息能力的场景下,CReLU可以作为一种有效的选择。
  • 视觉任务和特征学习:CReLU特别适用于视觉任务和特征学习领域,其中对输入数据的全面表示尤为重要。

局限性

  • 增加计算负担:由于CReLU会增加输出特征的维度,这可能会导致后续层的计算负担加重,尤其是在深层网络中。
  • 设计和实现复杂性:在使用CReLU时,需要仔细设计网络结构,以适应输出特征维度的增加,这可能增加模型设计和实现的复杂性。

5.代码实现

CReLU激活函数将输入数组的正部分和负部分分别通过ReLU函数处理后拼接起来,因此我们需要先计算这两部分,然后使用NumPy的拼接操作将它们组合起来。

import numpy as np

def crelu(x):
    """计算CReLU激活函数的值。
    
    参数:
    x -- 输入值,可以是一个数值、NumPy数组或者多维数组。
    
    返回:
    CReLU激活后的结果,其中正的ReLU和负的ReLU结果被拼接在一起。
    """
    relu_positive = np.maximum(0, x)  # 计算正的ReLU
    relu_negative = np.maximum(0, -x) # 计算负的ReLU
    return np.concatenate([relu_positive, relu_negative], axis=-1) # 沿最后一个轴拼接

解读

  • 正负部分的处理:首先,np.maximum(0, x)计算输入x的正部分,即标准的ReLU操作。接着,np.maximum(0, -x)通过对x取负再计算ReLU,得到输入的负部分的ReLU结果。
  • 拼接操作:使用np.concatenate函数将正的ReLU结果和负的ReLU结果沿最后一个轴拼接起来。这一步骤增加了输出的维度,正如CReLU函数的特性所述。
  • 多维数组支持:通过指定axis=-1参数,该实现支持对多维数组进行操作,使得它可以适用于处理多个数据样本的批量操作。

示例使用

下面是如何使用定义的crelu函数来计算一组输入值的CReLU激活:

x = np.array([-2, -1, 0, 1, 2])
crelu_values = crelu(x)

print("CReLU Values:", crelu_values)

三、RReLU

RReLU(Randomized Leaky Rectified Linear Unit)是一种变体的ReLU激活函数,旨在通过引入随机性来解决ReLU在训练过程中可能遇到的一些问题,如神经元死亡(即永远不激活的神经元)。RReLU通过为负输入值应用一个随机选取的小的斜率,增加了模型的鲁棒性和泛化能力。

1. 数学定义

RReLU函数的数学表达式可以定义为:

RReLU ⁡ ( x ) = { x  if  x > 0 α x  if  x ≤ 0 \operatorname{RReLU}(x)= \begin{cases}x & \text { if } x>0 \\ \alpha x & \text { if } x \leq 0\end{cases} RReLU(x)={xαx if x>0 if x0
其中, x x x是函数的输入,而 α \alpha α是一个在训练期间从均匀分布 U ( l , u ) U(l, u) U(l,u)中随机抽取的系数, l l l u u u是分布的下限和上限。在测试期间, α \alpha α通常被设置为 l l l u u u的均值,即 α = l + u 2 \alpha=\frac{l+u}{2} α=2l+u
在这里插入图片描述

2. 函数特性

  • 随机性:RReLU通过为每个神经元的负输入引入随机的斜率,帮助模型避免过拟合,增加了泛化能力。
  • 鲁棒性:引入的随机性也增加了模型的鲁棒性,使其更能够应对不同的输入变化。
  • 减少神经元死亡:与标准的ReLU相比,RReLU通过为负输入提供一个非零的斜率,减少了神经元死亡的问题。

3. 导数

RReLU函数的导数为:

RReLU ⁡ ′ ( x ) = { 1  if  x > 0 α  if  x ≤ 0 \operatorname{RReLU}^{\prime}(x)= \begin{cases}1 & \text { if } x>0 \\ \alpha & \text { if } x \leq 0\end{cases} RReLU(x)={1α if x>0 if x0
在正值部分,梯度为1;在负值部分,梯度为随机选取的 α \alpha α值。

4. 使用场景与局限性

使用场景

  • 避免过拟合:在小数据集上训练深度网络时,RReLU可以作为一种有效的正则化手段。
  • 提高模型泛化:在需要提高模型泛化能力的场景下,RReLU通过其随机性可以作为一种选择。

局限性

  • 随机性的不确定性:RReLU的随机性虽然可以提高泛化能力,但也可能导致模型训练的不稳定性,特别是在每次训练迭代中如果随机性变化较大时。
  • 参数选择:RReLU的效果很大程度上依赖于下限(l)和上限(u)的选择,不恰当的参数可能会导致性能下降。

5.代码实现

在Python中实现RReLU(Randomized Leaky ReLU)激活函数时,我们需要为负值输入随机选择一个斜率。这意味着在训练期间,对于每个负输入,我们将使用一个从预定范围内随机抽取的 α \alpha α值。在测试期间,我们通常使用这个范围的平均值作为 α \alpha α的值。以下是一个简单的RReLU实现,它采用了在训练期间随机选择 α \alpha α,而在测试期间使用固定 α \alpha α的策略。

为了简化,这里我们将展示一个基本的实现,不包括动态调整 α \alpha α的部分。

import numpy as np

def rrelu(x, l=0.01, u=0.05, training=True):
    """
    计算RReLU激活函数的值。
    
    参数:
    x -- 输入值,可以是一个数值、NumPy数组或者多维数组。
    l, u -- 随机alpha的下限和上限。
    training -- 指示当前是否为训练模式。在训练模式下,alpha将从[l, u]范围内随机选取;在测试模式下,将使用(l + u) / 2。
    
    返回:
    RReLU激活后的结果。
    """
    if training:
        # 训练阶段: 对每个元素随机选择alpha
        alpha = np.random.uniform(l, u, x.shape)
    else:
        # 测试阶段: 使用固定的alpha
        alpha = (l + u) / 2
    
    return np.where(x > 0, x, alpha * x)

解读

  • 随机斜率 α \alpha α:在训练模式下,该函数对每个负输入随机选择一个斜率 α \alpha α,这个斜率是从区间 [ l , u ] [l, u] [l,u]中随机选取的。这一随机性有助于增强模型的泛化能力并减少过拟合风险。
  • 固定斜率 α \alpha α:在测试模式下,为了保持预测的一致性,我们使用一个固定的值 α \alpha α,通常为 l l l u u u的平均值。
  • 向量化操作:通过使用NumPy的np.where函数,该实现支持向量化操作,能够高效地处理整个数组的激活计算,无论是单个样本还是批量样本。

示例使用

以下是如何使用定义的rrelu函数来计算一组输入值的RReLU激活,假设我们处于训练模式:

x = np.array([-2, -1, 0, 1, 2])
rrelu_values_training = rrelu(x, training=True)

print("RReLU Values (Training):", rrelu_values_training)

rrelu_values_testing = rrelu(x, training=False)
print("RReLU Values (Testing):", rrelu_values_testing)

四、参考文献

CReLU

  • Shang, W., Sohn, K., Almeida, D., & Lee, H. (2016). “Understanding and Improving Convolutional Neural Networks via Concatenated Rectified Linear Units.” In International Conference on Machine Learning (ICML). 这篇文章首次提出了CReLU激活函数,并展示了其在卷积神经网络中提升模型性能的能力。通过分析CReLU如何利用输入的正负信息,作者证明了CReLU在某些情况下比标准ReLU表现更好。

RReLU

  • Xu, B., Wang, N., Chen, T., & Li, M. (2015). “Empirical Evaluation of Rectified Activations in Convolutional Network.” arXiv preprint arXiv:1505.00853. 虽然这篇文章中主要讨论了多种激活函数的性能,包括Leaky ReLU和Parametric ReLU,但提到了RReLU,并对其在防止过拟合方面的潜力进行了评估。

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

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

相关文章

Solidity 智能合约开发 - 基础:基础语法 基础数据类型、以及用法和示例

苏泽 大家好 这里是苏泽 一个钟爱区块链技术的后端开发者 本篇专栏 ←持续记录本人自学两年走过无数弯路的智能合约学习笔记和经验总结 如果喜欢拜托三连支持~ 本篇主要是做一个知识的整理和规划 作为一个类似文档的作用 更为简要和明了 具体的实现案例和用法 后续会陆续给出…

【应急响应靶场web1】

文章目录 前言 一、web1 1、应急响应 1&#xff09;背景 2&#xff09;报错处理 3&#xff09;webshell查杀 4&#xff09;网站日志排查 5&#xff09;隐藏账户 6&#xff09;挖矿程序 2、渗透复现 1&#xff09;弱口令登录 2&#xff09;插件上传 3&#xff09;getshell 总结 …

还有没有免费裁剪音频的软件?15款音乐裁剪软件测评!(不断更新)

市面上有哪些免费裁剪音频的软件呢&#xff1f;今天&#xff0c;我们就来为大家详细介绍15款热门的音乐裁剪软件&#xff0c;并对其进行深度测评。 裁剪音频软件测评1&#xff1a;金舟音频大师 好评指数&#xff1a;4.5/5 优点罗列&#xff1a;支持音频格式转换、裁剪、降噪、…

Linux-vim显示乱码

Linux运维工具-ywtool 目录 一.问题二.解决2.1 编辑VIM的配置文件2.2 添加以下内容 一.问题 用vim编辑的时候,中文显示乱码 二.解决 2.1 编辑VIM的配置文件 vim ~/.vimrc #如果这个文件不存在,创建一个即可2.2 添加以下内容 添加完成以后就不会在出现中文乱码了 set fil…

爬虫的去重

去重基本原理 爬虫中什么业务需要使用去重 防止发出重复的请求防止存储重复的数据 在爬取网页数据时&#xff0c;避免对同一URL发起重复的请求&#xff0c;这样可以减少不必要的网络流量和服务器压力&#xff0c;提高爬虫的效率&#xff0c;在将爬取到的数据存储到数据库或其…

一个简单而绝妙的思维技巧

在文章的最开头&#xff0c;我想先问你一个问题&#xff1a; 你希望未来的你是什么样的&#xff1f;你希望未来的你比现在的你过得更好&#xff0c;还是过得更糟&#xff1f; 我想&#xff0c;应该没有人会选择后者吧&#xff1f; 尽管从客观上说&#xff0c;未来的我们很可能…

配置安装 Kuboard - kubernetes

目录 安装 Kuboard v3 - kubernetes | Kuboard 将官方yaml文件拿到本地 等待 Kuboard v3 就绪 访问 Kuboard 安装 Kuboard v3 - kubernetes | Kuboard Kuboard的官方非常丰富&#xff0c;大家也可以参考官网教程 将官方yaml文件拿到本地 ​kubectl apply -f https://add…

自定义指令控制权限

1.新建directives auth.ts 2.完整的auth.ts import { wmsStore } from "/store/pinia";//判断是否有某个角色的函数 function hasRoles(role: any) {const pinaRoles wmsStore().roles;if (typeof role string) {return pinaRoles.includes(role)} else if (Array…

docker部署Atheos云IDE平台

Codiad 是一个基于 Web 的 IDE 框架 部署 下载镜像 docker pull hlsiira/atheosvim docker-compose.yaml version: 3 services:atheos:image: hlsiira/atheosports:- 8565:80container_name: atheosrestart: always启动 docker-compose up -d访问 http://x.x.x.x:8565

ios开发错误积累

1.xcode 下载模拟器报错 Could not download iOS 报错&#xff1a; 解决&#xff1a; 1、去官网下载自己需要 地址&#xff08;https://developer.apple.com/download/all&#xff09; 2、下载完成后&#xff0c;执行以下命令添加&#xff1a;xcrun simctl runtime add /路径…

NLP:HanLP的下载与使用

昨天说到要做一个自定义的训练模型&#xff0c;但是很快这个想法就被扑灭了&#xff0c;因为这个手工标记的成本太大&#xff0c;而且我的上级并不是想要我做这个场景&#xff0c;而是希望我通过这个场景展示出可以接下最终需求的能力。换句话来说&#xff1a;可以&#xff0c;…

类和对象练习题

第1题 import java.util.Scanner; public class Homework01{public static void main(String[] args){//创建一个double类型的数组double array[]new double[6];//创建一个输入对象Scanner inputnew Scanner(System.in);//提示信息&#xff1a;对数组元素进行赋值System.out.pr…

22-Java状态模式 ( State Pattern )

Java状态模式 摘要实现范例 状态模式&#xff08;State Pattern&#xff09;中类的行为是基于它的状态改变的 在状态模式中&#xff0c;我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象 状态模式属于行为型模式 摘要 1. 意图 允许对象在内部…

Qt之格栅布局(QGridLayout)控件填满整个单元格

Qt专栏&#xff1a;http://t.csdnimg.cn/GQN1M 目录 1.现象1 2.解决方案 3.现象2 4.解决方案 5.总结 1.现象1 今天在用QGridLayout布局的时候&#xff0c;添加到布局的QWidget有文本框、标签、组合框和按钮等等&#xff0c;布局两列&#xff0c;通过下面的方式添加进去的&…

Edge-TTS:微软推出的,免费、开源、支持多种中文语音语色的AI工具

项目地址&#xff1a;rany2/edge-tts: Use Microsoft Edges online text-to-speech service from Python WITHOUT needing Microsoft Edge or Windows or an API key (github.com) Edge-TTS是由微软推出的文本转语音Python库&#xff0c;通过微软Azure Cognitive Services转化文…

计算机网络——OSI网络层次模型

计算机网络——OSI网络层次模型 应用层表示层会话层传输层TCP和UDP协议复用分用 网络层数据链路层物理层OSI网络层次模型中的硬件设备MAC地址和IP地址MAC地址IP地址MAC地址和IP地址区别 OSI网络层次模型通信过程解释端到端点到点端到端和点到点的区别 我们之前简单介绍了一下网…

在【IntelliJ IDEA】中配置【Tomcat】【2023版】【中文】【图文详解】

作为一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;IntelliJ IDEA为Web服务器提供了卓越的支持&#xff0c;从而极大地简化了程序员在Web开发过程中的工作流程。学习Java Web开发实质上就是掌握如何创造动态Web资源&#xff0c;这些资源在完成开发后&…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Text)

显示一段文本的组件。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 可以包含Span和ImageSpan子组件。 接口 Text(content?: string | Resource, value?: TextOptions) 从API versi…

(码农福利) 介绍几个不用魔法 就能免费使用的AI工具

因为 AI的飞速发展 IT行业已经可以说非常的卷了 作为程序员 如果不具备 AI 使用的能力 很快就会被淘汰 但 在社区内 无法直接谈论魔法 大部分程序员 可能也不具备魔法 今天说一个不需要魔法 好用的 AI工具 我们打开官网 https://chandler.bet/#/overView 点击 Get Chrome Ex…

部署docker仓库harbor

1、下载包 1、包已上传有两个harbor.v2.6.0.tar与harbor.tar 2、harbor.tar解压后会生成harbor目录&#xff0c;将harbor.v2.6.0.tar移动到harbor目录下。 3、执行harbor目录下的install.sh 4、执行完后修改配置文件 2、修改配置文件 vim /root/harbor/make/ harbor.yml.tmpl …