深度学习知识点:LSTM
文章目录
- 1.应用现状
- 2.发展历史
- 3.基本结构
- 4.LSTM和RNN的差异
1.应用现状
长短期记忆神经网络(LSTM)是一种特殊的循环神经网络(RNN)。原始的RNN在训练中,随着训练时间的加长以及网络层数的增多,很容易出现梯度爆炸或者梯度消失的问题,导致无法处理较长序列数据,从而无法获取长距离数据的信息。
LSTM应用的领域包括:文本生成、机器翻译、语音识别、生成图像描述和视频标记等。
- 2009年, 应用LSTM搭建的神经网络模型赢得了ICDAR手写识别比赛冠军。
- 2015年以来,在机械故障诊断和预测领域,相关学者应用LSTM来处理机械设备的振动信号。
- 2016年, 谷歌公司应用LSTM来做语音识别和文字翻译,其中Google翻译用的就是一个7-8层的LSTM模型。
- 2016年, 苹果公司使用LSTM来优化Siri应用。
2.发展历史
1997年,Sepp Hochreiter 和 Jürgen Schmidhuber[1]提出了长短期记忆神经网络(LSTM),有效解决了RNN难以解决的人为延长时间任务的问题,并解决了RNN容易出现梯度消失的问题。
- 1999年,Felix A. Gers等人[2]发现[1]中提出的LSTM在处理连续输入数据时,如果没有重置网络内部的状态,最终会导致网络崩溃。因此,他们在文献[1]基础上引入了遗忘门机制,使得LSTM能够重置自己的状态。
- 2000年,Felix A. Gers和Jiirgen Schmidhuber[3]发现,通过在LSTM内部状态单元内添加窥视孔(Peephole)连接,可以增强网络对输入序列之间细微特征的区分能力。
- 2005年,Alex Graves和Jürgen Schmidhuber[4]在文献[1] [2] [3]的基础上提出了一种双向长短期记忆神经网络(BLSTM),也称为vanilla LSTM,是当前应用最广泛的一种LSTM模型。
- 2005年-2015年期间,相关学者提出了多种LSTM变体模型,此处不多做描述。
- 2016年,Klaus Greff 等人[5]回顾了LSTM的发展历程,并比较分析了八种LSTM变体在语音识别、手写识别和弦音乐建模方面的能力,实验结果表明这些变体不能显著改进标准LSTM体系结构,并证明了遗忘门和输出激活功能是LSTM的关键组成部分。在这八种变体中,vanilla LSTM的综合表现能力最佳。另外,还探索了LSTM相关超参数的设定影响,实验结果表明学习率是最关键的超参数,其次是网络规模(网络层数和隐藏层单元数),而动量梯度等设置对最终结果影响不大。
- 在GRU被提出后,Junyoung Chung等人[6]比较了LSTM和GRU在复音音乐和语音信号建模方面的能力,实验结果表明GRU和LSTM表现相当。
- GRU被提出至今(2019年),也只有几年时间,关于它的一些应用利弊到目前还未探索清楚。不过,相对于LSTM架构,GRU的的参数较少,在数据量较大的情况下,其训练速度更快。
- LSTM是深度学习技术中的一员,其基本结构比较复杂,计算复杂度较高,导致较难进行较深层次的学习,例如谷歌翻译也只是应用7-8层的LSTM网络结构。另外,在训练学习过程中有可能会出现过拟合,可以通过应用dropout来解决过拟合问题(这在Keras等框架中均有实现。
- LSTM在当前应用比较的结构是双向LSTM或者多层堆叠LSTM,这两种结构的实现在Keras等框架中均有对应的API可以调用。
下图展示一个堆叠两层的LSTM结构图

下图展示了一个双向LSTM的结构图

3.基本结构
本节首先回顾一下RNN的基本结构,然后说明LSTM的具体原理(下面要介绍的LSTM即为vanilla LSTM)。
原始的RNN基本结构图如下图所示。

由上图可知,RNN展开后由多个相同的单元连续连接。但是,RNN的实际结构确和上图左边的结构所示,是一个自我不断循环的结构。即随着输入数据的不断增加,上述自我循环的结构把上一次的状态传递给当前输入,一起作为新的输入数据进行当前轮次的训练和学习,一直到输入或者训练结束,最终得到的输出即为最终的预测结果。
LSTM是一种特殊的RNN,两者的区别在于普通的RNN单个循环结构内部只有一个状态。而LSTM的单个循环结构(又称为细胞)内部有四个状态。相比于RNN,LSTM循环结构之间保持一个持久的单元状态不断传递下去,用于决定哪些信息要遗忘或者继续传递下去。
包含三个连续循环结构的RNN如下图,每个循环结构只有一个输出:

包含三个连续循环结构的LSTM如下图,每个循环结构有两个输出,其中一个即为单元状态:

一层LSTM是由单个循环结构结构组成,既由输入数据的维度和循环次数决定单个循环结构需要自我更新几次,而不是多个单个循环结构连接组成,即当前层LSTM的参数总个数只需计算一个循环单元就行,而不是计算多个连续单元的总个数。
下面将由一组图来详细解释LSTM细胞的基本组成和实现原理。LSTM细胞由遗忘门、输入门、输出门和单元状态组成。
- 遗忘门( f t f_t ft):决定上一时刻的单元状态有多少需要保留到当前时刻。 (清理记忆垃圾,只保留考试相关内容)
- 输入门( i t i_t it): 更新门决定了当前时刻有多少新的信息要被存储到单元状态中。(吸收新重点,加入到当前记忆)
- 输出门( o t o_t ot):控制当前单元状态有多少需要输出到当前的输出值。(考试时根据题目提取相关知识点作答)
更通俗的解释:
-
遗忘门 (Forget Gate)
功能:决定过去的信息中哪些需要保留,哪些需要丢弃。
• 比喻:遗忘门像你的大脑在复习时选择丢弃的内容。例如,高数考试时你已经知道某些知识点不会考(如绪论部分),于是选择不再复习这些内容。
• 原理:根据当前输入(考试重点提示)和过去的记忆(已掌握的知识)评估重要性,决定哪些内容不再需要(权值接近 0 的部分被遗忘)。 -
输入门 (Input Gate)
功能:决定当前时刻有多少新的信息需要被记住并加入到记忆中。
• 比喻:输入门像你的大脑在吸收新的知识。例如,在老师讲解考试重点时,你决定哪些内容是需要认真记忆的重点。
• 原理:根据当前的输入(老师强调的重点)和上下文评估新信息的价值,选择性地将有用信息写入到记忆中。 -
输出门 (Output Gate)
功能:决定当前单元状态中的多少内容需要被输出,用于生成当前时刻的输出值。
• 比喻:输出门像你在考试答题时的记忆提取过程。例如,考试时你只需要提取与题目相关的知识点,而不需要将整本书的内容全部回忆出来。
• 原理:基于单元状态(你储存的知识)和当前输入(具体的考试题目)决定需要输出的信息量。
下图展示了应用上一个时刻的输出 h t − 1 h_{t-1} ht−1和当前的数据输入 x t x_t xt,通过遗忘门得到 f t f_t ft的过程。

下图展示了应用上一个时刻的输出 h t − 1 h_{t-1} ht−1和当前的数据输入 x t x_t xt,通过输入门得到 i t i_t it,以及通过单元状态得到当前时刻暂时状态 C ~ t \tilde{C}_t C~t的过程。

下图展示了应用上一个细胞结构的单元状态 C t − 1 C_{t-1} Ct−1、遗忘门输出 f t f_t ft、输入门输出 i t i_t it以及单元状态的输出 C ~ t \tilde{C}_t C~t,得到当前细胞的状态 C t C_t Ct的过程。

下图展示了应用上一个时刻的输出 h t − 1 h_{t-1} ht−1和当前的数据输入 x t x_t xt,通过输出门得到 o t o_t ot的过程,以及结合当前细胞的单元状态 C t C_t Ct和 o t o_t ot得到最终的输出 h t h_t ht的过程。

看看里面的步骤
解释
- 三个 σ \sigma σ代表三个门,其输入均有上一层的隐藏状态 h t h_t ht以及输入数据 x t x_t xt
- g t g_t gt = C ~ t \tilde{C}_t C~t
- 其他参数: W W W初始化权重, b b b偏置向
- c t − 1 c_{t-1} ct−1在经历过一次乘法和一次加法后的流动方向有两个:一个是直接输出,另一个是经过 t a n h tanh tanh后和 o t o_t ot汇合输出 h t h_t ht
- h t h_t ht也有两个流向:一个是流到下一个时刻,另一个是输出 y t = W y h h t + b y y_t = W_{yh}h_t + b_y yt=Wyhht+by

4.LSTM和RNN的差异
RNN:把所有信息都记住,不管有用的没用的。
LSTM:设计一个记忆细胞,具备选择性记忆的功能,可以选择记忆重要信息,过滤掉噪声信息,减轻记忆负担,解决了RNN上的问题:梯度爆炸和梯度消失
通俗讲差异:在期末复习周的时候,比如要考高数,老师已经给划定了重点,RNN还是会把整本书复习一遍,这会导致记忆负担重,会遗忘掉一些重要的信息,导致记忆效果差;而LSTM过滤掉了不考的信息,只记重点
名词解释:
梯度消失:
现象:在训练过程中,反向传播时梯度逐渐变小,导致网络的早期层权重更新很少甚至停滞,使模型无法捕捉长期 依赖的信息。
原因:在时间序列长度较长的情况下,RNN 的反向传播会涉及到多次链式求导(如 ∂ L ∂ W \frac{\partial L}{\partial W} ∂W∂L中的链式规则)。如果激活 函数的导数值小于 1(如 sigmoid),会使得梯度逐步衰减,最终趋近于 0。
梯度爆炸:
现象:在训练过程中,反向传播时梯度逐渐变大,导致权重更新幅度过大,模型失控。
原因:与梯度消失类似,但激活函数导数值较大(或权重初始化不当)会导致梯度不断放大。
参考文献
[1] S. Hochreiter and J. Schmidhuber, “Long Short-Term Memory,” Neural Comput, vol. 9, no. 8, pp. 1735–1780, Nov. 1997.
[2] F. A. Gers, J. Schmidhuber, and F. A. Cummins, “Learning to Forget: Continual Prediction with LSTM,” Neural Comput., vol. 12, pp. 2451–2471, 2000.
[3] F. A. Gers and J. Schmidhuber, “Recurrent nets that time and count,” Proc. IEEE-INNS-ENNS Int. Jt. Conf. Neural Netw. IJCNN 2000 Neural Comput. New Chall. Perspect. New Millenn., vol. 3, pp. 189–194 vol.3, 2000.
[4] A. Graves and J. Schmidhuber, “Framewise phoneme classification with bidirectional LSTM and other neural network architectures,” Neural Netw., vol. 18, no. 5, pp. 602–610, Jul. 2005.
[5] K. Greff, R. K. Srivastava, J. Koutník, B. R. Steunebrink, and J. Schmidhuber, “LSTM: A Search Space Odyssey,” IEEE Trans. Neural Netw. Learn. Syst., vol. 28, no. 10, pp. 2222–2232, Oct. 2017.
[6] J. Chung, C. Gulcehre, K. Cho, and Y. Bengio, “Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling,” ArXiv14123555 Cs, Dec. 2014.
相关文章:
深度学习知识点:LSTM
文章目录 1.应用现状2.发展历史3.基本结构4.LSTM和RNN的差异 1.应用现状 长短期记忆神经网络(LSTM)是一种特殊的循环神经网络(RNN)。原始的RNN在训练中,随着训练时间的加长以及网络层数的增多,很容易出现梯度爆炸或者梯度消失的问…...
11.C语言内存管理与常用内存操作函数解析
目录 1.简介2.void 指针3.malloc4.free5.calloc6.realloc7.restrict 说明符8.memcpy9.memmove()10.memcmp 1.简介 本篇原文为:C语言内存管理与常用内存操作函数解析。 更多C进阶、rust、python、逆向等等教程,可点击此链接查看:酷程网 C 语…...
Python 中的错误处理与调试技巧
💖 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长…...
门禁系统与消防报警的几种联动方式
1、规范中要求的出入口系统与消防联动 1.1《建筑设计防火规范》GB 50016-2018 1.2《民用建筑电气设计规范》JGJ 16-2008 14.4出入口控制系统 3 设置在平安疏散口的出入口限制装置,应与火灾自动报警系统联动;在紧急状况下应自动释放出入口限制系统&…...
云原生安全风险分析
一、什么是云原生安全 云原生安全包含两层含义: 面向云原生环境的安全具有云原生特征的安全 0x1:面向云原生环境的安全 面向云原生环境的安全的目标是防护云原生环境中基础设施、编排系统和微服务等系统的安全。 这类安全机制不一定具备云原生的特性…...
解决cursor50次使用限制问题并恢复账号次数
视频内容: 在这个视频教程中,我们将演示如何解决科sir软件50次使用限制的问题,具体步骤包括删除和注销账号、重新登录并刷新次数。教程详细展示了如何使用官网操作将账号的剩余次数恢复到250次,并进行软件功能测试。通过简单的操…...
python学习笔记—16—数据容器之元组
1. 元组——tuple(元组是一个只读的list) (1) 元组的定义注意:定义单个元素的元组,在元素后面要加上 , (2) 元组也支持嵌套 (3) 下标索引取出元素 (4) 元组的相关操作 1. index——查看元组中某个元素在元组中的位置从左到右第一次出现的位置 t1 (&qu…...
rabbitmq——岁月云实战笔记
1 rabbitmq设计 生产者并不是直接将消息投递到queue,而是发送给exchange,由exchange根据type的规则来选定投递的queue,这样消息设计在生产者和消费者就实现解耦。 rabbitmq会给没有type预定义一些exchage,而实际我们却应该使用自己定义的。 1.1 用户注册设计 用户在…...
Matlab APP Designer
我想给聚类的代码加一个图形化界面,需要输入一些数据和一些参数并输出聚类后的图像和一些评价指标的值。 gpt说 可以用 app designer 界面元素设计 在 设计视图 中直接拖动即可 如图1,我拖进去一个 按钮 ,图2 红色部分 出现一行 Button 图…...
CSS语言的编程范式
CSS语言的编程范式 引言 在现代网页开发中,CSS(层叠样式表)作为一种样式语言,承担着网站前端呈现的重要角色。无论是简单的静态网页还是复杂的单页应用,CSS都在人机交互中发挥着至关重要的作用。掩盖在美观背后的&am…...
一个简单的php博客
一个简单的 PHP 博客的示例代码: 收起 php <?php // 连接数据库 $servername "localhost"; $username "root"; $password ""; $dbname "blog_db";// 创建连接 $conn new mysqli($servername, $username, $passw…...
解决anaconda prompt找不到的情况
由于打开某个文件夹导致系统卡死了,鼠标使用不了,只能使用快捷键ctrlaltdelete打开,点任务管理器也没什么用,就点了注销选项。 注销:清空缓存空间和注册表信息,向系统发出清除现在登陆的用户的请求。 导致…...
【深度学习】多目标融合算法(二):底部共享多任务模型(Shared-Bottom Multi-task Model)
目录 一、引言 1.1 往期回顾 1.2 本期概要 二、Shared-Bottom Multi-task Model(SBMM) 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 三、总结 一、引言 在朴素的深度学习ctr预估模型中(如DNN),通常以一个行…...
如何使用vue引入three.js
在 Vue.js 项目中引入和使用 Three.js 是一个常见的需求,Three.js 是一个用于在浏览器中创建和显示动画 3D 计算机图形的 JavaScript 库。以下是一个基本的示例,展示如何在 Vue 项目中引入和使用 Three.js。 1. 创建 Vue 项目 如果你还没有一个 Vue 项…...
城市生命线安全综合监管平台
【落地产品,有需要可留言联系,支持项目合作或源码合作】 一、建设背景 以关于城市安全的重要论述为建设纲要,聚焦城市安全重点领域,围绕燃气爆炸、城市内涝、地下管线交互风险、第三方施工破坏、供水爆管、桥梁坍塌、道路塌陷七…...
计算机毕设【开题报告】怎么写?
技巧 1. 标题简洁且具体 技巧:开题报告的标题要简明扼要,并准确表达研究的核心内容。避免使用复杂的术语或过于宽泛的题目。 实用方法:根据你的研究方向,标题应该包括你的系统类型、技术框架或研究对象。例如,“基于…...
Go学习:多重赋值与匿名变量
1. 变量的多重赋值 1.1 基本语法格式 go语言中,可以将多个赋值语句 合并成 一句,比如: a : 10 b : 20 c : 30//a,b,c三个变量的赋值语句可以简练成以下格式a, b, c : 10, 20, 30 1.2 交换变量值 当需要交换两个变量的值时&#…...
【Ubuntu 上搭建 Nginx-RTMP 服务】
本章目录: 环境1. 安装依赖2. 创建 Nginx 编译目录3. 下载 Nginx 和 Nginx-RTMP-Module4. 编译 Nginx 并添加 RTMP 模块5. 验证 Nginx 安装成功6. 配置环境变量7. 修改 Nginx 配置文件8. 启动 Nginx 服务查看 Nginx 是否启动成功查看端口监听状态 8. 常见问题及解决方法1. 缺少…...
使用uniapp 微信小程序一些好用的插件分享
总结一下自己在开发中遇见的一问题,通过引入组件可以快速的解决 1.zxz-uni-data-select 下拉框选择器(添加下拉框检索,多选功能,多选搜索功能,自定义 下拉框插件,使用这个的原因是因为 uniui uview 组件库下拉框太…...
linux centos挂载未分配的磁盘空间
使用到的命令 lshw -class disk -short hostnamectl fdisk /dev/sdb partprobe /dev/sdb mount /dev/sdb2 /opt/fastdfs/ mkfs.ext4 /dev/sdb2 mount -t ext4 /dev/sdb2 /opt/fastdfs/...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》
近日,嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,海云安高敏捷信创白盒(SCAP)成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解…...
从实验室到产业:IndexTTS 在六大核心场景的落地实践
一、内容创作:重构数字内容生产范式 在短视频创作领域,IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色,生成的 “各位吴彦祖们大家好” 语音相似度达 97%,单条视频播放量突破百万…...
麒麟系统使用-进行.NET开发
文章目录 前言一、搭建dotnet环境1.获取相关资源2.配置dotnet 二、使用dotnet三、其他说明总结 前言 麒麟系统的内核是基于linux的,如果需要进行.NET开发,则需要安装特定的应用。由于NET Framework 是仅适用于 Windows 版本的 .NET,所以要进…...
python打卡day49@浙大疏锦行
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 一、通道注意力模块复习 & CBAM实现 import torch import torch.nn as nnclass CBAM(nn.Module):def __init__…...
Linux 内存管理调试分析:ftrace、perf、crash 的系统化使用
Linux 内存管理调试分析:ftrace、perf、crash 的系统化使用 Linux 内核内存管理是构成整个内核性能和系统稳定性的基础,但这一子系统结构复杂,常常有设置失败、性能展示不良、OOM 杀进程等问题。要分析这些问题,需要一套工具化、…...
篇章一 论坛系统——前置知识
目录 1.软件开发 1.1 软件的生命周期 1.2 面向对象 1.3 CS、BS架构 1.CS架构编辑 2.BS架构 1.4 软件需求 1.需求分类 2.需求获取 1.5 需求分析 1. 工作内容 1.6 面向对象分析 1.OOA的任务 2.统一建模语言UML 3. 用例模型 3.1 用例图的元素 3.2 建立用例模型 …...
Go 语言中的内置运算符
1. 算术运算符 注意: (自增)和--(自减)在 Go 语言中是单独的语句,并不是运算符。 package mainimport "fmt"func main() {fmt.Println("103", 103) // 13fmt.Println("10-3…...
Three.js + Vue3 加载GLB模型项目代码详解
本说明结合 src/App.vue 代码,详细解释如何在 Vue3 项目中用 three.js 加载并显示 glb 模型。 1. 依赖与插件导入 import {onMounted, onUnmounted } from vue import * as THREE from three import Stats from stats.js import {OrbitControls } from three/examples/jsm/co…...
