【课程总结】Day17(中):LSTM及GRU模型简介

news2024/11/12 5:21:19

前言

在上一章【课程总结】Day17(上):NLP自然语言处理及RNN网络我们初步了解RNN的基本概念和原理。本章内容,我们将继续了解RNN的变种模型,如LSTM和GRU。

RNN发展历史

早期发展

  • 1980年代:RNN 的概念最早由 David Rumelhart 和 Geoffrey Hinton 提出。早期的 RNN 结构相对简单,主要用于字符级别的序列处理。
  • 1986年:Rumelhart 等人提出的反向传播算法(Backpropagation Through Time, BPTT)使得 RNN 的训练变得可行。

问题与挑战

  • 1990年代:随着 RNN 的应用增多,研究人员发现传统 RNN 在处理长序列时面临梯度消失和梯度爆炸的问题,限制了其在实际应用中的有效性。

LSTM 和 GRU 的提出

  • 1997年:Sepp Hochreiter 和 Jürgen Schmidhuber 提出了长短期记忆网络(LSTM),引入了门控机制,有效解决了传统 RNN 的梯度消失问题。
  • 2014年:门控循环单元(GRU)被提出,作为 LSTM 的简化版本,进一步提高了 RNN 的性能和训练效率。

Transformer 的出现

  • 2017年:Vaswani 等人提出了 Transformer 模型,完全基于自注意力机制,摆脱了 RNN 的结构限制。Transformer 能够并行处理序列数据,显著提高了训练速度和效率。

LSTM模型

LSTM模型介绍

长短期记忆网络(LSTM)是一种特殊类型的递归神经网络(RNN),旨在解决传统 RNN 在处理长序列时常见的梯度消失和梯度爆炸问题。LSTM 通过引入门控机制,能够有效地捕捉长期依赖关系。

LSTM模型结构

LSTM 单元主要由以下几个部分组成:

  • 第一部分:遗忘门(Forget Gate)
    • 作用:遗忘不想要的。输出在 0 到 1 之间的值,0 表示完全遗忘,1 表示完全保留。
  • 第二部分:输入门(Input Gate)
    • 作用:输出短期状态,决定当前输入 (x_t) 有多少信息被添加到单元状态中。
  • 第三部分:输出门(Output Gate)
    • 作用:决定当前单元状态 (C_t) 的多少信息将输出到隐状态。

LSTM的API使用

自动循环
# 创建模型
lstm = nn.LSTM(input_size=128, hidden_size=256)

# 定义输入(待处理信息)
X = torch.randn(13, 2, 128)
# 初始的长期状态
c0 = torch.zeros(1, 2, 256, dtype=torch.float32)
# 初始的短期状态
h0 = torch.zeros(1, 2, 256, dtype=torch.float32)

# 执行循环
out, (hn, cn) = lstm(X, (h0, c0))
out.shape, hn.shape, cn.shape
# 输出结果
# (torch.Size([13, 2, 256]), torch.Size([1, 2, 256]), torch.Size([1, 2, 256]))
手写循环
# 创建手动循环
lstm_cell = nn.LSTMCell(input_size=128, hidden_size=256)

# 定义输入(待处理信息)
X = torch.randn(13, 2, 128)
c0 = torch.zeros(2, 256, dtype=torch.float32)
h0 = torch.zeros(2, 256, dtype=torch.float32)

out = []
# 循环处理
for x in X:
    h0, c0 = lstm_cell(x, (h0, c0))
    out.append(h0)
# 将结果堆叠
out = torch.stack(out)
len(out), out.shape
# 输出结果
# (13, torch.Size([13, 2, 256]))

GRU模型

GRU模型介绍

门控循环单元(Gated Recurrent Unit, GRU)是一种改进的递归神经网络(RNN)架构,旨在解决传统 RNN 在处理长序列时遇到的梯度消失问题。GRU 于 2014 年由 Kyunghyun Cho 等人提出,作为 LSTM 的一种简化版本,具有更少的参数和更高的计算效率。

