循环神经网络
循环神经网络(Recurrent Neural Network,RNN),是一类以序列数据为输入,在序列的演进方向进行递归且所有节点(循环单元)按链式连接的递归神经网络。RNN具有权重共享的特性,一个完全连接的循环神经网络可以近似解决所有可计算问题,此外,RNN也具有记忆更新的特性,即由上一时刻的隐含状态和本时刻的输入来共同更新新的记忆。
循环神经网络的早期研究始于20世纪80年代。1982年,约翰·霍普菲尔德引入了Hopfield网络,标志着RNN研究的开始。随后,RNN进入了以长短期记忆网络(LSTM)和双向循环神经网络(BRNN)为主的发展阶段。在这一时期,RNN训练的不稳定性和高技术要求成为了当时普遍的看法。到了2010年,RNN展现出在语言建模、机器翻译、数据压缩和语音识别等领域的显著能力,开启了其第三个发展阶段。特别是2014年,艾利克斯·格雷夫斯及其同事在神经图灵机(NTM)上的研究,以及2015年约林和米列夫斯基在堆叠RNN上的工作,进一步推动了RNN技术的进步。
循环神经网络由输入层、输出层和隐藏层组成,每层有时间反馈循环,其扩展结构包括双向循环神经网络、深度循环神经网络、长短时记忆网络和门控循环单元等,可通过随时间反向传播算法、梯度下降算法等方式进行训练。此外,循环神经网络广泛应用于自然语言处理、临床分割技术、风险预测等领域。但是RNN也面临着梯度消失和梯度爆炸等挑战。
历史沿革
背景
1933年,西班牙神经生物学家德诺(Rafael Lorente de Nó)发现扣带皮层的解剖结构允许刺激在神经回路中循环传递,并由此提出反响回路假设。该假说在同时期的一系列研究中得到认可,被认为是生物拥有短期记忆的原因。随后神经科学的进一步研究发现,反响回路的兴奋和抑制受大脑阿尔法节律调控,并在α-运动神经中形成循环反馈系统。在20世纪70~80年代,因模拟循环反馈系统面建立的各类数学模型为循环神经网络的发展奠定了基础。
雏形
最早关于循环神经网络的研究开始于20世纪80年代,1982年,约翰·霍普菲尔德(John Hopfield)提出了Hopfield神经网络,这种网络由全连接的二元节点组成,其特点是网络内部的所有节点都相互连接,形成一个动态系统。它包含递归计算和外部记忆(External Memory),标志着RNN研究的开始。
1986年杰弗里·辛顿(Hinton)等人提出了多隐含层网络结构,采用Sigmoid激活函数,利用误差反向传播算法来训练模型,有效解决了非线性分类问题。1989年,罗纳德·威廉姆斯(Ronald Williams)和大卫·齐普瑟(David Zipser)提出了RNN的实时循环学习方法(Real-时间 Recurrent Learning,RTRL)以调整RNN的权重,随后,1990年全连接的RNN网络(Elman网络)和随时间反向传播算法(BPTT)出现,RNN网络得到了不断的优化和发展。
改进
1991年,塞普·霍克赖特(Sepp Hochreiter)发现了循环神经网络的长期依赖问题,即在对序列进行学习时,循环神经网络会出现梯度消失和梯度爆炸现象,无法掌握长时间跨度的非线性关系。
为解决长期依赖问题,人们引入了大量的优化理论,并设计出许多改进算法,这一时期主要代表为1997年Hochreiter和施密德胡贝尔(Schmidhuber)提出的长短期记忆网络(long short-term memory,LSTM)和双向循环神经网络(bidirectional recurrent neural networks,BRNN)。
这几种模型扩展了RNN的应用场景,为后续序列化建模的发展打下了坚实的基础。在此之后很多研究者通过对RNN增加辅助结构,或直接引入外部的记忆单元,提升了网络对于长序列数据的处理能力。
发展
2010年,人们发现RNN能够显著提升语言建模、机器翻译、数据压缩和语音识别等任务的性能,RNN的发展进入第三阶段。期间,2014年Kyunghyun Cho等人提出了门控循环网络(gated recurrent units,GRU),同年艾利克斯·格雷夫斯(Alex Graves)等人在神经图灵机(neural turing machine,NTM)方面的工作也提升了RNN的学习表现,对RNN的发展产生了较大的影响。
在2014~2017年,基于循环神经网络的Seq2Seq在机器翻译以及其他序列任务上占据了绝对的主导地位,编码器-解码器架构以及注意力机制的各种变体被研究者反复探索。但是由于循环神经网络本身结构的局限性,翻译效果大打折扣。直到2017年,谷歌机器翻译团队开发了Transformer模型,摒弃了传统循环神经网络。这种模型基于自注意力机制,引入位置信息编码,显著改进了机器翻译效果。
2019年,为解决变压器架构中的文本通常需要分成多个片段的问题,Transformer-XL应运而生。它通过引入循环机制来学习输入Transformer注意力机制中的连续多个固定长度的文本片段之间的依赖关系。虽然注意力机制(以Transformer的形式)已经取代了循环神经网络,但在Transformer中加入循环机制,使得循环机制再次流行起来。
基本原理
循环神经网络的目的是处理序列数据。RNN在处理序列数据时,每次处理序列中的一个元素。RNN含有一个隐层和一个隐藏状态,用于保存隐层的输出,并将其作为反馈与下一个输入一起传递给隐层,并且隐层的输入不仅包括输入层的输出,还包括上一时刻隐层的输出。这种信息循环流意味着网络在处理每一个输入时都会考虑它对前一个输入的处理结果。如此在循环中传播的信息对序列中前期输入(可能是所有前期输入)提供的上下文信息进行了编码,这使得网络能够保存对先前在序列中已经看到的信息的记忆,并利用这些信息来决定应该如何处理当前的输入。
基本结构
基础的神经网络由输入层、输出层和隐藏层组成,通过激活函数控制输出,层与层之间通过权值连接,而RNN与传统神经网络最大的区别在于将前一时间步的隐藏状态(而非输出结果)传递到当前时间步的隐藏层,如下图所示。
输入层:指神经网络中数据输入的层次。该层次中数据一般不做处理或者只做二分类或者多分类处理,可以理解为人工神经网络的感知端,有些神经网络因为所处理的数据结构特点有各自独特的感知机,感知机的类型主要为一些自动化的分类系统,把复杂多元指标的信息转化为几个层面或者0,1变量,按照一定的连接权重传输到隐层的各个神经元当中,由隐层神经元激励函数处理后,将结果输入到输出层得到结果。
隐藏层:隐藏层是指位于神经网络中输入层和输出层之间的网络层。网络的深度指的是隐藏层的数量。
输出层:输出层表示的是神经元网络的最终输出量,输出层能够接收隐藏层的处理结果,并通过函数转换成判断、分类、决策或者确定评价分数等结果,即神经网络的综合评价结果。
循环单元:循环单元是一个很有效的沿时间线共享参数方式,它使得时间线可以递归地展开。可以形式化地可以表示为,其中,为循环单元(Recurrent Unit);为参数。
在RNN的时间展开图中,、、表示时间序列,表示在时刻的输入样本,表示该时刻的网络状态或记忆。网络状态的更新通过函数计算,通常使用如或等非线性函数,计算公式为。这种机制使得RNN可以预测如句子中下一个单词的概率分布等序列数据。
类型
简单循环神经网络
Elman神经网络
为了提高对历史数据的敏感性和处理动态信息的能力,Elman神经网络被开发出来。这种反馈型网络通过将隐层输出回馈到输入层,提供了学习记忆的模式,增强了网络的记忆功能、自适应性和全局稳定性。
Elman网络结构类似多层前馈神经网络,包括输入层、隐含层、承接层和输出层。输入层传递信号,输出层进行线性加权。隐含层使用线性或非线性传递函数,并可以调整其连接权。承接层由固定权值的单元组成,用于记忆隐含层前一时刻的输出,这些输出值经过延迟后再次输入到隐含层。
Elman神经网络的非线性状态空间表达式为
表达式中包括输出节点、中间节点、输入节点和反馈状态;连接权值分别为承接层到隐含层、输入层到隐含层和隐含层到输出层;和分别为输出和隐含层神经元的传递函数。
Jordan神经网络
另一种简单的全局前向局部反馈型网络是Jordan神经网络,Jordan网络的所有层都是递归结构的,它的工作原理类似于Elman神经网络的工作原理。与Elman网络不同之处是,Jordan神经网络从输出层到隐含层有局部反馈,上下文层处于输出层和第一隐含层之间,上下文层将输出延迟作为第一隐含层的输入,即。
双向循环神经网络
许多序列学习任务,尤其是序列到序列的任务,需要捕捉序列中的双向信息,双向循环神经网络即为满足这种需要而发明。双向循环神经网络是一种特殊的循环神经网络,它结合了前置和后置的状态来预测当前状态下的输出标签。双向循环神经网络由两层循环神经网络组成,它们的输入相同,只是信息传递的方向不同。
双向循环网络在向前层从时间步1到时间步T正向计算一遍,得到并保存每个时间步隐藏层的输出;在向后层从时间步T到时间步1反向计算一遍,得到并保存每个时间步隐藏层的输出。最后的输出结果是对两个方向的输出进行汇总,从而达到同时利用过去的信息和未来的信息来解决当前问题的目的。
各个状态的计算公式如下所示:
表达式中包括当前时间步;上一步时间步;时间步t的输入记为;从前往后计算得到的隐藏层的状态记为,从后往前计算得到的隐藏层的状态记为;代表激活函数,常见的有tanh、ReLU等;、、、是四个权重矩阵,每个权重矩阵都会通过网络的反向传播进行更新;表示将与两部分拼接起来,是网络最终的输出。
深度循环神经网络
循环神经网络可以看作是可深可浅的网络,一方面如果把循环网络按时间展开,长时间间隔的状态之间的路径很长,循环网络可以看作是一个非常深的网络;从另一方面来说,同一时刻网络输入到输出之间的路径xt→yt这个网络的深度是非常浅的,因此可以通过增加循环神经网络的深度从而增强循环神经网络的泛化能力。在循环神经网络的基础上堆叠两个以上的隐藏层,这样就得到了深度循环神经网络。在深度循环神经网络中,较低的层起到了将原始输入转化为对更高层的隐状态更合适的表示的作用。然而,增加深度可能会因为优化困难而损害学习效果。在一般的情况下,更容易优化较浅的结构,因此需要平衡深度循环网络的层数和训练难易度,以取得最好的学习效果。
增加循环神经网络的深度主要是延长同一时刻网络输入到输出之间的路径xt→yt,比如增加隐状态到输出ht→yt,以及输入到隐状态xt→ht之间的路径的深度。深度循环神经网络的结构如图所示。
在时刻的第层的隐状态的计算公式如下所示:
其中,第层网络的输入是第层网络的输出;表示当前时间步;表示在时刻的第层的隐状态;表示激活函数;表示权重矩阵;表示输入层到隐藏层的权重矩阵;表示隐藏层到隐藏层的权重矩阵;表示偏重。
长短时记忆网络
长短时记忆网络是一种称作长短时间记忆单元(Long Short-Temm Memory,LSTM)的特殊结构时间循环神经网络,它能够根据输入值和当前隐含状态选择性地对所存储信息进行“遗忘”,并组合新的信息结合成为新的记忆单元。通过在不同时间步调整模型权重,长短时记忆神经网络能够根据损失函数保留对任务最有价值的信息。
各个控制门以及各个状态的计算公式如下所示:
其中,是遗忘门,决定哪些信息被丢弃或保留;是输入门,决定输入信息能否输入到当前网络隐层节点中;是输出门,决定决定需要输出什么信息;是隐藏状态;是候选状态;是候选内部状态;和表示权重,表示偏重,矩阵表示logistic函数,表示激活函数,表示向量元素乘积。
门控循环单元
门控循环单元(GRU)是另一种具有门控机制的循环神经网络,它类似于长短期记忆网络,但结构更简单,计算效率更高。门控循环单元比长短期记忆网络训练更快,而且当训练数据有限时,其在训练过程中需要更新的权重和参数较少。
各个控制门以及各个状态的计算公式如下所示:
其中,是更新门,控制向记忆中写入的信息,决定是否应该用当前输入中的信息来更新记忆;是重置门,控制从记忆中删除的信息,决定了记忆中哪些信息应该被保留和传递;是候选隐藏状态;是最终隐藏状态;和表示权重,表示偏重,矩阵表示logistic函数,表示激活函数,表示向量元素乘积。
递归神经网络
递归神经网络(Recursive Neural Network,RecNN)是循环神经网络在有向无循环图上的扩展。递归神经网络的一般结构为树状的层次结构。递归神经网络主要用来建模自然语言句子的语义。给定一个句子的语法结构(一般为树状结构),可以使用递归神经网络来按照句法的组合关系来合成一个句子的语义。句子中每个短语成分又可以分成一些子成分,即每个短语的语义都可以由它的子成分语义组合而来,并进而合成整句的语义。
在递归神经网络的一般结构中,有三个隐藏层、和,其中由两个输入层和计算得到,由另外两个输入层和计算得到,由两个隐藏层和计算得到。各个隐藏状态的计算公式如下所示:
其中,代表递归神经网络的隐藏层;代表输入层;代表非线性激活函数;和是可学习的参数。
重要特性
权重共享:RNN的权重系数是共享的,即在一次迭代中,循环节点使用相同的权重系数处理所有的时间步,RNN能够通过权重共享的方式,将过去时刻重要的信息编码并传入当前时刻的神经元,使模型具有了记忆能力,解决了传统神经网络不能随时间变化提取特征这一问题。
计算能力:一个循环单元间完全连接的RNN满足通用近似定理,根据通用近似定理,两层的前馈神经网络可以近似任意有界闭集上的任意连续函数,因此,动力系统的两个函数可以用两层的全连接前馈网络近似。此外,RNN具有图灵完备(图灵机器人 completeness)特性,所有的图灵机都可以被一个由使用Sigmoid型激活函数的神经元构成的全连接循环网络来进行模拟,因此,一个完全连接的循环神经网络可以近似解决所有的可计算问题。
记忆更新:RNN每一个时间的输出不仅取决于当前的输入,还取决于过去的输出,即过去的输出等同于网络的一个内部的记忆,叫作内部隐含状态,相关公式为:,在公式中,是上一时刻的隐含状态,是本时刻的输入,是本时刻的隐含状态,即由上一时刻的隐含状态和本时刻的输入来共同更新新的记忆。
循环神经网络的训练
神经网络的参数训练通常依赖于误差反向传播算法、梯度下降算法、实时循环学习算法等。前馈网络的反向传播算法从最后的误差开始,经每个隐含层的输出、权重和输入反向移动,将一定比例的误差分配给每个权重,方法是计算权重与误差的偏导数。随后,梯度下降算法会用这些偏导数对权重进行上、下调整以减少误差。循环神经网络的参数同样可以通过梯度下降算法进行学习。与反向传播的BPTT算法不同的是,实时循环学习通过前向传播的方式来计算梯度。
随时间反向传播算法
与前馈神经网络不同,循环神经网络(RNN)在处理时间序列数据时,不仅存在层间的空间关系,还包含时间维度上的联系。为了在时间序列上计算梯度,RNN使用一种特殊的反向传播方法——随时间反向传播(BPTT)。在BPTT中,将RNN沿时间轴展开,每个时间步骤都视为一个独立的网络层。这样,RNN可以按照前馈网络的方式更新权重,视整个序列为静态输入。
RNN通过展开转换成前馈网络结构,简化了权重更新过程。尽管表面上看起来类似前馈网络,但RNN各时间步中的隐含层实际上是同一网络的不同时间实例,且所有时间步共享相同的参数。当处理长时间序列时,由于时间步数量增多,BPTT算法的计算量极大。为了减轻计算负担,可以采用截断时间步的策略,控制反向传播的深度。
实时循环学习算法
实时循环学习算法(Real-Time Recurrent Learning,RTRL)与随时间反向传播(BPTT)不同,它通过前向传播的方式实时计算梯度。
假设循环神经网络中第时刻的状态为
,
在RTRL中,循考虑环神经网络在某一时刻t的状态,并计算该状态关于网络参数的偏导数。
从第一个时刻开始,RTRL不仅计算网络的隐状态,还按顺序前向计算这些偏导数。每到一个时刻,如果存在监督信息,即有相应的损失函数,就能计算出损失函数对这些偏导数的依赖。这使得在每个时间点,算法都能实时地计算出损失函数关于参数的梯度,并据此更新参数。这种方法允许参数的实时更新,无需等到序列结束,从而适用于在线和实时处理场景。
梯度下降算法
梯度下降算法(Gradient Descent)是神经网络训练中最常用的一种优化算法。无论是经典的神经网络还是深度学习的神经网络,基本都可以采用梯度下降算法来进行网络训练,其主要思想是通过不断迭代找到目标函数的最小值。根据处理的训练数据的不同,对网络权重进行更新,梯度下降算法主要有以下三种形式。
优化策略
为了让让算法能更快收敛,使得训练速度加快,在神经网络模型的搭建中,通常会制定相应的优化策略,优化是神经网络建模中极其重要的环节,它直接决定了模型的训练时间和投入产出的性价比。
网络正则化
正则化(Regularization)是一类通过限制模型复杂度,从而避免过拟合,提高泛化能力的方法,比如引入约束、增加先验、提前停止等。在传统的机器学习中,提高泛化能力的方法主要是限制模型复杂度,比如采用和正则化等方式。
和正则化是机器学习中最常用的正则化方法,通过约束参数的和范数来减小模型在训练数据集上的过拟合现象。通过加入和正则化,优化问题可以写为。
其中为损失函数;为训练样本数量;为待学习的神经网络;为其参数;为范数函数;的取值通常为代表和范数;为正则化系数。
丢弃法
在训练深度神经网络时,特别是在过度参数化(Over-Parameterization)时,和正则化的效果往往不如浅层机器学习模型中显著,因此训练深度学习模型时,往往还会使用其他的正则化方法,比如丢弃法。当训练一个深度神经网络时,可以随机丢弃一部分神经元(同时丢弃其对应的连接边)来避免过拟合,这种方法称为丢弃法。
当在循环神经网络上应用丢弃法时,不能直接对每个时刻的隐状态进行随机丢弃,这样会损害循环网络在时间维度上的记忆能力。一种简单的方法是对非时间维度的连接(即非循环连接)进行随机丢失。
然而根据托马斯·贝叶斯学习的解释,丢弃法是一种对参数的采样,每次采样的参数需要在每个时刻保持不变。因此,在对循环神经网络上使用丢弃法时,需要对参数矩阵的每个元素进行随机丢弃,并在所有时刻都使用相同的丢弃掩码,这种方法称为变分丢弃法。
参数初始化
神经网络的参数学习是一个非凸优化问题。当使用梯度下降法来进行优化网络参数时,参数初始值的选取十分关键,关系到网络的优化效率和泛化能力。参数初始化的方式通常有预训练初始化、随机初始化和固定值初始化等。预训练初始化使用已有模型的参数作为新模型的起点,以加快学习速度。随机初始化通过随机数为模型参数设定起始值,保证训练时的多样性和探索性。固定值初始化在需要时使用,将参数设定为特定值,以适应模型对初值敏感的情况。
超参数优化
在神经网络中,除了可学习的参数之外,还存在很多超参数,这些超参数对网络性能的影响也很大,不同的机器学习任务往往需要不同的超参数。常见的超参数有以下三类:
(1)网络结构,包括神经元之间的连接关系、层数、每层的神经元数量、激活函数的类型等;
(2)优化参数,包括优化方法、学习率、小批量的样本数量等;
(3)正则化系数,包括L1正则化、L2正则化、噪声注入系数等。
对于超参数的配置,比较简单的方法有网格搜索、随机搜索、和神经架构搜索等。网格搜索(Grid Search)通过尝试所有超参数的组合来寻址合适一组超参数配置。随机搜索对超参数进行随机组合,然后选取一个性能最好的配置。神经架构搜索利用一个控制器来生成另一个子网络的架构描述。
归一化
归一化(Normalization)方法泛指把数据特征转换为相同尺度的方法,比如把数据特征映射到[0,1]或[−1,1]区间内,或者映射为服从均值为0、方差为1的标准正态分布。常见的归一化方法包括最小最大值归一化、标准化、白化病等。最小最大值归一化通过缩放将每一个特征的取值范围归一到[0,1]或[−1,1]之间。标准化将每一个维特征都调整为均值为0,方差为1。白化是用来降低输入数据特征之间的冗余性。
层归一化
层归一化(Layer Normalization),是对一个中间层的所有神经元进行归一化。层归一化定义为
其中,为第层神经元的净输入,和分别代表缩放和平移的参数向量,和维数相同。
在循环神经网络中,层归一化可以对循环神经层进行归一化操作。假设在时刻,循环神经网络的隐藏层为,其层归一化的更新为
其中输入为为第时刻的输入,和为网络参数。在标准循环神经网络中,循环神经层的净输入一般会随着时间慢慢变大或变小,从而导致梯度爆炸或消失。而层归一化的循环神经网络可以有效地缓解这种状况。
梯度截断
在基于梯度下降的优化过程中,如果梯度突然增大,用大的梯度更新参数反而会导致其远离最优点。为了避免这种情况,当梯度的模大于一定阈值时,就对梯度进行截断,称为梯度截断(Gradient Clipping)。
在下图中,曲面为只有一个隐藏神经元的循环神经网络的损失函数,其中和为参数。假如初始值为0.3,损失函数为。损失函数关于参数和的梯度在某个区域会突然变大。
梯度截断是一种比较简单的启发式方法,把梯度的模限定在一个区间,当梯度的模小于或大于这个区间时就进行截断。一般截断的方式有以下几种:
按值截断:在第次迭代时,梯度为,给定一个区间,如果一个参数的梯度小于时,就将其设为;如果大于时,就将其设为,相关公式为
按模截断:按模截断是将梯度的模截断到一个给定的截断阈值,如果,保持不变。如果,令。截断阈值是一个超参数,也可以根据一段时间内的平均梯度来自动调整。在训练循环神经网络时,按模截断是避免梯度爆炸问题的有效方法。实验中发现,训练过程对阈值并不十分敏感,通常一个小的阈值就可以得到很好的结果。
应用模式
序列到类别模式
序列到类别模式主要用于序列数据的分类问题:输入为序列,输出为类别。比如在文本分类中,输入数据为单词的序列,输出为该文本的类别。
假设一个样本为一个长度为的序列,输出为一个类别。可以将样本按不同时刻输入到循环神经网络中,并得到不同时刻的隐藏状态。可以将看作整个序列的最终表示(或特征),并输入给分类器进行分类(如图a所示),即。其中,可以是简单的线性分类器(比如Logistic回归)或复杂的分类器(比如多层前馈神经网络)。
除了将最后时刻的状态作为整个序列的表示之外,还可以对整个序列的所有状态进行平均,并用这个平均状态来作为整个序列的表示(如图b所示),即。
同步的序列到序列模式
同步的序列到序列模式主要用于序列标注(序列 Labeling)任务,即每一时刻都有输入和输出,输入序列和输出序列的长度相同。比如在词性标注(Part-of-Speech Tagging)中,每一个单词都需要标注其对应的词性标签。
在同步的序列到序列模式中,输入为一个长度为的序列,输出为序列样本按不同时刻输入到循环神经网络中,并得到不同时刻的隐状态。每个时刻的隐状态代表了当前时刻和历史的信息,并输入给分类器得到当前时刻的标签,即。
异步的序列到序列模式
异步的序列到序列模式也称为主轴编码器-解码器(Encoder-Decoder)模型,即输入序列和输出序列不需要有严格的对应关系,也不需要保持相同的长度。比如在机器翻译中,输入为源语言的单词序列,输出为目标语言的单词序列。
在异步的序列到序列模式中,输入为长度为的序列,输出为长度为的序列。异步的序列到序列模式一般通过先编码后解码的方式来实现,先将样本按不同时刻输入到一个循环神经网络(编码器)中,并得到其编码,然后再使用另一个循环神经网络(解码器),得到输出序列。为了建立输出序列之间的依赖关系,在解码器中通常使用非线性的自回归模型。令和分别为用作编码器和解码器的循环神经网络,则编码器-解码器模型可以写为
其中为分类器,为预测输出的向量表示。在解码器通常采用自回归模型,每个时刻的输入为上一时刻的预测结果。
挑战
梯度消失和梯度爆炸:循环神经网络虽然理论上任意两个时间步间均存在依赖,但在训练过程中并不能很好地学习到远距离位置间的依赖,主要原因就在于梯度消失和梯度爆炸问题。梯度消失是指在RNN训练过程中,梯度携带的误差通过梯度反向传播更新网络权值时,梯度趋近0,参数的反向传播更新变得不再明显,这将会使得长数据序列的学习变得困难。梯度爆炸是指在训练过程中,由于大的错误梯度累积,使得模型权值参数更新出现指数级的增长,梯度趋近无穷大,导致训练时间越长,模型的表现和准确率都变得更差。
激活函数较小或较远:激活函数的导数通常为(0,1)之间的小数,Sigmoid激活函数的导数值区间(0,1/4],更实用一些的tanh激活函数的导数值区间为(0,1],当激活函数的导数值较小时,它的累乘会导致整体梯度值很小,使得模型的迭代优化过程难以进行。而且,当这两个激活函数的输入远离原点时,函数图像就会趋于平缓,导数值接近0,梯度消失问题难以避免。
权重矩阵特征值过大或过小:当权重的取值超出了一定范围,它的累乘就会导致梯度值呈指数增长,也就是梯度爆炸问题,使得模型的迭代优化过程剧烈震荡,难以收敛。当权重矩阵的特征值大于1时,则可能发生梯度爆炸;而当权重矩阵的最大特征值过小,同样可能导致梯度消失。
信息传递的单向性:除梯度消失和梯度爆炸问题外,基本循环神经网络中信息传递的单向性也会导致部分信息的丢失。在语音识别中,由于协同发音,当前声音作为音素的正确解释可能取决于未来几个音素,甚至潜在的可能取决于未来的几个词,因为词与附近的词之间存在的语义依赖,如果当前的词有两种声学上合理的解释,可能就要在更远的未来和过去寻找信息区分它们。然而,基本循环神经网络的结构决定其只能捕捉从前到后的单向信息。
应用领域
自然语言处理
自然语言数据是典型的序列数据,因此对序列数据学习有一定优势的循环神经网络在自然语言处理问题中有得到应用。在语音识别中,循环神经网络可被应用于端到端建模,例如有研究使用长短期记忆神经网络单元构建的双向深度循环神经网络成功进行了英语文集TIMIT的语音识别,其识别准确率超过了同等条件的隐马尔可夫模型和深度前馈神经网络。
在语音合成(speech synthesis)领域,有研究将多个双向长短期记忆神经网络相组合建立了低延迟的语音合成系统,成功将英语文本转化为接近真实的语音输出。循环神经网络也被用于端到端文本语音(Text-To-Speech,TTS)合成工具的开发,例子包括Tacotron、Merlin等。
剩余使用寿命预测
剩余使用寿命(Remaining Useful Life,RUL)是指从当前时间点到产品使用寿命结束之间的时间段。RUL预测是预测性维护(Predictive Maintenance)最重要的组成部分。准确的RUL预测有助于将计划维护转向预测性维护,有效减少维护成本和避免因重大设备故障带来的灾难性后果。
准确的RUL预测有助于将计划性维护转变为预测性维护,有效减少维护成本并避免重大设备故障带来的灾难性后果。在RUL预测的应用中,往往需要使用传感器收集有时间序列特征的数据。随着RNN算法的改进、高效算力、与其他模型的结合以及基准数据集等多方面的推进,剩余使用寿命预测领域的鲁棒性研究、泛化性研究和优化预测模型将会取得新的突破。
超声前列腺分割
基于循环神经网络的超声前列腺分割算法可以先后通过先验知识、每点处作定长法线的方式缩小边界点的搜索范围,避开前列腺内外部的大量噪声伪影,再将法线覆盖的区域按序提取叠加形成窄带序列,按正向和反向分别输入到RNN中进行训练推导,Bidirectional RNN同时学习前列腺边界序列的历史信息和未来信息来对边界作合理推断。将这种包含了双向的上下文信息的轻量模型得到的新的经过每一段重定位的窄带序列反序列化到原图上,这种分割方法实现了不错的分割效果,精度高于大部分传统深度学习模型。
火灾风险预测
火灾风险预测的基本思想是利用机器学习方法,将历史火灾的发生与单位、建筑等多种特征关联起来,采用循环神经网络算法进行建模分析,获得单位及建筑等多种特征(如单位性质、行业、职工人数、建筑年龄、建筑面积、耐火等级、消防车道数等)与其火灾风险的数学模型,通过输入历史数据样本不断训练调整模型参数,从而得到一个稳定高效的火灾风险预测模型。
实测结果表明,将循环神经网络算法应用于火灾风险预测模型训练,可以一次建模、有效预测火灾风险。将模型预测的单位火灾风险量化排序,与“双随机一公开”结合、优化单位抽查规则,可以显著提升日常消防监督检查的效率和精准度。未来将针对社会单位和住宅小区分别独立建模,进一步提升算法模型拟合与火灾风险预测性能。