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

LSTM 模型原理

1. LSTM 模型原理

LSTM(Long Short-Term Memory)模型是一种特殊的递归神经网络(RNN),设计用于处理和预测基于时间序列的数据。LSTM的结构使得它可以有效地捕捉和利用长时间跨度的依赖关系,从而避免了传统RNN模型中的梯度消失问题。下面详细介绍LSTM的原理部分。

LSTM的基本结构

LSTM的核心是一个记忆单元(Cell)和三个门(Gate),分别是输入门(Input Gate)、遗忘门(Forget Gate)和输出门(Output Gate)。每个门都有不同的功能,帮助LSTM在处理序列数据时,有选择性地记住或者遗忘信息。

1.1 记忆单元(Cell State)
  • 记忆单元 (Cell State, C t C_t Ct) 是LSTM的核心部分,它通过门的操作控制信息在不同时间步长中的流动。理论上,记忆单元可以无修改地保存信息很长时间。
  • 记忆单元状态在每一个时间步长上都会被更新,以保持和管理整个序列中的重要信息。
1.2 门机制(Gate Mechanisms)
  • 输入门 (Input Gate, i t i_t it):决定哪些新的信息将被存储到记忆单元中。输入门通过对当前输入和前一时间步的隐藏状态进行非线性变换(通常使用sigmoid函数)来控制信息的写入。

    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[ht1,xt]+bi)

    其中, W i W_i Wi 是权重矩阵, b i b_i bi 是偏置项, σ \sigma σ 是sigmoid函数, h t − 1 h_{t-1} ht1 是前一时间步的隐藏状态, x t x_t xt 是当前时间步的输入。

  • 遗忘门 (Forget Gate, f t f_t ft):决定哪些以前的记忆单元状态将被遗忘。通过遗忘门,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[ht1,xt]+bf)

  • 输出门 (Output Gate, o t o_t ot):控制从记忆单元中读取的信息,决定下一时间步的隐藏状态。输出门决定了当前时间步的隐藏状态如何影响模型的最终输出。

    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[ht1,xt]+bo)

2. LSTM的工作流程

LSTM在每一个时间步长的工作流程如下:

  1. 计算遗忘门的输出 (Forget Gate, f t f_t ft):

    • 首先,LSTM使用前一个隐藏状态 h t − 1 h_{t-1} ht1 和当前输入 x t x_t xt 来计算遗忘门的值。这个值在0到1之间,表示需要保留的记忆比例。
  2. 计算输入门的输出 (Input Gate, i t i_t it):

    • 然后,LSTM通过输入门决定哪些新的信息将会加入到记忆单元中。
  3. 更新记忆单元状态 (Cell State, C t C_t Ct):

    • 根据遗忘门和输入门的输出,LSTM更新当前的记忆单元状态。具体操作为:将前一个时间步的记忆单元状态 C t − 1 C_{t-1} Ct1 与遗忘门 f t f_t ft 的输出相乘,删除不重要的信息;同时将输入门 i t i_t it 的输出与候选记忆单元状态 C t ~ \tilde{C_t} Ct~ 相乘,加入新的信息。

    C t = f t ⋅ C t − 1 + i t ⋅ C t ~ C_t = f_t \cdot C_{t-1} + i_t \cdot \tilde{C_t} Ct=ftCt1+itCt~

  4. 计算输出门的输出 (Output Gate, o t o_t ot):

    • 输出门结合记忆单元的更新状态来决定当前时间步的隐藏状态 h t h_t ht,隐藏状态是基于更新后的记忆单元状态,并且受到输出门控制的部分信息。

    h t = o t ⋅ tanh ⁡ ( C t ) h_t = o_t \cdot \tanh(C_t) ht=ottanh(Ct)

3. LSTM的优势
  • 长时间依赖性:传统RNN在处理长时间序列时容易遇到梯度消失或梯度爆炸的问题,导致远处的历史信息在传播到当前时刻时逐渐消失。而LSTM通过其记忆单元和门机制,有效地保存和使用长时间跨度的依赖关系。

  • 信息选择性记忆和遗忘:LSTM的门机制可以根据当前任务的需要,有选择性地记住或遗忘过去的信息,提升模型在处理复杂序列数据时的表现。

  • 适应性强:LSTM可以通过门的训练动态调整如何处理时间序列中的信息,因此在许多时间序列预测、自然语言处理等任务中表现优越。

4. 在本任务中的应用