GRU模型结构


GRU 主要由以下两个门控机制组成:

  • 更新门(Update Gate)
    • 作用:决定当前隐状态 (h_t) 中保留多少前一个隐状态 (h_{t-1}) 的信息。
  • 重置门(Reset Gate)
    • 作用:决定在计算当前隐状态时,前一个隐状态的信息被遗忘的程度。

GRU的API使用

自动循环
# 创建模型
gru = nn.GRU(input_size=128, hidden_size=256)

# 定义输入(待处理信息)
X = torch.randn(13, 2, 128)
# 初始的短期状态
h0 = torch.zeros(1, 2, 256, dtype=torch.float32)

# 执行循环
output, hn = gru(X, h0)
output.shape, hn.shape
# 输出结果
# (torch.Size([13, 2, 256]), torch.Size([1, 2, 256]))
手写循环
gru_cell = nn.GRUCell(input_size=128, hidden_size=256)

X = torch.randn(13, 2, 128)
h0 = torch.zeros(2, 256, dtype=torch.float32)

out = []
for x in X:
    h0 = gru_cell(x, h0)
    out.append(h0)
out = torch.stack(out)
len(out), out.shape

RNN、LSTM、GRU 的优势与劣势

RNN优势与劣势

优势

  1. 简单性:RNN 结构相对简单,易于理解和实现。
  2. 适合序列数据:RNN 能够处理任意长度的序列数据(例如:股票数据、销售数据、自然语言、语音信号等),实现了统计机器学习深度学习 的过渡。

劣势

  1. 梯度消失与爆炸:传统 RNN 在处理长序列时,容易出现梯度消失或梯度爆炸的问题,导致训练困难。
  2. 训练时间较长:由于序列数据的特性,RNN 的训练时间通常较长,尤其是在长序列上。
  3. 并行化困难:RNN 的计算依赖于前一个时间步的输出,导致其在训练和推理时难以进行并行化,效率较低,无法有效利用硬件加速。

LSTM优势与劣势

优势

  1. 解决梯度消失问题:通过引入遗忘门、输入门和输出门,有效缓解了梯度消失问题。
  2. 捕捉长距离依赖:能够更好地捕捉长距离依赖关系,适用于长序列数据。

劣势

  1. 复杂性:结构较为复杂,参数较多,训练和调优的难度增加。
  2. 计算开销:由于门控机制的引入,计算成本较高,训练速度相对较慢。
  3. 过拟合风险:参数较多可能导致过拟合,尤其是在数据量不足的情况下。

GRU优势与劣势

优势

  1. 简化结构:相较于 LSTM,GRU 只有两个门,结构更简单,参数更少。
  2. 高效训练:由于参数较少,训练速度通常更快,适合资源有限的环境。
  3. 良好性能:在许多任务中,GRU 的表现与 LSTM 相当,有时甚至更好。

劣势

  1. 灵活性不足:虽然 GRU 在许多任务中表现良好,但在某些特定任务上,LSTM 可能会表现得更好。
  2. 可解释性问题:与其他深度学习模型一样,GRU 的内部机制较难以解释,可能导致模型的可解释性问题。

内容小结

  • LSTM 和 GRU 都是 RNN 的变种,它们都旨在解决传统 RNN 在处理长序列时遇到的梯度消失问题。
  • LSTM 通过引入遗忘门(Forget Gate)和输入门(Input Gate)来控制短期记忆和长期记忆,能够有效地捕捉长期依赖关系。
  • GRU 通过引入更新门(Update Gate)和重置门(Reset Gate)来控制短期记忆和长期记忆,能够有效地捕捉长期依赖关系。
  • LSTM 和 GRU 的API使用方式都较为相似,都是通过调用 nn.LSTM()nn.GRU() 函数创建模型,他们与RNN类似都有自动循环和手写循环两种方式。
  • RNN的优势是简单,易于理解和实现;劣势是梯度消失和训练时间较长。
  • LSTM的优势是能够捕捉长距离依赖关系,缺点是参数较多,训练和调优的难度增加。
  • GRU的优势是简化结构,缺点是参数较多,训练和调优的难度增加。

