四、自然语言处理_03LSTM与GRU

0、前言

随着循环神经网络(RNN)在各种序列数据处理任务中被广泛应用,研究人员逐渐发现了其在处理长序列数据时会容易出现梯度消失(vanishing gradient)和梯度爆炸(exploding gradient)问题,限制了其在实际应用中的有效性

  • 梯度消失问题:在RNN中,信息需要通过隐藏状态在时间步之间传递,当序列很长时,如果权重矩阵的谱半径(spectral radius)小于1,那么在反向传播过程中,梯度会随着时间步的增加而指数级减小,这导致网络在处理长序列时只能捕捉到局部的模式,无法有效地利用序列中的长距离依赖信息

  • 梯度爆炸问题:与梯度消失相反,梯度爆炸指的是梯度在反向传播的过程中随着时间步的增加而指数级增大,从而导致权重更新过大,使得网络训练变得不稳定,甚至导致权重更新失效(梯度爆炸通常需要通过梯度裁剪(gradient clipping)等技术来缓解)

为了解决这些问题,研究人员提出了多种改进的RNN结构,其中最成功的两种分别是LSTM和GRU:

  • LSTM(Long Short-Term Memory,长短期记忆网络):通过引入细胞状态(cell state)和三个门控机制(输入门、遗忘门、输出门)来控制信息的流动,从而有效地解决了梯度消失问题,并允许梯度在时间步之间更稳定地传播

  • GRU(Gated Recurrent Unit,门控循环单元):作为LSTM的简化版本,GRU合并了LSTM中的遗忘门和输入门为一个更新门,同时引入了重置门,GRU的结构更简单,参数更少,但在很多情况下能够达到与LSTM相似的性能

1、LSTM基本介绍

1.1 定义

LSTM(Long Short-Term Memory,长短期记忆网络)是一种特殊类型的循环神经网络(RNN),设计用于解决标准RNN在处理长序列数据时遇到的梯度消失和梯度爆炸问题,LSTM能够学习长期依赖信息,使得它在处理序列数据方面非常有效(尤其是在时间序列预测、自然语言处理和其他需要捕捉长期依赖关系的任务中)

1.2 核心组件

LSTM的核心思想是门控思想,即:先用遗忘门丢掉一部分不重要信息,再用输入门增加重要的信息

其核心组件如下:

  • 细胞状态(Cell State):LSTM的核心是一个细胞状态(也称记忆细胞),它类似于一个传送带,可以沿着序列的长度保持信息,这个状态允许信息在序列中流动,而不会衰减

  • 遗忘门(Forget Gate):遗忘门控制细胞状态中哪些信息需要被遗忘,它也通过一个sigmoid激活函数来决定哪些值需要丢弃

  • 输入门(Input Gate):输入门控制新信息的流入,它通过一个sigmoid激活函数来决定哪些值需要更新

  • 候选记忆单元(Candidate Memory Cell):候选记忆单元是细胞状态的候选更新,通过一个tanh激活函数生成,用于在更新细胞状态时提供新的信息

  • 输出门(Output Gate):输出门控制细胞状态的哪一部分将被输出到隐藏状态,它通过一个sigmoid激活函数来决定输出的值,并通过一个tanh函数来生成新的候选值,这些值将被加到细胞状态上

1.3 调用示例

编码器nn.LSTM:

import torch 
from torch import nn# 定义输入语句
X = torch.randn(5, 3, 10)
# 定义初始短期状态
h0 = torch.zeros(1, 3, 20, dtype=torch.float32)
# 定义初始长期状态
c0 = torch.zeros(1, 3, 20, dtype=torch.float32)# 调用LSTM
lstm = nn.LSTM(input_size=10, hidden_size=20)
output, (hn, cn) = lstm(X, (h0, c0))# 查看output、hn、cn的形状和内容
print(output.shape, hn.shape, cn.shape)
print(output)
print(hn)
print(cn)

解码器nn.RNNCell:

import torch 
from torch import nnX = torch.randn(5, 3, 10)
hn = torch.zeros(3, 20, dtype=torch.float32)
cn = torch.zeros(3, 20, dtype=torch.float32)output = []lstm_cell = nn.LSTMCell(input_size=10, hidden_size=20)for x in X:hn, cn = lstm_cell(x, (hn, cn))output.append(hn)output = torch.stack(output)print(output.shape)
print(output)

