循环神经网络(Recurrent Neural Network, RNN)是一类以
序列(sequence)数据为输入,在序列的演进方向进行
递归(recursion)且所有节点(循环单元)按链式连接的
递归神经网络(recursive neural network)。
历史
1933年,西班牙神经生物学家Rafael Lorente de Nó发现
大脑皮层(cerebral cortex)的解剖结构允许刺激在神经回路中循环传递,并由此提出反响回路假设(reverberating circuit hypothesis)。该假说在同时期的一系列研究中得到认可,被认为是生物拥有
短期记忆的原因。随后神经生物学的进一步研究发现,反响回路的兴奋和抑制受大脑
阿尔法节律(α-rhythm)调控,并在α-运动神经(α-motoneurones )中形成循环反馈系统(recurrent feedback system)。在二十世纪70-80年代,为模拟循环反馈系统而建立的一些数学模型为RNN带来了启发。
1982年,美国学者John Hopfield基于Little (1974)的神经数学模型使用二元节点建立了具有
结合存储(content-addressable memory)能力的神经网络,即
Hopfield神经网络。Hopfield网络是一个包含递归计算和外部记忆(external memory)的神经网络,其内部所有节点都相互连接,并使用能量函数进行非监督学习。
1986年,Michael I. Jordan在分布式并行处理(parallel distributed processing)理论下提出了Jordan网络。Jordan网络的每个隐含层节点都与一个状态单元(state units)相连以实现延时输入,并使用
logistic函数作为
激励函数。Jordan网络使用
反向传播算法(Back-Propagation, BP)进行学习,并在测试中提取了给定音节的语音学特征。之后在1990年,Jeffrey Elman提出了第一个全连接的RNN,即Elman网络。Jordan网络和Elman网络都从单层
前馈神经网络出发构建递归连接,因此也被称为简单循环网络(Simple Recurrent Network, SRN)。
在SRN出现的同一时期,RNN的学习理论也得到发展。在
反向传播算法被提出后,学界开始尝试在BP框架下对循环神经网络进行训练。1989年,Ronald Williams和David Zipser提出了RNN的实时循环学习(Real-Time Recurrent Learning, RTRL)。随后Paul Werbos在1990年提出了随时间反向传播算法(BP Through Time,BPTT)。
1991年,Sepp Hochreiter发现了循环神经网络的长期依赖问题(long-term dependencies problem),即在对长序列进行学习时,循环神经网络会出现梯度消失(gradient vanishing)和梯度爆炸(gradient explosion)现象,无法掌握长时间跨度的非线性关系。为解决长期依赖问题,RNN的改进不断出现,较重要的包括Jurgen Schmidhuber及其合作者在1992和1997年提出的神经历史压缩器(Neural History Compressor, NHC)和长短期记忆网络(Long Short-Term Memory networks, LSTM),其中包含门控的LSTM受到了关注。
同在1997年,M. Schuster和K. Paliwal提出了具有深度结构的双向循环神经网络(Bidirectional RNN, BRNN),并对其进行了语音识别试验。双向和门控构架的出现提升了RNN的学习表现,在一些综述性研究中,被认为是RNN具有代表性的研究成果。
二十一世纪后,随着
深度学习理论的出现和
数值计算能力的提升,拥有更高复杂度的RNN开始在自然语言处理问题中得到关注。2005年,Alex Graves等将双向LSTM应用于语音识别,并得到了优于
隐马尔可夫模型(Hidden Markov Model, HMM)的表现。
2014年,K. Cho提出了门控循环单元网络(Gated Recurrent Unit networks, GRU),该方法是LSTM之后另一个受到关注的RNN门控构架。
2010年,Tomas Mikolov及其合作者提出了基于RNN的语言模型。2013-2015年, Y. Benjo、D. Bahdanau等提出了编码器-解码器、自注意力层等一系列RNN算法,并将其应用于机器翻译问题。为语言模型设计的RNN算法在随后的研究中启发了包括Transformers、XLNet、ELMo、BERT等复杂构筑。
结构
循环单元
内部计算
RNN的核心部分是一个
有向图(directed graph)。有向图展开中以链式相连的元素被称为循环单元(RNN cell)。通常地,循环单元构成的链式连接可类比
前馈神经网络中的隐含层(hidden layer),但在不同的论述中,RNN的“层”可能指单个时间步的循环单元或所有的循环单元,因此作为一般性介绍,这里避免引入“隐含层”的概念。给定按序列输入的学习数据 ,RNN的展开长度为 。待处理的序列通常为
时间序列,此时序列的演进方向被称为“时间步(time-step)”。对时间步 ,RNN的循环单元有如下表示:
式中 称为RNN的系统状态(system status),在
动力系统的观点下,系统状态描述了一个给定空间中所有点随时间步的变化。 是内部状态(internal status),与系统状态有关 。由于求解当前的系统状态需要使用前一个时间步的内部状态,因此循环单元的计算包含递归(recursion)。在树结构的观点下,所有先前时间步的循环单元都是当前时间步循环单元的父节点。式中 是
激励函数或一个封装的前馈神经网络,前者对应简单循环网络(SRN),后者对应门控算法和一些深度算法。常见的激励函数选择包括
logistic函数和
双曲正切函数(hyperbolic tangent function)。 是循环单元内部的权重系数,与时间步无关,即对一组学习样本,RNN使用共享的权重计算所有时间步的输出。
仅由循环单元构成的RNN在理论上是可行的,但RNN通常另有输出节点,其定义为一个线性函数:
式中 是权重系数。根据RNN结构的不同,一个或多个输出节点的计算结果在通过对应的输出函数后可得到输出值 。例如对分类问题,输出函数可以是
归一化指数函数(softmax function)或其它
机器学习算法建立的分类器。
连接性
1. 循环单元-循环单元连接:也被称为“隐含-隐含连接(hidden-hidden connection)”或全连接,此时每个循环单元当前时间步的状态由该时间步的输入和上一个时间步的状态决定: , 是循环节点的权重,前者称为状态-状态权重,后者称为状态-输入权重。正向、反向递归的循环单元-循环单元连接相堆叠可以得到BRNN,。
2. 输出节点-循环单元连接:该连接方式下循环单元的状态由该时间步的输入和上一个时间步的输出(而不是状态)决定: 。由于潜在假设了前一个时间步的输出节点能够表征先前所有时间步的状态,输出节点-循环单元连接的RNN不具有图灵完备性,学习能力也低于全连接网络。但其优势是可以使用Teacher Forcing进行快速学习。
3. 基于上下文的连接:因为在图网络的观点下呈现闭环结构,该连接方式也被称为闭环连接(closed-loop connection),其中循环单元的系统状态引入了其上一个时间步的真实值 。使用基于上下文连接的RNN由于训练时将学习样本的真实值作为输入,因此是一个可以逼近学习目标概率分布的
生成模型(generative model)。基于上下文的连接有多种形式,其中常见的一类使用了该时刻的输入、上一时刻的状态和真实值: 。其它的类型可能使用固定长度的输入,使用上一时刻的输出代替真实值,或不使用该时刻的输入 。
输出模式
通过建立输出节点,RNN可以有多种输出模式,包括序列-分类器(单输出)、序列-序列(同步多输出)、编码器-解码器(异步多输出)等。
序列-分类器
序列-分类器的输出模式适用于序列输入和单一输出的机器学习问题,例如文本分类(sentiment classification)。给定学习数据和分类标签: ,序列-分类器中循环单元的输出节点会直接通过分类器,常见的选择是使用最后一个时间步的输出节点 ,或递归计算中所有系统状态的均值 。常见的序列-分类器使用全连接结构。
序列-序列
序列-序列的输出模式中,序列的每个时间步对应一个输出,即输入和输出的长度相同。给定学习目标 ,序列-序列的输出模式在每个时间步都输出结果 。循环单元-循环单元连接、输出节点-循环单元连接和基于上下文的连接都支持序列-序列输出,其中前两者常见于词性标注(part-of-speech tagging)问题,后者可被应用于文本生成(text generation)和音乐合成(music composition)。
编码器-解码器(encoder-decoder)
在输入数据和学习目标都为序列且长度可变时,可以使用两个相耦合的基于上下文连接的RNN,即编码器-解码器进行建模。编码器-解码器也被称为“seq2seq”,是语言模型中的RNN构架。以
机器翻译为例。给定嵌入的原始文本和翻译文本: ,编码器在工作时对原始文本进行处理,并输出 或 到解码器,解码器根据编码器的输出生成新序列。编码器-解码器结构的RNN以最大化 为目标更新权重系数。
理论
学习范式
监督学习(supervised learning)
1. Teacher Forcing
Teacher Forcing是一种在序列-序列输出模式下对RNN进行快速训练的方法,常见于其理念是在每一个时间步的训练中引入上一个时间步的学习目标(真实值)从而解耦误差的反向传播。具体地,Teacher Forcing是一种
极大似然估计(Maximum Likelihood Estimation, MLE)方法,例如对序列的前两个时间步,序列的对数似然有如下表示:
此时MLE将时间步 的学习转化为求解权重系数 使 的似然取极大值的优化问题,因此不需要将神经网络的误差函数反向传播至该时间步。
上述方法被称为“严格的”Teacher Forcing,适用于输出节点-循环单元连接的RNN,对循环单元-循环单元连接的RNN,只要输出节点-循环单元可以连接,则Teacher Forcing可以和随时间反向传播(BPTT)一起使用。
严格的Teacher Forcing不适用于闭环连接的RNN,因为该连接方式在测试时会将前一个时间步的输出作为当前时间步的输入,而Teacher Forcing在学习时使用的真实值 和测试时神经网络自身的输出 往往有相当的差别。一个改进是对部分样本进行自由学习,即使用神经网络自身的输出代替真实的学习目标加入Teacher Forcing中。此外也可在Teacher Forcing的所有学习样本中随机混入 ,并随着学习过程不断增加混入 的比例。
2. 随时间反向传播(BP Through Time, BPTT)
BPTT是反向传播算法(BP)由前馈神经网络向RNN的推广,BPTT将RNN的链式连接展开,其中每个循环单元对应一个“层”,每个层都按前馈神经网络的BP框架进行计算。考虑RNN的参数共享性质,权重的梯度是所有层的梯度之和: 式中 为损失函数。这里以循环单元-循环单元连接的多输出网络为例介绍BPTT的计算步骤。首先给定如下的更新方程:
式中需要求解的权重为 。对最末端的时间步 和其余的时间步 ,求解总损失函数对循环单元状态的偏导数是一组递归计算:
由于RNN参数共享,因此在计算当前时间步的梯度时需要将共享的参数对其它时间步的损失函数的变化“固定”,这里使用“ ”表示该关系,在一些文献中,该符号被称为“实时导数(intermediate derivative)”。式中 为激励函数的导数, 与输出函数 有关。按上式对所有时间步反向传播后,RNN的权重梯度更新按如下方式给出:
上述步骤为BPTT的标准求解框架,在理论上可以处理所有类型的RNN构筑。在实际应用中,由于损失函数对状态的偏导数 需要被完整地保存直到该样本的所有参数更新完毕,因此在学习长序列样本时,BPTT的空间复杂度会对应地增加。对BPTT按固定长度截断,即截断的BPTT(truncated BPTT)是被用于解决上述问题的方法之一。
3. 实时循环学习(Real-Time Recurrent Learning, RTRL)
RTRL通过前向传播的方式来计算梯度,在得到每个时间步的损失函数后直接更新所有权重系数至下一个时间步,类似于
自动微分的前向连锁(forward accumulation)模式。这里以BPTT中的状态-状态权重 为例做简单介绍。在时间步 ,损失函数 对权重中元素 的实时更新规则如下:
其它权重的更新可以按相近的方式导出。相比于BPTT,RTRL的计算量更大,但因为无需存储反向传播的误差梯度,RTRL的内存开销更小,更适用于在线学习或使用长序列学习样本的问题。
非监督学习(unsupervised learning)
使用编码器-解码器结构的RNN能够以自编码器(Auto-Encoders, AE)的形式,即循环自编码器(Recurrent AE)进行非监督学习。RAE是对序列数据进行特征学习(feature learning)的方法之一,其工作方式与编码器-解码器相近。具体地,RAE输入端的编码器会处理序列并将最后一个时间步的状态传递至解码器,解码器使用编码器的输出重构序列。RAE以最小化原始序列和重构序列的差异为目标进行学习。不同于一般的编码器-解码器结构,在学习完毕后,RAE只有编码器部分会被取出使用,对输入序列进行编码。
非监督学习也可被应用于堆叠RNN,其中最早被提出的方法是神经历史压缩器(Neural History Compressor, NHC)。NHC是一个自组织阶层系统(self-organized hierarchical system),在学习过程中,NHC内的每个RNN都以先前时间步的输入 学习下一个时间步的输入 ,学习误差(通常由长距离依赖产生)会输入到更高阶层的RNN中,在更长时间尺度下进行学习以。最终输入数据会在NHC的各个阶层得到完整的表征,上述过程在研究中被描述为“压缩(compression)”或“蒸馏(distillation)”。NHC在本质上是阶层结构的AE,对输入数据进行压缩即是其特征学习的过程。由于可以在多时间尺度上学习长距离依赖,因此NHC也被用于RNN在监督学习问题中的预学习(pre-training)。在Transformer出现后,NHC也被用于BERT的预学习。
除上述方法外,RNN有其它适用于特定问题的非监督学习方法。被用于
聚类问题的BINGO(Binary Information Gain Optimization)算法和NEO(Non-parametric Entropy Optimization)算法。
优化
RNN在误差梯度在经过多个时间步的反向传播后容易导致极端的非线性行为,包括梯度消失(gradient vanishing)和梯度爆炸(gradient explosion)。不同于
前馈神经网络,梯度消失和梯度爆炸仅发生在深度结构中,且可以通过设计梯度比例得到缓解,对RNN,只要序列长度足够,上述现象就可能发生。在理解上,RNN的递归计算类似于连续的
矩阵乘法,由于
RNN使用固定的权重处理所有时间步,因此随着时间步的推移,权重系数必然出现
指数增长或衰减,引发梯度的大幅度变化。
在实践中,梯度爆炸虽然对学习有明显的影响,但较少出现,使用梯度截断可以解决。梯度消失是更常见的问题且不易察觉,发生梯度消失时,RNN在多个时间步后的输出几乎不与序列的初始值有关: ,因此无法模拟序列的长距离依赖(long-term dependency)。在数值试验中,SRN对时间步跨度超过20的长距离依赖进行成功学习的概率接近于0。恰当的权重初始化(weight initialization),或使用非监督学习策略例如神经历史压缩器(NHC)可提升RNN学习长距离依赖的能力,但对更一般的情形,RNN发展了一系列优化策略和构筑。
梯度截断
梯度截断是处理RNN梯度爆炸现象的有效方法,具体分为两种,一是设定阈值并逐个元素筛查,若梯度超过阈值则截断至阈值;二是在参数更新前,若误差对参数的梯度超过阈值,则按范数(norm)截断:
式中 为梯度的阈值。比较可知,按范数截断保持了截断前后梯度的方向不变,因此逻辑上更合理,但试验表明,两种方法效果相当。事实上作为经验方法,只要梯度截断将权重系数带离数值不稳定区域,就能很好地应对梯度爆炸现象。
正则化(regularization)
RNN的
正则化是应对其长距离依赖问题的方法之一,其理念是控制循环节点末端状态对初始状态导数,即
雅可比矩阵的范数以提升RNN对长距离误差的敏感性。在误差反向传播至第 个时间步时,其对应的正则化项有如下表示:
在BP中加入上述正则化项会提升计算复杂度,此时可将包含损失函数的项近似为常数,并引导雅可比矩阵的范数向1靠近。研究表明,正则化和梯度截断结合使用可以增加RNN学习长距离依赖的能力,但相比于门控单元,正则化没有减少模型的冗余。
在前馈神经网络中被使用和证实有效的
随机失活(dropout)策略也可用于RNN。在输入序列的维度大于1时,RNN在每个时间步的输入和状态的矩阵元素都可以被随机归零:
式中 为(0,1)-矩阵,也被称为maxout矩阵(maxout array)随机决定需要失活的连接。maxout矩阵可以对一组学习样本的所有时间步保持不变,其中与系统状态相乘的maxout矩阵也可随时间步变化。在长序列的学习中,不断生成随机数进行随机失活会降低算法的运行效率,一个可能的改进是假设距离过长的元素影响很小,并只对与当前时间步相隔一定范围的循环单元连接使用随机失活。
层归一化(Layer Normalization, LN)
应用于RNN时,LN将RNN的每个循环单元视为一个层进行归一化。对时间步 ,包含LN的循环节点的内部计算如下表示:
式中 和 为代表缩放和平移的参数,随BP算法进行更新。在RNN中,循环节点的均值和标准差会发生改变,产生协变漂移(covariate shift)现象,该现象会导致梯度爆炸和梯度消失,因此LN是缓解长距离依赖问题的方法之一。
储层计算(reservoir computing)
储层计算将RNN中链式连接转变为一个“储层(reservoir)”,储层内循环单元的状态在每个时间步更新。储层与输出层相连,其对应的输出权重由学习数据求解:
式中 为储层的输入权重,在计算中随机初始化并且固定, 为输出权重,按线性参数模型的计算方法求解。注意到上式中 向 的递归是随机的,因此储层计算的构筑本身缓解了RNN的长距离依赖问题。同时,为确保储层不发生梯度爆炸,其输出权重有两个设定:
(1)使用
稀疏矩阵和
特征值的最大绝对值小于谱半径(spectural radius)。谱半径是一个超参数,用于控制 随时间步的指数增长。
(2)稀疏矩阵控制储层与输出层间的松散连接,此时储层中的信息只能在有限的输出中“回声”,不会扩散至网络的所有输出中。
储层计算可以被视为RNN的学习理论或对RNN的结构优化。使用储层计算的RNN包括回声状态网络(Echo State Network, ESN)和流体状态机(liquid state machine),二者的不同点是流体状态机的储层单元是二元节点。储层计算中随机初始化并固定隐含层输入权重的方法接近于
极限学习机(Extreme Learning Machine, ELM),但后者基于
前馈神经网络构建,其隐含层节点不是循环单元,不具有记忆性。
跳跃连接(skip connection)
梯度消失是时间步的函数,因此可以通过使用跳跃连接提高RNN学习长距离依赖的能力。跳跃连接是跨多个时间步的长距离连接,引入跳跃连接后,长时间尺度的状态能够更好地在神经网络中传递,缓解梯度消失现象。有研究在使用跳跃连接的同时直接删除循环单元-循环单元连接,强迫RNN以阶层结构在长时间尺度上运行。
渗漏单元(leaky unit)和门控单元(gated unit)
渗漏单元也被称为线性自连接单元(linear self-connection unit)是在循环单元间模拟
滑动平均(moving average)以保持RNN中长距离依赖的方法:
式中的权重 是预先给定的。由上式容易发现,渗漏单元会在迭代中优先记忆系统先前的状态 ,因此提升了RNN建立长期依赖的能力。研究表明ESN可以引入渗漏单元进行优化以提升其学习效果。
渗漏单元在应用中有两个不足,一是人为给定的权重不是记忆系统状态的最优方式,二是渗漏单元没有遗忘功能,容易出现信息过载,在过去的状态被循环单元充分使用后,将其遗忘可能是有利的。 以此出发,门控单元是渗漏单元的推广,门控单元的类型包括输入门(input gate)、输出门(output gate)和遗忘门(forget gate)。每个门都是一个封装的神经网络,其计算方式可参见算法部分。总体而言,门控单元是减少学习误差的长距离依赖的有效方法,使用门控单元的算法,包括长短期记忆网络(Long Short-Term Memory networks, LSTM)和门控循环单元网络(Gated Recurrent Unit networks, GRU)被证实在各类问题中有优于SRN的表现。
算法
简单循环网络
简单循环网络(Simple Recurrent Network, SRN)是仅包含一组链式连接(单隐含层)的RNN,其中循环单元-循环单元连接的为Elman网络,闭环连接的为Jordan网络。对应的递归方式如下:
式中 和 为激励函数,例如逻辑斯蒂函数或双曲正切函数。SRN在提出时使用BPTT进行监督学习,但不包含任何优化理论,因此无法学习长距离依赖,在现代的机器学习问题中很少直接使用。
门控算法
门控算法是RNN应对长距离依赖的可行方法,其设想是通过门控单元赋予RNN控制其内部信息积累的能力,在学习时既能掌握长距离依赖又能选择性地遗忘信息防止过载。门控算法使用BPTT和RTRL进行学习,其计算复杂度和学习表现均高于SRN。
长短期记忆网络(Long Short-Term Memory networks, LSTM)
LSTM是最早被提出的RNN门控算法,其对应的循环单元,LSTM单元包含3个门控:输入门、遗忘门和输出门。相对于RNN对系统状态建立的递归计算,3个门控对LSTM单元的内部状态建立了自循环(self-loop)。具体地,输入门决定当前时间步的输入和前一个时间步的系统状态对内部状态的更新;遗忘门决定前一个时间步内部状态对当前时间步内部状态的更新;输出门决定内部状态对系统状态的更新。LSTM单元的更新方式如下:
式中 为系统状态和内部状态的激励函数,通常为双曲正切函数, 为随时间步更新的门控,本质上是以
Sigmoid函数为激励函数的前馈神经网络,使用Sigmoid函数的原因是其输出在 区间,等效于一组权重。式中脚标 表示输入门、遗忘门和输出门。除上述更新规则外,LSTM也可进一步引入内部状态更新门控,使用该策略的算法被称“peephole LSTM”:
最初版本的LSTM没有遗忘门,以全连接的方式进行序列-序列输出,但本质上LSTM单元可以被引入其它各类RNN构筑中,例如LSTM自编码器(LSTM Autoencoder)、堆叠LSTM(stacked LSTM)等。
对LSTM进行权重初始化时,需要为遗忘门设定较大的初始值,例如设定 。过小的值会使得遗忘门在学习中快速遗忘先前时间步的信息,不利于神经网络学习长距离依赖, 并可能导致梯度消失。
门控循环单元网络(Gated Recurrent Unit networks, GRU)
由于LSTM中3个门控对提升其学习能力的贡献不同,因此略去贡献小的门控和其对应的权重,可以简化神经网络结构并提升其学习效率。GRU即是根据以上观念提出的算法,其对应的循环单元仅包含2个门控:更新门和复位门,其中复位门的功能与LSTM单元的输入门相近,更新门则同时实现了遗忘门和输出门的功能。GRU的更新方式如下:
式中符号含义参考LSTM,脚标 表示更新门和复位门。对比LSTM与GRU的更新规则可以发现,GRU的参数总量更小,且参数更新顺序与LSTM不同,GRU先更新状态再更新门控,因此当前时间步的状态使用前一个时间步的门控参数,LSTM先更新门控,并使用当前时间步的门控参数更新状态。GRU的2个门控不形成自循环,而是直接在系统状态间递归,因此其更新方程也不包含内部状态 。
LSTM和GRU有很多变体,包括在循环单元间共享更新门和复位门参数,以及对整个链式连接使用全局门控,但研究表明这些改进版本相比于标准算法未体现出明显优势,其可能原因是门控算法的表现主要取决于遗忘门,而上述变体和标准算法使用了的遗忘门机制相近。
深度算法
RNN的“深度”包含两个层面,即序列演进方向的深度和每个时间步上输入与输出间的深度。对前者,循环神经网络的深度取决于其输入序列的长度,因此在处理长序列时可以被认为是直接的深度网络;对后者,循环神经网络的深度取决于其链式连接的数量,单链的循环神经网络可以被认为是“单层”的。
RNN能够以多种方式由单层加深至多层,其中最常见的策略是使用堆叠的循环单元。
堆叠循环神经网络(Stacked Recurrent Neural Network, SRNN)
SRNN是在全连接的单层RNN的基础上堆叠形成的深度算法。SRNN内循环单元的状态更新使用了其前一层相同时间步的状态和当前层前一时间步的状态:
式中符号含义参见循环单元部分,上标 分别表示时间步和层数。参与构建SRNN的RNN可以是简单循环网络(SRN)或门控算法。使用SRN构建的SRNN也被称为循环多层感知器(Recurrent Multi-Layer Perceptron,RMLP),是1991年被提出的深度RNN。
双向循环神经网络(bidirectional recurrent neural network, BRNN)
BRNN是至少包含两层的深度RNN,被应用于学习目标与完整(而不是截止至当前时间步)输入序列相关的场合。例如在语音识别中,当前语音对应的词汇可能与其后出现的词汇有对应关系,因此需要以完整的语音作为输入。Bi-RNN的两个链式连接按相反的方向递归,输出的状态会进行矩阵拼接并通过输出节点,其更新规则如下:
式中符号含义参见循环单元部分, 表示矩阵拼接。和SRNN类似,Bi-RNN也可以由各种类型的循环单元构成,例如由LSTM构成的版本被称为双向LSTM。
扩展算法
外部记忆
RNN在处理长序列时有
信息过载的问题,例如对编码器-解码器结构,编码器末端的输出可能无法包含序列的全部有效信息。门控算法的遗忘门/更新门可以有选择地丢弃信息,减缓循环单元的饱和速度,但更进一步地,有研究通过注意力和自注意力(self-attention)机制将信息保存在外部记忆(external memory)中,并在需要时再进行读取,以提高RNN的网络容量(network capacity)。在RNN框架下使用注意力机制的例子包括
Hopfield神经网络、神经图灵机(Neural Turing Machine, NTM)等。
与卷积神经网络相结合
RNN与卷积神经网络相结合的常见例子是循环卷积神经网络(Recurrent CNN, RCNN)。RCNN将卷积神经网络的卷积层替换为内部具有递归结构的循环卷积层(Recurrent Convolutional Layer, RCL),并按前馈连接建立深度结构。
除RCNN外,RNN和卷积神经网络还可以通过其它方式相结合,例如使用卷积神经网络在每个时间步上对序列化的格点输入进行特征学习(time-distributed),并将结果输入RNN。
递归神经网络和图网络
RNN按序列演进方向的递归可以被扩展到
树(tree)结构和
图(graph)结构中,得到递归神经网络(recursive neural network)和图网络(Graph Network, GN)。
递归神经网络是RNN由链式结构向树状结构的推广。不同于RNN的链式连接,递归神经网络的每个子节点都可以和多个父节点相连并传递状态。当其所有子节点都仅与一个父节点相连时,递归神经网络退化为RNN。递归神经网络的节点可加入门控机制,例如通过LSTM门控得到树状长短期记忆网络(tree-structured LSTM)。图网络是RNN和递归神经网络的推广,或者说后两者是图网络在特定结构下的神经网络实现。在图网络观点下,全连接的RNN是一个有向无环图,而上下文连接的RNN是一个有向环图。递归神经网络和图网络通常被用于学习数据具有结构关系的场合,例如语言模型中的语法结构。
性质
权重共享:RNN的权重系数是共享的,即在一次迭代中,循环节点使用相同的权重系数处理所有的时间步。相比于前馈神经网络,权重共享降低了RNN的总参数量。权重共享也意为着RNN可以提取序列中随时间变化的特征,因此其在学习和测试序列具有不同长度时可表现出泛化能力。
计算能力:一个循环单元间完全连接的RNN满足通用近似定理,即全联接循环神经网可以按任意精度逼近任意非线性系统,且对状态空间的紧致性没有限制,只要其拥有足够多的非线性节点。在此基础上,任何图灵可计算函数(Turing computable function)都可以由有限维的全联接计算,因此RNN是
图灵完备(Turing completeness)的。
作为时间序列模型的性质:在时间序列建模的观点下,RNN是一个无限冲激响应滤波器(Infinite Impulse Response filter, IIR)。这将RNN与其它应用于序列数据的权重共享模型,例如一维的卷积神经网络相区分,后者以时间延迟网络为代表,是有限冲激响应滤波器(Finite Impulse Response filter, FIR)。
应用
自然语言处理
RNN在NLP问题中有得到应用。在
语音识别(speech recognition)中,有研究使用L双向STM对英语文集TIMIT进行语音识别,其表现超过了同等复杂度的隐马尔可夫模型(Hidden Markov Model, HMM)和深度前馈神经网络。RNN是
机器翻译(Machine Translation, MT)的算法之一,并形成了区别于“统计机器翻译”的“神经机器翻译(neural machine translation)”方法。有研究使用端到端学习的LSTM成功对法语-英语文本进行了翻译,也有研究将卷积n元模型(convolutional n-gram model)与RNN相结合进行机器翻译。有研究认为,按编码器-解码器形式组织的LSTM能够在翻译中考虑语法结构。
基于上下文连接的RNN被用于语言建模(language modeling)问题。有研究在字符层面(character level)的语言建模中,将RNN与卷积神经网络相结合。RNN也是语义分析( sentiment analysis)的工具之一,被应用于文本分类、社交网站数据挖掘等场合。
在
语音合成(speech synthesis)领域,有研究将多个双向LSTM相组合建立了低延迟的语音合成系统,成功将英语文本转化为接近真实的语音输出。RNN也被用于端到端文本-语音(Text-To-Speech, TTS)合成工具的开发,例子包括Tacotron、Merlin等。
RNN也被用于与自然语言处理有关的异常值检测问题,例如社交网络中虚假信息/账号的检测。
计算机视觉
RNN与卷积神经网络向结合的系统可被应用于在计算机视觉问题,例如在
字符识别(text recognition)中,有研究使用卷积神经网络对包含字符的图像进行特征提取,并将特征输入LSTM进行序列标注。对基于视频的计算机视觉问题,例如行为认知(action recognition)中,RNN可以使用卷积神经网络逐帧提取的图像特征进行学习。
其它
在
计算生物学(computational biology)中,RNN被用于分析包含生物信息的序列数据,例如在DNA序列中识别分割外显子(exon)和内含子(intron)的断裂基因(split gene)、通过RNA序列识别小分子RNA(microRNA)、使用蛋白质序列进行蛋白质亚细胞定位(subcellular location of proteins)预测等。
在
地球科学(earth science)领域,RNN被用于时间序列变量的建模和预测。使用LSTM建立的水文模型(hydrological model)对土壤湿度的模拟效果与陆面模式相当。基于LSTM的降水-径流模式(rainfall-runoff model)所输出的径流量与美国各流域的观测结果十分接近。在预报方面,有研究将地面遥感数据作为输入,使用循环卷积神经网络进行单点降水的
临近预报(nowcast)。
包含循环神经网络的编程模块
现代主流的机器学习库和界面,包括
TensorFlow、
Keras、Thenao、Microsoft-CNTK等都支持RNN层或循环单元。此外有基于特定数据的RNN构建工具,例如面向音频数据开发的auDeep等。