参考资料

一文搞懂 LSTM(长短期记忆网络)

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

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

相关文章

盘点一下这几个月以来的大事记吧~图欧学习资源库更新日志(2022年5月~10月)含资源

大家好,我是TUO图欧君!好久不见~ 这几个月以来我都干了什么呢?到底是因为什么事情拖更呢?咳咳……说来话长……总的来说,更加完善了图欧学习资源库网站,并且升级了三大网盘的内容空间,资源更加…

亚马逊与Temu联动:揭秘差价新玩法

摘要: 最近,跨境电商里有一种新颖的玩法悄然兴起——在亚马逊开店,通过在Temu下单并直接发货给亚马逊客户,从而赚取差价。 这种模式不仅降低了库存压力,还能实现利润最大化。 甚至有些铁子,能在这个制度下…

基于Java+SpringBoot+Vue的母婴商城

基于JavaSpringBootVue的母婴商城 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 哈喽兄弟们…

day16 Java基础——JavaDoc生成文档

day16 Java基础——JavaDoc生成文档 目录 day16 Java基础——JavaDoc生成文档1. 什么是JavaDoc2. 生成JavaDoc2.1 通过命令行生成JavaDoc2.2 使用IDEA生成JavaDoc 1. 什么是JavaDoc JavaDoc是一种标准的、用于生成Java代码API文档的工具。它通过在Java源代码中特定的注释标签&…

【letcode-c++】242有效的字母异位词与49字母异位词分组

一、242 有效的字母异位词 (1)题目 (2)知识点–哈希 【这一段总结来自于代码随想录的讲解学透哈希表 哈希的优势是可以实现快速查找,它非常适合应用与查找某一个元素是否在一个集合中出现。 哈希有三种实现形式&…

arduino程序-模拟输入(基础知识)

arduino程序-模拟输入(基础知识) 1-28 模拟输入1 - 学用电位器电位器电位器实际应用Arduino如何接电位器 1-29 模拟输入2-analogRead演示效果示例程序:干扰问题AnalogRead() 1-30 模拟输入3-电位器控制LED亮度实验演示…

自定义封装日历组件

自定义日历 工作需要&#xff0c;但现有框架封装的日历无法满足需求&#xff0c;又找不到更好的插件&#xff0c;所以准备自己封装一个。 效果图和说明 一个很简易版的demo日历&#xff0c;本文只提供最基本的功能代码&#xff0c;便于阅读二开。 新建calendar.vue文件 <…

【小技巧】CSS如何实现文字溢出显示省略号

文章目录 文字溢出显示省略号设置伪类实现全称展示 文字溢出显示省略号 在列表项或者导航菜单中&#xff0c;经常会在列表项或导航菜单中&#xff0c;由于空间有限&#xff0c;当文本内容较长时&#xff0c;可以使用省略号显示文本已被截断。 CSS中文字溢出显示省略号&#xf…

TCP通信的实现和项目案例

TCP协议是面向连接的&#xff0c;在通信时客户端与服务器端必须建立连接。在网络通讯中&#xff0c;第一次主动发起通讯的程序被称作客户端&#xff08;Client&#xff09;程序&#xff0c;简称客户端&#xff0c;而在第一次通讯中等待连接的程序被称作服务器端&#xff08;Ser…

npm install 报错 ‘proxy‘ config is set properly. See: ‘npm help config‘

解决 参考链接&#xff1a;npm install 报错 ‘proxy‘ config is set properly. See: ‘npm help config‘-阿里云开发者社区 (aliyun.com)

Linux Ubuntu 20.04 安装DPDK方法指南

