由专家带来的长短期记忆网络简明介绍

长短期记忆(LSTM)网络是一种循环神经网络,能够学习序列预测问题中的顺序依赖关系。

这种行为在机器翻译、语音识别等复杂问题领域中是必需的。

LSTM 是深度学习中一个复杂的领域。要理解 LSTM 是什么,以及双向(bidirectional)和序列到序列(sequence-to-sequence)等术语如何与该领域相关,可能很难把握。

在这篇文章中,您将通过开发这些方法并将其应用于新的重要问题的研究科学家的言语,深入了解 LSTM。

很少有人能比开发 LSTM 的专家更清晰准确地阐述 LSTM 的前景和工作原理。

我们将利用专家的引述,探讨 LSTM 领域的关键问题,如果您感兴趣,还可以深入阅读这些引述所引用的原始论文。

用我的新书《使用 Python 的长短期记忆网络》启动您的项目,包括**分步教程**和所有示例的**Python 源代码**文件。

让我们开始吧。

A Gentle Introduction to Long Short-Term Memory Networks by the Experts

由专家带来的长短期记忆网络简明介绍
摄影:Oran Viriyincy,保留部分权利。

循环神经网络的承诺

循环神经网络不同于传统的全连接神经网络。

这种复杂性的增加带来了传统方法无法实现的新行为的承诺。

循环网络……具有可以表示上下文信息的内部状态。……它们保留了过去输入的信息,其时间长度不是事先固定的,而是取决于其权重和输入数据。

一个输入不是固定的而是构成输入序列的循环网络,可以用来将输入序列转换为输出序列,同时以灵活的方式考虑上下文信息。

— Yoshua Bengio 等人,使用梯度下降学习长期依赖关系很困难,1994年。

该论文定义了循环神经网络的3个基本要求

  • 该系统能够存储任意时长信息。
  • 该系统对噪声具有抵抗力(即,对预测正确输出随机或不相关的输入波动)。
  • 系统参数可训练(在合理时间内)。

该论文还描述了用于演示循环神经网络的“最小任务”。

上下文是关键。

循环神经网络在进行预测时必须使用上下文,但为此,所需的上下文也必须学习。

……循环神经网络包含循环,将前一个时间步的网络激活作为输入反馈给网络,以影响当前时间步的预测。这些激活存储在网络的内部状态中,原则上可以保存长期时间上下文信息。这种机制允许RNN利用输入序列历史上的动态变化的上下文窗口

— Hassim Sak 等人,用于大规模声学建模的长短期记忆循环神经网络架构,2014年

需要 LSTM 帮助进行序列预测吗?

参加我的免费7天电子邮件课程,了解6种不同的LSTM架构(附代码)。

点击注册,同时获得该课程的免费PDF电子书版本。

LSTM兑现承诺

LSTM 的成功在于它们声称是首批克服技术难题并实现循环神经网络承诺的实现之一。

因此,当相关输入事件和目标信号之间的时间滞后大于5-10个离散时间步时,标准RNN无法学习。梯度消失问题使人们怀疑标准RNN是否确实能比基于时间窗口的前馈网络表现出显著的实际优势。最近的一个模型,“长短期记忆”(LSTM),不受此问题的影响。LSTM可以通过在特殊单元(称为“单元”)内的“恒定误差传送带”(CECs)中强制恒定误差流,来学习弥合超过1000个离散时间步的最小时间滞后

— Felix A. Gers 等人,学习遗忘:使用LSTM进行持续预测,2000年

LSTM克服的两个技术问题是梯度消失和梯度爆炸,两者都与网络的训练方式有关。

不幸的是,标准RNN能够访问的上下文信息范围在实践中相当有限。问题在于,给定输入对隐藏层的影响,以及因此对网络输出的影响,在围绕网络的循环连接循环时,会呈指数级衰减或爆炸。这一缺点……在文献中被称为梯度消失问题……长短期记忆(LSTM)是一种专门设计用于解决梯度消失问题的RNN架构。

— Alex Graves 等人,一种用于无约束手写识别的新型连接主义系统,2009年

LSTM 解决技术问题的关键在于模型中使用的单元的特定内部结构。