2、GRU基本介绍

2.1 定义

门控循环单元(Gated Recurrent Unit,简称GRU)也是一种特殊类型的循环神经网络(RNN),具体来说,其属于LSTM的简化版,也可用于解决标准RNN在处理长序列数据时遇到的梯度消失和梯度爆炸问题

2.2 核心组件

同样是门控思想,其核心组件如下:

  • 更新门(Update Gate):更新门决定了网络在当前时间步应该保留多少过去的信息,以及应该丢弃多少新信息,它通过一个sigmoid激活函数来实现

  • 重置门(Reset Gate):重置门控制着网络在当前时间步应该忽略多少过去的信息,它也通过一个sigmoid激活函数来实现。

  • 候选隐藏状态(Candidate Hidden State):候选隐藏状态是当前时间步的潜在隐藏状态,它结合了重置门的输出和前一时间步的隐藏状态

2.3 调用示例

调用过程与RNN极其相似

编码器nn.GRU:

import torch 
from torch import nnX = torch.randn(5, 3, 10)
h0 = torch.zeros(1, 3, 20, dtype=torch.float32)gru = nn.GRU(input_size=10, hidden_size=20)
output, hn = gru(X, h0)print(output.shape, hn.shape)
print(output)
print(hn)

解码器nn.GRUCell:

import torch 
from torch import nnX = torch.randn(5, 3, 10)
hn = torch.zeros(3, 20, dtype=torch.float32)output = []gru_cell = nn.GRUCell(input_size=10, hidden_size=20)for x in X:hn = gru_cell(x, hn)output.append(hn)output = torch.stack(output)print(output.shape)
print(output)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

类加载过程Java虚拟机(JVM)详细

类加载过程是Java虚拟机(JVM)将类的字节码文件加载到内存中,并生成对应的类对象的过程。这个过程主要包括加载、验证、准备、解析和初始化五个阶段,每个阶段都有其特定的任务和作用。以下是对每个阶段的详细解释: 1. …

基于灰色神经网络的订单需求预测

灰色神经网络(Grey Neural Network, GNN) 是将灰色系统理论与人工神经网络相结合的一种模型,旨在处理不完全信息和小样本问题。灰色神经网络利用灰色系统的预测优势和神经网络的学习能力,能够在信息不完整或数据不充分的情况下实现…

nerdctl:与 Docker 兼容的 containerd CLI

nerdctl 是一个用于容器管理的命令行工具,它旨在提供与 Docker CLI 相似的用户体验,但却是为 containerd 这样的低级容器运行时设计的。containerd 是一个行业标准的容器运行时,被广泛用作 Kubernetes 等容器编排平台的一部分。nerdctl 通过简…

java基础教程第16篇( 正则表达式)

Java 正则表达式 正则表达式定义了字符串的模式。 正则表达式可以用来搜索、编辑或处理文本。 正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。 Java 提供了 java.util.regex 包,它包含了 Pattern 和 Matcher 类,用于处理正…

百问FB显示开发图像处理 - 图像调整

2.4 图像调整 2.4.1 图像的缩放 2.4.1.1 图像缩放算法浅析 图像缩放算法有很多种,这里参考网友"lantianyu520"所著的"图像缩放算法"。 原理浅析 ​ 要理解这个图像缩放算法的原理,最重要的是需要理解:对于图像上的每…

部署项目报错

