四、自然语言处理_02RNN基础知识笔记

1、RNN的定义

RNN(Recurrent Neural Network,循环神经网络)是一种专门用于处理序列数据的神经网络架构,它与传统的前馈神经网络(Feedforward Neural Network)不同,主要区别在于它能够处理输入数据之间的时间依赖性,这使得它特别适合于处理时间序列数据、自然语言文本、语音信号等类型的数据

2、RNN的工作原理与结构

2.1 工作原理

RNN通过在网络中引入循环结构来处理序列数据,使得网络能够在处理当前输入时考虑到之前的所有输入,这种结构允许信息在网络中持续存在,从而实现对序列数据的动态特征抽取

  • 循环结构:网络中的循环允许信息在时间步之间传递(通过循环的方式来抽取时序信号的特征)
  • 逐个处理:序列中的每个元素都被逐一处理,但每个元素的处理都依赖于前一个元素的处理结果
  • 前后依赖:当前的输出不仅依赖于当前的输入,还依赖于之前所有输入的累积效应(前面的处理会影响后面的处理)
  • 中间隐藏状态:RNN通过隐藏状态来存储和传递之前输入的信息,从而实现对序列的长期依赖关系的捕捉

2.2 工作结构

2.3.1 结构图

上图是RNN的工作结构示意图,包含X、A、h三个主要的模块,其简洁地展示了RNN如何通过循环结构处理序列数据,以及如何通过隐藏状态在时间步之间传递信息:

  • 循环结构:图中显示了RNN的核心特性——循环,每个方框 A 代表网络中的一个重复模块(其实也就是权重矩阵),这个模块在每个时间步都会接收新的输入并产生输出

  • 时间步:图中的 X0​,X1​,X2​,…,Xt​ 表示输入序列在不同时间步的输入,例如,如果处理的是文本数据,则 X0​ 可能是第一个词的向量表示,X1​ 是第二个词的向量表示,以此类推

  • 隐藏状态h0​,h1​,h2​,…,ht​ 表示在每个时间步的隐藏状态,隐藏状态是RNN的“记忆”,它携带了之前时间步的信息,在每个时间步,隐藏状态不仅依赖于当前的输入 Xt​,还依赖于前一个时间步的隐藏状态 ht−1​ ,在序列的末尾,最终的隐藏状态 hn​ 可以作为整个序列的上下文信息,用于分类、情感分析等任务

  • 信息传递:在每个时间步,隐藏状态 ht​ 会作为下一个时间步的输入的一部分,这样信息就可以在时间步之间传递,这种传递是通过循环连接实现的,使得网络能够捕捉到序列中元素之间的依赖关系

  • 输出:在每个时间步,RNN可以产生一个输出,这个输出可以是基于当前隐藏状态的,也可以是整个序列处理完毕后的最终输出

  • 参数共享:在RNN中,所有时间步的重复模块“A”共享相同的参数,这意味着无论序列有多长,网络都使用相同的权重来处理每个元素

  • 训练:RNN的训练通常涉及到反向传播算法的变种,如反向传播通过时间(Backpropagation Through Time, BPTT),以处理序列数据的时序特性

2.3.2 示例

对于句子“宝,你吃饭了吗? ”,分词后得到的结果是['宝', ',', '你', '吃饭', '了', '吗', '?'] ,这些词会被循环地进行处理,具体如下: x0​ = “宝”,x0​ 输入到权重矩阵 A ,得到 h0​ (在实际的RNN实现中,如PyTorch或TensorFlow,h0​ 通常是由用户手动初始化的,以确保网络从一个已知的状态开始学习,这是因为RNN在处理序列的第一个元素之前没有先前的隐藏状态可以依赖。)

x1 = “,”,x1​ 再输入到权重矩阵 A ,并与上一步的 h0 相结合,得到 h1​

x2 = “你”,x2 再输入到权重矩阵 A ,并与上一步的 h1 相结合,得到 h2​

x3 = “吃饭'”,x3 再输入到权重矩阵 A ,并与上一步的 h2 相结合,得到 h3

