一步一步详解LSTM网络【从RNN到LSTM到GRU等,直至attention】

2023-11-13

0、前言

本文主要译至Understanding LSTM Networks并加上了部分笔者的见解,对于全面理解LSTM有一定的帮助。

1、Recurrent Neural Networks循环神经网络

人类不会每一秒都从头开始思考。
当你阅读这篇文章时,你会根据你对前面单词的理解来理解每个单词。
你不会扔掉所有东西,重新开始思考。
你的思想有坚持。Your thoughts have persistence.

传统的神经网络无法做到这一点,这似乎是一个主要缺点。
例如,假设您想对电影中每一点发生的事件类型进行分类。
目前尚不清楚传统的神经网络如何利用其对电影中先前事件的推理来通知后来的事件。

递归神经网络解决了这个问题。它们是带有循环的网络,允许信息持续存在。
在这里插入图片描述
在上图中,一大块神经网络 A, 查看一些输入 x t x_t xt并输出一个值 h t h_t ht
循环允许信息从网络的一个步骤传递到下一个步骤。

这些循环使递归神经网络看起来有点神秘。
然而,如果你多想想,就会发现它们与普通神经网络并没有什么不同。
循环神经网络可以被认为是同一网络的多个副本,每个副本都将一条消息传递给后继者。
考虑一下如果我们展开循环会发生什么:
在这里插入图片描述
这种链状性质表明循环神经网络与序列和列表sequences and lists密切相关。
它们是用于此类数据的神经网络的自然架构。

他们肯定被使用了!
在过去的几年里,将 RNN 应用于各种问题取得了令人难以置信的成功:语音识别、语言建模、翻译、图像字幕……这个例子不胜枚举。
关于 RNN 可以实现的惊人壮举,将在 Andrej Karpathy 的优秀博客文章 The Unreasonable Effectiveness of Recurrent Neural Networks中进行讨论。但他们真的很了不起。

这些成功的关键是使用“LSTM”,这是一种非常特殊的递归神经网络,对于许多任务,它比标准版本要好得多。
几乎所有基于递归神经网络的令人兴奋的结果都是用它们实现的。
本文将探讨这些 LSTM。

2、The Problem of Long-Term Dependencies长期依赖的问题

RNN 的吸引力之一是它们可能能够将以前的信息连接到当前的任务,例如使用以前的视频帧可能会告知对当前帧的理解。
如果 RNN 可以做到这一点,它们将非常有用。
但他们可以吗?这要看情况而定。

有时,我们只需要查看最近的信息即可执行当前任务。
例如,考虑一个语言模型试图根据前面的单词预测下一个单词。
如果我们试图预测“the clouds are in the sky”中的最后一个词,我们不需要任何进一步的上下文——很明显下一个词将是 sky。
在这种情况下,相关信息和需要它的地方之间的差距很小,RNN 可以学习使用过去的信息。
在这里插入图片描述
但在某些情况下,我们需要更多上下文。
考虑尝试预测文本“I grew up in France… I speak fluent French.”中的最后一个词。
最近的信息表明,下一个词可能是一种语言的名称,但如果我们想缩小哪种语言的范围,我们需要法国的上下文,从更远的地方。
相关信息和需要它的点之间的差距变得非常大是完全有可能的。

不幸的是,随着差距的扩大,RNN 变得无法学习连接信息。
在这里插入图片描述
理论上,RNN 绝对有能力处理这种“长期依赖”。
人类可以仔细地为他们挑选参数来解决这种形式的玩具问题。
遗憾的是,在实践中,RNN 似乎无法学习它们。
Hochreiter (1991) [German] 和 Bengio 等人 (1994)深入探讨了这个问题,他发现了一些非常根本的原因,为什么这可能很困难。

值得庆幸的是,LSTM 没有这个问题!

3、LSTM Networks

长短期记忆网络——通常简称为“LSTM”——是一种特殊的 RNN,能够学习长期依赖关系。
它们由 Hochreiter & Schmidhuber (1997) 引入,并在后续工作中被许多人改进和推广。
它们在处理大量问题时表现出色,现在被广泛使用。

LSTM 明确设计用于避免长期依赖问题。
长时间记住信息实际上是他们的默认行为,而不是他们努力学习的东西!