在本代码中,LSTM被用来处理气候数据,并预测飓风状态。LSTM通过多层(这里使用了两层)的堆叠方式来增强模型的表示能力,利用输入门、遗忘门、输出门来决定如何有效利用气候数据进行飓风状态的预测。

  • 输入特征:多个时间步长的气候特征被作为LSTM的输入(可选,通过调整代码中的step即可)。
  • 隐藏状态:LSTM的隐藏状态数量为50,表示LSTM可以在每个时间步长中记住50个隐藏单元的信息。
  • 输出:每个时间步长的输出是一个标量,表示对当前时间步飓风状态的预测。

LSTM通过反复训练,从数据中学习到长时间依赖的模式,从而提高对序列数据的预测准确性。

5. 特征重要性评估方法

在这段代码中,使用了排列重要性(Permutation Importance)方法来评估不同气候特征在LSTM模型中的重要性。排列重要性是一种模型无关的特征重要性评估方法,它的基本思想是通过随机打乱特征值来测量特征对模型预测性能的影响。

5.1 排列重要性原理

排列重要性评估方法的基本步骤如下:

  1. 训练模型:首先使用训练数据训练好LSTM模型。
  2. 计算基准性能:使用训练好的模型对测试数据进行预测,并计算基准的模型性能指标,如均方误差(MSE)。
  3. 特征打乱:对每个特征,依次将该特征的值在测试集中随机打乱,同时保持其他特征值不变。
  4. 重新预测:使用打乱后的数据再次进行预测,并计算模型的新性能指标。
  5. 评估重要性:比较打乱特征后的模型性能与基准性能的差异。如果打乱某个特征导致模型性能显著下降,则说明该特征对模型预测的重要性较高。
5.2 在LSTM中的实现

由于LSTM模型处理的是时间序列数据,因此在计算排列重要性之前,需要对输入数据进行一些处理:

  • 输入数据的展平:LSTM的输入数据是三维的(样本数,时间步长,特征数),在进行排列重要性评估之前,需要将其展平为二维数组(样本数,特征数 × 时间步长)。
  • 模型包装器:为了使LSTM模型兼容scikit-learnpermutation_importance函数,代码中使用了一个包装类LSTMWrapper,将LSTM模型包装成一个符合scikit-learn接口的回归模型。
5.3 结果展示与保存

排列重要性评估完成后,将特征重要性分数与特征名称对应,并按重要性排序。代码还包括了保存结果和可视化的步骤:

  • 特征名的生成:由于LSTM的输入是多步长的时间序列数据,特征名需要包含时间步长的信息。例如,对于特征'cld',可能会生成'cld_t-2''cld_t-1''cld_t-0'等特征名。
  • 结果保存:特征重要性评估的结果保存为Excel文件,便于进一步分析。
  • 可视化:生成柱状图展示前10个最重要的特征,并将图像保存为PNG文件。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python----爬虫
  • django之select_related 与 prefetch_related用法
  • windows C++- C++/WinRT和COM组件(下)
  • Python编写Word文档
  • css-定位
  • 【Linux】——进程概念(万字解读)
  • 【嵌入式linux开发】智能家居入门6:最新ONENET,物联网开放平台(QT、微信小程序、MQTT协议、ONENET云平台、旭日x3派)
  • Linux环境下运行介绍
  • 51单片机学习
  • 第八季完美童模全球总冠军·韩嘉潞 破浪扬帆写就传奇
  • INSTALLMENT MORTGAGE
  • Mac升级系统文件都丢了怎么办?Mac更新后资料找不到了怎么恢复
  • 【ARM 芯片 安全与攻击 6 -- ARM 中的 PAC 是什么?】
  • 2024年电赛H题全开源
  • 深度学习(YOLO、DETR) 十折交叉验证
  • 《Java编程思想》读书笔记-对象导论
  • 【css3】浏览器内核及其兼容性
  • Android Studio:GIT提交项目到远程仓库
  • CODING 缺陷管理功能正式开始公测
  • Java方法详解
  • linux学习笔记
  • Magento 1.x 中文订单打印乱码
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 蓝海存储开关机注意事项总结
  • 前端知识点整理(待续)
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 如何在GitHub上创建个人博客
  • 山寨一个 Promise
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 硬币翻转问题,区间操作
  • 白色的风信子
  • Prometheus VS InfluxDB
  • #{}和${}的区别?
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (3)nginx 配置(nginx.conf)
  • (Charles)如何抓取手机http的报文
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (SERIES12)DM性能优化
  • (二)linux使用docker容器运行mysql
  • (分布式缓存)Redis分片集群
  • (附源码)php新闻发布平台 毕业设计 141646
  • (七)Activiti-modeler中文支持
  • (七)Knockout 创建自定义绑定
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (一)、python程序--模拟电脑鼠走迷宫
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (原創) 物件導向與老子思想 (OO)
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .net 获取某一天 在当月是 第几周 函数