x4 = “了”,x4 再输入到权重矩阵 A ,并与上一步的 h3 相结合,得到 h4​

x5 = “吗”,x5 再输入到权重矩阵 A ,并与上一步的 h4 相结合,得到 h5​

x6 = “?”,x6 再输入到权重矩阵 A ,并与上一步的 h5 相结合,得到 h6​ 最后得到的h6就是最终隐藏状态​,可以作为整个序列的上下文信息

3、RNN的隐藏状态更新公式

上面的公式是RNN中隐藏状态更新的一个常见表达式,它结合了当前时间步的输入和前一时间步的隐藏状态,具体说明如下:

  • xt​:在时间步 t 的输入向量,表示当前输入
  • Wih​:输入到隐藏状态的权重矩阵,用于将当前输入 xt​ 转换为隐藏状态的输入部分
  • Whh​:隐藏状态到隐藏状态的权重矩阵,用于将前一时间步的隐藏状态 ht−1​ 传递到当前时间步
  • bih​ 和 bhh​:分别是输入和隐藏状态的偏置项
  • tanh:激活函数,通常用于引入非线性特性,使模型能够学习复杂的模式
  • ht​:输出结果,即:在时间步 t 的隐藏状态,表示当前时间步的记忆

Tanh激活函数与‌Sigmoid、ReLU的区别:

  • 输出范围

    • Sigmoid函数‌:输出范围在0到1之间,其输出值可以被看作是一个概率值,用于表示某个事件发生的概率‌

    • ReLU函数‌:输出范围在0到正无穷之间,输入小于0时输出为0,输入大于0时输出等于输入值

    • Tanh函数‌:输出范围在-1到1之间

  • 梯度特性

    • Sigmoid函数‌:在输入值较大或较小时,梯度接近于0,导致训练过程中梯度消失的问题;此外,Sigmoid函数的计算开销较大,涉及指数运算,可能会影响大规模数据和深层网络的计算效率‌

    • ReLU函数‌:在正值区间内具有线性特性,解决了梯度消失问题;ReLU函数在负值区间梯度为0,可能导致一些神经元永远不会被激活,从而停止更新‌

    • ‌Tanh函数‌:也存在梯度饱和的问题,但其输出值范围在-1到1之间,相对于Sigmoid函数,其输出值范围更大,可能导致模型学习更快‌

  • 适用场景

    • Sigmoid函数‌:适用于二分类问题或输出概率的场景

    • ReLU函数‌:适用于需要快速计算的场景,特别是在深层网络中,因为它解决了梯度消失问题,并且在正值区间内具有线性特性,所以计算速度很快‌

    • Tanh函数‌:通常用于隐藏层的激活函数,因为其输出范围更广,可以更好地表示数据的分布‌

4、RNN的使用方法及示例

由于时序数据通常需要进行向量转换(如文本词向量),经过训练和预测后,再解析为用户所需内容,所以整个处理过程通常会包含编码器和解码器两部分

在深度学习框架(如PyTorch)中,,RNN可以通过以下两种方式结合使用:

  • nn.RNN:这是一个封装好的RNN层,可以自动处理循环逻辑,通常用于编码器部分
  • nn.RNNCell:这是一个基本的RNN单元,需要手动实现循环逻辑,通常用于解码器部分,特别是在需要更精细控制的场景下

nn.RNN示例:

import torch 
from torch import nn# 定义输入语句和初始隐藏状态h0
# 5表示序列长度(sequence length),3表示批次大小(batch size),10表示每个时间步的输入特征数(input size)
X = torch.randn(5, 3, 10)
# 1表示RNN层的数量(这里只有一层),3表示批次大小,20表示隐藏层的维度(hidden size)
h0 = torch.zeros(1, 3, 20, dtype=torch.float32)# 调用RNN(与input和h0的最后一个参数相对应)
rnn = nn.RNN(input_size=10, hidden_size=20)
# 获得output和hn(output包含了每个时间步的隐藏状态的输出,hn只包含最后一个时间步的隐藏状态)
output, hn = rnn(X, h0)# 查看output和hn的形状和内容
print(output.shape, hn.shape)
print(output)
print(hn)