所有循环神经网络都具有神经网络重复模块链的形式。
在标准 RNN 中,这个重复模块将具有非常简单的结构,例如单个 tanh 层。
在这里插入图片描述
LSTM 也有这种链状结构,但重复模块有不同的结构。
不是只有一个神经网络层,而是有四个,以一种非常特殊的方式进行交互。
在这里插入图片描述
不要担心正在发生的事情的细节。
稍后我们将逐步介绍 LSTM 图。
现在,让我们尝试熟悉我们将要使用的符号。
在这里插入图片描述
在上图中,每条线都带有一个完整的向量,从一个节点的输出到其他节点的输入。
粉色圆圈代表逐点操作,如向量加法,而黄色框是学习的神经网络层。
行合并表示串联,而行分叉表示其内容被复制并且副本转到不同的位置。

4、The Core Idea Behind LSTMs

LSTM 的关键是细胞状态cell state,即贯穿图表顶部的水平线。

细胞状态有点像传送带。
它直接沿着整个链条运行,只有一些次要的线性交互。
信息很容易原封不动地沿着它流动。
在这里插入图片描述

LSTM 确实有能力删除或添加信息到细胞状态,由称为门的结构仔细调节。

门是一种有选择地让信息通过的方式。
它们由一个 sigmoid 神经网络层和一个逐点乘法运算组成。
在这里插入图片描述

sigmoid 层输出介于 0 和 1 之间的数字,描述应该让多少成分通过。
值为零表示“不让任何东西通过”,而值为 1 表示“让一切都通过!”

LSTM 具有三个这样的门,以保护和控制单元状态cell state。

5、Step-by-Step LSTM Walk Through

LSTM 的第一步是决定我们要从细胞状态中丢弃哪些信息。
该决定由称为“遗忘门层”的sigmoid层做出。
它看着 h t − 1 h_{t−1} ht1 x t x_t xt, 并输出一个介于 0 和1之间的数字对于细胞状态 C t − 1 C_{t−1} Ct1 中的每个数字。
A 1代表“完全保留这个”,而 a 0 代表“彻底抛弃这个”。

让我们回到我们的语言模型示例,它试图根据所有先前的单词预测下一个单词。
在这样的问题中,细胞状态可能包括当前主体的性别,以便可以使用正确的代词。
当我们看到一个新主题时,我们想忘记旧主题的性别。
在这里插入图片描述
下一步是决定我们要在细胞状态中存储哪些新信息。
这有两个部分。
首先,称为“输入门层”的 sigmoid 层决定我们将更新哪些值。
接下来,一个 tanh 层创建一个新候选值向量 C ~ t \tilde{C}_t C~t,可以将其添加到状态。
在下一步中,我们将结合这两者来创建对状态的更新。

在我们的语言模型示例中,我们想要将新主题的性别添加到单元格状态,以替换我们忘记的旧主题。
在这里插入图片描述
现在是更新旧细胞状态 C t − 1 C_{t−1} Ct1 的时候了, 进入新的细胞状态 C t C_t Ct. 前面的步骤已经决定了要做什么,我们只需要实际去做。

我们将旧状态乘以 f t f_t ft,以忘记我们早些时候决定忘记的事情。
然后我们加上 i t ∗ C ~ t i_t * \tilde{C}_t itC~t
这是新的候选值,根据我们决定更新每个状态值的程度进行缩放。

在语言模型的情况下,这是我们实际上要删除有关旧主题性别的信息并添加新信息的地方,正如我们在前面的步骤中所决定的那样。
在这里插入图片描述
最后,我们需要决定要输出什么。
此输出将基于我们的细胞状态,但将是过滤后的版本。
首先,我们运行一个 sigmoid 层,它决定我们要输出细胞状态的哪些部分。
然后,我们把cell state通过tanh(将值推到 −1 和 1之间 ) 并将其乘以 sigmoid 门的输出,这样我们就只输出我们决定输出的部分。

对于语言模型示例,由于它只是看到一个主语,它可能想要输出与动词相关的信息,以防接下来会发生什么。
例如,它可能会输出主语是单数还是复数,这样我们就知道接下来应该将动词变位为什么形式。
在这里插入图片描述

6、Variants on Long Short Term Memory

到目前为止,我所描述的是一个非常普通的 LSTM。
但并不是所有的 LSTM 都和上面的一样。
事实上,似乎几乎每篇涉及 LSTM 的论文都使用略有不同的版本。
差异很小,但值得一提的是其中的一些差异。