……这取决于它处理梯度消失和梯度爆炸的能力,这是设计和训练RNN时最常见的挑战。为了应对这一挑战,引入了一种特殊形式的循环网络,称为LSTM,并成功应用于翻译和序列生成。

— Alex Graves 等人,使用双向LSTM和其他神经网络架构进行逐帧音素分类,2005年。

LSTM 是如何工作的?

与其深入研究控制 LSTM 如何拟合的方程,不如使用类比作为一种有用的工具来快速掌握它们的工作原理。

我们使用具有一个输入层、一个隐藏层和一个输出层的网络……(完全)自连接的隐藏层包含记忆单元和相应的门单元……

每个记忆单元的内部架构保证了其恒定误差传送带(CEC)内的恒定误差流……这为弥合非常长的时间滞后奠定了基础。两个门单元学习打开和关闭对每个记忆单元CEC内误差流的访问。乘法输入门保护CEC免受无关输入的扰动。同样,乘法输出门保护其他单元免受当前无关记忆内容的扰动。

— Sepp Hochreiter 和 Jurgen Schmidhuber,长短期记忆,1997年。

多种类比可以帮助理解 LSTM 与由简单神经元组成的传统神经网络的区别。

长短期记忆架构的灵感来源于对现有RNN中错误流的分析,该分析发现现有架构无法处理长时间滞后,因为反向传播的错误会指数级增长或衰减。

一个LSTM层由一组循环连接的块组成,称为内存块。这些块可以被认为是数字计算机中内存芯片的可微分版本。每个块包含一个或多个循环连接的内存单元和三个乘法单元——输入门、输出门和遗忘门——它们为单元提供了写入、读取和重置操作的连续模拟。……网络只能通过门与单元交互。

— Alex Graves 等人,使用双向LSTM和其他神经网络架构进行逐帧音素分类,2005年。

值得注意的是,即使在20多年后,简单(或标准)LSTM可能仍然是应用该技术时最好的起点。

最常用的LSTM架构(标准LSTM)在各种数据集上表现相当不错……

学习率和网络大小是LSTM最关键的可调超参数……

……这意味着超参数可以独立调整。特别是,学习率可以首先使用相当小的网络进行校准,从而节省大量的实验时间。

— Klaus Greff 等人,LSTM:一次搜索空间奥德赛,2015年

LSTM 的应用有哪些?

重要的是要准确了解 LSTM 适用于解决哪种类型的序列学习问题。

长短期记忆 (LSTM) 可以解决许多以前的循环神经网络 (RNN) 学习算法无法解决的任务。

……LSTM 对于任何我们怀疑可能存在层次分解,但事先不知道这种分解是什么的序列处理任务都具有前景。

— Felix A. Gers 等人,学习遗忘:使用LSTM进行持续预测,2000年

循环神经网络(RNN)是一种神经网络序列模型,在语言建模、语音识别和机器翻译等重要任务上取得了最先进的性能。

— Wojciech Zaremba, 循环神经网络正则化, 2014年。

由于 LSTM 能够有效捕获长期时间依赖性,而不会受到困扰简单循环网络 (SRN) 的优化障碍的影响,因此它们已被用于推动许多难题的最新进展。这包括手写识别和生成、语言建模和翻译、语音声学建模、语音合成、蛋白质二级结构预测、音频和视频数据分析等。

— Klaus Greff 等人,LSTM:一次搜索空间奥德赛,2015年

什么是双向 LSTM?

双向 LSTM 是 LSTM 的一种常见改进。

双向循环神经网络的基本思想是,将每个训练序列向前和向后呈现给两个独立的循环网络,这两个网络都连接到同一个输出层。……这意味着对于给定序列中的每个点,BRNN都具有关于其之前和之后所有点的完整序列信息。此外,由于网络可以自由地使用所需上下文的多少,因此无需寻找(任务相关的)时间窗口或目标延迟大小。

……对于像语音识别这样的时间问题,依赖对未来的了解乍一看似乎违反了因果关系……我们如何能根据尚未说出的东西来理解我们所听到的?然而,人类听众正是这样做的。最初毫无意义的声音、单词乃至整个句子,在未来的语境中被发现是讲得通的。