nn.RNNCell示例:

import torch 
from torch import nnX = torch.randn(5, 3, 10)
hn = torch.zeros(3, 20, dtype=torch.float32)
# 定义一个output空列表,用于存储每个时间步的隐藏状态
output = []# 调用RNN(与input和hn的最后一个参数相对应)
rnn_cell = nn.RNNCell(input_size=10, hidden_size=20)# 循环存储每个时间步的隐藏状态
for x in X:hn = rnn_cell(x, hn)output.append(hn)# 将列表中的所有隐藏状态堆叠成一个张量,形状为 (sequence_length, 3, 20)
output = torch.stack(output)# 查看output的形状和内容
print(output.shape)
print(output)

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

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

相关文章

高性能MySQL-优化服务器设置

优化服务器设置 1、MySQL的配置是如何工作的1.1 MySQL配置文件1.2 语法、作用于和动态性1.3 设置变量的副作用 2、不可取的调整参数方法3、配置内存使用3.1 每个连接的内存需求3.2 为操作系统保留内存3.3 InnoDB缓冲池3.4 线程缓存3.4.1 MySQL线程池相关配置参数3.4.2 MySQL线程…

Ubuntu 22.04.5 + kubeadm:Kubernetes v1.28.2集群部署企业实战

文章目录 Ubuntu 22.04.5 kubeadm:Kubernetes v1.28.2集群部署企业实战一、环境准备1.1 机器规划1.2 环境配置1.2.1 设置主机名1.2.2 安装依赖工具1.2.3 配置时间同步1.2.4 关闭swap分区1.2.5 停止和禁用防火墙1.2.6 配置内核转发及网桥过滤1.2.7 安装配置ipset及i…

【ElasticSearch】倒排索引与ik分词器

ElasticSearch,简称ES(后文将直接使用这一简称),是一款卓越的开源分布式搜索引擎。其独特之处在于其近乎实时的数据检索能力,为用户提供了迅速、高效的信息查询体验。 它能够解决全文检索,模糊查询、数据分析等问题。那么它的搜索…

SpringCloud框架学习(第七部分:分布式事务Seata)

目录 十五、SpringCloud Alibaba Seata处理分布式事务 1.分布式事务背景 2.Seata简介 (1)介绍 (2)工作流程 (3)各事务模式 (4)下载安装 3.Seata案例实战-数据库和表准备 …

python打包深度学习虚拟环境

今天师兄让我把环境打包发给他,我才知道可以直接打包深度学习虚拟环境,这样另一个人就不用辛辛苦苦的去装环境了,我们都知道有些论文他需要的环境很难装上。比如装Apex,装 DCN,mmcv-full 我现在把3090机子上的ppft虚拟…

基于MobileNet深度学习网络的MQAM调制类型识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a 3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频&#xff09…

<工具 Claude Desktop> 配置 MCP server 连接本地 SQLite, 本机文件夹(目录) 网络驱动器 Windows 11 系统

也是在学习中... 起因: 抖音博客 艾克AI分享 他的视频 #143《Claude开源MCP彻底打破AI的信息孤岛》 提到: Claude开源的MCP太强了,视频后面是快速演示,反正看了好几遍也没弄明白。菜单都不一样,感觉用的不是同一家 Claude. 探…

(78)MPSK基带调制通信系统瑞利平坦衰落信道传输性能的MATLAB仿真

文章目录 前言一、MATLAB仿真1.仿真代码2.仿真结果 二、子函数与完整代码总结 前言 本文给出瑞利平坦衰落信道上的M-PSK通信系统性能仿真的MATLAB源代码与仿真结果。其中,调制方式M-PSK包括BPSK、QPSK、8-PSK、16-PSK、32-PSK等方式。 一、MATLAB仿真 1.仿真代码 …

go语言 Pool实现资源池管理数据库连接资源或其他常用需要共享的资源