由 Gers & Schmidhuber (2000) 引入的一种流行的 LSTM 变体正在添加“窥孔连接”。“peephole connections.”
这意味着我们让门层查看细胞状态。
在这里插入图片描述
上图给所有的门都加了窥视孔,但是很多论文会给一些窥视孔,其他的就不给了。

另一种变体是使用耦合的遗忘门和输入门。
我们不是单独决定要忘记什么以及我们应该向什么添加新信息,而是一起做出这些决定。
我们只会忘记什么时候我们要输入一些东西来代替它。
当我们忘记旧的东西时,我们只会向状态输入新值。
在这里插入图片描述
LSTM 的一个稍微更显着的变化是门控循环单元 (Gated Recurrent Unit, GRU),由 Cho 等人引入(2014)。
它将遗忘门和输入门组合成一个“更新门”。
它还合并了细胞状态和隐藏状态,并做了一些其他的改变。
生成的模型比标准 LSTM 模型更简单,并且越来越受欢迎。
在这里插入图片描述
这些只是一些最著名的 LSTM 变体。
还有很多其他的,比如 Yao 等人的 Depth Gated RNNs(2015)。
还有一些完全不同的方法来解决长期依赖关系,比如 Koutnik 等人的 Clockwork RNNs (2014)。

这些变体中哪个最好?差异重要吗?格雷夫等人 (2015) 对流行的变体进行了很好的比较,发现它们都差不多。 Jozefowicz 等人 (2015) 测试了超过一万个 RNN 架构,发现其中一些在某些任务上比 LSTM 更有效。

7、Conclusion

早些时候,我提到了人们使用 RNN 取得的显著成果。
基本上所有这些都是使用 LSTM 实现的。
对于大多数任务,它们确实工作得更好!

写成一组方程式,LSTM 看起来相当吓人。
希望在本文中逐步介绍它们可以使它们更容易理解。

LSTM 是我们使用 RNN 可以完成的一大步。
人们很自然地会想:是否又迈出了一大步?
研究人员的共同意见是:“是的!还有下一步,那就是attention!”这个想法是让 RNN 的每一步都从一些更大的信息集合中挑选信息来查看。
例如,如果您使用 RNN 创建描述图像的标题,它可能会选择图像的一部分来查看它输出的每个单词。
事实上,徐等人 (2015) 正是这样做的——如果你想探索注意力,这可能是一个有趣的起点!
使用注意力已经取得了许多非常令人兴奋的结果,而且似乎还有更多的结果……

注意力并不是 RNN 研究中唯一令人兴奋的话题。
例如,Kalchbrenner 等人的 Grid LSTM (2015) 似乎非常有前途。
在生成模型中使用 RNN——例如 Gregor 等人 (2015),Chung 等人 (2015),或 Bayer & Osendorfer (2015) – 似乎也很有趣。
过去几年对于递归神经网络来说是一个激动人心的时期,而即将到来的只会更加精彩!

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

一步一步详解LSTM网络【从RNN到LSTM到GRU等,直至attention】 的相关文章