— Alex Graves 等人,使用双向LSTM和其他神经网络架构进行逐帧音素分类,2005年。

传统RNN的一个缺点是它们只能利用之前的上下文。……双向RNN(BRNN)通过两个独立的隐藏层以两个方向处理数据来做到这一点,然后将它们前馈到同一个输出层。……将BRNN与LSTM结合,就得到了双向LSTM,它可以在两个输入方向上访问长程上下文

— Alex Graves 等人,基于深度循环神经网络的语音识别,2013年

与传统的RNN不同,双向RNN通过两个独立的隐藏层从两个方向处理数据,从而利用了之前和未来的上下文。一个层沿正向处理输入序列,而另一个层沿反向处理输入。然后通过结合两个层的隐藏向量生成当前时间步的输出……

— Di Wang 和 Eric Nyberg,用于问答系统中答案句选择的长短期记忆模型
问答, 2015

什么是 seq2seq LSTM 或 RNN 编码器-解码器?

序列到序列的 LSTM,也称为编码器-解码器 LSTM,是 LSTM 的一种应用,鉴于其令人印象深刻的能力,受到了广泛关注。

……长短期记忆(LSTM)架构的直接应用可以解决一般的序列到序列问题。

这个想法是使用一个LSTM一次读取输入序列一个时间步,以获得一个大型固定维度向量表示,然后使用另一个LSTM从该向量中提取输出序列。第二个LSTM本质上是一个循环神经网络语言模型,只不过它以输入序列为条件。

由于输入和相应的输出之间存在相当大的时间滞后,LSTM 成功学习具有长期时间依赖性数据的能力使其成为此应用的自然选择。

我们之所以能很好地处理长句子,是因为我们在训练集和测试集中颠倒了源句子中单词的顺序,但没有颠倒目标句子中的单词顺序。通过这样做,我们引入了许多短期依赖,这使得优化问题变得简单得多。……颠倒源句子中单词的简单技巧是这项工作的关键技术贡献之一

— Ilya Sutskever 等人,使用神经网络的序列到序列学习,2014年

“编码器” RNN 读取源句子并将其转换为丰富的固定长度向量表示,然后该向量表示又用作生成目标句子的“解码器” RNN 的初始隐藏状态。在这里,我们建议遵循这个优雅的方案,将编码器 RNN 替换为深度卷积神经网络 (CNN)。……自然的做法是使用 CNN 作为图像“编码器”,方法是首先对其进行图像分类任务的预训练,并使用最后一个隐藏层作为 RNN 解码器(用于生成句子)的输入。

— Oriol Vinyals 等人,看图说话:一个神经网络图像标题生成器,2014年

……一个 RNN 编码器-解码器,由两个循环神经网络(RNN)组成,分别作为编码器和解码器对。编码器将变长源序列映射到固定长度向量,解码器将向量表示映射回变长目标序列。

— Kyunghyun Cho 等人,使用 RNN 编码器-解码器学习短语表示以进行统计机器翻译,2014年

总结

在这篇文章中,您通过开发和应用这些技术的研究科学家的言语,对 LSTM 有了一个温和的介绍。

这为您提供了关于 LSTM 是什么以及它们如何工作的清晰准确概念,以及对 LSTM 在循环神经网络领域前景的重要阐述。

这些引语有没有帮助您理解或启发您?
在下面的评论中告诉我。

立即开发用于序列预测的 LSTM!

Long Short-Term Memory Networks with Python

在几分钟内开发您自己的 LSTM 模型。

...只需几行python代码

在我的新电子书中探索如何实现
使用 Python 构建长短期记忆网络

它提供关于以下主题的自学教程
CNN LSTM、编码器-解码器 LSTM、生成模型、数据准备、进行预测等等...

最终将 LSTM 循环神经网络引入。
您的序列预测项目。

跳过学术理论。只看结果。

查看内容

