LSTM 和 Bi-LSTM

2023-11-12

承上启下

承接上文介绍过的 SimpleRNN ,这里介绍它的改进升级版本 LSTM。

RNN 和 LSTM 比较

  • RNN 的记忆很短,容易产生梯度消失的长依赖问题,而 LSTM 可以解决这个问题,它有更长的记忆
  • RNN 模型比较简单,只有一个参数矩阵,但是 LSTM 比较复杂,有四个参数矩阵

LSTM

Long Short Term Memory ,又叫 LSTM ,本质上 LSTM 是一种特殊 RNN 模型,但是它对 RNN 模型做了大幅度的改进,可以避免梯度消失的长依赖问题。它的结构如图所示。

avatar

LSTM 核心理念

LSTM 的核心理念就是细胞状态,表示细胞状态的就是图中横穿的黑色粗线。细胞的状态在这里类似长期记忆线,可以将上一时刻的细胞的状态传递到下一时刻的细胞状态,达到序列信息的学习和记忆目的,这也是它能够避免梯度消失的原因。

h 是隐层输出,可以看作当前时刻的细胞状态有多少可以输出,这里面积累了当前时刻及其之前所有时刻的输入的特征信息。

h 是我们在应用中常用到的特征向量,而细胞状态只用于内部计算,我很少用到。

例如:我从前到后读一篇长文,不重要的信息丢掉即可,重要的信息持续积累,最后能得出中心思想。而不是读一个字忘一个字,读完还不知道说了什么。

avatar

LSTM 模型中具有忘掉和记忆某些信息的能力,这些能力都是被称为门(Gate)的结构所实现的。如下图所示。

avatar

门(Gate)在数学表示中,就是一个 Sigmod 神经网络层和一个对应位置相乘的运算。Sigmod 神经网络层输出结果矩阵 S 中的值就是 0 到 1 之间的数字, 0 表示不通过任何信息, 1 表示全部通过。S 和之后与它进行运算的矩阵 matrix 大小相同,矩阵中的每个数字之后会与 matrix 中的对应位置数字进行相乘运算,这样得到的结果矩阵维度保持不变,其中有的值因为乘 0 结果是 0 ,表示之后不需要这个信息 ,有的值因为乘 1 结果保持不变,有的值因为乘了 0 到 1 之间的小数,表示特征保留了一定比例。

LSTM 遗忘门

遗忘门就是决定我们的细胞状态中有什么无用的信息需要丢弃,结构如下图所示。

  • ht-1 是上一个时刻的隐层输出, xt 是当前的输入,通过与参数矩阵 Wf 和偏置参数 bf 计算出的结果,又经过 Sigmod 层得到 ft ,其中的值都在 0 到 1 之间,它与上一时刻的细胞状态 Ct-1 相乘,可以丢弃不需要的信息。

例如:我们想要通过前面三个词来预测下一个词, Ct-1 中可能包含某些信息不再用到,就可以将这些属性在通过遗忘门来丢弃。

LSTM 记忆门

一般叫输入门,但是我觉得的记忆门更加形象好理解。记忆门就是需要确定当前输入的信息有多少需要被存放到当前的细胞状态 Ct 中。

  • ht-1 是上一个时刻的隐层输出, xt 是当前的输入,通过与参数矩阵 Wi 和偏置参数 bi 计算出的结果,又经过 Sigmod 层得到 it ,其中的值都在 0 到 1 之间,表示哪些输入的部分需要被用到。

  • ht-1 是上一个时刻的隐层输出, xt 是当前的输入,通过与参数矩阵 Wc 和偏置参数 bc 计算出的结果,又经过 tanh 层得到候选输入向量 C~t ,其中的值都在 -1 到 1 之间。

LSTM 更新细胞状态

