【NLP251】NLP RNN 系列网络

NLP251 系列主要记录从NLP基础网络结构到知识图谱的学习

1.原理及网络结构

1.1RNN 

在Yoshua Bengio论文中( http://proceedings.mlr.press/v28/pascanu13.pdf )证明了梯度求导的一部分环节是一个指数模型,当n<1时,就会出现“梯度消失"问题,而当η> 1时,“梯度爆炸”也就产生了。

1.2 双向-RNN

两个方向RNN的区别在于输入数据的不同,反向RNN数据是对正向RNN数据的反转

1.3深度双向-RNN

 

1.4LSTM

LSTM(长短期记忆网络)相较于RNN(循环神经网络)的主要优势如下:

1. 解决长期依赖问题

  • RNN在处理长序列数据时,容易出现梯度消失或梯度爆炸的问题,导致难以捕捉到序列中相隔较远的依赖关系。

  • LSTM通过引入“记忆单元”(Cell State)和门控机制(遗忘门、输入门、输出门),能够有效地学习和保持长期依赖关系。遗忘门可以有选择性地丢弃不再重要的信息,输入门可以添加新的重要信息,输出门则控制信息的输出,从而确保信息在长序列中能够稳定传递。

2. 缓解梯度消失问题

  • RNN在反向传播时,梯度可能会随着序列长度增加而迅速衰减或增大,导致训练困难。

  • LSTM通过门控机制,使得梯度可以直接通过记忆单元流动,减少了梯度在传播过程中的衰减,从而缓解了梯度消失问题。

LSTM 的关键在于其所特有的“细胞状态”,这一状态犹如一条贯穿始终的传送带。它在整个链条上顺畅运行 ,只有一些少量的线性交互。信息在 上面流传保持不变很容易。

LSTM怎么控制“细胞状态”? 

LSTM(长短期记忆网络)借助所谓的“门”结构,能够有选择地去除或增加“细胞状态”中存储的信息。这一过程包含一个sigmoid神经网络层以及一个逐元素的乘法操作。sigmoid层生成一个介于0到1之间的概率值,决定每个成分可以通过的量,其中0代表“完全阻止”,而1则表示“完全允许”。在LSTM中,存在三个主要的“门”结构,共同调控“细胞状态”的更新机制。

第一个“门”——“忘记门”或“遗忘门”, 决定从过去的“细胞状态”中 丢弃什么信息;比如在语言模型中,细胞状态可能包含了性别信息(“他” 或者“她”),当我们看到新的代名词的时候,可以考虑忘记旧的数据。
第二个“门”,即“信息 增加门”,负责决定哪些新信息可以添加到“细胞状态”中。 Sigmoid层决定什么值需要更新; Tanh层创建一个新的候选向量Ct; 主要是为了状态更新做准备

 

经过第一个和第二个“门”后,可以确定传递信息的删除和增加,进而执行“细胞状态”的更新操作。具体来说,首先将Ct-1更新为Ct,接着把旧状态与ft相乘,从而剔除那些确凿无误无需保留的信息。随后,加入新的候选值it *Ct,最终获得更新后的“细胞状态”。

 

第三个“门”即“输出门”,它基于“细胞状态”生成输出。首先,通过sigmoid层来决定细胞状态的哪一部分会被用于输出。然后,利用tanh函数处理细胞状态,得到一个介于-1到1之间的数值。最后,将这个数值与sigmoid门的输出相乘,从而确定最终输出的内容。

 

LSTM变种

 变种1 增加“peephole connections”层 ,让门层也接受细胞状态的输入

变种2 通过耦合忘记门和更新输入门(第一个和第二个门);也就是不再单独的考虑忘记什么、 增加什么信息,而是一起进行考虑

 

1.5GRU 

Gated Recurrent Unit (GRU) 是在2014年被提出的,它将LSTM中的忘记门和输出门合并为一个单一的更新门,同时还将数据单元状态和隐藏状态(即细胞状态和输出状态)进行了合并。这种结构相较于LSTM更为简单。

总结:RNN与GRU细胞状态信息与输出信息相同,而GRU细胞状态信息可能与输出信息不同 。

 2.API接口实现

2.1RNN API调用讲解

RNN返回值为两部分,第一部分是蓝框所示所有时刻 最后一个隐藏层的输出特征向量;

第二分是红色圈所示最后时刻 所有一个隐藏层的输出特征向量;

我们可以通过rnn.named_parameters()来查看详细的中间过程状态shape

rnn = nn.RNN(4, 8, num_layers=2, batch_first=True, bidirectional=True)
for name, param in rnn.named_parameters():print(name, param.shape)

  

RNN无法保持长时依赖(代码验证):

 2.2 LSTM API调用讲解 

 

 从网络结构图和代码中不难发现LSTM中ht与output输出相同 

 中间过程中的32从何而来?

weight_ih_l0 torch.Size([32, 4])
weight_hh_l0 torch.Size([32, 8])
bias_ih_l0 torch.Size([32])
bias_hh_l0 torch.Size([32])

附LSTM代码:

lstm = nn.LSTM(input_size=4,  # 每个样本每个时刻输入的向量维度大小hidden_size=16,  # 每个样本每个时刻输出的向量维度大小num_layers=1,  # RNN的层数,默认为1bias=True,  # 内部的线性转换是否添加bias,True表示添加,默认为Truebatch_first=True,  # 输入&输出数据的第一维是不是批次样本,True表示是,也就是输出的格式为:[N,T,E]; 默认为False,表示shape格式为[T,N,E]dropout=0,  # 针对输出的特征向量中,部分值重新为0的概率/可能性bidirectional=False,  # 是否构建双向的RNN,True表示构建,False表示不构建反向RNN;默认为Falseproj_size=0  # 是否针对每个时刻输出的hi进行一个线性转换,0表示不进行转换;>0的值表示会将hi映射(全连接)为proj_size大小的向量
)x = torch.randn(2, 3, 4)  # 2个样本,每个样本3个token,每个token对应的向量维度大小为4
# batch_first = True
# output: 所有样本、所有时刻对应的输出特征向量值,shape为: [N,T,?]
# ? = hidden_size * (2 if bidirectional else 1) if proj_size <=0 else proj_size
# ct: 最后一个时刻的状态信息/细胞信息, shape为: [1 * num_layers * (2 if bidirectional else 1), N, hidden_size]
# ht: 最后一个时刻的状态信息/细胞信息, shape为: [1 * num_layers * (2 if bidirectional else 1), N, hidden_size]
output, (ht, ct) = lstm(x)
print(type(output), output.shape)
print(type(ht), ht.shape)
print(type(ct), ct.shape)print(output[:, -1, :])
print(ht)
print(ct)rnn = nn.LSTM(4, 8, batch_first=True, bidirectional=False, num_layers=1)
for name, param in rnn.named_parameters():print(name, param.shape)

2.3 GRU API调用讲解 

lstm = nn.GRU(input_size=4,  # 每个样本每个时刻输入的向量维度大小hidden_size=16,  # 每个样本每个时刻输出的向量维度大小num_layers=1,  # RNN的层数,默认为1bias=True,  # 内部的线性转换是否添加bias,True表示添加,默认为Truebatch_first=True,  # 输入&输出数据的第一维是不是批次样本,True表示是,也就是输出的格式为:[N,T,E]; 默认为False,表示shape格式为[T,N,E]dropout=0,  # 针对输出的特征向量中,部分值重新为0的概率/可能性bidirectional=False  # 是否构建双向的RNN,True表示构建,False表示不构建反向RNN;默认为False
)# 2个样本,每个样本3个token,每个token对应的向量维度大小为4
x = torch.randn(2, 3, 4)
# batch_first = True
# output: 所有样本、所有时刻对应的输出特征向量值,shape为: [N,T,?]
# **** ? = hidden_size * (2 if bidirectional else 1)
# : 最后一个时刻的状态信息/细胞信息, shape为: [1 * num_layers * (2 if bidirectional else 1), N, hidden_size]
# ct/ht: 最后一个时刻的状态信息/细胞信息, shape为: [1 * num_layers * (2 if bidirectional else 1), N, hidden_size]
output, ct = lstm(x)
print(type(output), output.shape)
print(type(ct), ct.shape)rnn = nn.GRU(4, 8, batch_first=True, bidirectional=False, num_layers=1)
for name, param in rnn.named_parameters():print(name, param.shape)

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

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

相关文章

OpenCV:在图像中添加噪声(瑞利、伽马、脉冲、泊松)

目录 简述 1. 瑞利噪声 2. 伽马噪声 3. 脉冲噪声 4. 泊松噪声 总结 相关阅读 OpenCV&#xff1a;在图像中添加高斯噪声、胡椒噪声-CSDN博客 OpenCV&#xff1a;高通滤波之索贝尔、沙尔和拉普拉斯-CSDN博客 OpenCV&#xff1a;图像处理中的低通滤波-CSDN博客 OpenCV&…

小智 AI 聊天机器人

小智 AI 聊天机器人 &#xff08;XiaoZhi AI Chatbot&#xff09; &#x1f449;参考源项目复现 &#x1f449; ESP32SenseVoiceQwen72B打造你的AI聊天伴侣&#xff01;【bilibili】 &#x1f449; 手工打造你的 AI 女友&#xff0c;新手入门教程【bilibili】 项目目的 本…

亚博microros小车-原生ubuntu支持系列:16 机器人状态估计

本来想测试下gmapping建图&#xff0c;但是底层依赖了yahboomcar_bringup做底层的数据处理&#xff0c;所以先把依赖的工程导入。 程序启动后&#xff0c;会订阅imu和odom数据&#xff0c;过滤掉一部分的imu数据后&#xff0c;然后与odom数据进行融合&#xff0c;最后输出一个…

C++中的类与对象(中)

在上一节中&#xff0c;我们初步了解了一下&#xff0c;C中的类&#xff0c;这一概念&#xff0c;这一节让我们进一步深入了解一下。 文章目录 目录 前言 一、类中的默认成员函数 1.1 构造函数 构造函数的特点&#xff1a; 1.2 析构函数 析构函数的特点&#xff1a; 1.3 …

Kotlin开发(六):Kotlin 数据类,密封类与枚举类

引言 想象一下&#xff0c;你是个 Kotlin 开发者&#xff0c;敲着代码忽然发现业务代码中需要一堆冗长的 POJO 类来传递数据。烦得很&#xff1f;别急&#xff0c;Kotlin 贴心的 数据类 能帮你自动生成 equals、hashCode&#xff0c;直接省时省力&#xff01;再想想需要多种状…

redis数据安全与性能保障

数据安全与性能保障 1、持久化1.1 快照持久化1.2 AOF持久化1.3 重写/压缩AOF文件 2、复制2.1 Redis复制的启动过程2.2 主从链 3、处理系统故障3.1 验证快照文件和AOF文件 4、事务4.1 java中的redis事务使用 如有侵权&#xff0c;请联系&#xff5e; 如有错误&#xff0c;也欢迎…

数据分析系列--③RapidMiner算子说明及数据预处理

一、算子说明 1.新建过程 2.算子状态灯 状态灯说明: (1)状态指示灯&#xff1a; 红色:指示灯说明有参数未被设置或输入端口未被连接等问题; 黄色:指示灯说明还未执行算子&#xff0c;不管配置是否基本齐全; 绿色:指示灯说明一切正常&#xff0c;已成功执行算子。 (2)三角…

基于Go语言的三甲医院人机与智能体协同环境系统(上.文章部分)

一、引言 1.1 研究背景与意义 1.1.1 三甲医院对高效协同系统的需求 三甲医院作为医疗体系的核心力量,承担着疑难病症诊治、医学科研教学等重要任务,其业务具有高度的复杂性。在日常运营中,三甲医院涉及多个科室,每个科室又包含众多专业领域,各科室之间需要紧密协作,共…

js笔记(黑马程序员)

&#xff08;Web APIs day4&#xff09; 一、日期对象 1.实例化 在代码中发现了 new 关键字时&#xff0c;一般将这个操作称为实例化 创建一个时间对象并获取时间// 1&#xff0e;得到当前时间 2.日期对象方法 因为日期对象返回的数据我们不能直接使用&#xff0c;所以需…

SOME/IP--协议英文原文讲解2

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 4.1 Speci…

python-leetcode-反转链表 II

92. 反转链表 II - 力扣&#xff08;LeetCode&#xff09; # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def reverseBetween(self, head: Optional…

LM Studio 本地部署DeepSeek及其他AI模型的详细操作教程及硬件要求

本篇文章主要讲解&#xff0c;通过LM Studio工具实现各类型AI模型本地部署的操作方法方式。 作者&#xff1a;任聪聪 日期&#xff1a;2025年1月29日 LM Studio 介绍&#xff1a; LM Studio是一款能够本地离线运行各类型大语言模型的客户端应用&#xff0c;通过LM Studio 可以…

SOME/IP--协议英文原文讲解3

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 Note: Thi…

Janus Pro:DeepSeek 开源革新,多模态 AI 的未来

Janus Pro 是 DeepSeek 开发的一个开源多模态人工智能框架&#xff0c;它通过集成视觉和语言处理能力&#xff0c;提供了高性能的多模态任务处理能力。 在线体验&#xff1a; https://deepseek-januspro.com/ 背景 Janus Pro 于2025年1月发布&#xff0c;是一个开源的多模态…

Jenkins上生成的allure report打不开怎么处理

目录 问题背景&#xff1a; 原因&#xff1a; 解决方案&#xff1a; Jenkins上修改配置 通过Groovy脚本在Script Console中设置和修改系统属性 步骤 验证是否清空成功 进一步的定制 也可以使用Nginx去解决 使用逆向代理服务器Nginx&#xff1a; 通过合理调整CSP配置&a…

指针的介绍3前

1.字符指针变量 1.1介绍 char arr[] "abcdef";char* p arr; 上面的代码中&#xff0c;我创建了 字符数组 arr 来存储一个字符串 此时&#xff0c;我可以创建一个指针变量对这个字符串进行相应的修改&#xff1a; 我也可以创建一个指针变量指向一个字符串&#xff…

Scrapy如何设置iP,并实现IP重用, IP代理池重用

前置知识 1/3乐观锁 2/3 Scrapy流程(非全部) 3/3 关于付费代理 我用的"快代理", 1000个ip, 每个ip1min的有效期, 你用的时候, 把你的链接, 用户名填上去就行 设置代理IP &#x1f512; & 帮助文档: ①meta ②meta#proxy$ 语法: ①proxy的设置: Request对象中…

gesp(C++六级)(7)洛谷:P10376:[GESP202403 六级] 游戏

gesp(C六级)&#xff08;7&#xff09;洛谷&#xff1a;P10376&#xff1a;[GESP202403 六级] 游戏 题目描述 你有四个正整数 n , a , b , c n,a,b,c n,a,b,c&#xff0c;并准备用它们玩一个简单的小游戏。 在一轮游戏操作中&#xff0c;你可以选择将 n n n 减去 a a a&am…

【16届蓝桥杯寒假刷题营】第2期DAY5

5.变变数组 - 蓝桥云课 给定一个长度为 n 的整数数组 A&#xff0c;A 中第 i 个元素为 Ai​&#xff08;1≤i≤n&#xff09;&#xff0c;你只能在 A 中选择一个元素 a&#xff0c;将 A 中所有数值等于 a 的元素变为 a2&#xff0c;请问变化后 A 中所有元素和的最大为多少。 …

论文阅读(十五):DNA甲基化水平分析的潜变量模型

1.论文链接&#xff1a;Latent Variable Models for Analyzing DNA Methylation 摘要&#xff1a; 脱氧核糖核酸&#xff08;DNA&#xff09;甲基化与细胞分化密切相关。例如&#xff0c;已经观察到肿瘤细胞中的DNA甲基化编码关于肿瘤的表型信息。因此&#xff0c;通过研究DNA…