当前位置: 首页 > news >正文

【深度学习】深入解析长短期记忆网络(LSTMs)

在这里插入图片描述

长短期记忆网络(Long Short-Term Memory networks, LSTMs)是一种特殊的递归神经网络(RNN),专门设计用来解决标准 RNN 在处理长序列数据时的梯度消失和梯度爆炸问题。LSTMs 在许多序列数据任务中表现出色,如自然语言处理、时间序列预测和语音识别等。本文将深入探讨 LSTMs 的基本结构、工作原理、关键技术及其应用。

一、LSTMs 的基本结构

LSTM 的基本单元与传统 RNN 的单元不同,主要由以下几个部分组成:

1.1 单元状态(Cell State)

LSTM 维护一个称为单元状态的内部记忆,能够在时间步之间传递长期信息。单元状态通过不同的门控机制进行更新和调整。

1.2 门控机制

LSTM 使用三种门控机制来控制信息的流动:

  • 遗忘门(Forget Gate):决定保留多少先前单元状态的信息。遗忘门的输出是一个介于 0 和 1 之间的值,表示当前信息的重要性。计算公式为:

  • 在这里插入图片描述

  • 输入门(Input Gate):决定当前输入信息对于单元状态的影响。输入门的输出同样是一个介于 0 和 1 之间的值。计算公式为:
    在这里插入图片描述

  • 输出门(Output Gate):决定当前单元状态对输出的影响。计算公式为:

在这里插入图片描述

1.3 单元状态更新

通过上述门控机制,LSTM 更新单元状态的公式如下:

  1. 更新单元状态

在这里插入图片描述

其中,(\tilde{C}_t) 是当前输入的候选值,计算公式为:

在这里插入图片描述

  1. 计算输出

在这里插入图片描述

二、LSTMs 的工作原理

LSTM 的工作流程可以概括为以下几个步骤:

  1. 输入序列:接收输入序列 (x_1, x_2, \ldots, x_T)。
  2. 逐步处理:在每个时间步 (t):
    • 计算遗忘门、输入门和输出门的值。
    • 更新单元状态。
    • 计算当前时间步的输出。
  3. 序列输出:根据任务的需要,输出最后的隐藏状态 (h_T) 或所有时间步的隐藏状态。

三、 LSTMs 的关键技术

3.1 梯度截断

在训练 LSTM 时,可能会遇到梯度爆炸的问题。为了解决这一问题,常用的技术是梯度截断(Gradient Clipping),即在反向传播时限制梯度的最大值,以防止其过大。

3.2 双向 LSTM

双向 LSTM 通过同时考虑序列的正向和反向信息,能够更全面地捕捉上下文信息。它由两个 LSTM 组成,一个处理正向序列,一个处理反向序列,最终将两者的输出结合。

3.3 多层堆叠

通过堆叠多个 LSTM 层,可以构建更深的网络,从而增强模型的表达能力。每一层的输出都可以作为下一层的输入,以捕捉更复杂的特征。

四、LSTMs 的应用

LSTMs 在多个领域取得了显著的成就,尤其在以下几个方面:

4.1 自然语言处理

LSTMs 在文本生成、情感分析、机器翻译等任务中表现出色。例如,在机器翻译中,LSTM 能够有效捕捉上下文信息,从而提高翻译质量。

4.2 时间序列预测

在金融市场预测、气象预报等领域,LSTM 被广泛应用于处理时间序列数据。通过学习历史数据中的模式,LSTM 可以有效预测未来趋势。

4.3 语音识别

LSTM 的序列建模能力使其在语音识别任务中表现优异。它能处理变长的语音信号,并有效识别出语音内容。

五、应用介绍:使用 LSTM 进行情感分析

在本节中,我们将构建一个使用长短期记忆网络(LSTMs)进行情感分析的项目。我们将使用 IMDB 电影评论数据集,该数据集包含大量标记为正面或负面的评论。我们的目标是构建一个 LSTM 模型,能够有效地预测评论的情感。

项目概述

目标

通过构建和训练 LSTM 模型,对 IMDB 数据集中的电影评论进行情感分类,判断其为正面或负面。

数据集

IMDB 数据集包含 50,000 条评论,其中 25,000 条用于训练,25,000 条用于测试。每条评论被标记为正面(1)或负面(0)。

环境准备