有了上面的上一时刻的细胞状态、遗忘门、记忆门和候选输入向量,这时就可以更新当前时刻的细胞状态,如图所示。

  • 从上图的公式可以轻易理解更新细胞状态的方式,遗忘门 ft 与上一时刻的细胞状态 Ct-1 相乘,表示上一时刻传进来的信息有多少需要被丢弃。
  • 记忆门 it 与当前候选输入向量 C~t 相乘,表示当前输入中有多少信息需要被加入到当前细胞状态 Ct 中。
  • 过去的事情该忘记的忘记,现在的事情该记住的记住,将两者的结果相加,不就是当前的细胞状态,你说妙不妙~

LSTM 输出门

虽然有了需要的当前细胞状态,但是对于当前时刻的情况需要有些输出,输出门就是控制当前细胞状态对外有多少是可见的。如图所示。

  • ht-1 是上一个时刻的隐层输出, xt 是当前的输入,通过与参数矩阵 Wo 和偏置参数 bo 计算出的结果,又经过 Sigmod 层得到 ot ,其中的值都在 0 到 1 之间,表示细胞状态的哪些部分需要被输出。

  • 当前时刻的细胞状态经过 tanh 函数进行非线性变化,然后与 ot 进行相乘可以得到当前需要输出的结果 ht 。既是当前时刻的输出,又是下一个时刻的隐层状态的输入。本质上 ht 就是 Ct 衰减之后的内容。

LSTM 参数数量

经过上面的介绍,我们知道 LSTM 一共有四个参数矩阵 Wf 、Wi 、Wc 、Wo 。每个参数矩阵的大小为:

shape(h) * [shape(h) + shape(x)]

相应的有四个偏置参数 bf 、bi 、bc 、bo ,每个参数的大小为:

shape(h)

则总共有参数:

4 * [shape(h) * [shape(h) +shape(x)] + shape(h)]

LSTM 的升级版 Bi-LSTM

Bi-LSTM 就是前向的 LSTM 与后向的 LSTM 结合而成的模型。

可以看到 xt 时刻的正向隐层输出和反向隐层输出进行拼接,得到了当前时刻的隐层输出 yt 。下面对“我爱中国”这句话进行编码,并通过 Bi-LSTM 捕捉特征

从左到右的理解这句话,每个时刻都能得到 hLi 隐层输出,从右到左的理解这句话,每个时刻都能得到 hRi 隐层输出,而 Bi-LSTM 将每个时刻的正向和反向隐层输出进行了拼接 [hLi ,hRi] ,来表示当前时刻的特征更加丰满的隐层输出。

我们可以这样理解,计算机只认二进制码,所以两种方向的阅读方式都不影响它对这句话的两个方向的“语义的理解”,尽管从右往左人类一般不认为有什么语义存在,当然计算机可能会按照从右到左的顺序理解到人类无法直接理解的字符搭配等其他深层次含义。所以双向的特征更加能捕捉到代表这句话的“语义”。

LSTM 变体

上面所介绍的只是经典的一种,其实还有很多变体,如一个比较流行的 LSTM 变种是由 Gers & Schmidhuber 提出的,结构图如下所示。

案例

这是我之前写的关于 LSTM 的一篇案例文章,是一个预测单词的最后一个字母,只为展现原理,有详细的注释,觉得不错的可以跳过去留赞,https://juejin.cn/post/6949412997903155230

这是我之前写的关于 Bi-LSTM 的一篇案例文章,输入一句话预测下一个单词,只为展现原理,有详细的注释,觉得不错的可以跳过去留赞,https://juejin.cn/post/6949413253982191652

参考

