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

【NLP 37、激活函数 ③ relu激活函数】

—— 25.2.23

ReLU广泛应用于卷积神经网络(CNN)和全连接网络,尤其在图像分类(如ImageNet)、语音识别等领域表现优异。其高效性和非线性特性使其成为深度学习默认激活函数的首选

一、定义与数学表达式

ReLU(Rectified Linear Unit,修正线性单元)是一种分段线性激活函数,

其数学表达式为:ReLU(x)=max(0,x)

即当输入 x 大于 0 时,输出为 x;当 x≤0 时,输出为 0。


二、核心特点

非线性特性:通过引入分段线性特性,ReLU为神经网络引入非线性,使其能拟合复杂函数。

计算高效:仅通过阈值判断(x>0)即可完成计算,避免了指数运算(如Sigmoid、Tanh),显著提升速度。

缓解梯度消失:在 x>0 时梯度恒为 1,反向传播时梯度不会饱和,加速收敛。

稀疏激活性:负输入时输出为 0,导致部分神经元“休眠”,减少参数依赖和过拟合风险。


三、优点

简单高效:实现和计算成本低,适合深度网络。

收敛速度快:相比Sigmoid/Tanh,ReLU在训练中梯度更稳定,收敛更快。

非零中心性:输出范围为 [0,+∞),虽非严格零中心,但简化了优化过程


四、局限性

Dead ReLU问题:若神经元输入长期为负,梯度恒为 0,导致权重无法更新,神经元“死亡”。

非零中心性:输出偏向非负值,可能影响梯度下降效率。

对初始化敏感:若学习率过高,负输入区域可能使神经元永久失效。


五、变体

Leaky ReLU:允许负输入时输出 αx(α为小常数,如0.01)。

PReLU(Parametric ReLU):将 α 设为可学习参数,动态调整负区斜率。

ELU(Exponential Linear Unit):负输入时输出 α(ex−1),使输出均值接近零。

Swish:自门控激活函数,结合ReLU和Sigmoid特性,平滑且无上界。


六、代码示例

1.通过 nn.ReLU() 作为网络层

nn.ReLU() :PyTorch 中的修正线性单元(ReLU)激活函数模块,用于神经网络中引入非线性。其功能是将输入张量中所有负值置为 0,保留正值不变

参数名称类型是否必填说明
inplacebool是否原地操作(直接修改输入张量)。
默认值为 False,此时会返回新张量。若设为 True,则直接在原张量上操作。
import torch
import torch.nn as nn
import torch.optim as optim# 定义一个简单的网络,包含两个线性层和 ReLU 激活
class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.fc1 = nn.Linear(784, 256)  # 输入层:784 → 256self.relu = nn.ReLU()           # ReLU 激活层self.fc2 = nn.Linear(256, 10)   # 输出层:256 → 10(如分类任务)def forward(self, x):x = self.relu(self.fc1(x))  # 在第一层后应用 ReLUx = self.fc2(x)return x# 初始化网络、损失函数和优化器
model = Net()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)# 输入数据示例(如 MNIST 图像,形状为 [batch_size, 784])
input_data = torch.randn(32, 784)# 前向传播
output = model(input_data)
print(output.shape)  # 输出形状: (32, 10)

2. 直接使用 torch.relu() 函数

torch.relu(): PyTorch 中实现修正线性单元(ReLU)激活函数的函数

其数学表达式为:ReLU(x)=max(0,x)

参数名称类型是否必填说明
inplacebool是否原地修改输入张量。若为 True,则直接修改输入张量以节省内存;若为 False(默认),则返回新张量。
import torch# 示例输入
x = torch.tensor([-1.0, 0.0, 1.0])# 应用 ReLU 函数(非原地)
y = torch.relu(x)
print(y)  # 输出: tensor([0., 0., 1.])# 应用 ReLU 函数(原地)
torch.relu_(x)
print(x)  # 输出: tensor([0., 0., 1.]),原始张量被修改[1,7](@ref)。

http://www.lryc.cn/news/542444.html

相关文章:

  • 量子计算的威胁,以及企业可以采取的措施
  • C#初级教程(5)——解锁 C# 变量的更多奥秘:从基础到进阶的深度指南
  • Pytorch实现之GIEGAN(生成器信息增强GAN)训练自己的数据集
  • 使用PHP接入纯真IP库:实现IP地址地理位置查询
  • 计算机毕业设计SpringBoot+Vue.jst0甘肃非物质文化网站(源码+LW文档+PPT+讲解)
  • 无人机实战系列(三)本地摄像头+远程GPU转换深度图
  • 七.智慧城市数据治理平台架构
  • UE5从入门到精通之多人游戏编程常用函数
  • RK3399 Android7 Ethernet Tether功能实现
  • 【论文学习】基于规模化Transformer模型的低比特率高质量语音编码
  • Pretraining Language Models with Text-Attributed Heterogeneous Graphs
  • 什么是将应用放在边缘服务器上创建?应用不是在用户手机上吗?边缘计算究竟如何优化?通过两个问题来辨析
  • uni-app 系统学习,从入门到实战(二)—— 项目结构解析
  • 滴水逆向_引用_友元函数_运算符重载
  • java医院多维度综合绩效考核源码,医院绩效管理系统,支持一键核算和批量操作,设有审核机制,允许数据修正
  • 科普:HTTP端口80和HTTPS端口443
  • uniapp打包生产证书上架IOS全流程
  • 山东大学软件学院nosql实验一环境配置
  • 【2024 CSDN博客之星】大学四年,我如何在CSDN实现学业与事业的“双逆袭”?
  • 【Windows 同时安装 MySQL5 和 MySQL8 - 详细图文教程】
  • [Python学习日记-83] 操作系统的介绍
  • 软考——WWW与HTTP
  • 算法-数据结构-图-邻接表构建
  • Docker(Nginx)部署Vue
  • ubuntu22.04的docker容器中安装ssh服务
  • 卷积这个词在卷积神经网络中应该怎么理解
  • 设计模式教程:迭代器模式(Iterator Pattern)
  • C语言学习【1】C语言关于寄存器的封装
  • 鸿蒙app 开发中的 == 和 === 的区别
  • 【算法】冒泡排序