【机器学习】探索LSTM:深度学习领域的强大时间序列处理能力
目录
🍔 LSTM介绍
🍔 LSTM的内部结构图
2.1 LSTM结构分析
2.2 Bi-LSTM介绍
2.3 使用Pytorch构建LSTM模型
2.4 LSTM优缺点
🍔 小结
学习目标
🍀 了解LSTM内部结构及计算公式.
🍀 掌握Pytorch中LSTM工具的使用.
🍀 了解LSTM的优势与缺点.
🍔 LSTM介绍
LSTM(Long Short-Term Memory)也称长短时记忆结构, 它是传统RNN的变体, 与经典RNN相比能够有效捕捉长序列之间的语义关联, 缓解梯度消失或爆炸现象. 同时LSTM的结构更复杂,。
🐼 它的核心结构可以分为四个部分去解析:
- 遗忘门
- 输入门
- 细胞状态
- 输出门
🍔 LSTM的内部结构图
2.1 LSTM结构分析
- 结构解释图:
- 遗忘门部分结构图与计算公式:
-
遗忘门结构分析:
- 与传统RNN的内部结构计算非常相似, 首先将当前时间步输入x(t)与上一个时间步隐含状态h(t-1)拼接, 得到[x(t), h(t-1)], 然后通过一个全连接层做变换, 最后通过sigmoid函数进行激活得到f(t), 我们可以将f(t)看作是门值, 好比一扇门开合的大小程度, 门值都将作用在通过该扇门的张量, 遗忘门门值将作用的上一层的细胞状态上, 代表遗忘过去的多少信息, 又因为遗忘门门值是由x(t), h(t-1)计算得来的, 因此整个公式意味着根据当前时间步输入和上一个时间步隐含状态h(t-1)来决定遗忘多少上一层的细胞状态所携带的过往信息.
-
遗忘门内部结构过程演示:
- 激活函数sigmiod的作用:
- 用于帮助调节流经网络的值, sigmoid函数将值压缩在0和1之间.
- 输入门部分结构图与计算公式:
-
输入门结构分析:
- 我们看到输入门的计算公式有两个, 第一个就是产生输入门门值的公式, 它和遗忘门公式几乎相同, 区别只是在于它们之后要作用的目标上. 这个公式意味着输入信息有多少需要进行过滤. 输入门的第二个公式是与传统RNN的内部结构计算相同. 对于LSTM来讲, 它得到的是当前的细胞状态, 而不是像经典RNN一样得到的是隐含状态.
-
输入门内部结构过程演示:
- 细胞状态更新图与计算公式:
-
细胞状态更新分析:
- 细胞更新的结构与计算公式非常容易理解, 这里没有全连接层, 只是将刚刚得到的遗忘门门值与上一个时间步得到的C(t-1)相乘, 再加上输入门门值与当前时间步得到的未更新C(t)相乘的结果. 最终得到更新后的C(t)作为下一个时间步输入的一部分. 整个细胞状态更新过程就是对遗忘门和输入门的应用.
-
细胞状态更新过程演示:
- 输出门部分结构图与计算公式:
-
输出门结构分析:
- 输出门部分的公式也是两个, 第一个即是计算输出门的门值, 它和遗忘门,输入门计算方式相同. 第二个即是使用这个门值产生隐含状态h(t), 他将作用在更新后的细胞状态C(t)上, 并做tanh激活, 最终得到h(t)作为下一时间步输入的一部分. 整个输出门的过程, 就是为了产生隐含状态h(t).
-
输出门内部结构过程演示:
2.2 Bi-LSTM介绍
Bi-LSTM即双向LSTM, 它没有改变LSTM本身任何的内部结构, 只是将LSTM应用两次且方向不同, 再将两次得到的LSTM结果进行拼接作为最终输出.
- Bi-LSTM结构分析:
- 我们看到图中对"我爱中国"这句话或者叫这个输入序列, 进行了从左到右和从右到左两次LSTM处理, 将得到的结果张量进行了拼接作为最终输出. 这种结构能够捕捉语言语法中一些特定的前置或后置特征, 增强语义关联,但是模型参数和计算复杂度也随之增加了一倍, 一般需要对语料和计算资源进行评估后决定是否使用该结构.
2.3 使用Pytorch构建LSTM模型
-
位置: 在torch.nn工具包之中, 通过torch.nn.LSTM可调用.
-
nn.LSTM类初始化主要参数解释:
- input_size: 输入张量x中特征维度的大小.
- hidden_size: 隐层张量h中特征维度的大小.
- num_layers: 隐含层的数量.
- bidirectional: 是否选择使用双向LSTM, 如果为True, 则使用; 默认不使用.
-
nn.LSTM类实例化对象主要参数解释:
- input: 输入张量x.
- h0: 初始化的隐层张量h.
- c0: 初始化的细胞状态张量c.
-
nn.LSTM使用示例:
# 定义LSTM的参数含义: (input_size, hidden_size, num_layers)
# 定义输入张量的参数含义: (sequence_length, batch_size, input_size)
# 定义隐藏层初始张量和细胞初始状态张量的参数含义:
# (num_layers * num_directions, batch_size, hidden_size)>>> import torch.nn as nn
>>> import torch
>>> rnn = nn.LSTM(5, 6, 2)
>>> input = torch.randn(1, 3, 5)
>>> h0 = torch.randn(2, 3, 6)
>>> c0 = torch.randn(2, 3, 6)
>>> output, (hn, cn) = rnn(input, (h0, c0))
>>> output
tensor([[[ 0.0447, -0.0335, 0.1454, 0.0438, 0.0865, 0.0416],[ 0.0105, 0.1923, 0.5507, -0.1742, 0.1569, -0.0548],[-0.1186, 0.1835, -0.0022, -0.1388, -0.0877, -0.4007]]],grad_fn=<StackBackward>)
>>> hn
tensor([[[ 0.4647, -0.2364, 0.0645, -0.3996, -0.0500, -0.0152],[ 0.3852, 0.0704, 0.2103, -0.2524, 0.0243, 0.0477],[ 0.2571, 0.0608, 0.2322, 0.1815, -0.0513, -0.0291]],[[ 0.0447, -0.0335, 0.1454, 0.0438, 0.0865, 0.0416],[ 0.0105, 0.1923, 0.5507, -0.1742, 0.1569, -0.0548],[-0.1186, 0.1835, -0.0022, -0.1388, -0.0877, -0.4007]]],grad_fn=<StackBackward>)
>>> cn
tensor([[[ 0.8083, -0.5500, 0.1009, -0.5806, -0.0668, -0.1161],[ 0.7438, 0.0957, 0.5509, -0.7725, 0.0824, 0.0626],[ 0.3131, 0.0920, 0.8359, 0.9187, -0.4826, -0.0717]],[[ 0.1240, -0.0526, 0.3035, 0.1099, 0.5915, 0.0828],[ 0.0203, 0.8367, 0.9832, -0.4454, 0.3917, -0.1983],[-0.2976, 0.7764, -0.0074, -0.1965, -0.1343, -0.6683]]],grad_fn=<StackBackward>)
2.4 LSTM优缺点
-
LSTM优势:
LSTM的门结构能够有效减缓长序列问题中可能出现的梯度消失或爆炸, 虽然并不能杜绝这种现象, 但在更长的序列问题上表现优于传统RNN.
-
LSTM缺点:
由于内部结构相对较复杂, 因此训练效率在同等算力下较传统RNN低很多.
🍔 小结
-
LSTM(Long Short-Term Memory)也称长短时记忆结构, 它是传统RNN的变体, 与经典RNN相比能够有效捕捉长序列之间的语义关联, 缓解梯度消失或爆炸现象. 同时LSTM的结构更复杂, 它的核心结构可以分为四个部分去解析:
- 遗忘门
- 输入门
- 输出门
- 细胞状态
-
遗忘门结构分析:
与传统RNN的内部结构计算非常相似, 首先将当前时间步输入x(t)与上一个时间步隐含状态h(t-1)拼接, 得到[x(t), h(t-1)], 然后通过一个全连接层做变换, 最后通过sigmoid函数进行激活得到f(t), 我们可以将f(t)看作是门值, 好比一扇门开合的大小程度, 门值都将作用在通过该扇门的张量, 遗忘门门值将作用的上一层的细胞状态上, 代表遗忘过去的多少信息, 又因为遗忘门门值是由x(t), h(t-1)计算得来的, 因此整个公式意味着根据当前时间步输入和上一个时间步隐含状态h(t-1)来决定遗忘多少上一层的细胞状态所携带的过往信息.
-
输入门结构分析:
我们看到输入门的计算公式有两个, 第一个就是产生输入门门值的公式, 它和遗忘门公式几乎相同, 区别只是在于它们之后要作用的目标上. 这个公式意味着输入信息有多少需要进行过滤. 输入门的第二个公式是与传统RNN的内部结构计算相同. 对于LSTM来讲, 它得到的是当前的细胞状态, 而不是像经典RNN一样得到的是隐含状态.
-
细胞状态更新分析:
细胞更新的结构与计算公式非常容易理解, 这里没有全连接层, 只是将刚刚得到的遗忘门门值与上一个时间步得到的C(t-1)相乘, 再加上输入门门值与当前时间步得到的未更新C(t)相乘的结果. 最终得到更新后的C(t)作为下一个时间步输入的一部分. 整个细胞状态更新过程就是对遗忘门和输入门的应用.
-
输出门结构分析:
输出门部分的公式也是两个, 第一个即是计算输出门的门值, 它和遗忘门,输入门计算方式相同. 第二个即是使用这个门值产生隐含状态h(t), 他将作用在更新后的细胞状态C(t)上, 并做tanh激活, 最终得到h(t)作为下一时间步输入的一部分. 整个输出门的过程, 就是为了产生隐含状态h(t).
-
什么是Bi-LSTM ?
Bi-LSTM即双向LSTM, 它没有改变LSTM本身任何的内部结构, 只是将LSTM应用两次且方向不同, 再将两次得到的LSTM结果进行拼接作为最终输出.
-
Pytorch中LSTM工具的使用:
位置: 在torch.nn工具包之中, 通过torch.nn.LSTM可调用.
-
LSTM优势:
LSTM的门结构能够有效减缓长序列问题中可能出现的梯度消失或爆炸, 虽然并不能杜绝这种现象, 但在更长的序列问题上表现优于传统RNN.
-
LSTM缺点:
由于内部结构相对较复杂, 因此训练效率在同等算力下较传统RNN低很多.
相关文章:

