神经网络:LSTM基础学习

article/2025/9/22 12:13:13

1、LSTM简介

  在时间序列数据学习中,传统的循环神经网络(RNN)存在较多的学习瓶颈和技术缺陷,而长短时记忆(LSTM)神经网络克服了循环神经网络的缺陷,使其在长时间序列数据学习训练中能克服梯度爆炸和梯度消失的瓶颈,展现出超强的长系列数据学习能力。

2、LSTM原理

  基础的 RNN 网络结构,LSTM 新增了一个状态向量𝑪𝑡,同时引入了门控(Gate)机制,通过门控单元来控制信息的遗忘和刷新。
在这里插入图片描述
  在 LSTM 中,有两个状态向量𝒄和h,其中𝒄作为 LSTM 的内部状态向量,可以理解为LSTM 的内存状态向量 Memory,而h表示 LSTM 的输出向量。相对于RNN,LSTM 把内部 Memory 和输出分开为两个变量,同时利用三个门控:输入门(Input Gate)、遗忘门(Forget Gate)和输出门(Output Gate)来控制内部信息的流动。
  门控机制可以理解为控制数据流通量的一种手段,在 LSTM 中,阀门开和程度利用门控值向量𝒈表示。通过𝜎(𝒈)激活函数将门控制压缩到[0,1]之间区间,当𝜎(𝒈) = 0时,门控全部关闭,输出𝒐 = 0;当𝜎(𝒈) = 1时,门控全部打开,输出𝒐 = 𝒙。通过门控机制可以较好地控制数据的流量程度。
在这里插入图片描述
.

2.1 遗忘门

  遗忘门作用于 LSTM 状态向量𝒄上面,用于控制上一个时间戳的记忆 𝒄𝑡−1 对当前时间戳的影响。遗忘门的控制变量 𝒈𝑓 由格式产生:
在这里插入图片描述
其中 𝑾𝑓 和 𝒃𝑓 为遗忘门的参数张量,可由反向传播算法自动优化,𝜎为激活函数,一般使用 Sigmoid 函数。当门控 𝒈𝑓 = 1 时,遗忘门全部打开,LSTM 接受上一个状态 𝒄𝑡−1的所有信息;当门控 𝒈𝑓 = 0 时,遗忘门关闭,LSTM 直接忽略 𝒄𝑡−1,输出为 0的向量。这也是遗忘门的名字由来。经过遗忘门后,LSTM 的状态向量变为 𝒈𝑓 𝒄t−1
在这里插入图片描述
.

2.2 输入门

  输入门用于控制 LSTM 对输入的接收程度。首先通过对当前时间戳的输入 𝒙𝑡 和上一个时间戳的输出 h𝑡−1 做非线性变换得到新的输入向量 𝒄 t ~ \widetilde{𝒄_t} ct :
在这里插入图片描述
其中 𝑾𝑐 和 𝒃𝑐 为输入门的参数,需要通过反向传播算法自动优化,tanh 为激活函数,用于将输入标准化到[−1,1]区间。 𝒄 t ~ \widetilde{𝒄_t} ct 并不会全部刷新进入 LSTM 的 Memory,而是通过输入门控制接受输入的量。输入门的控制变量同样来自于输入 𝒙𝑡 和输出 h𝑡−1
在这里插入图片描述
其中 𝑾𝑖 和 𝒃𝑖 为输入门的参数,需要通过反向传播算法自动优化,𝜎为激活函数,一般使用Sigmoid 函数。输入门控制变量 𝒈𝑖 决定了 LSTM 对当前时间戳的新输入 𝒄 t ~ \widetilde{𝒄_t} ct 的接受程度:当 𝒈𝑖 = 0时,LSTM 不接受任何的新输入 𝒄 t ~ \widetilde{𝒄_t} ct ;当 𝒈𝑖 = 1时,LSTM 全部接受新输入 𝒄 t ~ \widetilde{𝒄_t} ct 。经过输入门后,待写入 Memory 的向量为 𝒈𝑖 𝒄 t ~ \widetilde{𝒄_t} ct
在这里插入图片描述
.