随机推荐

  • JavaScript 获取数组的最后一个元素

    index取值 args args length 1 pop方法 args pop 注意 pop方法会删除args最后一个元素 并返回
  • RS485、MODBUS通信协议浅显易懂篇

    前言 MODBUS协议是Modicon公司发表的一种串行通信协议 属于OSI模型中应用层的协议 现广泛应用于工业控制领域 它的主要特点是免费开放 支持多种电气接口 如RS 232 RS 485 传输介质可以是双绞线 光纤 无线等 RS485
  • 计算机网络基础概论

    什么是Internet 从具体构成角度看 端系统 主机节点 主机及其上运行的网络应用程序 和网络交换设备 数据交换节点 中继器 路由器 交换机 负载均衡设备等 边 通信链路 分为接入网链路和骨干链路 接入网链路是指主机连接到互联网的链路 骨
  • java开发异常类型汇总

    1 java lang nullpointerexception 这个异常大家肯定都经常遇到 异常的解释是 程序遇上了空指针 简单地说就是调用了未经初始化的对象或者是不存在的对象 这个错误经常出现在创建图片 调用数组这些操作中 比如图片未经
  • Java 5-1、用户模块-Mybatis代码生成

    5 1 用户模块 Mybatis代码生成 从这里开始 环境相关配置就告一段落了 项目就开始进入开发学习阶段 一 代码生成 实体类 Mapper接口 Mapper xml 分别生成 AppUser java SysUser java 再抽取B
  • Python题目:学生信息管理系统-高级版(图形界面+MySQL数据库)

    Python题目 学生信息管理系统 高级版 图形界面 MySQL数据库 使用图形界面显示 选用list tuple dictionary或map等数据结构 操作数据库存储X个学生的三门课的成绩 机器学习 Python程序设计 研究生英语 并
  • #BDA#笔记#阶段一:熟悉要分析的数据

    学习参考 1 小灶能力派 BDA证书班
  • java jhat_java命令--jhat命令使用

    jhat也是jdk内置的工具之一 主要是用来分析java堆的命令 可以将堆中的对象以html的形式显示出来 包括对象的数量 大小等等 并支持对象查询语言 使用jmap等方法生成java的堆文件后 使用其进行分析 第一步 导出堆 jmap d
  • 将一组很大的数据集随机分成两组数据

    最近在看机器学习的东西时发现了一些特别好玩的东西 机器学习中又分为训练集和测试集 如何把一组很大的数据分为这两个集合呢 可以使用接下来的函数完成 当然由于random这个随机数生成函数每次产生的数不一定都是刚好达到你的期望 所以总会有一点小
  • 【大数据入门核心技术-Impala】(一)Impala简介

    目录 一 Impala介绍 二 Impala优势 三 Impala主要功能 一 Impala介绍 Impala是Cloudera公司主导开发的新型查询系统 它提供SQL语义 能查询存储在Hadoop的HDFS和HBase中的PB级大数据 已
  • hibernateCRUD

    本文章的目的是实现hibernateDao层功能 但是具体的操作不在Dao层内完成 实体类 package com hibernate entity public class User private int id private Stri
  • 前端实现单元测试(代码版)

    Jest使用 下载 npm install save dev jest ts jest ts node jest globals types jest 在nodejs中支持ts ts执行报错 npx ts jest config init
  • 小白学习go之基础篇2 -- Slice切片的原理

    文章目录 前言 一 为什么要有切片 二 切片是怎么实现的呢 1 Go的切片结构体 SliceHeader 2 初始化切片的两种方式 3 切片是在栈上分配内存的还是在堆 4 切片的扩容 三 切片的使用有什么坑需要注意呢 总结 前言 本文主要记
  • 【解决】mysql安装时,Unable to connect to any of the specified MySQL hosts

    解决方法 win r打开运行 输入regedit 打开注册表 更改注册表 找到HKEY LOCAL MACHINE SYSTEM CurrentControlSet services mysql 服务名 ImagePath 我原先的地址为
  • 性能调优篇07:Zabbix性能优化的几点原则

    性能调优 概述 使Zabbix系统正确调整以获得最佳性能是非常重要的 Zabbix性能优化的几点原则 确保zabbix内部组件性能处于被监控状态 调优的基础 使用硬件性能足够好的服务器 不同角色分开 使用各自独立的服务器 使用分布式部署 调
  • 统计:Flutter,开发采用量

    本文作者 徐宜生 原文发布于 群英传 Flutter这个东西出来这么久了 到底市场占有率怎么样呢 为了让大家了解这一真实数据 也为了让大家了解当前Flutter在各大App中的使用情况 我今天下载了几百个App 占了手机将近80G空间 就为
  • 队列同步器AQS原理分析及具体实现

    Java中的并发编程很多都是以队列同步器AbstractQueuedSynchronizer为基础的 例如ReentrantLock CountDownLatch等 下面介绍其构成以及相应的实现 构成 private volatile in
  • 【汽车电子】浅谈LIN总线

    目录 1 为何使用LIN总线 2 什么是LIN总线 3 LIN总线的主从关系 4 LIN的特点 5 LIN报文帧结构 6 LIN总线波形 7 帧类型 8 进度表 9 状态机的实现 10 总结 11 声明 1 为何使用LIN总线 在这里你可能
  • Vue常用的修饰符有哪些?分别有什么应用场景?

    一 修饰符是什么 在程序世界里 修饰符是用于限定类型以及类型成员的声明的一种符号 在Vue中 修饰符处理了许多DOM事件的细节 让我们不再需要花大量的时间去处理这些烦恼的事情 而能有更多的精力专注于程序的逻辑处理 vue中修饰符分为以下五种
  • 一步一步详解LSTM网络【从RNN到LSTM到GRU等,直至attention】

    一步一步详解LSTM网络 从RNN到LSTM到GRU等 直至attention 0 前言 1 Recurrent Neural Networks循环神经网络 2 The Problem of Long Term Dependencies长期