【机器学习】探索LSTM:深度学习领域的强大时间序列处理能力
目录 🍔 LSTM介绍 🍔 LSTM的内部结构图 2.1 LSTM结构分析 2.2 Bi-LSTM介绍 2.3 使用Pytorch构建LSTM模型 2.4 LSTM优缺点 🍔 小结 学习目标 🍀 了解LSTM内部结构及计算公式. 🍀 掌握Pytorch中LSTM工具的使用. &…...

QT学习笔记之文件操作
你千万不要跟任何人谈起任何事。你只要一谈起,就会想念起每一个人来。 在ui界面添加一个LineEdit(lEt)、QPushButton(btn)、QWidget widget.cpp #include "widget.h" #include "ui_widget.h" #include <QFile> #include <QFileDialo…...

Mybatis XML配置文件操作数据库
Mybaits在操作数据库时,可以有两种方式;第一种是使用注解的方式操作,另一种是使用XML配置文件的方式:一般而言,若没有特别的要求,则编写一些简单的SQL语句,可以直接使用注解的方式;编…...

Ansible-template模块动态生成特定文件
文章目录 一、Jinja2介绍什么是主要特性安装基本用法进阶特性总结 Jinja2与Ansible关系1. 模板引擎2. Ansible 的依赖3. 变量和模板4. 动态生成配置5. 社区和生态系统总结 二、Ansible如何使用Jinja2使用template模块Jinja2文件中使用判断和循环Jinja2文件中使用判断语法 Jinja…...