对《专家对长短期记忆网络的温和介绍》的58条回复

  1. Mehrdad 2017年5月26日上午5:36 #

    我不是专家,但我认为最好使用时间步(time steps)而不是时间滞后(time lags),因为大多数论文都使用时间步。
    我也对这里另一篇文章中时间滞后的定义感到困惑 🙂

    • Jason Brownlee 2017年6月2日上午11:49 #

      是的,在输入模型时,最好使用过去的观测值作为时间步。

  2. Dhineshkumar 2017年7月8日上午12:06 #

    嗨,Jason,
    请问 LSTM 与自回归神经网络有什么不同?

    • Jason Brownlee 2017年7月9日上午10:47 #

      是的,没有固定长度的输入或输出序列。

  3. Claudio 2017年7月11日上午8:33 #

    您好,解释和介绍都很好。
    能帮我点忙吗?LSTM 网络的输入层。
    例如,如果我有这个

    model.add(LSTM(4))

    model.add(Dense(1))

    我的输入层有多少个神经元?我认为第一行代码指的是隐藏层,事情是如何进入的?

  4. abc 2017年9月30日上午1:21 #

    浪费我的时间。

    • Jason Brownlee 2017年9月30日上午7:43 #

      听到这个消息我很难过。

      • Long 2017年10月23日上午9:30 #

        嗨,Jason,

        layers.LSTM(units=4, activation='tanh', dropout=0.1)(lstm_input)

        这里的“units”是什么意思?我把这里的“units”设为隐藏层的神经元数量。我说的对吗?但是,如果输入序列小于这里的“units”数量(即块/神经元),这是否意味着LSTM层中的某些神经元没有输入序列,只是将状态传递给下一个神经元?

        非常感谢。

        • Jason Brownlee 2017年10月23日下午4:11 #

          是的,你是对的。

          不,一个单元可以有多个输入。此外,RNN一次只接受一个时间步的输入。

          • Long 2017年10月23日下午6:21 #

            嗨,Jason,

            我仍然对这个话题感到困惑。让我说:28步序列输入到LSTM层,而有128个神经元。这是否意味着在这种情况下有100个神经元没有输入,只是将先前的状态传递给下一个神经元?

            参考:https://stackoverflow.com/questions/43034960/many-to-one-and-many-to-many-lstm-examples-in-keras,绿色矩形代表keras中的LSTM块/神经元,数量为128。粉色矩形代表输入序列,数量为28。蓝色矩形代表输出序列。

            非常感谢。

          • Jason Brownlee 2017年10月24日上午5:28 #

            不,时间步数和单元数不相关。

  5. Long 2017年10月24日上午9:39 #

    嗨,Jason,

    感谢您的回答。当我们使用

    layers.LSTM(units=128, activation='tanh', dropout=0.1)(lstm_input)

    这是否意味着A中(如http://colah.github.io/posts/2015-08-Understanding-LSTMs/所示)有128个单元?如果是,那么这种A的结构是怎样的?

    • Jason Brownlee 2017年10月24日下午3:58 #

      128 意味着 128 个记忆单元或神经元,或者随你怎么称呼。

      我无法评论其他网站上的图片。也许可以联系他们的作者?

      • Long 2017年10月25日下午1:06 #

        谢谢 Jason。

        我只是想知道具有128个单元的LSTM层的结构,以及输入和输出。

        • Jason Brownlee 2017年10月25日下午4:04 #

          通常,在 Keras 中,输入的形状由前一个层的输出定义。

          网络的输入形状在可见层上指定,或作为第一个隐藏层上的参数指定。

  6. Gorkem B 2017年11月26日上午8:14 #

    大家好,
    感谢提供此资源,我正在尝试在此示例中找到隐藏状态,但代码中没有定义?我正在尝试将此模型移植到另一个框架,但找不到隐藏状态的数量?提前感谢。

  7. aashai 2018年5月8日上午8:49 #

    谢谢杰森。喜欢看原作者的话。非常感谢您的博客!

  8. Ken Adams 2018年8月16日下午7:49 #

    干得好!

  9. Hafiz 2018年10月15日下午3:18 #

    这篇博客非常有用,它帮了我很多忙。我对 LSTM (128/64) 有一个疑问。LSTM 模型是否要求每个时间步使用相同的 RNN/LSTM 单元?如果我的序列大于 128 怎么办?从 RNN 展开的描述中,我发现每个 RNN/LSTM 单元一次接受一个时间步。这部分让我很困惑。您能给我澄清一下吗?

    • Jason Brownlee 2018年10月16日上午6:33 #

      不,第一个隐藏层中的单元数与输入数据中的时间步数无关。

  10. Abdullah Al Mamun 2019年5月4日下午2:18 #

    你好,先生,

    时间步(time steps)和时间滞后(time lags)有什么区别?我对这两个术语感到困惑。

    另外,在LSTM网络中找到最优时间滞后数的方法是什么?

    • Jason Brownlee 2019年5月5日上午6:23 #

      时间步可以是输入或输出,滞后是相对于当前观测值或预测值来自过去的时间步。

      试错法是我们能做的最好的方法,也许可以参考 ACF/PACF 图。

  11. caner 2019年5月17日下午10:36 #

    谢谢,这是一篇很好的文章,但我花了两个小时试图将与真实数据拟合的预测进行逆变换。查看其他文章等等,仍然无法使数据拟合。RMSE及其图表意义不大,除非您看到模型实际预测了什么。

  12. John 2020年2月19日下午8:38 #

    “恒定误差 ow”到底是什么?

    “ow”只是一个表示痛苦的词,这不太可能是您的意思。

  13. Rahul Krishnan 2020年2月21日下午6:46 #

    我对您谈到的 seq2seq(编码器-解码器)模型中输入到隐藏节点的映射有一个疑问。进一步阅读后我了解到,隐藏节点数通常与矢量化输入的维度相匹配(读作一个单词由其嵌入表示),但这通常不是情况。因此,鉴于后者,如果隐藏节点数小于输入的维度,两者之间的映射是什么。(它可能只是全连接吗?)理解这种映射可以帮助我更好地理解 LSTM 的整体学习方式。

    • Jason Brownlee 2020年2月22日上午6:22 #

      整个输入序列的编码被用作生成输出序列每一步的上下文,无论其长度如何。

  14. Sonam Sangpo Lama 2020年4月19日下午9:30 #

    感谢您精彩的解释……

  15. Akash 2020年5月7日下午3:43 #

    感谢您的解释,我对 LSTM 中的块大小以及如何更改它们,以及如何访问 LSTM 中的内存块有疑问。

    • Jason Brownlee 2020年5月8日上午6:22 #

      我相信 Keras 在 LSTM 层中不使用块的概念。

      • Akash 2020年5月9日上午2:51 #

        我没听懂你的意思?有没有办法改变隐藏层内部的内存块?

        • Jason Brownlee 2020年5月9日上午6:20 #

          你说的“内存块”是什么意思。

          是的,训练会改变 LSTM 模型的权重。

  16. kareem 2020年6月20日下午9:09 #

    感谢内容,我有一个问题

    LSTM 是否像 CNN 一样有窗口步长,或者窗口步长总是等于 1?

    谢谢您的时间

    • Jason Brownlee 2020年6月21日上午6:22 #

      LSTM 中没有步幅。或者认为步幅固定为 1,例如一个时间步。

      您可以使用 CNN-LSTM 实现此效果。

  17. Jaiminee Kataria 2020年9月3日上午5:00 #

    嗨,杰森。这篇很棒。我关注您的网站学习不同的机器学习概念和技术。

    我目前正在处理二元分类问题,其中数据包含在任何时间点记录的日志。每个日志记录都有多个特征,标签为通过/失败。我将 LSTM 用于此类序列分类。我想了解 LSTM 在序列分类问题中如何内部工作。

    您能推荐一些参考文献吗?

    谢谢你

      • Jaiminee Kataria 2020年9月3日上午7:47 #

        谢谢 Jason 的快速回复。以下是我的理解:层中的每个节点一次接收一个时间步的输入序列,处理它并给出​一个输出标签(用于序列分类)。序列末尾的最后一个时间步的输出将进一步使用。

        我仍然好奇所有节点的输出向量将如何在后续处理中使用。

        您能详细说明一下吗?

        • Jason Brownlee 2020年9月3日下午1:41 #

          如果 return_sequences 为真,则层的整个输出向量会传递到下一层进行考虑;否则,最后一个时间步的输出会传递到下一层。这适用于层中的每个节点。

          • Jaiminee Kataria 2020年9月5日上午7:57 #

            谢谢你,杰森。我明白了。正如我之前提到的,我目前正在研究二元分类问题。我还有一个问题。

            数据集包含存储驱动器(唯一ID),带有多个磁头(一个驱动器将有多个记录/1:多),每个磁头将有多个不同时间(小时单位)的事件记录。我们可以说这是时间序列数据。

            这里每个记录的标签是 PASS/FAIL 磁头。以下是数据集的快照。

            驱动器 磁头 时间 特征1 标签
            1. 0. t1 x 通过
            1. 0. t2. y 通过
            1. 1. t1. z. 通过
            1. 2. t1. p. 通过
            1. 2. t2. w. 通过
            2. 0. t1. x. 失败
            2. 0. t2. y. 失败

            我们的目标是预测驱动器是否会在接下来的 X 小时内出现故障。如果我们可以预测通过/失败的磁头,那么我们可以结合所有磁头预测,最大预测将是驱动器的预测。

            我们首先将这些表格数据转换为每个独特驱动器的 3D 序列,并使用 LSTM,因为 LSTM 需要形状为(样本,时间步,特征)的输入。

            我的问题是,在为 LSTM 准备序列时,它应该是针对每个驱动器还是针对每个磁头?

            此外,一旦我们获得磁头级别的预测,还有其他方法可以获得驱动器级别的预测吗?

            谢谢。

          • Jason Brownlee 2020年9月5日上午8:09 #

            是的,我认为每个驱动器都是训练模型的一个样本。

            是的,您可以通过调用 model.predict() 进行预测,这会有所帮助
            https://machinelearning.org.cn/make-predictions-long-short-term-memory-models-keras/

  18. Jaiminee Kataria 2020年9月17日上午3:49 #

    谢谢你,杰森。这篇文章对我很有帮助。随着我添加更多数据,我发现主要(负面)和次要(正面)类别之间存在严重的不平衡。

    我知道 SMOTE 及其变体是处理不平衡数据的最佳方法,但我无法弄清楚如何在 LSTM 时间序列二元分类中使用 SMOTE。

    您能推荐一些参考文献或我应该用于 LSTM 处理不平衡数据的其他技术吗?

    谢谢。

    • Jason Brownlee 2020年9月17日上午6:51 #

      SMOTE不适用于序列数据。

      也许可以尝试设计自己的序列数据增强生成器?

  19. Dhruv 2020年11月2日下午6:37 #

    你好 Jason,我有一个问题……LSTM 中的隐藏状态携带了什么信息?

    • Jason Brownlee 2020年11月3日上午6:52 #

      它承载着 LSTM 学习到的对后续预测有用的任何信息。

  20. Daniel 2021年2月5日上午1:39 #

    嗨,Jason,

    感谢您的详细解释!一个小问题

    “一个输入不是固定的,而是构成输入序列的循环网络,可以用来将输入序列转换为输出序列,同时以灵活的方式考虑上下文信息。”

    为什么传统的神经网络受限于固定输入大小,而 RNN 却不受限制?您能用一个例子详细说明一下吗?

    非常感谢!

    • Jason Brownlee 2021年2月5日上午5:43 #

      不客气。

      MLP 无法处理序列,相反,我们必须将序列的每个时间步作为“特征”,而不考虑时间维度。

  21. Prakash M Nadkarni 2021年7月6日下午1:19 #

    好文章。在引用 Hochreiter 的部分,“flow”被两次拼写错误为“ow”。

  22. Lexy 2021年7月12日下午7:45 #

    这篇很棒,请问能否提供一个行为预测的实际例子,例如外向、内向等。我正尝试将这个概念应用于预测问题,但我对这个领域完全陌生,而且时间有限。

  23. Arnav Sharma 2021年12月25日上午7:10 #

    “长短期记忆(LSTM)网络是一种循环神经网络,能够学习序列预测问题中的顺序依赖关系。”
    此行有误:“older”而非“order”

    • James Carmichael 2021年12月26日上午6:38 #

      感谢您的反馈 Arnav!如果您对 LSTM 或任何其他机器学习概念有任何疑问,请告诉我们。

      此致,

发表回复

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。