http://colah.github.io/posts/2015-08-Understanding-LSTMs/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LSTM 和 Bi-LSTM 的相关文章

  • 如何快速申请GPT账号?

    详情点击链接 如何快速申请GPT账号 一OpenAI 1 最新大模型GPT 4 Turbo 2 最新发布的高级数据分析 AI画图 图像识别 文档API 3 GPT Store 4 从0到1创建自己的GPT应用 5 模型Gemini以及大模型
  • 手把手教你用 Stable Diffusion 写好提示词

    Stable Diffusion 技术把 AI 图像生成提高到了一个全新高度 文生图 Text to image 生成质量很大程度上取决于你的提示词 Prompt 好不好 前面文章写了一篇文章 一份保姆级的 Stable Diffusion
  • 如何用GPT进行论文润色与改写?

    详情点击链接 如何用GPT GPT4进行论文润色与改写 一OpenAI 1 最新大模型GPT 4 Turbo 2 最新发布的高级数据分析 AI画图 图像识别 文档API 3 GPT Store 4 从0到1创建自己的GPT应用 5 模型Ge
  • CorelDRAW2024官方中文版重磅发布更新

    35年专注于矢量设计始于1988年并不断推陈出新 致力为全球设计工作者提供更高效的设计工具 CorelDRAW 滋养并见证了一代设计师的成长 在最短的时间内交付作品 CorelDRAW的智能高效会让你一见钟情 CorelDRAW 全称 Co
  • 国产化率100%,北斗导航单日定位4500亿次,外媒:GPS将被淘汰

    追赶30年的技术差距 国产卫星导航系统 北斗 开始扬眉吐气 数据显示 北斗导航目前单日定位量达4500亿次 已经获得100多个国家的合作意向 甚至国际民航也摒弃以往 独宠 GPS的惯例 将北斗纳入参考标准 对此 有媒体直言 GPS多年来的技
  • 深度学习(5)--Keras实战

    一 Keras基础概念 Keras是深度学习中的一个神经网络框架 是一个高级神经网络API 用Python编写 可以在TensorFlow CNTK或Theano之上运行 Keras优点 1 允许简单快速的原型设计 用户友好性 模块化和可扩
  • Making Large Language Models Perform Better in Knowledge Graph Completion论文阅读

    文章目录 摘要 1 问题的提出 引出当前研究的不足与问题 KGC方法 LLM幻觉现象 解决方案 2 数据集和模型构建
  • 多特征因果 CNN - Keras 实现

    我目前正在使用基本的 LSTM 进行回归预测 并且我想实现一个因果 CNN 因为它的计算效率应该更高 我正在努力弄清楚如何重塑当前的数据以适应因果 CNN 单元并表示相同的数据 时间步关系以及扩张率应设置为多少 我当前的数据是这样的 num
  • 为什么RNN总是输出1

    我使用循环神经网络 RNN 进行预测 但由于某些奇怪的原因 它总是输出 1 这里我用一个玩具示例对此进行解释 Example考虑一个矩阵M维度 360 5 和一个向量Y其中包含 rowsumM 现在 使用 RNN 我想预测Y from M
  • 使用 conv1D “检查输入时出错:期望 conv1d_input 有 3 个维度,但得到形状为 (213412, 36) 的数组”

    我的输入只是一个 csv 文件237124行和37列 首先36列作为特征 The last列是一个二进制类标签 我正在尝试在 conv1D 模型上训练我的数据 我尝试过建立一个一层 CNN 但我有一些问题 编译器输出 ValueError
  • 使用张量流理解 LSTM 模型进行情感分析

    我正在尝试使用 Tensorflow 学习 LSTM 模型进行情感分析 我已经经历了LSTM模型 http colah github io posts 2015 08 Understanding LSTMs 以下代码 create sent
  • 了解 Tensorflow LSTM 模型输入?

    我在理解 TensorFlow 中的 LSTM 模型时遇到一些困难 我用tflearn http tflearn org 作为包装器 因为它自动完成所有初始化和其他更高级别的工作 为了简单起见 我们考虑这个示例程序 https github
  • Python - 基于 LSTM 的 RNN 需要 3D 输入?

    我正在尝试构建一个基于 LSTM RNN 的深度学习网络 这是尝试过的 from keras models import Sequential from keras layers import Dense Dropout Activatio
  • Tensorflow动态RNN(LSTM):如何格式化输入?

    我已获得这种格式的一些数据以及以下详细信息 person1 day1 feature1 feature2 featureN label person1 day2 feature1 feature2 featureN label person
  • 尝试理解 Pytorch 的 LSTM 实现

    我有一个包含 1000 个示例的数据集 其中每个示例都有5特征 a b c d e 我想喂7LSTM 的示例 以便它预测第 8 天的特征 a 阅读 nn LSTM 的 Pytorchs 文档 我得出以下结论 input size 5 hid
  • 张量流 LSTM 模型中的 NaN 损失

    以下网络代码应该是经典的简单 LSTM 语言模型 一段时间后开始输出 nan 损失 在我的训练集上 这需要几个小时 而且我无法在较小的数据集上轻松复制它 但在认真的训练中 这种情况总是会发生 Sparse softmax with cros
  • PyTorch LSTM:运行时错误:无效参数 0:张量的大小必须匹配,维度 0 除外。维度 1 为 1219 和 440

    我有一个基本的 PyTorch LSTM import torch nn as nn import torch nn functional as F class BaselineLSTM nn Module def init self su
  • 为什么 Keras 的 train_on_batch 在第二个 epoch 产生零损失和准确率?

    我正在使用一个大数据集 所以我尝试使用 train on batch 或适合 epoch 1 model Sequential model add LSTM size input shape input shape return seque
  • LSTM 批次与时间步

    我按照 TensorFlow RNN 教程创建了 LSTM 模型 然而 在这个过程中 我对 批次 和 时间步长 之间的差异 如果有的话 感到困惑 并且我希望得到帮助来澄清这个问题 教程代码 见下文 本质上是根据指定数量的步骤创建 批次 wi
  • 将 Pytorch LSTM 的状态参数转换为 Keras LSTM

    我试图将现有的经过训练的 PyTorch 模型移植到 Keras 中 在移植过程中 我陷入了LSTM层 LSTM 网络的 Keras 实现似乎具有三种状态类型的状态矩阵 而 Pytorch 实现则具有四种状态矩阵 例如 对于hidden l