系统及DPDK版本 系统&#xff1a;Ubuntu 20.04 DPDK&#xff1a;20.11.10 Pktgen-DPDK&#xff1a;22.04.1 关于DPDK&#xff0c;其实Ubuntu的软件源中就已经包含了最新的Stable版本的DPDK&#xff0c;如果不想自己编译的话&#xff0c;直接 apt install dpdk 也是可以的 安…

python库(17):pkuseg库实现文本分词

1 pkuseg简介 PKUSEG&#xff0c;全称“北京大学语言计算与机器学习研究组开发的分词工具”&#xff0c;它就像一把锋利的瑞士军刀&#xff0c;帮助我们轻松切割文本。 在Python的文本处理领域&#xff0c;有很多分词工具&#xff0c;比如jieba、SnowNLP等。但是&#xff0c;…

iOS多界面传值

iOS多界面传值 文章目录 iOS多界面传值属性传值协议传值Block传值通知传值KVO传值概述使用步骤 总结 属性传值 这个传值方式和他的名字一样&#xff0c;我们主要还是通过属性对值进行一个传递&#xff0c;主要应用场景是前一个页面向后一个页面传值。 首先我们先要设置一个属…

哪里有ai写真软件免费方法?轻松获取写真的5个技巧

想在8月为自己的社交媒体更新个人形象吗&#xff1f;想要为即将到来的秋季增添一抹新意吗&#xff1f; AI写真软件是我们最佳的理想选择&#xff0c;通过简单的操作&#xff0c;我们可以在短时间内获得一张专属于自己的AI头像&#xff0c;让这个夏天的回忆更加生动。 特别是常…

C++进阶:设计模式___适配器模式

前言 在C的基础语法的学习后,更进一步为应用场景多写代码.其中设计模式是有较大应用空间. 引入 原本在写容器中适配器类有关的帖子,发现适配模式需要先了解,于是试着先写篇和适配器模式相关的帖子 理解什么是适配器类,需要知道什么是适配器模式.适配器模式是设计模式的一种.笔…

【论文阅读】PETRv2: A Unified Framework for 3D Perception from Multi-Camera Images

Q: 论文如何解决这个问题&#xff1f; A: 论文通过提出PETRv2框架来解决多相机图像的3D感知问题&#xff0c;具体方法包括以下几个关键点&#xff1a; 时间建模&#xff08;Temporal Modeling&#xff09;&#xff1a; 通过3D坐标对齐&#xff08;3D Coordinates Alignment&…

AI应用开发前景与目标

前景与目标 什么是AIGC AIGC最基本的能力是生成内容&#xff0c;包括文本、图像、视频、代码、3D内容或者几种媒介类型转换组合 形成的“多模态内容”。生成算法、预训练模型、多模态等技术累积融合&#xff0c;以及深度模型方面的 技术创新&#xff0c;共同催生了AIGC的大爆…

一篇文章教你如何在Android上使用QPython高效编程

导语&#xff1a;你是否想在Android设备上体验Python编程的乐趣&#xff1f;QPython是一款强大的Python脚本引擎&#xff0c;让你在手机上也能轻松编写和运行Python代码。本文将带你了解QPython的使用方法&#xff0c;让你随时随地开启编程之旅&#xff01; 一、认识QPython Q…

File 34

package File;import java.awt.*; import java.io.File;public class file1 {public static void main(String[] args) {//创建FILE对象&#xff0c;指代某个具体的文件//路径分隔符File f1new File("C:/Users/SUI/Desktop/kaishi/nih.txt");// File f1new File(&quo…

推荐4款比转转大师还好用的专业数据恢复软件。

数据已经成为我们生活和工作中不可或缺的一部分&#xff1b;然而我们在很多的场景当中都会导致数据丢失&#xff1b;于是数据恢复工具便成了一些人的常用工具。很多人都知道转转大师数据恢复软件&#xff0c;但是也有其他的恢复软件也很好用。 1、福昕恢复 直通车&#xff1a;…