2.3 更新门

  更新门用于刷新 Memory。在遗忘门和输入门的控制下,LSTM 有选择地读取了上一个时间戳的记忆 𝒄𝑡−1 和当前时间戳的新输入 𝒄 t ~ \widetilde{𝒄_t} ct ,状态向量 𝒄𝑡 的刷新方式为:
在这里插入图片描述
得到的新状态向量 𝒄𝑡 即为当前时间戳的状态向量。
在这里插入图片描述

2.4 输出门

  LSTM 的内部状态向量 𝒄𝑡 并不会直接用于输出,简单的 RNN 不一样。RNN 网络的状态向量 h 既用于记忆,又用于输出,所以 RNN 可以理解为状态向量 𝒄 和输出向量 h 是同一个对象。在 LSTM 内部,状态向量并不会全部输出,而是在输出门的作用下有选择地输出。输出门的门控变量 𝒈𝑜 为:
在这里插入图片描述
其中 𝑾𝑜 和 𝒃𝑜 为输出门的参数,同样需要通过反向传播算法自动优化,𝜎为激活函数,一般使用 Sigmoid 函数。当输出门 𝒈𝑜 = 0时,输出关闭,LSTM 的内部记忆完全被隔断,无法用作输出,此时输出为 0 的向量;当输出门 𝒈𝑜 = 1时,输出完全打开,LSTM 的状态向量 𝒄𝑡全部用于输出。LSTM 的输出由:
在这里插入图片描述
产生,即内存向量 𝒄𝑡 经过 tanh 激活函数后与输入门作用,得到 LSTM 的输出。由于𝒈𝑜 ∈[0,1],tanh(𝒄t) ∈ [−1,1],因此 LSTM 的输出 h𝑡 ∈ [−1,1]。
在这里插入图片描述

3、LSTM 情感分类问题实战

首先是 Cell 方式。LSTM 网络的状态 List 共有两个,需要分别初始化各层的 h 和 𝒄 向量。例如:

self.state0 = [tf.zeros([batchsz, units]),tf.zeros([batchsz, units])]
self.state1 = [tf.zeros([batchsz, units]),tf.zeros([batchsz, units])]

并将模型修改为 LSTMCell 模型。代码如下:

self.rnn_cell0 = layers.LSTMCell(units, dropout=0.5)
self.rnn_cell1 = layers.LSTMCell(units, dropout=0.5)

其它代码不需要修改即可运行。对于层方式,只需要修改网络模型一处即可,修改如下:

 # 构建 RNN,换成 LSTM 类即可
self.rnn = keras.Sequential([layers.LSTM(units, dropout=0.5, return_sequences=True),layers.LSTM(units, dropout=0.5)])

