循环神经网络,或称RNN,是一种人工神经网络,它为网络增加额外的权重,以在网络图中创建循环,从而维持内部状态。
增加状态到神经网络的承诺是它们能够明确地学习和利用序列预测问题中的上下文,例如那些具有顺序或时间分量的序列。
在本篇博文中,您将了解用于深度学习的循环神经网络。
阅读本文后,你将了解:
- 像LSTM、GRU和NTM这样的顶级循环神经网络是如何工作的。
- 顶级RNN与更广泛的神经网络递归研究的关系。
- RNN的研究如何在一系列具有挑战性的问题上取得了最先进的性能。
启动您的项目,阅读我的新书《Python长短期记忆网络》,其中包括分步教程和所有示例的Python源代码文件。
请注意,我们不会涵盖所有可能的循环神经网络。相反,我们将重点关注用于深度学习的循环神经网络(LSTM、GRU和NTM)以及理解它们所需的背景知识。
让我们开始吧。

深度学习循环神经网络算法详解
照片由Santiago Medem拍摄,保留部分权利。
概述
我们将首先为循环神经网络领域设定背景。
接下来,我们将仔细研究用于深度学习的LSTM、GRU和NTM。
然后,我们将花一些时间讨论与在深度学习中使用RNN相关的进阶主题。
- 循环神经网络
- 全循环网络
- 递归神经网络
- 神经历史压缩器
- 长短期记忆网络
- 门控循环单元神经网络
- 神经图灵机
循环神经网络
让我们来设定背景。
普遍的看法是,循环性赋予了网络拓扑以记忆。
更佳的理解方式是,训练集包含当前训练样本的输入集合。这就是“传统的,例如传统的多层感知机”。
1 |
X(i) -> y(i) |
但训练样本会补充来自前一个样本的输入集。这就是“非传统的”,例如循环神经网络。
1 |
[X(i-1), X(i)] -> y(i) |
与所有前馈网络范式一样,问题是如何将输入层连接到输出层,包括反馈激活,然后训练结构使其收敛。
现在,让我们从非常简单的概念开始,游览不同类型的循环神经网络。
全循环网络
保留了多层感知机的分层拓扑,但每个元素都与架构中的其他所有元素都有加权连接,并有一个反馈连接到自身。
并非所有连接都经过训练,并且误差导数极端的非线性意味着传统的反向传播将不起作用,因此采用了随时间反向传播方法或随机梯度下降。
另请参见Bill Wilson的张量积网络(1991)。
递归神经网络
循环神经网络是递归网络的线性结构变体。
递归促进了分层特征空间的扩展,并且随着训练的进行,由此产生的网络架构模仿了这一点。
训练通过亚梯度方法的梯度下降来实现。
这在R. Socher等人的论文《使用递归神经网络解析自然场景和自然语言》(2011)中有详细描述。
神经历史压缩器
Schmidhuber在1991年首次报道了一种非常深的学习器,它通过对RNN的层次结构进行无监督预训练,能够对数百层神经网络进行信用分配。
每个RNN都经过无监督训练以预测下一个输入。然后,只有产生误差的输入才被前馈,将新信息传递给层次结构中的下一个RNN,后者以更慢、自组织的速率进行处理。
结果表明,信息没有丢失,只是被压缩了。RNN堆栈是数据的“深度生成模型”。数据可以从压缩形式中重建。
参见J. Schmidhuber等人,《深度学习在神经网络中的应用:概述》(2014)。
反向传播失败,因为随着误差在大型拓扑结构中反向传播,非线性导数的极端性计算会增加,使得信用分配困难,甚至不可能。
需要 LSTM 帮助进行序列预测吗?
参加我的免费7天电子邮件课程,了解6种不同的LSTM架构(附代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
长短期记忆网络
使用传统的随时间反向传播(BPTT)或实时循环学习(RTTL),向后流经时间的误差信号往往会爆炸或消失。
反向传播误差的时间演变指数级地取决于权重的大小。权重爆炸可能导致权重振荡,而消失则导致学习在很长的时间滞后后才能桥接,或者需要过量的时间,甚至根本不起作用。
- LSTM是一种新颖的循环网络架构,可通过适当的基于梯度的学习算法进行训练。
- LSTM旨在克服误差回溯问题。它能够学习桥接超过1000个时间步长的间隔。
- 在存在嘈杂、不可压缩的输入序列的情况下,这仍然是真实的,并且不会丢失短时间滞后能力。
误差回溯问题通过一种有效的、基于梯度的算法来克服,该算法用于一种强制通过特殊单元的内部状态的恒定(因此既不爆炸也不消失)误差流的架构。这些单元减少了“输入权重冲突”和“输出权重冲突”的影响。
输入权重冲突:如果输入非零,则相同的输入权重必须同时用于存储某些输入和忽略其他输入,然后通常会收到冲突的权重更新信号。
这些信号将尝试使权重参与存储输入并保护输入。这种冲突使得学习变得困难,并需要一种更具上下文感知能力的机制来通过输入权重控制“写入操作”。
输出权重冲突:只要单元的输出非零,该单元输出连接上的权重就会在序列处理期间吸引冲突的权重更新信号。
这些信号将尝试使输出权重参与访问存储在处理单元中的信息,并在不同时间保护后续单元不被馈送到前向单元的输出所扰动。
这些冲突并非仅限于长期滞后,同样会影响短期滞后。值得注意的是,随着滞后的增加,存储的信息必须免受扰动,尤其是在学习的高级阶段。
网络架构:不同类型的单元可以传达关于网络当前状态的有用信息。例如,输入门(输出门)可以使用来自其他记忆单元的输入来决定是否在其记忆单元中存储(访问)某些信息。
记忆单元包含门。门是特定于它们所介导的连接的。输入门用于解决输入权重冲突,而输出门用于消除输出权重冲突。
门:具体来说,为了缓解输入和输出权重冲突和扰动,引入了一个乘法输入门单元,以保护存储的记忆内容免受无关输入的扰动;引入了一个乘法输出门单元,以保护其他单元免受当前无关的存储记忆内容的影响。

带有8个输入单元、4个输出单元以及2个大小为2的记忆单元块的LSTM网络示例。in1表示输入门,out1表示输出门,cell1 = block1表示块1的第一个记忆单元。
摘自《长短期记忆》,1997年。
与多层感知机相比,LSTM的连接性更为复杂,因为其处理元素多样且包含反馈连接。
记忆单元块:共享相同输入门和相同输出门的记忆单元形成一个称为“记忆单元块”的结构。
记忆单元块促进信息存储;与传统神经网络一样,在单个单元中对分布式输入进行编码并不容易。大小为1的记忆单元块只是一个简单的记忆单元。
学习:使用一种考虑了由输入门和输出门引起的修改后的乘法动力学的实时循环学习(RTRL)变体,以确保通过记忆单元内部状态的反向传播的误差不会衰减,并且到达“记忆单元网络输入”的误差不会进一步回溯到过去。
猜测:这种随机方法可以优于许多滞后算法。已证实,许多先前工作中使用的长时滞任务可以通过简单的随机权重猜测比提出的算法更快地解决。
参见S. Hochreiter和J. Schmidhuber,《长短期记忆》,1997年。
LSTM循环神经网络最有趣的应用是语言处理方面的工作。有关全面的描述,请参见Gers的工作。
- F. Gers和J. Schmidhuber,《LSTM循环神经网络学习简单的上下文无关和上下文相关语言》,2001年。
- F. Gers,《循环神经网络中的长短期记忆》,博士论文,2001年。
LSTM的局限性
LSTM的有效截断版本将无法轻松解决类似“强延迟XOR”的问题。
每个记忆单元块都需要一个输入门和一个输出门。这在其他循环方法中并非必需。
通过记忆单元内部的“恒定误差传送带”进行的恒定误差流,其效果与传统的前馈架构一次性处理整个输入字符串相同。
LSTM与“近期性”概念一样,与其他前馈方法一样存在缺陷。如果需要精细计数的步长,可能需要额外的计数机制。
LSTM的优势
该算法能够桥接长时滞,是由于其网络架构记忆单元中的恒定误差反向传播。
LSTM可以逼近嘈杂问题域、分布式表示和连续值。
LSTM在考虑的问题域上泛化良好。考虑到某些任务对于已建立的循环网络来说是难以处理的,这一点很重要。
在问题域上微调网络参数似乎没有必要。
在每权重和时间步的更新复杂度方面,LSTM本质上等同于BPTT。
LSTM在机器翻译等领域取得了最先进的结果,被证明功能强大。
门控循环单元神经网络
门控循环神经网络已成功应用于序列或时间数据。
最适合语音识别、自然语言处理和机器翻译,与LSTM一起,它们在长序列问题域中表现出色。
在LSTM主题中考虑了门控,它包括一个门控网络,该网络生成信号,用于控制当前输入和先前记忆如何协同工作以更新当前激活,从而更新当前网络状态。
门本身是加权的,并在学习阶段根据算法选择性地更新。
门网络引入了计算上的额外开销,因为复杂性增加,因此参数化也增加。
LSTM RNN架构将简单RNN的计算用作内部记忆单元(状态)的中间候选。门控循环单元(GRU)RNN将LSTM RNN模型中的门控信号减少到两个。这两个门分别称为更新门和重置门。
GRU(和LSTM)RNN中的门控机制在参数化方面是简单RNN的副本。这些门的相应权重也使用BPTT随机梯度下降进行更新,因为它试图最小化成本函数。
每个参数更新将涉及与整个网络状态有关的信息。这可能产生不利影响。
进一步探讨了门控概念,并扩展了三个新的变体门控机制。
已考虑的三个门控变体是:GRU1,其中每个门仅使用先前的隐藏状态和偏差进行计算;GRU2,其中每个门仅使用先前的隐藏状态进行计算;GRU3,其中每个门仅使用偏差进行计算。GRU3的参数量明显减少,是参数量最少的。
三个变体和GRU RNN使用MNIST手写数字数据库和IMDB电影评论数据集的数据进行基准测试。
从MNIST数据集中生成了两个序列长度,从IMDB数据集中生成了一个。
门的主要驱动信号似乎是(循环)状态,因为它包含有关其他信号的重要信息。
随机梯度下降的使用隐式地携带了网络状态的信息。这或许可以解释仅使用偏差作为其自适应更新来携带网络状态信息相对成功的原因。
门控变体通过有限的拓扑评估来探索门控机制。
欲了解更多信息,请参阅
- R. Dey和F. M. Salem,《门控循环单元(GRU)神经网络的门变体》,2017年。
- J. Chung等人,《门控循环神经网络在序列建模上的实证评估》,2014年。
神经图灵机
神经图灵机通过将它们与外部记忆资源耦合,并通过注意力过程与之交互,从而扩展了神经网络的能力。
组合系统类似于图灵机或冯·诺依曼架构,但它是端到端可微分的,允许其通过梯度下降进行有效训练。
初步结果表明,神经图灵机可以从输入和输出示例中推断出简单的算法,如复制、排序和联想回忆。
RNN因其在很长一段时间内学习和执行复杂数据转换的能力而从其他机器学习方法中脱颖而出。此外,众所周知,RNN是图灵完备的,因此如果正确连接,就有能力模拟任意过程。
标准RNN的能力得到了扩展,以简化算法任务的解决方案。这种丰富主要通过一个大的、可寻址的内存来实现,因此,类比图灵用无限内存带丰富有限状态机,因此被称为“神经图灵机”(NTM)。
与图灵机不同,NTM是一种可微分计算机,可以通过梯度下降进行训练,从而为学习程序提供了实用的机制。

NTM架构通常显示如上所示。在每个更新周期中,控制器网络从外部环境接收输入并响应地发出输出。它还通过一组并行读写头读取和写入内存矩阵。虚线表示NTM电路和外部世界之间的划分。
摘自《神经图灵机》,2014年。
至关重要的是,架构的每个组件都是可微分的,这使得用梯度下降进行训练变得简单。这是通过定义“模糊”的读写操作来实现的,这些操作在不同程度上与内存中的所有元素交互(而不是像普通图灵机或数字计算机那样寻址单个元素)。
欲了解更多信息,请参阅
- A. Graves等人,《神经图灵机》,2014年。
- R. Greve等人,《进化神经图灵机以进行基于奖励的学习》,2016年。
NTM实验
复制任务测试NTM是否能够存储和回忆长序列的任意信息。网络接收随机二进制向量的输入序列,后跟一个分隔符标志。
网络被训练来复制八位随机向量序列,其中序列长度在1到20之间随机化。目标序列只是输入序列(不含分隔符标志)的副本。
重复复制任务通过要求网络按指定次数输出复制的序列,然后发出序列结束标记来扩展复制任务。主要动机是观察NTM是否可以学习简单的嵌套函数。
网络接收随机长度的随机二进制向量序列,后跟一个指示所需副本数量的标量值,该标量值出现在单独的输入通道上。
联想回忆任务涉及组织由“间接性”引起的、即一个数据项指向另一个数据项的数据。构建一个项目列表,以便用其中一个项目查询时,要求网络返回后续项目。
定义了一个由分隔符符号在左右两侧边界的二进制向量序列。在将多个项目馈送到网络后,通过显示一个随机项目来查询网络,并观察网络是否能产生下一个项目。
动态N-Gram任务测试NTM是否可以通过使用记忆作为可重写表来快速适应新的预测分布,该表可用于统计转换的计数,从而模拟传统的N-Gram模型。
考虑所有可能的二进制序列的6-Gram分布。每个6-Gram分布可以表示为32个数字的表,指定下一个位为1的概率,给定所有可能的长度为五的二进制历史。通过使用当前查找表绘制200个连续位来生成特定训练序列。网络一次观察一个位,然后被要求预测下一个位。
优先级排序任务测试NTM的排序能力。随机二进制向量序列与每个向量的标量优先级评分一起输入到网络。优先级从[-1, 1]的范围内均匀抽取。目标序列包含根据其优先级排序的二进制向量。
NTM具有作为其组件的前馈架构,类似于LSTM。
总结
在本篇博文中,您了解了用于深度学习的循环神经网络。
具体来说,你学到了:
- 像LSTM、GRU和NTM这样的顶级循环神经网络是如何工作的。
- 顶级RNN与更广泛的神经网络递归研究的关系。
- RNN的研究如何在一系列具有挑战性的问题上取得了最先进的性能。
这是一篇非常长的博文。
您对用于深度学习的RNN有任何疑问吗?
请在下面的评论中提问,我会尽力回答。
Jason,
您能推荐一下循环和LSTM网络的硬件要求吗?
您认为LSTM能否在具有大约3000个数据点的时序数据上表现令人满意?
最后但同样重要的是,请写一篇博文,给出应该阅读您LSTM博客的顺序。有很多博客,很难决定从哪里开始。
适度的现代硬件。GPU的帮助不大,除非您有非常大的数据。在这种情况下,我建议在AWS上租用。
您是否考虑使用LSTM创建一个聊天机器人?
人们这样做,但我没有。
LSTM模型能否预测遵循泊松分布的随机序列?
通常,神经网络无法预测伪随机序列。
LSTM和RNN在提供防伪新闻检测的万无一失的算法方面能走多远?
没有什么事是万无一失的。
我认为,只要有足够的数据,就可以开发出良好的模型。
嗨,Jason,
我想知道您是否有经验(或知道任何工作)在主帧(IBM z/OS)数据集记录中为字节序列分类实现LSTM,这些记录中没有分隔符(类似于数据表中的行,但您不知道列的开始和结束,但您确实知道行的开始和结束)。如果两者都没有,任何快速的想法/建议也将不胜感激!
感谢您提供如此出色的网站!
查尔斯
这是一个非常具体的情况,我没有见过。
听起来很简单。您必须将输入转换为整数序列,LSTM才能学习问题。
这类似于我们在NLP问题中所做的将单词映射到整数。
这有帮助吗?
嗨,Jason,
我的问题是,我们可以说LSTM和RNN是深度学习架构的类型吗?如果是,为什么我在一些博客和论文中读到“深度RNN”?它们有什么区别?我很困惑。
LSTM是RNN的一种。
如果LSTM或RNN有多层,那么它们就是深度。
嗨,Jason,
在基于NLP的应用中,更偏好哪种网络?
CNN
LSTM
GRU
CNN LSTM
这真的取决于具体的NLP任务。
我是一名博士生。我的同事和医生说:“在NLP应用中,尤其是文本相似度方面,LSTM的表现优于GRU。”
您能告诉我您对此说法的看法吗?
我想说这取决于具体的数据集。
您能告诉我什么时候可以使用LSTM,什么时候可以使用GRU吗?
LSTM和GRU的好处是什么?
依我之见,我认为GRU唯一的优点是它比LSTM更快?
您可以使用LSTM或GRU,通常不能在同一个模型中使用两者。
GRU更简单,速度更快。
GRU能否比LSTM提供更高的性能和准确性?
这取决于模型和具体的数据集。
如何在Keras中更改LSTM记忆单元的超参数?
您只能更改LSTM层中的单元数或节点数。
先生,您好,
我非常钦佩您为我们提供如此内容的努力。
但是,在阅读了这篇博文之后,我有一些疑问。我只想得到简短的回答/要点。
RNN的类型有哪些?
有人说是1对1、1对多等等。(参考 - https://iq.opengenus.org/types-of-rnn/)
有人说是LSTM、GRU等等(参考 - https://machinelearning.org.cn/recurrent-neural-network-algorithms-for-deep-learning/)
RNN的架构有哪些(如果架构不同于类型)?
架构是否不同于类型?
LSTM的类型有哪些?
有人说是简单的、堆叠的等等(参考 - https://machinelearning.org.cn/how-to-develop-lstm-models-for-time-series-forecasting/)
有人说是经典LSTM、窥视孔LSTM等等(参考 - https://blog.exxactcorp.com/5-types-lstm-recurrent-neural-network/)
LSTM的架构类型有哪些(如果架构不同于类型)?
我只需要名称,这样我就可以单独搜索并学习。
谢谢,继续保持好工作。
谢谢。
LSTM和GRU是RNN的类型。
有很多架构,这里有一些。
https://machinelearning.org.cn/start-here/#lstm
嗨,Jason!
感谢您提供这份关于RNN的精彩博文!我想在我的研究论文中引用您提供的信息。您能否推荐一些关于RNN的论文供我参考?
谢谢!
请参阅此引用。
https://machinelearning.org.cn/faq/single-faq/how-do-i-reference-or-cite-a-book-or-blog-post
感谢您提供的精彩教程Jason。
您的帖子总是帮助我深入理解 ML/DL。
我这里有一些问题,请问。
您能帮我解释一下 GRU 的输出方程吗?比如 y_t 是什么?
GRU 在实现时如何定义输出 (y_t) 的大小?
如果可能的话,请您帮助我定义并推荐一些相关的优秀论文或教程。
Muneeb。
抱歉,我没有 GRU 的教程,但我希望将来能涵盖它。