LSTM和GRU

news2025/7/4 23:07:46

LSTM和GRU

RNN的优缺点

优点:

  1. 可以捕获序列之间的关系;
  2. 共享参数。

缺点:

  1. 存在梯度消失和梯度爆炸问题;
  2. RNN的训练是一个比较困难的任务;
  3. 无法处理长序列问题。

LSTM

LSTM可以处理长序列问题,同样在之前这篇文章中,关于LSTM网络的核心思想介绍的比较明白,而且传送带的比喻比较形象,结合上篇和当前这篇可以对LSTM有更深入的理解。

接着上篇文章中的例子,RNN一个时间步t的输出为:

y = activation(dot(state_t, U) + dot(input_t, W) + b)

LSTM多了一个Ct:

output_t = activation(dot(state_t, Uo) + dot(input_t, Wo) + dot(C_t, Vo) + bo)

Ct的计算方式:

i_t = activation(dot(state_t, Ui) + dot(input_t, Wi) + bi)
f_t = activation(dot(state_t, Uf) + dot(input_t, Wf) + bf)
k_t = activation(dot(state_t, Uk) + dot(input_t, Wk) + bk)

c_t+1 = i_t * k_t + c_t * f_t

接下来先看看LSTM的网络结构图,可以帮助更好的理解上面的计算含义

在这里插入图片描述

c_t+1 = i_t * k_t + c_t * f_t,其中f_t是下面这部分(也就是forget gate)

在这里插入图片描述

i_t*k_t是下面这部分(也就是update gate,网上一般将此门称为输入门)

在这里插入图片描述

之后将这两部分加到一起(memory pipe)

在这里插入图片描述

别忘了,以上只是在计算Ct,Ct只是LSTM相比较于RNN增加的部分,真正的输出(ht)是下面这部分

在这里插入图片描述

代码实现

仅返回最终输出

# 32个句子,每个句子长度为10,词向量长度为8
inputs = tf.random.normal([32, 10, 8])
lstm = tf.keras.layers.LSTM(4)
output = lstm(inputs)
print(output.shape)

(32, 4)

返回每个时间步的输出

# 这里每个句子的长度为10,正常一个句子会有一个向量输出,如果return_sequences=True,则句子中每个单词均会有一个输出。
lstm = tf.keras.layers.LSTM(4, return_sequences=True)
out = lstm(inputs)
print(out.shape)

返回除最后一个输出之外的最后一个状态

lstm = tf.keras.layers.LSTM(4, return_sequences=False, return_state=True)
# 会同时返回h状态和c状态,不过仅是最后一个状态
# return_sequences=False时,h状态和out的值是一样的
out, h_state, c_state = lstm(inputs)
print(out.shape)
print(h_state.shape)
print(c_state.shape)

(32, 4)
(32, 4)
(32, 4)

返回所有时间步的输出和最后一个状态

lstm = tf.keras.layers.LSTM(4, return_sequences=True, return_state=True)
# out = lstm(inputs)
out, h_state, c_state = lstm(inputs)
print(out.shape)
print(h_state.shape)
print(c_state.shape)

(32, 10, 4)
(32, 4)
(32, 4)

GRU

LSTM参数过多,计算量大,也存在梯度消失的问题,为解决计算量过大的问题,将LSTM中的遗忘门和输入门简化为一个更新门,这就是GRU。

单个GRU的结构图:

在这里插入图片描述

下面是整个图的拆解图

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

代码实现

inputs = tf.random.normal([32, 10, 8])
gru = tf.keras.layers.GRU(4)
output = gru(inputs)
print(output.shape)

(32, 4)
# return_sequences参数的用法和lstm一样
gru = tf.keras.layers.GRU(4, return_sequences=True, return_state=True)
out, final_state = gru(inputs)
print(out.shape)
print(final_state.shape)

(32, 10, 4)
(32, 4)

注意,这里GRU返回值只有两个,相比LSTM,没有c_state,这个也正是GRU相比于LSTM的优化点,后面会进一步说明。同样的,当return_sequences=False时,out和final_state的值是一致的。

LSTM VS GRU

  1. GRU 只有两个门。GRU 将 LSTM 中的输入门和遗忘门合二为一,称为更新门(update gate),控制前边记忆信息能够继续保留到当前时刻的数据量,或者说决定有多少前一时间步的信息和当前时间步的信息要被继续传递到未来;GRU 的另一个门称为重置门(reset gate),控制要遗忘多少过去的信息。

  2. 取消进行线性自更新的记忆单元(memory cell,也就是不再使用c_state),而是直接在隐藏单元中利用门控直接进行线性自更新。

  3. 利用重置门重置记忆信息,GRU 不再使用单独的记忆细胞存储记忆信息,而是直接利用隐藏单元记录历史状态。利用重置门控制当前信息和记忆信息的数据量,并生成新的记忆信息继续向前传递。

  4. 利用更新门计算当前时刻隐藏状态的输出,隐藏状态的输出信息由前一时刻的隐藏状态信息h_(t-1)和当前时刻的隐藏状态输出h_t ,利用更新门控制这两个信息传递到未来的数据量。

在这里插入图片描述

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

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

相关文章

openssl做文件处理(base64,MD5,sha256等)

这次使用openssl,发现openssl不仅可以用来做加密和解密,实际上也可以用来做文件的处理,比如base64转码、解码,文件md5的计算等。实现这些,即可以从命令行去做,也可以通过代码去实现。 1. 命令行操作 1. ba…