vue2项目部署后 Error: Cannot find module /views/*** 1.起因 登录页、首页等静态页面可以正常进入,后端访问也正常,可以获取到验证码。 但是登录之后会发现首页空白或者进入不到首页 F12查看有报错信息:Error: Cannot find module ‘/v…

怎麼解決路由器IP地址衝突?

路由器IP地址衝突通常發生在網路中有兩個設備嘗試使用相同的IP地址時。這種衝突會導致網路連接問題,因為每個設備需要一個唯一的IP地址才能正常通信。 1. 重啟設備 重啟路由器和設備:有時候簡單的重啟可以解決問題,設備重新獲取一個新的IP地…

c# Grpc取消

net6.0 通过CancellationTokenSource 客户端取消Grpc,服务端判断 IsCancellationRequested 是否取消。 proto: syntax "proto3";// 引用可空类型 import "google/protobuf/wrappers.proto";option csharp_namespace "Grpc.Common"…

opencv复习

目录 1.core 1.图像变换 1.1 affine仿射变换 1.2 透视变换 2.四元数(旋转) 2.1 轴角转四元数 2.2 旋转矩阵转四元数 2.3 欧拉角转旋转矩阵 2.4 四元数转旋转矩阵 2.5 四元数用eigen用的比较多 2. imgproc. Image Processing 2.1 bilateralF…

10-高级主题

第10节 高级主题 在这一节中,我们将探讨一些 Python 中的高级主题,包括装饰器、生成器、上下文管理器、元类以及常用的设计模式。这些高级特性能够帮助你编写更强大、更灵活的代码。 10.1 装饰器 装饰器是一种特殊类型的函数,可以修改其他函数…

蓝桥杯分治

P1226 【模板】快速幂 题目描述 给你三个整数 𝑎,𝑏,𝑝a,b,p,求 𝑎𝑏 mod 𝑝abmodp。 输入格式 输入只有一行三个整数,分别代表 𝑎,𝑏,𝑝a,b,p。…

【webApp之h5端实战】首页评分组件的原生实现

关于评分组件,我们经常在现代前端框架中用到,UI美观效果丰富,使用体验是非常不错的。现在自己动手使用原生js封装下评分组件,可以用在自己的项目中。 组件实现原理 点击的❤左侧包括自己都是高亮的样式,右侧都是灰色的样式,这样就能把组件的状态区分开了。右边再加上辅…

C++小碗菜之二:软件单元测试

“没有测试的代码重构不能称之为重构,它仅仅是垃圾代码的到处移动” ——Corey Haines 目录 前言 什么是单元测试? 单元测试的组成 单元测试的命名 单元测试的独立性 Google Test 单元测试的环境配置与使用 1. Ubuntu下安装 Google Test 2. 编写…

ssm 多数据源 注解版本

application.xml 配置如下 <!-- 使用 DruidDataSource 数据源 --><bean id"primaryDataSource" class"com.alibaba.druid.pool.DruidDataSource" init-method"init" destroy-method"close"></bean> <!-- 使用 数…

【C++】格式化输出详解:掌握 cout 的进阶用法

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;格式化输出的理论概述&#x1f4af;控制输出宽度和填充字符setw 操作符setfill 操作符 &#x1f4af;控制浮点数的显示格式fixed 与 scientificsetprecision &#x1f4af;…

uC/OSII学习笔记(一)任务的增删改查

使用天玛智控的控制器&#xff0c;基础工程文件已移植ucosii。 正常的任务创建流程为&#xff1a; 1.OSInit()&#xff1b; 2.OSTaskCreate()&#xff1b; 3.OSStart()&#xff1b; 但是天玛对其有做修改&#xff0c;任务创建直接调用OSTaskCreate()函数即可&#xff0c;不用在…

【日常记录-Mybatis】PageHelper导致语句截断

1. 简介 PageHelper是Mybatis-Plus中的一个插件&#xff0c;主要用于实现数据库的分页查询功能。其核心原理是将传入的页码和条数赋值给一个Page对象&#xff0c;并保存到本地线程ThreadLocal中&#xff0c;接下来&#xff0c;PageHelper会进入Mybatis的拦截器环节&#xff0c;…

Linux入门攻坚——40、Linux集群系统入门-lvs(1)

Cluster&#xff0c;集群&#xff0c;为了解决某个特定问题将多台计算机组合起来形成的单个系统。 这个单个集群系统可以扩展&#xff0c;系统扩展的方式&#xff1a;scale up&#xff0c;向上扩展&#xff0c;更换更好的主机&#xff1b;scale out&#xff0c;向外扩展&…

Canal 深入解析:从原理到实践的全面解读

Canal 深入解析&#xff1a;从原理到实践的全面解读 官网&#xff1a;https://github.com/alibaba/canal Canal 是阿里巴巴开源的一款分布式增量数据同步工具&#xff0c;广泛应用于数据同步、实时数据处理和数据库的增量备份等场景。它可以通过监听 MySQL 数据库的 binlog&am…

Java中的数据存储结构解析与应用

一、引言 在Java编程中&#xff0c;数据存储结构是程序设计的基础。合理选择和使用数据结构可以提高程序的性能和可维护性。本文将带您了解Java中的各种数据存储结构&#xff0c;并探讨其优缺点及适用场景。 二、基本数据类型 Java提供了8种基本数据类型&#xff0c;分别是b…