LSTM长短时记忆网络【数学+图解】
文章目录
🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法,初步涉猎人工智能和前端开发。
🦅个人主页:@逐梦苍穹
📕所属专栏:人工智能
🌻gitee地址:xzl的人工智能代码仓库
✈ 您的一键三连,是我创作的最大动力🌹
1、简介
长短时记忆网络(LSTM)和门控循环单元(GRU)是循环神经网络(RNN)的两种改进变体。
它们通过引入 门控机制 解决了RNN在处理长序列时的梯度消失和梯度爆炸问题。
先复习一下RNN:https://xzl-tech.blog.csdn.net/article/details/140940642
有兴趣可以继续学习GRU:https://xzl-tech.blog.csdn.net/article/details/140940794
2、门控机制
- 门控机制的基本思想是使用“门”来控制信息在网络中的流动。
每个门都是通过神经网络层计算出来的权重向量,其值通常在0到1之间。- 不同的门在不同
时间步上控制信息的选择、遗忘和更新。 - 这些门是通过可学习的参数在训练过程中自动调整的。
3、LSTM
LSTM:Long Short-Term Memory
3.1、概念
LSTM是一种 特殊的RNN结构,它通过引入记忆单元和门控机制来控制信息的流动,以此解决长时依赖问题。
LSTM网络包含一个称为记忆单元(cell state)的特殊单元,用于维护跨越时间步的长期信息。

记忆单元通过三种 门(门控机制)来控制信息的更新:
- 输入门(Input Gate):决定哪些新信息需要被写入记忆单元。
- 遗忘门(Forget Gate):决定哪些旧信息需要被从记忆单元中移除。
- 输出门(Output Gate):决定从记忆单元中输出哪些信息。
3.2、公式⭐
(
下文有图解,此处看不懂可以先跳过)
LSTM在每个时间步的更新过程可以用以下公式描述:
- 遗忘门: f t = σ ( W f ⋅ [ h t − 1 , x t ] + b f ) f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f) ft=σ(Wf⋅[ht−1,xt]+bf)
- f t f_t ft 表示遗忘门的输出。
- σ \sigma σ 是sigmoid激活函数,用于将输出值限制在0到1之间。
- 输入门: i t = σ ( W i ⋅ [ h t − 1 , x t ] + b i ) i_t = \sigma(W_i \cdot [h_{t-1}, x_t] + b_i) it=σ(Wi⋅[ht−1,xt]+bi)
- i t i_t it 表示输入门的输出。
- 候选记忆单元更新: C ~ t = tanh ( W C ⋅ [ h t − 1 , x t ] + b C ) \tilde{C}_t = \tanh(W_C \cdot [h_{t-1}, x_t] + b_C) C~t=tanh(WC⋅[ht−1,xt]+bC)
- C ~ t \tilde{C}_t C~t 表示候选的记忆单元状态。
- 记忆单元更新: C t = f t ∗ C t − 1 + i t ∗ C ~ t C_t = f_t \ast C_{t-1} + i_t \ast \tilde{C}_t Ct=ft∗Ct−1+it∗C~t
- C t C_t Ct 表示当前时间步的记忆单元状态。
- 输出门: o t = σ ( W o ⋅ [ h t − 1 , x t ] + b o ) o_t = \sigma(W_o \cdot [h_{t-1}, x_t] + b_o) ot=σ(Wo⋅[ht−1,xt]+bo)
- o t o_t ot 表示输出门的输出。
- 隐藏状态更新: h t = o t ∗ tanh ( C t ) h_t = o_t \ast \tanh(C_t) ht=ot∗tanh(Ct)
- h t h_t ht 是当前时间步的隐藏状态。
3.3、特点
- 有效捕获长时依赖:LSTM通过门控机制,有效地捕获序列数据中的长时依赖关系。
- 复杂性:相对于标准RNN,LSTM的结构更为复杂,计算量也更大。
4、图解LSTM⭐
4.1、RNN
多维的角度:

二维的角度:

其实就是在原本的前馈神经网络中加入了时间的维度
4.2、时间链条
在原来的RNN的基础上,LSTM就是增加了一条时间链条 C t C_t Ct

连起来:

这个时间链条并不是跟 S t S_t St隐藏层同平面的,旋转一下即为:

4.3、记忆单元🔺
下面关于 S t S_t St和 C t C_t Ct的关系进行展开:

S t S_t St和 C t C_t Ct这条线展开平面为:

S t S_t St和 C t C_t Ct一条线拆成了三条线:

那么,关于 f 1 f_1 f1和 f 2 f_2 f2两个函数关系,
f 1 = σ ( W 1 ⋅ [ h t − 1 , x t ] + b 1 ) f_1 = \sigma(W_1 \cdot [h_{t-1}, x_t] + b_1) f1=σ(W1⋅[ht−1,xt]+b1)
i t = σ ( W 2 ⋅ [ h t − 1 , x t ] + b 2 ) i_t = \sigma(W_2 \cdot [h_{t-1}, x_t] + b_2) it=σ(W2⋅[ht−1,xt]+b2)
C ~ t = tanh ( W ~ 2 ⋅ [ h t − 1 , x t ] + b ~ 2 ) \tilde{C}_t = \tanh(\tilde{W}_2 \cdot [h_{t-1}, x_t] + \tilde{b}_2) C~t=tanh(W~2⋅[ht−1,xt]+b~2)
f 2 = i t ∗ C ~ t f_2=i_t*\tilde{C}_t f2=it∗C~t
C t = f t ∗ C t − 1 + i t ∗ C ~ t C_t = f_t \ast C_{t-1} + i_t \ast \tilde{C}_t Ct=ft∗Ct−1+it∗C~t

所以根据这张图,以及上面的公式,不难看出:
图中的"删除"就是遗忘门 f t = σ ( W f ⋅ [ h t − 1 , x t ] + b f ) f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f) ft=σ(Wf⋅[ht−1,xt]+bf);
图中的"增加"就是输入门 i t = σ ( W i ⋅ [ h t − 1 , x t ] + b i ) i_t = \sigma(W_i \cdot [h_{t-1}, x_t] + b_i) it=σ(Wi⋅[ht−1,xt]+bi)和候选记忆单元更新 C ~ t = tanh ( W C ⋅ [ h t − 1 , x t ] + b C ) \tilde{C}_t = \tanh(W_C \cdot [h_{t-1}, x_t] + b_C) C~t=tanh(WC⋅[ht−1,xt]+bC)的乘积
4.4、LSTM
关于LSTM,有这么一张经典图:

这张图展示了LSTM单元的详细结构,包含了三个主要的门:遗忘门、输入门和输出门,以及记忆单元的更新过程。
从输入到输出,LSTM单元通过门控机制控制信息的流动,允许网络在长时间跨度内捕获依赖关系。
5、LSTM与GRU的对比
- 复杂性:
- LSTM更复杂,参数更多。
- GRU较为简洁,参数更少,训练速度更快。
- 性能:
- 两者在处理长时依赖性任务时表现都很优异,具体选择往往取决于数据集和计算资源。
- 在一些特定任务和数据集上,GRU可能比LSTM表现更好,尤其是在计算资源有限的情况下。
- 使用场景:
- 对于需要更强的长期记忆和复杂信息流动的任务,LSTM可能更合适。
- 对于实时性要求较高或者模型简单性要求较高的任务,GRU可能更具优势。
LSTM和GRU是两种非常成功的RNN变体,通过改进信息传递机制,有效解决了传统RNN在处理长序列数据时的局限性。
它们在自然语言处理、语音识别和时间序列预测等领域得到广泛应用。
6、应用
RNN及其变体广泛应用于以下领域:
- 自然语言处理:如语言模型、机器翻译和文本生成。
- 语音识别:将音频序列转换为文本。
- 时间序列预测:如股票价格预测和天气预报。
- 视频分析:从视频帧中提取时间信息。
7、训练技巧
- 梯度裁剪:限制梯度的大小以防止梯度爆炸。
- 正则化:使用Dropout等技术防止过拟合。
- 预训练和转移学习:利用大规模预训练模型微调特定任务。
RNN模型在序列数据处理中具有强大的表现力和适应能力,但也面临一些挑战。通过使用LSTM、GRU等改进模型,结合适当的训练技巧,能够有效地应用于各种实际问题。
相关文章:
LSTM长短时记忆网络【数学+图解】
文章目录 1、简介2、门控机制3、LSTM3.1、概念3.2、公式⭐3.3、特点 4、图解LSTM⭐4.1、RNN4.2、时间链条4.3、记忆单元🔺4.4、LSTM 5、LSTM与GRU的对比6、应用7、训练技巧 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博…...
Linux-入门-02
上节我们讲了如何安装虚拟机,本节课讲一些linux的常用命令,首先我们需要做一些配置,我们的centos的镜像是最小版安装,里面什么也没有,所以我们的linux是不能进行联网的,接下来我们就来一步一步联网 1、配置网络 首先我们需要先使用命令查看ip地址,linux中一切皆文件,只能使用命…...
Animate软件基本概念:基本形状、绘制对象及位图
这一篇讲Animate软件中的基本形状、绘制对象及位图三个概念。 FlashASer:AdobeAnimate2021软件零基础入门教程https://zhuanlan.zhihu.com/p/633230084 FlashASer:实用的各种Adobe Animate软件教程https://zhuanlan.zhihu.com/p/675680471 FlashASer&…...
Shell定时上传日志到HDFS
Shell定时上传日志到HDFS 一、任务需求二、实现思路三、具体实现流程3.1 规划文件上传目录3.2 开发 shell 脚本3.3 授予 shell 可执行权限3.4 手动执行查看3.4 定时执行 shell 脚本 一、任务需求 公司在线服务器每天都会产生网站运行日志,为了避免志文件过大&#…...
前端day3-表格
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>day3-表格</title> </head> <body&g…...
多进程系列:一个进程对应一个函数
多进程系列:一个进程对应一个函数 这里展示创建两个进程,一个进程用于执行分类模型,另外一个进程用于执行分割模型,以及获取结果的示例。 import multiprocessing import time def classify_data(data):# 这里放置分类任务的代…...
数据清洗与预处理:确保数据质量的关键步骤
数据清洗与预处理:确保数据质量的关键步骤 引言 在大数据时代,数据已成为企业最宝贵的资产。然而,数据的质量直接影响到分析结果和决策的准确性。数据清洗与预处理是确保数据质量的关键步骤,它们包括识别和处理数据中的错误、缺…...
《PostgreSQL 数据库在国内的发展前景》
从DB-engines这张2024年8月的最新排名图上可以看出,PostgreSQL数据库的发展趋势还是非常好的,在国内,PostgreSQL数据库也展现出令人振奋的发展前景,非常明显的一种表现就是腾讯云、人大金仓、阿里云、华为等众多厂商都有基于Postg…...
LVS部署DR集群
介绍 DR(Direct Routing):直接路由,是LVS默认的模式,应用最广泛. 通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址. 整个…...
《Linux运维总结:etcd 3.5.15集群数据备份与恢复》
总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、备份恢复说明 通常, 只需在其中一个节点上对 Etcd 进行快照,即可完成数据备份。但是, 数据恢复时必须要在每个节点上进行。 注意:即便是高可用 Etcd 集群…...
我在杭州的Day30_进程间通信(IPC)——20240805
一、相关练习 1.使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上一份 1.1> 01homework.c #include <myhead.h>int main(int argc, const char *argv[]) …...
FFmpeg推流
目录 一. 环境准备 二. 安装FFmpeg 三. 给docker主机安装docker服务 四. 使用 FFmpeg 进行推流测试 FFmpeg是一个非常强大的多媒体处理工具,它可以用于视频和音频的录制、转换以及流处理。在流处理方面,FFmpeg可以用来推流,即将本地媒体…...
【Rust光年纪】简化文件操作流程:深度剖析多款文件系统操作库
文件系统操作利器:介绍常用的文件操作库 前言 在现代软件开发中,文件系统操作是一个十分常见的需求。为了更加高效地进行文件系统操作,开发人员经常会使用各种文件系统操作库来简化开发流程、提高代码可维护性。本文将介绍几个常用的文件系…...
FFmpeg实现文件夹多视频合并
使用FFmpeg合并文件夹中的多个视频文件,可以通过多种方式来实现,具体取决于你希望如何合并这些视频文件。下面介绍两种常见的方法: 按顺序拼接多个视频文件: 适用于希望将多个视频文件按顺序合并成一个视频文件的情况。 将多个视…...
[设备] 关于手机设备中几种传感器的研究
一、手机设备中三位坐标系概念 X轴的方向:沿着屏幕水平方向从左到右,如果手机如果不是是正方形的话,较短的边需要水平 放置,较长的边需要垂直放置。Y轴的方向:从屏幕的左下角开始沿着屏幕的的垂直方向指向屏幕的顶端Z轴…...
C#通过Modbus读取温度和湿度
使用 C# 通过 RS-485 接口读取温湿度数据并在电脑上显示,需要使用串口通信。假设你的温湿度传感器使用 Modbus RTU 协议,这里提供一个示例代码,使用 System.IO.Ports 命名空间进行串口通信,并使用 Modbus 协议库 NModbus 进行通信…...
海量数据处理商用短链接生成器平台 - 9
第二十六章 短链服务-冗余双写架构删除和更新消费者开发实战 第1集 冗余双写架构-更新短链消费者开发实战 简介: 短链服务-更新短链-消费者开发实战 具体步骤见代码 第2集 冗余双写架构-更新短链消费者链路测试 简介: 冗余双写架构-更新短链消费者链…...
从困境到突破,EasyMR 集群迁移助力大数据底座信创国产化
在大数据时代,企业对数据的依赖程度越来越高。然而,随着业务的不断发展和技术的快速迭代,大数据平台的集群迁移已成为企业数据中台发展途中无法回避的需求。在大数据平台发展初期,国内数据中台市场主要以国外开源 CDH、商业化 CDP…...
【Mysql】第十二章 视图特性(概念+使用)
文章目录 一、概念二、使用1.创建视图2.修改视图会影响基表3.修改基表会影响视图4.删除视图 一、概念 视图不能添加索引,也不能有关联的触发器或者默认值。由于视图和基表用的本质是同一份数据,因此对视图的修改会影响到基表,对基表的修改也…...
【颠覆数据处理的利器】全面解读Apache Flink实时大数据处理的引擎-上篇
什么是 Apache Flink? Apache Flink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。Flink 被设计为在所有常见的集群环境中运行,以内存速度和任何规模执行计算。 如何理解无界和有界数据? 无界数据&#…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