【ML特征工程】第 5 章 :分类变量:机器鸡时代的鸡蛋计数

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

想做副业没有方向,这三条告诉你什么是副业思维

怎样副业赚钱?教你几招,掌控自己的固有思维 你了解钱是怎么来的吗?你如果弄不懂这一点,你也是很难赚到钱的。 钱不是苦的,辛苦努力挣的基本都是一点钱。 假如将你的工作时长换为钱,你可以清晰地赚多少钱…

Java并发-线程上下文切换与死锁

理解线程的上下文切换 概述:在多线程编程中,线程个数一般都大于 CPU 个数,而每个 CPU 同一时-刻只能被一个线程使用,为了让用户感觉多个线程是在同时执行的, CPU 资源的分配采用了时间片轮转的策略&#x…

javacc之路0--- 安装与使用

官网: https://javacc.github.io/javacc/ https://github.com/javacc/javacc#getting-started 安装 下载解压 执行: mvn package 将 javacc-7.0.10.jar 重命名为 javacc.jar 并将目录下的scripts文件夹加入到环境变量中。 执行javacc命令验证是否成功…

【Qt 按钮】QPushButton所有函数和样式

【Qt 按钮】QPushButton所有函数和样式一、QSS语句 (界面样式大全)二、 构造函数三、Geometry (获取属性)四、 QFont五、setFont六、text七、setText八、move九、resize十、adjustSize[按钮自动适应文本大小]十一、setFocus十二、…

【附源码】计算机毕业设计JAVA预约健身私教网站

【附源码】计算机毕业设计JAVA预约健身私教网站 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JAVA my…

开发人员为什么要写测试用例?

作为一名开发人员,你可能会发现周围的开发并不太喜欢写测试用例,甚至有些同学根本不写测试用例,认为写测试用例完全是浪费时间,或者是测试用例只是测试的事情。 在开发过程中,往往都是呼啦啦的写完代码,然后…

【负荷预测、电价预测】基于神经网络的负荷预测和价格预测附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

别人熬夜看世界杯 我熬夜改代码 你满意了

2022年卡塔尔世界杯正如火如荼地进行着, 一边是热火朝天的比赛,一边是让人惊掉下巴的爆冷结局, 但正因为这些不确定因素,反倒让世界杯增添了几分魅力和乐趣! 小编在看球赛的过程中,不禁起了联想&#xff…

Django+Vue中文件的上传和下载

场景:上传一个源数据Excel文件,然后根据数据处理生成另外一个Excel文件并支持下载 Django: 1.首先在Django的settings.py文件中增加配置 MEDIA_URL /media/ MEDIA_ROOT os.path.join(BASE_DIR, media)2.项目的urls.py中增加 url(r^medi…

环境主题静态HTML网页作业作品 大学生环保网页设计制作成品 简单DIV CSS布局网站

🎀 精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

百度智能云与实体经济“双向奔赴”: 一场1+1>2的双赢

实体经济,已经成为检验科技企业潜力的试金石。 在最近的财报季中,各家大厂的财报里“实体经济”都是关键字眼,已经成为各家心照不宣的共同目的地。 当然,条条大路通罗马。每一家的战略思路和打法都不一样。11月22日,…

Centos7下新硬盘的挂载操作

1、查看当前硬盘使用情况 df -h 2、 查看磁盘分配情况 fdisk -l 如图所示 vdb 磁盘 还未被使用,现在开始分配。 3、 磁盘分配 使用m查看详细命令,n添加一块新分区,默认最多只能有四个主分区,但可以通过设置将第…

Web前端开发技术课程大作业,期末考试HTML+CSS+JavaScript电竞游戏介绍网站

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

SpringCloudAlibaba全网最全讲解5️⃣之Feign(建议收藏)

🌈专栏简介 感谢阅读,希望能对你有所帮助,博文若有瑕疵请在评论区留言或在主页个人介绍中添加我私聊我,感谢每一位小伙伴不吝赐教。我是XiaoLin,既会写bug也会唱rap的男孩,这个专栏主要是介绍目前微服务最主流的解决方…

4 款适用于 Windows 的最佳免费 GIS 软件

GIS 代表地理信息系统,用于分析、存储、操作和可视化地图上的地理信息。GIS是一种应用广泛的软件,在农业、天文、考古、建筑、银行、航空等各个领域都有应用。开始这些项目,需要 shapefile。一些网站提供不同国家的免费 shapefile。下载免费 …

软件测试入门+面试点

前言:大约是2022年11月18日,我想学习软件测试,在此之前我是Java路线的,这不大环境的竞争激烈在加上自身的能力分析,我认为测试可能是我找工作路上的救赎之光,又恰逢这个时间点,留给我的时间不多…

python实现综合评价模型TOPSIS

原文:https://mp.weixin.qq.com/s/J9fZQ8T9TR1Ed7taPGYYjw 1 TOPSIS简介 有关综合评价的方法有多种, 根据赋权方法不同主要有两类:一类是主观赋值法, 如指数法、层次分析法、模糊综合评价法等;另一类是客观赋值法&am…

Ceph集群部署

目录 一、环境准备 1、准备4台centos服务器 2、配置ceph源 3、配置主机名解析和SSH互信 4、NTP时间同步 二、ceph集群部署 1、安装ceph组件 2、部署MON集群 3、部署OSD集群 一、环境准备 1、准备4台centos服务器 主机主机名IP备注客户端client192.168.2.10关闭selin…