另一种类型的神经网络正在解决涉及输入序列的困难机器学习问题:循环神经网络。
循环神经网络具有循环连接,随着时间的推移为网络增加反馈和记忆。这种记忆允许这种类型的网络学习并泛化输入序列而非单个模式。
一种强大的循环神经网络,称为长短期记忆网络,当堆叠成深度配置时被证明特别有效,在从语言翻译到图像和视频自动字幕等各种问题上取得了最先进的成果。
在这篇文章中,您将获得深度学习中循环神经网络的速成课程,只需足够理解即可开始使用 Python 和 Keras 中的 LSTM 网络。
阅读本文后,你将了解:
- 多层感知器的局限性,这些局限性通过循环神经网络得到解决。
- 使循环神经网络有用必须解决的问题。
- 应用于深度学习中的长短期记忆网络的细节。
通过我的新书《Python 中的长短期记忆网络》启动您的项目,包括分步教程和所有示例的 Python 源代码文件。
让我们开始吧。

深度学习中循环神经网络速成班。
图片由 Martin Fisch 拍摄,保留部分权利。
神经网络对序列的支持。
有些问题类型最好通过涉及序列作为输入或输出来构建。
例如,考虑一个单变量时间序列问题,例如股票随时间的价格。这个数据集可以通过定义一个窗口大小(例如5)并训练网络从固定大小的输入窗口中学习进行短期预测,从而被构造成一个经典的,前馈多层感知器网络的预测问题。
这将起作用,但非常有限。输入窗口为问题增加了记忆,但仅限于固定数量的点,并且必须在对问题有足够了解的情况下选择。一个朴素的窗口无法捕捉到可能与预测相关的几分钟、几小时和几天内更广泛的趋势。从一个预测到下一个预测,网络只知道它所提供的特定输入。
单变量时间序列预测很重要,但还有更多涉及序列的有趣问题。
考虑以下需要将输入映射到输出的序列问题分类(摘自 Andrej Karpathy)。
- 一对多:用于图像字幕的序列输出。
- 多对一:用于情感分类的序列输入。
- 多对多:用于机器翻译的序列输入和输出。
- 同步多对多:用于视频分类的同步序列输入和输出。
您还可以看到,输入到输出的一对一示例将是用于图像分类等预测任务的经典前馈神经网络的示例。
神经网络对序列的支持是一类重要的问题,深度学习最近在这方面取得了令人印象深刻的成果。最先进的成果使用的是一种专门为序列问题设计的网络,称为循环神经网络。
需要 LSTM 帮助进行序列预测吗?
参加我的免费7天电子邮件课程,了解6种不同的LSTM架构(附代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
循环神经网络
循环神经网络或 RNN 是一种专门为序列问题设计的特殊类型神经网络。
给定一个标准的前馈多层感知器网络,循环神经网络可以被认为是架构中添加了循环。例如,在给定层中,每个神经元除了向前传递到下一层外,还可以横向(侧向)传递信号。网络的输出可以作为输入反馈到网络中,并带有下一个输入向量。依此类推。
循环连接为网络增加了状态或记忆,并允许它从输入序列中学习更广泛的抽象。
循环神经网络领域已经成熟,拥有流行的方法。为了使这些技术在实际问题上有效,需要解决两个主要问题才能使网络有用。
- 如何用反向传播训练网络。
- 如何在训练过程中阻止梯度消失或爆炸。
1. 如何训练循环神经网络。
训练前馈神经网络的主要技术是反向传播误差并更新网络权重。
由于循环或循环连接,反向传播在循环神经网络中会失效。
这通过对反向传播技术进行修改来解决,称为时间反向传播(BPTT)。
不是直接对循环网络执行反向传播,而是将网络结构展开,其中创建具有循环连接的神经元的副本。例如,一个自身具有连接的单个神经元(A->A)可以表示为两个具有相同权重值的神经元(A->B)。
这使得循环神经网络的循环图可以转化为像经典前馈神经网络一样的非循环图,并且可以应用反向传播。
2. 如何在训练过程中保持梯度稳定。
当在非常深的神经网络和展开的循环神经网络中使用反向传播时,用于更新权重的梯度可能会变得不稳定。
它们可能会变成非常大的数字,称为梯度爆炸,或者非常小的数字,称为梯度消失问题。这些大数字反过来又被用来更新网络中的权重,导致训练不稳定和网络不可靠。
这个问题在深度多层感知器网络中通过使用整流器传递函数,甚至更奇特但现在不太流行的无监督预训练层的方法得到了缓解。
在循环神经网络架构中,这个问题通过使用一种称为长短期记忆网络的新型架构得到缓解,该架构允许训练深度循环网络。
长短期记忆网络
长短期记忆(LSTM)网络是一种循环神经网络,使用时间反向传播进行训练,并克服了梯度消失问题。
因此,它可用于创建大型(堆叠)循环网络,从而可用于解决机器学习中困难的序列问题并取得最先进的成果。
LSTM网络没有神经元,而是将记忆块连接成层。
一个块具有使其比经典神经元更智能的组件,以及用于最近序列的内存。一个块包含管理块状态和输出的门。一个单元在输入序列上操作,并且单元内的每个门都使用 Sigmoid 激活函数来控制它是否被触发,从而使通过单元流动的状态变化和信息添加成为条件。
内存单元中有三种类型的门。
- 遗忘门:有条件地决定从单元中丢弃哪些信息。
- 输入门:有条件地决定从输入中哪些值用于更新内存状态。
- 输出门:有条件地决定根据输入和单元的内存输出什么。
每个单元都像一个迷你状态机,其中单元的门具有在训练过程中学习到的权重。
你可以看到如何从一层 LSTM 中实现复杂的学习和记忆,而且不难想象如何通过多层这样的结构来分层实现更高级别的抽象。
资源
你在这篇文章中涵盖了很多内容。下面是一些你可以用来更深入地了解深度学习中循环神经网络主题的资源。
了解更多关于循环神经网络和 LSTM 的资源。
- 维基百科上的循环神经网络。
- 维基百科上的长短期记忆。
- Andrej Karpathy 撰写的《循环神经网络的不可思议的有效性》
- 理解 LSTM 网络。
- 深入研究循环神经网络。
- 循环网络和 LSTM 初学者指南。
实现 LSTM 的流行教程。
LSTM 的主要来源。
- 长短期记忆 [pdf],Hochreiter 和 Schmidhuber 于 1997 年发表的论文。
- 学习遗忘:使用 LSTM 的持续预测,Schmidhuber 和 Cummins 于 2000 年发表,增加了遗忘门。
- 循环神经网络训练的难度 [pdf],2013年。
值得关注的 LSTM 杰出研究人员。
- 亚历克斯·格雷夫斯(Alex Graves)。
- 于尔根·施密德胡伯(Jürgen Schmidhuber)。
- 伊利亚·苏茨克维尔(Ilya Sutskever)。
- 托马斯·米科洛夫(Tomas Mikolov)。
总结
在这篇文章中,您了解了序列问题以及可用于解决这些问题的循环神经网络。
具体来说,你学到了:
- 经典前馈神经网络的局限性以及循环神经网络如何克服这些问题。
- 训练循环神经网络的实际问题以及如何克服这些问题。
- 用于创建深度循环神经网络的长短期记忆网络。
您对深度循环神经网络、LSTM 或这篇文章有什么疑问吗?请在评论中提出您的问题,我将尽力回答。
万分感谢 Jason!机器学习大师正是我需要的!:)
不客气,马塞尔。
你好,Jason
我是深度学习新手,这篇教程真的帮助了我。现在我想建立一个模型,它可以根据过去的坐标(x,y)预测未来的位置坐标(x,y)
即 xi, yi –> xi+1, yi+1
我的 CSV 中还有额外的特征,如唯一占用者 ID、人员身高。
你能帮我一下吗——我的输入和输出应该是什么样子?我该如何重塑它们?
我希望我的目标是 2D (x,y)。
我相信这会帮助你确定形状。
https://machinelearning.org.cn/faq/single-faq/what-is-the-difference-between-samples-timesteps-and-features-for-lstm-input
我正在使用 Keras 实现聊天机器人。在其中,我从互联网上发现顺序模型中添加了四个 LSTM 层。您能指导我聊天机器人实现需要多少个 LSTM 节点吗?在算法中拥有更多 LSTM 节点是否有利?我如何测试其准确性?
我们无法通过分析得知哪个模型最适合给定问题。您必须通过分析来发现它。
我关于评估深度学习算法的最佳建议在这里。
https://machinelearning.org.cn/evaluate-skill-deep-learning-models/
这篇文章并不是真正的速成班。它只是对 RNN 和 LSTM 的介绍。此外,引言部分中的以下陈述也具有误导性。只有少数对一些教程的引用,仅此而已。
“在这篇文章中,您将获得深度学习中循环神经网络的速成课程,只需足够理解即可开始使用 Python 和 Keras 中的 LSTM 网络。”
也许从这里开始
https://machinelearning.org.cn/start-here/#lstm
很棒的帖子。但我有一个问题。
你写道,“网络的结构被展开”。这是如何完成的?
在 Keras 中,您可以为 LSTM 层指定“unroll”参数。
很棒的工作,Jason。我是你所有博客文章的忠实读者!
谢谢。
关于BPTT算法的问题:如果我们将A->A展开为具有相同权重的A->B,我们如何避免无限递归得到A->B->C->D->E…?
我们是否限制回溯的次数,例如限制为 5 次?如果这样做,那我们不就只是增加了一个类似于窗口大小的超参数吗?
如果不是那样,我们被迫将其展开到序列中的第一个项,比如说月份数据,或者从句子的开头。在这种情况下,我们将反馈的初始值设置为0吗?另外,当我们有极长的序列时,我们该怎么办?我们需要一种方法将序列本地化到最近的邻居吗?
我一直试图理解RNN,但我总是卡在一些实现细节上(试图在没有框架的情况下构建一个来真正理解其工作原理)……
是的,回溯是有限的,通常是输入时间步数。
我在这里更详细地介绍了它。
https://machinelearning.org.cn/gentle-introduction-backpropagation-time/
ResNet(残差网络)与 RNNs 或 LSTM 不同吗?还是 ResNet 是 RNN 的另一个变体?
不同。
ResNet 是一种设计深度 CNN 的方法。它是一种模型架构,而不是一种神经网络类型。
问题:建模循环神经网络相比于使用其他形式的预测模型(例如梯度提升机)结合时间滞后变量(y = X_t + X_t-1 + X_t-2 + . . .)有什么优势?
它有助于解决输出是近期输入的非线性函数的问题。不仅仅是自回归,例如,当输出可能取决于一个或多个先前的输入时,我们不知道在哪些时间。就像句子中的单词一样。
我本希望能了解神经网络的诀窍,但再次发现晦涩难懂的术语。您能解释一下您的意思吗?
– ‘横向传递信号’,
– ‘循环连接增加状态或记忆’ – 什么的连接?‘循环连接’又是什么?它们与神经元之间的普通连接有什么不同?
– ‘网络的结构被展开’ – 您也可以展开网络吗?那么挤压呢?折叠呢?
– ‘梯度’ – 您是指权重吗?
– ‘整流器传递函数’ – 公式会有帮助,
– ‘块’ – 它们不就是神经元组吗?
– ‘一个单元对输入进行操作’ – 天啊,一个什么的单元?
等等...
真的,您应该考虑您为谁写作。如果您是为您的同行写作,他们已经知道您在说什么,那就没有意义。如果您是为非专业人士、新手写作,您真的应该在您的语言上下功夫。
感谢您的反馈。也许我应该更好地说明受众,显然这篇文章假定读者具有简单的神经网络背景,我没有明确说明这一点。
我通常不为绝对初学者写作,而是为实践者写作。
我正在进行交通流量预测在线机器学习算法项目,我想为我的项目选择一个合适的 DNN 模型。我应该使用哪一个才能给我准确的输出?
注意:我的数据集是 CSV 格式的,正如您所写,MLP 用于这些问题。但是否有其他更准确的模型可以使用?
谢谢:))
此外,我的选择必须取决于复杂性和训练时间。
也许可以从 MLP 开始,然后尝试一系列模型配置以发现最佳方案。例如,不同数量的层/节点/激活函数等。
谢谢……非常好。
谢谢。
你好 Jason,我们可以说简单的 RNN 是传统的浅层神经网络,而 LSTM RNN 是深度学习网络吗?
不,增加更多层使其变深。
顺便说一下,我认为“latterly”应该是“laterally”,即“横向”。
除此之外,内容很棒!
谢谢
感谢您的反馈和支持!