随机推荐

  • 在ubuntu上安装qt

    1 登录VM 上网下载Qt 保存路径一般在下载文件夹 可以下载后放到自定义文件夹 2 下载完成后 cd到保存文件的文件夹 并执行命令 sudo chmod a x qt opensource linux x64 5 9 run 将文件改变成
  • 数据结构进阶(一)

    更多内容可以访问我的个人博客 1 二叉查找树 参考 深入学习理解二叉搜索树 附详细讲解与实例分析 1 1 基本概念 二叉查找树 也称二叉搜索树 或二叉排序树 其要么是一颗空树 要么就是具有如下性质的二叉树 1 若任意节点的左子树不空 则左子
  • FPGA编程入门:Quartus II 设计1位全加器

    FPGA编程入门 Quartus II 设计1位全加器 一 半加器和1位全加器原理 一 半加器 二 1位全加器 二 实验目的 三 Quartus II设计半加器 一 新建工程 二 创建原理图 三 将设计项目设置成可调用的元件 四 半加器仿真
  • Centos 下安装使⽤ Memcache

    1 美图 2 安装 在 Centos 下安装使 用 yum 命令安装 Memcache 非常简单 yum install y memcached 启动 usr bin memcached b p 11211 m 150 u root gt
  • Linux-getopt命令详解

    getopt命令记录 简介 格式说明 要点 使用 简介 getopt命令可以接受一系列任意形式的命令行选项和参数 并自动将它们转换成适当的格式 格式说明 getopt三种使用方式 第一种 无法处理带有空格的参数 getopt optstri
  • c++void函数如何返回处理结果

    文章目录 一 void函数 二 void函数通过引用和指针返回处理结果 一 void函数 void在函数和变量中的含义详解 void表示无类型的意思 无类型可以包容有类型 可以用其定义的函数获得各种想要输出的数据类型 比如各个视觉库自定义的
  • java流

    java流 字节流 fr new FileReader E javaTxt adc txt fw new FileWriter E javaTxt adc txt 字符流 fis new FileInputStream E javaTxt
  • .gitignore文件不生效解决方法

    创建git仓库 忘记创建 gitignore 文件 导致提交的时候检测出一堆 DS Store node modules 等无需提交的文件 这个时候添加 gitignore 文件 如果是还没有提交 重新打开下编辑器就好了 编辑器是VS Co
  • Java 集合根据条件进行拆分

    创建测试集合 List
  • typescript学习(四)——泛型

    泛型 泛型 软件工程中 不仅要创建一致的定义良好的API 同时也要考虑可重用性 组件不仅能够支持当前的数据类型 同时也能支持未来的数据类型 这在创建大型系统时提供了十分灵活的功能 在像c 和java这样的语言中 可以使用泛型来创建可重用的组
  • 从C语言出发新角度内核剖析C++函数重载(千字精品,附带大厂面试问题回答)

    目录 C角度引入 函数重载 1 什么是函数重载 2 函数重载的优点 3 函数重载的特性 剖析函数重载 最后做一个小补充 大厂面试题 C角度引入 首先在进行C 讲解之前我们照例先来谈谈C语言是如何做的 在C语言中是没有函数重载存在的 每一个函
  • hibernate 关系映射文件配置

  • 1、Java实现队列(Queue)的方式

    编程题目 1 请用Java实现队列 Queue 队列实现的三种方式 1 通过数组实现一个队列 2 通过集合实现一个对列 3 通过两个堆栈实现一个队列 示例代码 1 通过数组实现一个队列 package program stack array
  • conda更新失败--更新后版本号不变

    我们通常使用下面的命令更新conda conda update n base c defaults conda 然而 这个命令有时候失效 如在我电脑上 4 10 0版本的conda一直无法升级为最新的23 3 1版本 失效情况 在更新前的状
  • vue 数字变星号 过滤器_Vue自定义过滤器格式化数字三位加一逗号实现代码

    前端处理一些金额 数字类的数据要求按照固定的格式显示 比如9 527 025 或者带有小数 如1 587 23 仍要三位一断 有些话也不必多说 既然要求如此 实现呗 作为前端主流框架之一的Vue 类似的功能肯定都有人写的很完善了 我呢 最讨
  • React Hooks 学习笔记

    大家好 小编最近在梳理 React Hook 的相关内容 由于看视频 看书 自己做项目总觉得缺点什么 总觉得看过了 内容太简单 有啥好写的 但是过了一段时间 感觉有些东西又模糊了 同时又觉得怕简单 写了也不一定有人看 但是想想 还是整理成文
  • iOS开发之第三方支付支付宝支付教程,史上最新最全第三方支付宝支付方式实现、支付宝集成教程,支付宝实现流程

    本章项目demo https github com zhonggaorong alipayDemo 支付宝支付大致流程为 1 公司与支付宝进行签约 获得商户ID partner 和账号ID seller 和私钥 privateKey 开发中
  • 【自然语言处理】主题建模:Top2Vec(理论篇)

    主题建模 Top2Vec 理论篇 Top2Vec 是一种用于 主题建模 和 语义搜索 的算法 它自动检测文本中出现的主题 并生成联合嵌入的主题 文档和词向量 算法基于的假设 许多语义相似的文档都可以由一个潜在的主题表示 首先 创建文档和词向
  • 没有头的猫在笛卡尔坐标系上随机漫步(未完成)

    想用python模拟随机运动 布朗运动 BROWNIAN MOTION 英国科学家布朗在两百年前第一次观察到水分子推动花粉颗粒在水面做不规则运动 现在我们也想用电脑模拟 在无外力作用下 花粉颗粒在水面的随机运动 如何实现呢 详细解释直接写在
  • LSTM 和 Bi-LSTM

    承上启下 承接上文介绍过的 SimpleRNN 这里介绍它的改进升级版本 LSTM RNN 和 LSTM 比较 RNN 的记忆很短 容易产生梯度消失的长依赖问题 而 LSTM 可以解决这个问题 它有更长的记忆 RNN 模型比较简单 只有一个