【NLP251】NLP RNN 系列网络

news2025/4/8 3:53:42

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的层数,默认为1
    bias=True,  # 内部的线性转换是否添加bias,True表示添加,默认为True
    batch_first=True,  # 输入&输出数据的第一维是不是批次样本,True表示是,也就是输出的格式为:[N,T,E]; 默认为False,表示shape格式为[T,N,E]
    dropout=0,  # 针对输出的特征向量中,部分值重新为0的概率/可能性
    bidirectional=False,  # 是否构建双向的RNN,True表示构建,False表示不构建反向RNN;默认为False
    proj_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的层数,默认为1
    bias=True,  # 内部的线性转换是否添加bias,True表示添加,默认为True
    batch_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.coloradmin.cn/o/2286543.html

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

相关文章

【越学学糊涂的Linux系统】Linux指令篇(二)

一、pwd指令&#xff1a; 00x0:打印该用户当前目录下所属的文件路径 看指令框可以看出我用的是一个叫sw的用户&#xff0c;我们的路径就是在一个home目录下的sw目录下的class113文件路径。 也可以说是指出当前所处的工作目录 补充&#xff1a;&#x1f386;​​​​​​​Wi…

【AI论文】Omni-RGPT:通过标记令牌统一图像和视频的区域级理解

摘要&#xff1a;我们提出了Omni-RGPT&#xff0c;这是一个多模态大型语言模型&#xff0c;旨在促进图像和视频的区域级理解。为了在时空维度上实现一致的区域表示&#xff0c;我们引入了Token Mark&#xff0c;这是一组在视觉特征空间中突出目标区域的标记。这些标记通过使用区…

Java面试题2025-并发编程基础(多线程、锁、阻塞队列)

并发编程 一、线程的基础概念 一、基础概念 1.1 进程与线程A 什么是进程&#xff1f; 进程是指运行中的程序。 比如我们使用钉钉&#xff0c;浏览器&#xff0c;需要启动这个程序&#xff0c;操作系统会给这个程序分配一定的资源&#xff08;占用内存资源&#xff09;。 …

Three城市引擎地图插件Geo-3d

一、简介 基于Three开发&#xff0c;为Three 3D场景提供GIS能力和城市底座渲染能力。支持Web墨卡托、WGS84、GCJ02等坐标系&#xff0c;支持坐标转换&#xff0c;支持影像、地形、geojson建筑、道路&#xff0c;植被等渲染。支持自定义主题。 二、效果 三、代码 //插件初始化…

MySQL的复制

一、概述 1.复制解决的问题是让一台服务器的数据与其他服务器保持同步&#xff0c;即主库的数据可以同步到多台备库上&#xff0c;备库也可以配置成另外一台服务器的主库。这种操作一般不会增加主库的开销&#xff0c;主要是启用二进制日志带来的开销。 2.两种复制方式&#xf…

【后端开发】字节跳动青训营Cloudwego脚手架

Cloudwego脚手架使用 cwgo脚手架 cwgo脚手架 安装的命令&#xff1a; GOPROXYhttps://goproxy.cn/,direct go install github.com/cloudwego/cwgolatest依赖thriftgo的安装&#xff1a; go install github.com/cloudwego/thriftgolatest编辑echo.thrift文件用于生成项目&…

ArcGIS10.2 许可License点击始终启动无响应的解决办法及正常启动的前提

1、问题描述 在ArcGIS License Administrator中&#xff0c;手动点击“启动”无响应&#xff1b;且在计算机管理-服务中&#xff0c;无ArcGIS License 或者License的启动、停止、禁止等均为灰色&#xff0c;无法操作。 2、解决方法 ①通过cmd对service.txt进行手动服务的启动…

Cyber Security 101-Build Your Cyber Security Career-Security Principles(安全原则)

了解安全三元组以及常见的安全模型和原则。 任务1&#xff1a;介绍 安全已成为一个流行词;每家公司都想声称其产品或服务是安全的。但事实真的如此吗&#xff1f; 在我们开始讨论不同的安全原则之前&#xff0c;了解我们正在保护资产的对手至关重要。您是否试图阻止蹒跚学步…

NLP模型大对比:Transformer > RNN > n-gram

结论 Transformer 大于 RNN 大于 传统的n-gram n-gram VS Transformer 我们可以用一个 图书馆查询 的类比来解释它们的差异&#xff1a; 一、核心差异对比 维度n-gram 模型Transformer工作方式固定窗口的"近视观察员"全局关联的"侦探"依赖距离只能看前…