层方式完整代码

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import Sequential, layers, optimizers, losses
import numpy as np# 加载数据
# 批大小
batchsize = 128# 词汇表大小
total_words = 10000# 句子最大长度s,大于的句子部分将截断,小于的将填充
max_review_len = 80# 词向量特征长度n
embedding_len = 100# 加载IMDB数据集,此处的数据采用数字编码,一个数字代表一个单词
(x_train, y_train), (x_test, y_test) = keras.datasets.imdb.load_data(num_words=total_words)# 截断和填充句子,使得等长,此处长句子保留句子后面的部分,短句子在前面填充
x_train = keras.preprocessing.sequence.pad_sequences(x_train, maxlen=max_review_len)
x_test = keras.preprocessing.sequence.pad_sequences(x_test, maxlen=max_review_len)# 构建数据集,打散,批量,并丢掉最后一个不够batchsize的batch
db_train = tf.data.Dataset.from_tensor_slices((x_train, y_train))
db_train = db_train.shuffle(1000).batch(batchsize, drop_remainder=True)
db_test = tf.data.Dataset.from_tensor_slices((x_test, y_test))
db_test = db_test.batch(batchsize, drop_remainder=True)# 网络模型
class MyRNN(keras.Model):# Cell方式构建多层网络def __init__(self, units):super(MyRNN, self).__init__()# [b, 64], 构建Cell初始化状态向量,重复使用self.state0 = [tf.zeros([batchsize, units]), tf.zeros([batchsize, units])]self.state1 = [tf.zeros([batchsize, units]), tf.zeros([batchsize, units])]# 词向量编码[b, 80] => [b, 80, 100]self.embedding = layers.Embedding(total_words, embedding_len, input_length=max_review_len)# 构建RNNself.rnn = keras.Sequential([layers.LSTM(units, dropout=0.5, return_sequences=True),layers.LSTM(units, dropout=0.5)])# 构建分类网络,用于将CELL的输出特征进行分类,2分类# [b, 80, 100] => [b, 64] => [b, 1]self.outlayer = Sequential([layers.Dense(units),layers.Dropout(rate=0.5),layers.ReLU(),layers.Dense(1)])def call(self, inputs, training=None):# [b, 80]x = inputs# 获取词向量:[b, 80] => [b, 80, 100]x = self.embedding(x)# 通过2个RNN CELL,[b, 80, 100] => [b, 64]x = self.rnn(x)# 末层最后一个输出作为分类网络的输入:[b, 64] => [b, 1]x = self.outlayer(x, training)# 通过激活函数,p(y is pos|x)prob = tf.sigmoid(x)return probdef main():    units = 64    epochs = 20model = MyRNN(units)# 装配model.compile(optimizer=optimizers.Adam(1e-3),loss=losses.BinaryCrossentropy(), metrics=['accuracy'],experimental_run_tf_function=False)# 训练和验证model.fit(db_train, epochs=epochs, validation_data=db_test)# 测试model.evaluate(db_test)if __name__ == '__main__':main()

http://chatgpt.dhexx.cn/article/ngPwfcVb.shtml

相关文章

Lstm(循环神经网络)

算法模型Lstm(循环神经网络): 简介 LSTM和RNN相似,它们都是在前向传播的过程中处理流经细胞的数据,不同之处在于 LSTM 中细胞的结构和运算有所变化。 LSTM结构: 遗忘门: 遗忘门的功能是决定应丢弃或保留哪些信息。…

基于MATLAB的LSTM神经网络时序预测

参考博客及文献:4 Strategies for Multi-Step Time Series Forecasting Multivariate Time Series Forecasting with LSTMs in Keras (machinelearningmastery.com) LSTM进阶:使用LSTM进行多维多步的时间序列预测_lstm多维多部预测_一只小EZ的博客-CSD…

LSTM神经网络图解

LSTM神经网络图详解 (1)遗忘门,用于计算信息的遗忘(保留)程度,通过sigmoid处理后为0到1的值,1表示全部保留,0表示全部忘记。 f t σ ( W f ⋅ [ h t − 1 , x t ] b f ) f_{t}\si…

【神经网络】LSTM

1.什么是LSTM 长短期记忆(Long short-term memory, LSTM)是一种特殊的RNN,主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。简单来说,相比普通的RNN,LSTM能够在更长的序列中有更好的表现。 LSTM区别于RNN地方…

[深入浅出] LSTM神经网络

由来 人类并不是每时每刻都从一片空白的大脑开始他们的思考。在你阅读这篇文章时候,你都是基于自己已经拥有的对先前所见词的理解来推断当前词的真实含义。我们不会将所有的东西都全部丢弃,然后用空白的大脑进行思考。我们的思想拥有持久性。 传统的神经…

简单理解LSTM神经网络

递归神经网络 在传统神经网络中,模型不会关注上一时刻的处理会有什么信息可以用于下一时刻,每一次都只会关注当前时刻的处理。举个例子来说,我们想对一部影片中每一刻出现的事件进行分类,如果我们知道电影前面的事件信息&#xf…

LSTM神经网络

LSTM被广泛用于许多序列任务(包括天然气负荷预测,股票市场预测,语言建模,机器翻译),并且比其他序列模型(例如RNN)表现更好,尤其是在有大量数据的情况下。 LSTM经过精心设…

(神经网络深度学习)--循环神经网络LSTM