go Pool Pool用于展示如何使用有缓冲的通道实现资源池,来管理可以在任意数量的goroutine之间共享及独立使用的资源。这种模式在需要共享一组静态资源的情况(如共享数据库连接或者内存缓冲区)下非 常有用。如果goroutine需要从池里得到这些资…

Android 系统之Init进程分析

1、Init进程流程 2、Init细节逻辑 2.1 Init触发shutdown init进程触发系统重启是一个很合理的逻辑,为什么合理? init进程是android世界的一切基石,如果android世界的某些服务或者进程出现异常,那么会导致整个系统无法正常使用…

用micropython 操作stm32f4单片机的定时器实现蜂鸣器驱动

import pyb import time # 初始化引脚和定时器通道作为PWM输出 # 注意:这里我们假设您使用的是支持PWM的引脚和定时器 # 在不同的MicroPython板上,支持的引脚和定时器可能不同 # 请查阅您的板的文档以确认正确的引脚和定时器 buzzer_pin pyb.Pin(PD15,…

长沙市的科技查新单位

1、中南大学图书馆科技查新站: 中南大学图书馆科技查新站成立于2003年12月,中南大学图书馆科技查新站作为教育部首批批准的科技查新工作站之一,具备了在全国范围内开展科技查新工作的专业资质。 2、湖南大学科技查新站: 湖南大学…

java基础语法光速入门

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理Java的基础语法部分 适合有编程基础的人快点掌握语法使用 没学过一两门语言的话。。还是不建议看了 极致的浓缩没有一点解释 注释 单行注释 // 多行注释 /**/ 数据类型 布尔型:true false 整型:int,lon…

【redis】集群详解

redis集群 一、集群的概念二、数据分片算法2.1哈希求余算法2.2一致性哈希算法2.3哈希槽分区算法 三、集群的搭建3.1配置docker-compose.yml文件3.2配置generate.sh脚本文件3.3构建redis集群3.4简单测试redis集群 四、故障处理流程4.1故障判定4.2故障转移 五、集群扩容 一、集群…

Linux | Linux的开机启动流程

对于linux系统的初学者来说,理解并掌握linux系统启动流程能够使你够深入的理解linux系统,还可以通过系统的启动过程来分析问题解决问题。 Linux开机启动的流程如下图 power on 开机 post自检(检查一部分大的硬件) BIOS&#xf…

TiDB如何保证数据一致性

1. 分布式事务协议 TiDB 采用了类似 Google Percolator 的分布式事务协议来处理分布式事务。这个协议基于两阶段提交(2PC)的思想,但进行了优化和改进,以适应分布式环境的特殊需求。在 TiDB 中,当一个事务需要跨多个节…

【Maven系列】深入解析 Maven 常用命令

前言 在当今的软件开发过程中,项目管理是至关重要的一环。项目管理包括了项目构建、依赖管理以及发布部署等诸多方面。而在Java生态系统中,Maven已经成为了最受欢迎的项目管理工具之一。Maven 是一套用于构建、依赖管理和项目管理的工具,主要…

DBA面试题-1

面临失业,整理一下面试题,找下家继续搬砖 主要参考:https://www.csdn.net/?spm1001.2101.3001.4476 略有修改 一、mysql有哪些数据类型 1, 整形 tinyint,smallint,medumint,int,bigint;分别占用1字节、2字节、3字节…

【Rust WebAssembly 入门实操遇到的问题】

Rust WebAssembly 入门实操遇到的问题 什么是WebAssembly跟着教程走wasm-pack build error总结 什么是WebAssembly WebAssembly(简称Wasm)是一种基于堆栈的虚拟机的二进制指令 格式。Wasm 被设计为编程语言的可移植编译目标,支持在 Web 上部…

数据挖掘之数据预处理

​​​​​​​ 引言 数据挖掘是从大量数据中提取有用信息和知识的过程。在这个过程中,数据预处理是不可或缺的关键步骤。数据预处理旨在清理和转换数据,以提高数据质量,从而为后续的数据挖掘任务奠定坚实的基础。由于现实世界中的数据通常…