【Hadoop】【vim编辑器】【~/.bashrc 文件】如何编辑
1. 进入 vim 编辑器 在终端中输入以下命令: vim ~/.bashrc 2. 进入插入模式 打开文件后,你将处于普通模式。在普通模式下,你不能直接编辑文本。 要进入插入模式,请按下 i 键。这时,你应该会看到屏幕底部出现 -- 插…...

vs code自动报错
让vs code自动报错, 点击插件 → 搜索error lens → 点击install, 下载完后,编写的代码有问题就会自动报错了。 5、修改默认缩进字符 点击设置(settings) → 点击常用设置 → 修改字符缩进。...

详细分析Nginx中的proxy_pass 末尾斜杠
目录 前言1. 基本知识2. Demo 前言 对于Nginx的讲解,更多推荐阅读: Nginx配置静态网页访问(图文界面)Nginx将https重定向为http进行访问的配置(附Demo)Nginx从入门到精通(全)详细分…...

数据结构:双指针—移动0(OJ283)
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出: […...

LeetCode - 850 矩形面积 II
题目来源 850. 矩形面积 II - 力扣(LeetCode) 题目描述 给你一个轴对齐的二维数组 rectangles 。 对于 rectangle[i] [x1, y1, x2, y2],其中(x1,y1)是矩形 i 左下角的坐标, (xi1, yi1) 是该…...

Jenkins Pipeline 中通过勾选参数来控制是否构建 Docker 镜像
1.定义参数: 使用 booleanParam 定义一个布尔参数,示例如下 booleanParam(name: BUILD_DOCKER, description: 是否构建Docker镜像, defaultValue: false)2.使用参数: 在 stage 中,根据参数的值决定构建方式: stage(编…...

C++入门基础知识86(实例)——实例11【计算自然数之和】
成长路上不孤单😊😊😊😊😊😊 【14后😊///C爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于计算自然数之和相关内容! 关…...

ChatGPT与R语言融合技术在生态环境数据统计分析、绘图、模型中的实践与进阶应用
自2022年GPT(Generative Pre-trained Transformer)大语言模型的发布以来,它以其卓越的自然语言处理能力和广泛的应用潜力,在学术界和工业界掀起了一场革命。在短短一年多的时间里,GPT已经在多个领域展现出其独特的价值…...

OpenAi以及Dify结合生成Ai模型
文章目录 1、Dify介绍2、使用 Dify3、部署Docker1.系统要求2.系统虚拟化3.下载docker 4、安装WSL1.检查是否已经安装 五、访问系统六、添加模型 1、Dify介绍 Dify官方地址。 Dify 是一个开源的 LLM 应用开发平台。其直观的界面结合了 AI 工作流、RAG 管道、Agent、模型管理、…...

【漏洞复现】用友 UFIDA /portal/pt/file/upload 任意文件上传漏洞
免责声明: 本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测试时,可能会违反某些法律法规或服…...

C:内存函数
目录 前言: 一、memcpy 函数的使用及实现 1、memcpy函数的介绍 1.1 memcpy函数参数解读 2、memcpy函数的使用 3、memcpy函数的模拟实现 二、memmove函数的使用及模拟 1、memmove函数的使用 2、memmove函数的模拟实现 三、memset 函数的使用 1、memset函数的…...

【Web】御网杯信息安全大赛2024 wp(全)
目录 input_data admin flask 如此多的FLAG 一夜醒来之全国CTF水平提升1000倍😋 input_data 访问./.svn后随便翻一翻拿到flag admin dirsearch扫出来 访问./error看出来是java框架 测出来是/admin;/路由打Spring View Manipulation(Java)的SSTI https:/…...

VC++同时处理ANSI和Unicode字符集,除了使用TCHAR和_T()宏外,还有其他方法可以实现吗?
在我的C项目中,如果我需要同时处理ANSI和Unicode字符集,除了使用TCHAR和_T()宏外,还有其他方法可以实现吗? 除了使用 TCHAR 和 _T() 宏之外,还有其他方法可以实现同时处理 ANSI 和 Unicode 字符集: 1. 使用…...

MATLAB定位程序与讲解【专栏介绍】
AOA(到达角度)定位原理: 描述了基于到达角度进行定位的方法,适用于一维、二维或三维空间。 由动静压之比求马赫数的MATLAB函数: 提供了一个计算马赫数的函数,用于流体力学中速度的计算。 三边法定位与三点法…...

机器学习3--numpy
Numpy 一、numpy是什么?二、N维数组三、数组基本操作四、数组的运算 一、numpy是什么? numpy是一个开源的python科学计算库,用于处理任意维度的数组。numpy用ndarray处理多维数组。 import numpy as np np.array创建数组 机器学习数据量很大…...

Linux之我不会
一、常用命令 1.系统管理 1.1 systemctl start | stop | restart | status 服务名 案例实操 1 查看防火墙状态 systemctl status firewalld2 停止防火墙服务 systemctl stop firewalld3 启动防火墙服务 systemctl start firewalld4 重启防火墙服务 systemctl restart f…...

音视频整体解码流程和同步流程
目录 1. 整体解码流程1. 初始化 FFmpeg2. 打开媒体文件3. 查找解码器4. 打开解码器5. 读取和解码数据6. 处理解码后的帧7. 释放资源 2. 音视频同步整体流程1. 解复用媒体流2. 解码3. 以音频为时钟源进行音视频同步的策略4. 缓冲区设计 现在先说大体流程,不分析代码 …...

1.2 HuggingFists安装说明-Linux安装
Linux版安装说明 下载地址 【GitHub】https://github.com/Datayoo/HuggingFists 【百度网盘】https://pan.baidu.com/s/12-qzxARjzRjYFvF8ddUJQQ?pwd2024 安装说明 环境要求 操作系统:CentOS7 硬件环境:至少4核8G,系统使用Containerd…...

四,MyBatis-Plus 当中的主键策略和分页插件的(详细实操使用)
四,MyBatis-Plus 当中的主键策略和分页插件的(详细实操使用) 文章目录 四,MyBatis-Plus 当中的主键策略和分页插件的(详细实操使用)1. 主键策略1.1 主键生成策略介绍 2. 准备工作:2.1 AUTO 策略2.2 INPUT 策略2.3 ASSIGN_ID 策略2.3.1 雪花算…...

Win32打开UWP应用
最近无意间发现Windows里一个神奇的文件夹。 shell:appsfolder 运行打开 这个文件夹后,你可以看到本机安装的所有应用程序。 我觉得这个挺方便的,所以做了一个简单的appFolderDialog包给C#用 项目地址:https://github.com/TianXiaTech/App…...

C# C++ 笔记
第一阶段知识总结 lunix系统操作 1、基础命令 (1)cd cd /[目录名] 打开指定文件目录 cd .. 返回上一级目录 cd - 返回并显示上一次目录 cd ~ 切换到当前用户的家目录 (2)pwd pwd 查看当前所在目录路径 pwd -L 打印当前物理…...

关于最小二乘法
最小二乘法的核心思想简单而优雅:我们希望找到一条最佳的曲线,使其尽可能贴近所有的数据点。想象一下,当你在画布上描绘一条线,目标是让这条线与点的距离最小。数学上,这可以表示为: 在这个公式中ÿ…...

国产OpenEuler与Centos全面之比较
OpenEuler 和 CentOS 都是流行的 Linux 发行版,但它们有一些关键的区别。以下是 OpenEuler 和 CentOS 的全面比较: 1. 起源和支持: - OpenEuler:由华为公司支持,中国开源社区主导开发的操作系统,旨在构建一…...

Java面试题一
一、Java语言有哪些特性? Java语言具有多种特性,这些特性使得Java成为一种广泛使用的编程语言。以下是Java语言的一些主要特性: 面向对象(Object-Oriented): Java是一种纯面向对象的编程语言。它支持类&…...

LabVIEW提高开发效率技巧----自动化测试和持续集成
在大型项目中,自动化测试和持续集成是提高开发效率和代码质量的关键手段。通过这些技术,开发者能够在开发的早期阶段快速发现问题,减少后期调试的工作量,并且能够确保代码的稳定性和可维护性。以下是这两个概念如何在LabVIEW开发中…...

开源链动 2+1 模式 S2B2C 商城小程序:激活 KOC,开启商业新征程
摘要:本文深入探讨了 KOC 在立体连接中的重要性,以及如何通过开源链动 21 模式 S2B2C 商城小程序发现和找到更多的 KOC。强调了历史积累强关系和快速强化强关系的方法,并阐述了该商城小程序在推动商业发展中的关键作用。 一、引言 在当今竞争…...