一、什么是LSTM: 如果你经过上面的文章看懂了RNN的内部原理,那么LSTM对你来说就很简单了,首先大概介绍一下LSTM,是四个单词的缩写,Long short-term memory,翻译过来就是长短期记忆,是RNN的一种…

机器学习——人工神经网络模型LSTM

LSTM的学习 学习目标: 1理解什么是人工神经网络。2深入理解LSTM(长短期记忆网络)3Code 浅析人工神经网络: 在谈人工神经网络模型之前我们先来了解一下生理上的神经网络。 下面是一张对比图: Neural Science Compute…

LSTM神经网络详解

LSTM 长短时记忆网络(Long Short Term Memory Network, LSTM),是一种改进之后的循环神经网络,可以解决RNN无法处理长距离的依赖的问题,目前比较流行。 长短时记忆网络的思路: 原始 RNN 的隐藏层只有一个状态,即h&am…

LSTM神经网络介绍

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 引言一、介绍1.1什么是LSTM?1.2基础知识1.2.1门控机制1.2.2 相关激活函数1.2.3网络参数介绍 二、LSTM网络架构2.1架构图 三、LSTM的门3.1遗忘门3.2输入门3.3输出门…

大白话理解LSTM神经网络(附实例讲解)

前言 本文章为个人学习笔记整理,所学习的内容来自b站up主老弓的学习日记,附有实例讲解。 归类 长短期记忆神经网络(LSTM)是一种特殊的循环神经网络(RNN)。原始的RNN在训练中,随着训练时间的加长以及网络层数的增多&a…

Idea如何导入一个SpringBoot项目

最近公司要求开发工具要用Idea,作为一个eclipse的老员工,记录一下Idea中遇到的坑 刚开始用Idea从Git上导入一个项目时,遇到了很多坑,网上有很多方法,我不多做介绍。只说明一下我使用的方法。 1.本地新建一个文件夹&a…

idea导入项目框架的方法

学习时,使用IDEA的时候,经常需要导入项目框架,下面操作介绍如何导入项目框架。 打开需要导入的项目 打开方式: 打开 idea ,选择 Import Project 也可以进入idea后,选择 Flie --> New --> Project …

IDEA导入Eclipse项目

背景:用习惯了idea再去用eclipse实在用的不习惯,于是将老的eclipse项目导入到eclipse,网上有很多教程,看了很多博客都不行,一直报错,各种报错,现在终于好了,我们一起来看看怎么将ecl…

关于新版idea如何导入项目

现今有很多同学都发现idea怎么找不到import project这个按钮了,我也遇到了这个问题,经过研究发现,之前使用import project最关键还是在于project form Existing Sources。 而就在打开项目后,File-->New-->Project form Exi…

idea导入项目后没有被识别为maven项目的解决办法

开发中遇到了idea导入项目后没有被识别为maven项目,使用下面方法即可 1、首先点击工具栏最左边的 Help 再点击 Find Action ;或者使用快捷键 CtrlShiftA 2、接着在输入框中输入 maven projects ,会弹出一个 Add Maven Projects 选项&#xf…

IDEA导入web项目并启动

导入项目 依次点击idea左上角的File->Project Structure->project 修改SDK、Language level,选择自己电脑对应的jdk版本,为web的运行提供jdk的环境 第二步,依次点击Facts->Web 点击Artifacts->Web Application:Exploded->…

Java代码实例2,idea导入项目后,没有项目结构

目录 专栏导读一、idea导入项目后,没有项目结构二、解决方案1、点击file -> project structure -> Modules2、点击右上角加号 --> import Modules3、选择import modules from external model4、导入后,就可以显示项目的目录结构了。 专栏导读 &…

IntelliJ IDEA导入Maven项目

(1)项目导入, 点击intelliJ IDEA的Open按钮, 找到项目目录下pom的文件,然后点击ok (先admin, 在biz-admin, 再加dal) 由于之前导入过这个项目,所以现在要先删除再导入 导入后编译器的右侧就会出现Maven Projects的侧边…