确保安装以下库:

pip install tensorflow keras numpy matplotlib

实现代码

下面是实现情感分析的完整代码,包括数据加载、预处理、模型构建、训练和评估。

import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras import datasets, layers, models, preprocessing
from tensorflow.keras.preprocessing.sequence import pad_sequences# 1. 数据加载
max_features = 10000  # 只考虑前 10,000 个最常用的词
maxlen = 200  # 每条评论最长 200 个词# 加载 IMDB 数据集
(train_data, train_labels), (test_data, test_labels) = datasets.imdb.load_data(num_words=max_features)# 2. 数据预处理
# 将评论填充到相同的长度
train_data = pad_sequences(train_data, maxlen=maxlen)
test_data = pad_sequences(test_data, maxlen=maxlen)# 3. 建立 LSTM 模型
model = models.Sequential([layers.Embedding(max_features, 128, input_length=maxlen),  # 嵌入层layers.LSTM(128),  # LSTM 层layers.Dense(1, activation='sigmoid')  # 输出层
])# 4. 编译模型
model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])# 5. 训练模型
history = model.fit(train_data, train_labels, epochs=5, batch_size=64, validation_split=0.2)# 6. 评估模型
test_loss, test_acc = model.evaluate(test_data, test_labels, verbose=2)
print(f'\nTest accuracy: {test_acc}')# 7. 可视化训练过程
plt.figure(figsize=(12, 4))# 绘制准确率
plt.subplot(1, 2, 1)
plt.plot(history.history['accuracy'], label='Training Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.title('Model Accuracy')
plt.legend()# 绘制损失值
plt.subplot(1, 2, 2)
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Model Loss')
plt.legend()plt.tight_layout()
plt.show()

代码详解

1. 数据加载

我们使用 Keras 提供的 IMDB 数据集,并限制词汇表的大小为前 10,000 个最常用的词。

max_features = 10000
(train_data, train_labels), (test_data, test_labels) = datasets.imdb.load_data(num_words=max_features)
2. 数据预处理

在这一步,我们将评论填充到相同的长度,以便输入到模型中。我们设定每条评论的最大长度为 200 个词。

train_data = pad_sequences(train_data, maxlen=maxlen)
test_data = pad_sequences(test_data, maxlen=maxlen)
3. 建立 LSTM 模型

模型由以下几部分组成:

  • 嵌入层(Embedding Layer):将词汇转换为向量表示。
  • LSTM 层:使用 LSTM 单元来捕捉评论中的时序特征。
  • 输出层:使用 Sigmoid 激活函数输出预测结果。
model = models.Sequential([layers.Embedding(max_features, 128, input_length=maxlen),layers.LSTM(128),layers.Dense(1, activation='sigmoid')
])
4. 编译模型

我们选择 Adam 优化器和二元交叉熵作为损失函数,评估指标为准确率。

model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
5. 训练模型

我们在训练数据上训练模型,并将 20% 的数据用于验证。

history = model.fit(train_data, train_labels, epochs=5, batch_size=64, validation_split=0.2)
6. 评估模型

使用测试集评估模型性能,输出测试集的准确率。

test_loss, test_acc = model.evaluate(test_data, test_labels, verbose=2)
print(f'\nTest accuracy: {test_acc}')

7. 可视化训练过程

使用 Matplotlib 绘制训练和验证过程中的准确率和损失变化,以便分析模型的学习情况。

plt.figure(figsize=(12, 4))
# 绘制准确率和损失值...

模型结果分析

训练与验证准确率

在训练过程中,可以观察到训练准确率和验证准确率的变化。通常,随着训练轮数的增加,训练准确率会逐步提高,验证准确率也应该随之上升。

测试准确率

在训练结束后,评估模型在测试集上的准确率。例如,如果测试集的准确率达到 85% 以上,说明模型在未见过的数据上表现良好。

可视化结果

通过绘制训练和验证的准确率及损失曲线,可以直观地了解模型的学习过程。这有助于调整模型超参数、选择合适的训练轮数和早停策略。

小结

通过这个项目,展示了如何使用 LSTM 进行情感分析。从数据加载、预处理到模型构建、训练和评估,完整地实现了一个情感分类器。
这个项目不仅帮助我们理解 LSTM 的工作原理,还展示了如何在实际应用中利用深度学习技术处理文本数据。通过不断调整模型结构和超参数,我们可以进一步提高模型的表现。

六、结论

长短期记忆网络(LSTMs)作为递归神经网络的一种变体,有效解决了标准 RNN 在处理长序列数据时的局限性。通过引入门控机制,LSTMs 能够在长时间跨度内保持信息,广泛应用于自然语言处理、时间序列预测和语音识别等领域。随着深度学习技术的发展,LSTMs 仍然是序列数据建模的重要工具,未来可能会与其他先进技术(如 Transformer)结合,进一步提升性能。

相关文章:

【深度学习】深入解析长短期记忆网络(LSTMs)

长短期记忆网络(Long Short-Term Memory networks, LSTMs)是一种特殊的递归神经网络(RNN),专门设计用来解决标准 RNN 在处理长序列数据时的梯度消失和梯度爆炸问题。LSTMs 在许多序列数据任务中表现出色,如…...

从Web3到智能合约:探索新一代数据交互模式

随着互联网技术的不断演进,Web3的到来标志着互联网的一个新纪元。与传统的Web2相比,Web3倡导去中心化、更加开放和透明的网络架构,而智能合约则是其中的核心技术之一。本文将介绍Web3与智能合约的概念、应用以及它们如何改变数据交互模式&…...

排查bug的通用思路

⭐️前言⭐️ APP点击某个按钮没有反应/PC端执行某个操作后,响应较慢,通用的问题排查方法: 从多个角度来排查问题 🍉欢迎点赞 👍 收藏 ⭐留言评论 🍉博主将持续更新学习记录收获,友友们有任何问题可以在评…...

如何利用Python爬虫获得商品类目

在当今数字化时代,获取和分析数据的能力对于任何希望在市场上保持竞争力的企业来说都是至关重要的。对于电子商务平台和市场研究公司而言,获取商品类目数据尤为重要,因为这些数据可以帮助他们更好地理解市场趋势、优化产品目录并制定有效的营…...

如何通过 Windows 自带的启动管理功能优化电脑启动程序

在日常使用电脑的过程中,您可能注意到开机后某些程序会自动运行。这些程序被称为“自启动”或“启动项”,它们可以在系统启动时自动加载并开始运行,有时甚至在后台默默工作。虽然一些启动项可能是必要的(如杀毒软件)&a…...

大模型学习有什么发展前景?

前景人工智能大模型是指拥有超大规模参数(通常在十亿个以上)、复杂计算结构的机器学习模型。它通常能够处理海量数据,完成各种复杂任务,如自然语言处理、图像识别等。 2024年政府工作报告提出“发展新质生产力”,并将…...

Excel技巧:如何批量调整excel表格中的图片?

插入到excel表格中的图片大小不一,如何做到每张图片都完美的与单元格大小相同?并且能够根据单元格来改变大小?今天分享,excel表格里的图片如何批量调整大小。 方法如下: 点击表格中的一个图片,然后按住Ct…...

独著与编著的区别是?

独著和编著主要有以下区别: 一、创作性质 - 独著 - 独著是作者完全独立进行创作的作品。其内容是作者自己的研究成果、观点见解或者经验总结。作者从最初的选题构思,到资料收集、分析研究,再到内容撰写、修改润色等全过程都是独立完成的。…...

vue中pdf.js的使用,包括pdf显示,跳转指定页面,高亮关键词

目录 一、下载pdf.js 二、引入到本地的项目中 三、实现预览pdf 四、跳转到指定页面 五、利用pdf里面的find查找关键词 六、修改页面大小为实际大小 一、下载pdf.js https://github.com/mozilla/pdf.js 里面有很多的版本, 高版本的可能浏览器不兼容或者还要考…...

【Spring Boot】自动装配机制详解

1. 传统的 Spring 注入方式&#xff08;基于 XML 配置&#xff09; 在传统的 Spring 中&#xff0c;依赖注入&#xff08;DI&#xff09;通常通过 XML 配置文件来进行管理。常见的方式有两种&#xff1a; 通过 <property> 元素进行属性注入&#xff1a; <bean id&qu…...

Flink集群搭建整合Yarn运行

Flink 集群 1. 服务器规划 服务器h1、h4、h5 2. StandAlone 模式&#xff08;不推荐&#xff09; 2.1 会话模式 在h1操作 #1、解压 tar -zxvf flink-1.19.1-bin-scala_2.12.tgz -C /app/#2、修改配置文件 cd /app/flink-1.19.1/conf vim conf.yaml ##内容&#xff1a;## j…...

Linux Ubuntu 安装配置RabbitMQ,springboot使用RabbitMQ

rabbit-Ubuntu 一篇文章学会RabbitMQ 在Ubuntu上查看RabbitMQ状态可以通过多种方式进行&#xff0c;包括使用命令行工具和Web管理界面。以下是一些常用的方法&#xff1a; 1-使用systemctl命令&#xff1a; sudo systemctl start rabbitmq-server sudo systemctl status ra…...

云数据库 MongoDB

MongoDB 是一个基于文档的 NoSQL 数据库&#xff0c;它与传统的关系型数据库不同&#xff0c;采用的是灵活的文档结构&#xff08;类似 JSON 格式&#xff09;。MongoDB 是开源的&#xff0c;且高度可扩展&#xff0c;通常用于处理大量的非结构化或半结构化数据。 云数据库 Mon…...

Ionic 8.4 简介

Ionic 是一个用于开发混合移动应用、渐进式Web应用&#xff08;PWA&#xff09;以及桌面应用的开源框架。它结合了 Angular、React 或 Vue.js 等现代前端框架与 Cordova/PhoneGap 的力量&#xff0c;允许开发者使用 Web 技术&#xff08;HTML, CSS, JavaScript&#xff09;构建…...

蓝桥杯系列---class1

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 我们今天会再开一个系列&#xff0c;那就是蓝桥杯系列&#xff0c;我们会从最基础的开始讲起&#xff0c;大家想要备战明年蓝桥杯的&#xff0c;让我们一起加油。 工具安装 DevC…...

vue3+elementPlus封装的一体表格

目录结构 源码 exportOptions.js export default reactive([{label: 导出本页,key: 1,},{label: 导出全部,key: 2,}, ])index.vue <template><div class"flex flex-justify-between flex-items-end"><div><el-button-group><slot name…...

Junit5 单元测试入门

基础知识 常用注解含义 Test&#xff1a;标记一个方法为测试方法BeforeEach&#xff1a;标记的方法会在每个测试方法执行前执行AfterEach&#xff1a;标记的方法会在每个测试方法执行后执行BeforeAll&#xff1a;标记的方法会在所有测试方法执行前执行一次AfterAll&#xff1…...

数字信号处理-数学基础

来源哪都有&#xff0c;个人复习使用 一 积分 常用积分公式&#xff1a; 基本积分方法 凑微分法(也称第一换元法)&#xff1a; 换元&#xff1a; 分部积分&#xff1a; 卷积 这里有动图解释&#xff1a; https://mathworld.wolfram.com/Convolution.html 欧拉公式 e i x…...

【Exp】# Microsoft Visual C++ Redistributable 各版本下载地址

Microsoft官方页面 https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads Redistributable 2019 X86: https://aka.ms/vs/16/release/VC_redist.x86.exe X64: https://aka.ms/vs/16/release/VC_redist.x64.exe Redistributable 201…...

Hive 分桶表的创建与填充操作详解

Hive 分桶表的创建与填充操作详解 在 Hive 数据处理中&#xff0c;分桶表是一个极具实用价值的功能&#xff0c;它相较于非分桶表能够实现更高效的采样&#xff0c;并且后续还可能支持诸如 Map 端连接等节省时间的操作。不过&#xff0c;值得注意的是&#xff0c;在向表写入数…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

小木的算法日记-多叉树的递归/层序遍历

&#x1f332; 从二叉树到森林&#xff1a;一文彻底搞懂多叉树遍历的艺术 &#x1f680; 引言 你好&#xff0c;未来的算法大神&#xff01; 在数据结构的世界里&#xff0c;“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的&#xff0c;它…...

自然语言处理——文本分类

文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益&#xff08;IG&#xff09; 分类器设计贝叶斯理论&#xff1a;线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别&#xff0c; 有单标签多类别文本分类和多…...

02.运算符

目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&&#xff1a;逻辑与 ||&#xff1a;逻辑或 &#xff01;&#xff1a;逻辑非 短路求值 位运算符 按位与&&#xff1a; 按位或 | 按位取反~ …...