【Rust自学】14.5. cargo工作空间(Workspace)

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 14.4.1. 为什么需要cargo workspace 假如说我们构建了一个二进制crate&#xff0c;里面既有library又有库。随着项目规模不断增长&#…

[权限提升] Windows 提权 — 系统内核溢出漏洞提权

关注这个框架的其他相关笔记&#xff1a;[内网安全] 内网渗透 - 学习手册-CSDN博客 0x01&#xff1a;系统内核溢出漏洞提权介绍 注意&#xff1a;提权很容易让电脑蓝屏&#xff0c;所以如果是测试的话&#xff0c;提权前最好做好系统备份。 溢出漏洞就像是往杯子里装水 —— 如…

手机端语音转文字的实用选择

今天推荐两款配合使用的软件&#xff1a;MultiTTS 和 T2S&#xff0c;它们可以在安卓设备上实现文字转语音功能。 第一款&#xff1a;MultiTTS&#xff08;安卓&#xff09; MultiTTS 是一款离线文本转语音工具&#xff0c;完全免费&#xff0c;提供多种语音风格&#xff0c;…

四.3 Redis 五大数据类型/结构的详细说明/详细使用( hash 哈希表数据类型详解和使用)

四.3 Redis 五大数据类型/结构的详细说明/详细使用&#xff08; hash 哈希表数据类型详解和使用&#xff09; 文章目录 四.3 Redis 五大数据类型/结构的详细说明/详细使用&#xff08; hash 哈希表数据类型详解和使用&#xff09;2.hash 哈希表常用指令(详细讲解说明)2.1 hset …

无心剑七绝《经纬岁华》

七绝经纬岁华 经天伟业梦初耕 纬地深沉志纵横 岁去年来添锦绣 华章曼妙筑新城 2025年1月29日 平水韵八庚平韵 无心剑七绝《经纬岁华》以“经纬岁华”为藏头&#xff0c;歌颂了泸州职业技术学院&#xff08;川南经纬学堂&#xff09;百余年的光辉历程。诗中“经天伟业梦初耕&…

大数据治理实战:架构、方法与最佳实践

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 大数据治理是确保数据质量、合规性和安全性的重要手段&#xff0c;尤其在数据驱动决策和人工智能应用日益普及的背景下&…

区块链在能源行业的创新

技术创新 1. 智能合约与自动化交易 智能合约是区块链技术的核心组件之一&#xff0c;它允许在没有中介的情况下自动执行合同条款。在能源行业&#xff0c;这可以用于自动化电力交易、支付流程以及管理复杂的供应链。例如&#xff0c;当太阳能板产生的电量达到预设值时&#x…

C基础寒假练习(1)

一、求二维数组只中元并输出行标和列标(以二行三列为例)元素的最大值&#xff0c; #include <stdio.h>int main() {// 初始化二维数组int array[2][3] {{1, 2, 3},{4, 5, 6}};// 定义变量来存储最大值及其位置int max_value array[0][0];int max_row 0;int max_col 0…

SQLServer 不允许保存更改(主键)

在我们进行数据库表格编辑的时候,往往会出现同一个名字,就比如我们的账号一样,我们在注册自己QQ的时候,我们通常注册过的账号,别人就不能注册了,这是为了保证严密性 所以我们需要点击表格>右键>设计 点击某一列>右键>设计主键 当我们Ctrls 保存的时候回弹出下…

linux监控脚本+自动触发邮件发送

linux脚本 需求&#xff1a; CPU 负载&#xff1a;使用 uptime 命令&#xff0c;我们可以清楚地了解系统的 CPU 负载情况。这个命令会显示系统在过去 1 分钟、5 分钟和 15 分钟的平均负载。高负载可能意味着系统正在处理大量的任务&#xff0c;可能会导致性能下降或服务响应延迟…

Ollama本地部署deepseek-r1:7b

Ollama本地部署deepseek-r1:7b RTX2060 6GB显存可运行。 一、下载安装ollama ollama地址 二、设置环境变量 您可以右键点击“此计算机” > “切换到管理员”&#xff0c;然后以管理员身份运行 cmd setx OLLAMA_HOST 0.0.0.0 setx OLLAMA_ORIGINS *三、然后重启ollama …