循环神经网络_循环神经网络rnn - CSDN
循环神经网络 订阅
循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network) [1]  。对循环神经网络的研究始于二十世纪80-90年代,并在二十一世纪初发展为深度学习(deep learning)算法之一 [2]  ,其中双向循环神经网络(Bidirectional RNN, Bi-RNN)和长短期记忆网络(Long Short-Term Memory networks,LSTM)是常见的的循环神经网络 [3]  。循环神经网络具有记忆性、参数共享并且图灵完备(Turing completeness),因此在对序列的非线性特征进行学习时具有一定优势 [4]  。循环神经网络在自然语言处理(Natural Language Processing, NLP),例如语音识别、语言建模、机器翻译等领域有应用,也被用于各类时间序列预报。引入了卷积神经网络(Convoutional Neural Network,CNN)构筑的循环神经网络可以处理包含序列输入的计算机视觉问题。 展开全文
循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network) [1]  。对循环神经网络的研究始于二十世纪80-90年代,并在二十一世纪初发展为深度学习(deep learning)算法之一 [2]  ,其中双向循环神经网络(Bidirectional RNN, Bi-RNN)和长短期记忆网络(Long Short-Term Memory networks,LSTM)是常见的的循环神经网络 [3]  。循环神经网络具有记忆性、参数共享并且图灵完备(Turing completeness),因此在对序列的非线性特征进行学习时具有一定优势 [4]  。循环神经网络在自然语言处理(Natural Language Processing, NLP),例如语音识别、语言建模、机器翻译等领域有应用,也被用于各类时间序列预报。引入了卷积神经网络(Convoutional Neural Network,CNN)构筑的循环神经网络可以处理包含序列输入的计算机视觉问题。
信息
外文名
Recurrent Neural Network, RNN
提出时间
1986-1990年
提出者
M. I. Jordan,Jeffrey Elman
类    型
机器学习算法,神经网络算法
中文名
循环神经网络
应    用
自然语言处理,计算机视觉
所属学科
人工智能
循环神经网络历史
1933年,西班牙神经生物学家Rafael Lorente de Nó发现大脑皮层(cerebral cortex)的解剖结构允许刺激在神经回路中循环传递,并由此提出反响回路假设(reverberating circuit hypothesis) [5]  。该假说在同时期的一系列研究中得到认可,被认为是生物拥有短期记忆的原因 [6-7]  。随后神经生物学的进一步研究发现,反响回路的兴奋和抑制受大脑阿尔法节律(α-rhythm)调控,并在α-运动神经(α-motoneurones )中形成循环反馈系统(recurrent feedback system) [8-9]  。在二十世纪70-80年代,为模拟循环反馈系统而建立的一些数学模型为RNN带来了启发 [10-12]  。1982年,美国学者John Hopfield基于Little (1974) [12]  的神经数学模型使用二元节点建立了具有结合存储(content-addressable memory)能力的神经网络,即Hopfield神经网络 [13]  。Hopfield网络是一个包含递归计算和外部记忆(external memory)的神经网络,其内部所有节点都相互连接,并使用能量函数进行非监督学习 [14]  。1986年,Michael I. Jordan在分布式并行处理(parallel distributed processing)理论下提出了Jordan网络 [15]  。Jordan网络的每个隐含层节点都与一个状态单元(state units)相连以实现延时输入,并使用logistic函数作为激励函数 [15]  。Jordan网络使用反向传播算法(Back-Probagation, BP)进行学习,并在测试中提取了给定音节的语音学特征 [15]  。之后在1990年,Jeffrey Elman提出了第一个全连接的RNN,即Elman网络 [16]  。Jordan网络和Elman网络都从单层前馈神经网络出发构建递归连接,因此也被称为简单循环网络(Simple Recurrent Network, SRN) [4]  。在SRN出现的同一时期,RNN的学习理论也得到发展。在反向传播算法被提出后 [17]  ,学界开始尝试在BP框架下对循环神经网络进行训练 [15]  [2]  [18]  。1989年,Ronald Williams和David Zipser提出了RNN的实时循环学习(Real-Time Recurrent Learning, RTRL) [19]  。随后Paul Werbos在1990年提出了随时间反向传播算法(BP Through Time,BPTT) [20]  。1991年,Sepp Hochreiter发现了循环神经网络的长期依赖问题(long-term dependencies problem),即在对长序列进行学习时,循环神经网络会出现梯度消失(gradient vanishing)和梯度爆炸(gradient explosion)现象,无法掌握长时间跨度的非线性关系 [21-22]  。为解决长期依赖问题,RNN的改进不断出现,较重要的包括Jurgen Schmidhuber及其合作者在1992和1997年提出的神经历史压缩器(Neural History Compressor, NHC) [23]  和长短期记忆网络(Long Short-Term Memory networks, LSTM) [24]  ,其中包含门控的LSTM受到了关注。同在1997年,M. Schuster和K. Paliwal提出了具有深度结构的双向循环神经网络(Bidirectional RNN, BRNN),并对其进行了语音识别试验 [25]  。双向和门控构架的出现提升了RNN的学习表现,在一些综述性研究中,被认为是RNN具有代表性的研究成果 [2]  。十一世纪后,随着深度学习理论的出现和数值计算能力的提升,拥有更高复杂度的RNN开始在自然语言处理问题中得到关注。2005年,Alex Graves等将双向LSTM应用于语音识别,并得到了优于隐马尔可夫模型(Hidden Markov Model, HMM)的表现 [26]  。2014年,K. Cho提出了门控循环单元网络(Gated Recurrent Unit networks, GRU),该方法是LSTM之后另一个受到关注的RNN门控构架 [27]  。2010年,Tomas Mikolov及其合作者提出了基于RNN的语言模型 [28]  [29]  。2013-2015年, Y. Benjo、D. Bahdanau等提出了编码器-解码器、自注意力层等一系列RNN算法,并将其应用于机器翻译问题 [30-31]  。为语言模型设计的RNN算法在随后的研究中启发了包括ransformers、XLNet、ELMo、BERT等复杂构筑 [32-34]  。
收起全文
精华内容
参与话题
  • 本系列讲解循环神经网络RNN和LSTM的所有知识点,学完本系列课程将对RNN和LSTM的理论知识有清晰的认识,同时能够将理论结合实践应用到工作中。
  • 循环神经网络(RNN)入门

    千次阅读 2018-05-05 09:44:51
    之前学习了卷积神经网络(CNN),在这里再简单介绍一下卷积神经网络的原理。一个典型的卷积神经网络为:输入 -> 卷积 -> RelU -> 池化 -> RelU -> 卷积 -> ... ->...

    之前学习了卷积神经网络(CNN),在这里再简单介绍一下卷积神经网络的原理。


    一个典型的卷积神经网络为:

    输入 -> 卷积 -> RelU -> 池化 -> RelU -> 卷积 -> ... -> 池化 -> 全连接层 -> 输出

    对于CNN来说,并不是所有上下层神经元都能直接相连,而是通过“卷积核”作为中介。而通过max pooling等操作可以进一步提高鲁棒性。CNN不仅可以用于图像识别,也可以用于语音识别等领域。

    在CNN中,每层神经元的信号只能向上一层传播,样本的处理在各个时刻独立,因此又被称为前向神经网络(Feed-forward Neural Networks)。CNN和DNN的缺陷在于,仅适合处理固定维度的输入及输出。DNN和CDD不适合解决不固定长度的序列问题。例如:机器翻译就是一个序列问题。RNN的优势在于,适合处理序列问题。

    RNN

    在RNN中,神经元的输出可以在下一时刻直接作用到自身,即第i层神经元在m时刻的输入,除了(i-1)层神经元在该时刻的输入外,还包括其自身在(m-1)时刻的输出。将RNN展开,我们得到如下图所示的关系:


    循环神经网络的这种结构非常适合处理前后有依赖关系的数据样本。由于这种链式的结构,循环神经网络与序列和列表紧密相连。因此,RNN适合处理基于时间的序列,例如:一段连续的语音,一段连续的手写文字。以语言模型为例,根据给定句子中的前t个字符,然后预测第t+1个字符。假设我们的句子是“你好世界”,使用前馈神经网络来预测:在时间1输入“你”,预测“好”,时间2向同一个网络输入“好”预测“世”。整个过程如下图所示:


    我们可以根据前n个字符预测第t+1个字符。在这里,n=1。我们可以增大n来使得输入含有更多信息。但是我们不能任意增大n,因为这样通常会增在模型的复杂度,从而导致需要大量数据和计算来训练模型。

    LSTM

    RNN也有梯度消失的问题,因此很难处理长序列的序列。LSTM是一种特殊的RNN,能够解决长期依赖的问题,避免常规RNN的梯度消失。LSTM是长短时记忆单元,具有长期记住信息的特性。

    在标准RNN中,重复模块具有简单的结构,例如单tanh层,如下图所示:


    h(t)一方面用于当前层的模型损失计算,一方面用于下一层h(t+1)计算。

    LSTM的结构比RNN的复杂得多,如下图所示:


    LSTM的关键是细胞状态,即贯穿图表顶部的水平线。


    LSTM为细胞状态移除或者增加信息,这种精心设计的结构叫做门。LSTM有三种门结构。

    1、遗忘门


    顾名思义,遗忘门决定丢掉细胞状态的哪些信息。根据h(t-1)和x(t),遗忘门为状态C(t-1)输出一个介于0到1之间的数字,0表示“完全丢弃”,1表示”完全接受“。数学表达式为:


    2、输入门


    输入门由两个部分构成:第一部分为sigmoid激活函数,输出为i(t),决定更新哪些值;第二部分为tanh激活函数,输出为~C(t)。i(t)与~C(t)相乘后的结果用于更新细胞状态,数学表达式为:


    3、输出门

    经过遗忘门和输入门,细胞状态更新为:


    最后,我们应该决定输出是什么。输出基于上述细胞状态,但是需要过滤。输出门如下图所示:


    首先,我们使用sigmoid层决定输出细胞状态的哪些部分。然后,我们令细胞状态通过tanh层,输出结果与sigmoid层的输出结果相乘。数学公式为:


    LSTM的前向传播算法

    (1)更新遗忘门输出:


    (2)更新输入门输出:


    (3)更新细胞状态:


    (4)更新输出门输出:


    其他参考

    有一篇博客具体讨论了LSTM的详细过程【深度学习】包教包会LSTM



    展开全文
  • 循环神经网络(RNN)简介

    万次阅读 2018-09-01 17:19:22
    人工神经网络介绍参考: https://blog.csdn.net/fengbingchun/article/details/50274471  ... 这里在以上两篇基础上整理介绍循环神经网络: 前馈网络可以分为若干”层”,各层按信号传输先后顺序依次排列...

    人工神经网络介绍参考: https://blog.csdn.net/fengbingchun/article/details/50274471 

    卷积神经网络介绍参考: https://blog.csdn.net/fengbingchun/article/details/50529500 

    这里在以上两篇基础上整理介绍循环神经网络:

    前馈网络可以分为若干”层”,各层按信号传输先后顺序依次排列,第i层的神经元只接受第(i-1)层神经元给出的信号,各神经元之间没有反馈。前馈型网络可用一有向无环路图表示。前馈神经网络用于处理有限的,定长的输入空间上的问题是很有优势的。使用越多的隐藏层节点就能学习到越多的信息,能更好的处理特定的任务。而循环神经网络(Recurrent Neural Networks, RNN)处理方式与前馈神经网络有着本质上的不同,循环神经网络只处理一个单一的输入单元和上一个时间点的隐藏层信息。这使得循环神经网络能够更加自由和动态的获取输入的信息,而不受到定长输入空间的限制。

    传统神经网络对于声音类似的时间序列信号,由于网络的单向无反馈连接方式使得网络只能处理输入信号所包含时间段的信号,对于该信号所包含时间段以外的信号在处理本段信号时常没有任何参考,而常见时间序列信号都和它所在时间段前后时间区间的背景信号有着密切的联系。例如,对包含”早上好”语义的语音进行识别时,训练时同时用包含”早上好”的这段语音分别对传统神经网络和循环神经网络进行训练,在处理包含”好”所在的语音信号时,以往的神经网络不会参考包含”早”或者”上”的语音信号只能对网络输入语音信号”好”进行处理分析,而对于循环神经网络而言它会根据历史数据信息结合”好”语音所处的时间位置参考该时间位置前面的语音信号”早上”更加容易的识别出语义为”上”的语音信号。包含这种潜在能力的原因在于以往的前馈神经网络神经元仅为顺序连接,而循环神经网络存在神经元反馈连接,这种形式的连接使得网络能够以一种激励的形式存储最近时间段的输入数据信息(短时记忆),而网络的这种潜在意义在实际应用方面着广泛的意义。

    RNN之所以称为循环神经网络,即”一个序列的当前输出与前面的输出也是有关的”。具体体现在后面层数的输入值要加入前面层的输出值,即隐藏层之间不再是不相连的而是有连接的。

    一个多层感知机仅仅是将输入映射到输出向量,然而RNN原则上是将之前输入的整个历史映射到每个输出。所以与MLPs的全局逼近理论对应的是RNN拥有足够的隐藏节点个数可以以任意精度逼近任意可度量的序列到序列映射。环状连接最重要的特点是可以将之前的”记忆”保留在网络的中间状态,而这个状态会影响最终的网络输出。

    RNN的前向传播和单个隐藏层的MLP基本是一样的,除了当前点的激活值是通过当前的输入和隐藏层在上一次激活值一起计算得到。

    和标准的反向传播算法一样,循环神经网络中的反向传播算法(BackPropagation Through Time, BPTT)也需要不断的使用链式法则。微小的不同之处是对于循环网络,目标函数依赖的隐藏层激活值不仅将激活值传递到输出层,并且会影响下一个时间片段的隐藏层。

    循环神经网络的定义

    循环神经网络的单个神经元模型如下图所示,与以往的神经元相比它包含了一个反馈输入,如果将其按照时间变化展开可以看到循环神经网络单个神经元类似一系列权值共享前馈神经元的依次连接,连接后同传统神经元相同随着时间的变化输入和输出会发生变化,但不同的是循环神经网络上一时刻神经元的”历史信息”会通过权值与下一时刻的神经元相连接,这样循环神经网络在t时刻的输入完成与输出的映射且参考了t之前所有输入数据对网络的影响,形成了反馈网络结构。虽然反馈结构的循环神经网络能够参考背景信号但常见的信号所需要参考的背景信息与目标信息时间相隔可能非常的宽泛,理论上循环神经网络可以参考距离背景信息任意范围的参考信息,但实际应用过程中对于较长时间间隔的参考信息通常无法参考。

    对于上述问题主要在于网络训练时需要计算的网络代价函数梯度,而梯度计算与神经元之间连接的权值密切相关,在训练学习过程中很容易造成梯度爆炸或者梯度消失问题。常见的网络训练学习算法以反向传播算法或者实时递归学习算法为主,随着时间推移数据量逐步增大以及网络隐层神经元自身循环问题,这些算法的误差在按照时间反向传播时会产生指数增长或者消失问题。由于时间延迟越来越长从而需要参考的信号也越来越多,这样权值数量也会出现激增,最终,很小的误差经过大量的权值加和之后出现指数式增长,导致无法训练或者训练时间过长。而梯度消失问题指网络刚开始输入的具有参考价值的数据,随着时间变化新输入网络的数据会取代网络先前的隐层参数导致最初的有效信息逐步被”忘记”,如果以颜色深浅代表数据信息的有用程度,那么随着时间的推移数据信息的有用性将逐步被淡化。这两种问题都会导致网络的实际建模缺陷,无法参考时间间隔较远的序列状态,最终在与网络相关的分类识别类似的应用中仍旧无法获得好的实践效果。

    一个最简单的循环神经网络如下图所示:这样的神经网络一共有3层,分别是输入层x,隐藏层h和输出层y。定义每一层的节点下标如下:k表示的是输出层的节点下标,j表示的是当前时间节点隐藏层的节点下标,l表示的是上一时间节点隐藏层的节点下标,i表示的是输入层的节点下标。

    对于一个普通的单输入前馈神经网络来说,隐藏层某一时刻某一节点的激活netj(t)可以用公式表示:

    其中,n表示的是输入层节点的个数,θj表示的是一个偏置参数,(t)表示的是t时间节点。但是在循环神经网络中,隐藏层在某一时刻某个节点的激活不再单单受到输入层的影响,也受到上一时刻的隐藏层状态的影响。隐藏层的节点状态被”循环”地利用与神经网络之中,这就组成了一个循环神经网络。如上图所示,这样隐藏层节点的激活netj(t)的计算方式被更新为:

    其中,m表示的是隐藏层节点的总个数。f表示的是隐藏层节点的激活函数。对于一个神经网络来说,激活函数有多种选择,例如,sigmoid函数,tanh函数或者二值函数都是可选的激活函数。

    对于输出层的激活计算循环神经网络与常见的前馈神经网络并没有太大的区别,都可以使用如下公式来计算:

    其中g表示的是输出层节点的激活函数(可以与隐藏层节点的f是同一个激活函数)。

    循环神经网络的训练

    当一个神经网络结构的每一个激活函数都是可导的并且整个网络的预先设计输出是可以获得时,该神经网络的训练可以通过反向传播算法(Back Propagation, BP)来学习。反向传播算法的基础是梯度下降优化法。对于任何一个需要优化的权重参数,计算它们关于优化目标函数的梯度并且根据梯度更新权重参数是反向传播算法的基本思想。

    常用的优化目标函数有和方差函数(Summed Squard Error, SSE),交叉熵函数(Cross Entropy)等。这里以和方差函数为例,采用随机梯度下降法,分析循环神经网络的学习过程。和方差的目标函数一般形式如下所示:

     随机梯度下降法是不处理所有的样本,每次只处理一个样本,针对一个样本就对这个神经网络进行一次更新,再读入下一个样本,依次循环来更新整个神经网络。

    根据梯度下降算法的思想,所有的权重参数都需要被相应的负梯度乘以一个学习率(Learning Rate)的值更新,对于输出层与隐藏层之间的参数w,其更新值可以由以下公式表示:

    其中α表示的是学习率。但是直接对于这个函数求导并不容易,在此我们先定义残差δ,来方便计算导数。对于输出层来说,残差的计算公式如下:

    根据上述公式关于残差的计算,我们可以得到权重参数w中某一个节点的更新公式:

    这样计算起来就会方便的多,同理对于隐藏层的节点,我们也可以计算它们的残差:

    根据这个残差节点的公式,我们可以得到权重v的更新公式:

    同理,对于循环部分的权重u,我们可以得到如下的更新公式:

    一般而言,为了简化计算,会选择导数相对好求的函数作为激活函数以提升训练的效率。例如逻辑斯蒂函数(Logistic Function):

    对于这样的一个激活函数,其求导就变得十分的方便,该函数的导数为g’(net)=g(net)(1-g(net))。

    一般而言,训练之初循环神经网络是随机初始化的,而初始的输入隐藏层一般采用随机小实数向量或者是全相等小实数向量。

    长短时间记忆单元

    为了解决循环神经网络在训练过程中的梯度问题,循环神经网络神经元在以往的循环神经元结构基础上进行改进,1997年由Hochreiter和Schmidhuber提出了一种称作长短时间记忆单元(Long Short-Term MemoryLSTM)的特殊结构循环神经网络,最终Graves对该结构进行了进一步改良和推广,获得了巨大成功。该网络结构基于梯度学习算法能够避免上述提及的梯度问题且对于存在噪声或不可压缩的输入序列数据依然可以参考时间间隔在1000 时间步长以上的数据信息。经过大量的实验结论证明LSTM网络已经解决了传统循环神经网络无法解决的问题,在蛋白质结构预测,语音识别及手写字符识别等常见研究方面取得了新的突破。

    LSTM网络由一个一个的单元模块组成,每个单元模块一般包含一个或者多个反馈连接的神经元及三个乘法单元,正是由于这些乘法单元的存在我们可以用这些乘法单元实现数据是否输入、输出及遗忘摒弃。常用取值为’0’或’1’的输入门,输出门和遗忘门与对应数据相乘实现如下图所示,输入门控制是否允许输入信息输入到当前网络隐层节点中,如果门取值为’1’则输入门打开允许输入数据,相反若门取值为’0’,则输入门关闭不允许数据输入;输出门控制经过当前节点的数据是否传递给下一个节点,如果门取值为’1’,则当前节点的数据会传递给下一个节点,相反若门取值为’0’,则不传递该节点信息;遗忘门控制神经元是否摒弃当前节点所保存的历史时刻信息,该门通过一种称为”peephole”的连接方式和内部神经元相连这种连接方式可以提高LSTM在时间精度及计算内部状态相关研究的学习能力,若门取值为’1’则保留以往的历史信息,相反若门取值为’0’,则清除当前节点所保存的历史信息。除了多增加的三个信息输入控制门以外,模块内部的神经元连接方式也有所不同,线性性质的内部神经元以一个权值固定为1的循环自连接方式连接称为”Constant Error Carousel”(CEC),CEC连接保证了误差或梯度随着时间的传播不会发生消失现象。当没有新的输入或者误差信号进入神经元时,CEC的局部误差既不增长也不下降保持不变状态,最终能够在前向传播和反向传播时都能通过输入输出门保证不必要的信息进入到网络。对较远时间步长的信号参考而言,更远时间步长的有效数据信息可以通过各个门的组合开或关保存下来,而无效的数据信息可以被摒弃其对应的参数无需保存,最终前面提及的梯度消失问题得到遏制。例如,当有参考价值的有效信息出现时,我们打开输入门使有效数据可以输入,当有效数据输入网络后输入门再保持关闭状态,随着时间的推移如果输入门一直保持关闭状态,那么,网络新输入的数据将无法替换单元以前的激励输出,在任意时刻只要网络输出门打开该有效数据信息都可以随时参考,从而网络实现了时间距离步长更远的有效数据信息参考。

    从以上的分析来看单个LSTM网络与最初的循环神经网络除了隐层的非线性单元被替换成为了记忆模块以外别的方面都非常相似,但LSTM网络内部隐层连接方面却有了非常大的变化。LSTM网络隐层由一系列具有循环连接的记忆单元模块所构成,这些记忆单元模块类似于计算机的内存芯片可以存储对应的状态信息,如下图所示,网络输入层和输出层节点个数都为3,图中各个记忆单元所包含的神经元个数取2,神经元输出与所有的控制门、所有的神经元输入及网络所有输出节点都保持全连接状态,网络输入层各个节点与各个神经元的输入及状态控制门都为全连接形式,此外网络输出层节点和输入层节点也有附加的快捷连接。网络各个单元通过如上所述的连接方式基本就可以构建成对应的LSTM网络,但是,各个网络之间因为应用范围不同还是有部分连接差异。

    双向LSTM网络

    虽然以上提及的网络能够对数据点所在时刻的”历史”信息进行参考,但同时参考数据点所在时刻的”未来”信息更有利于我们分析数据。为了能对输入数据的背景信息更加有效的利用,一种沿着时间刻度前进和倒退的双向分离式网络结构被提出。假设每一层的网络都是一位专家,那么要合并两个专家的意见意味着他们的意见是相互关联的。实践证明Graves团队所改进的双方向结构LSTM网络输出确实与背景信息存在密切联系,且通过简单的线性或者对数合并算法就可以获得网络识别率的提高。

    如下图所示,双向循环神经网络前向传播层和后向传播层相互分离,如果没有后向传播层那么该网络结构和我们最早提到的前馈网络结构完全相同。网络输入节点同时和前向后向传播单元连接,对于前向传播层而言,上一时刻的输出状态作为下一时刻的输入状态;对于后向传播层而言,上一时刻的输入为下一时刻的输出状态,最终,前向传播输出和输入同时输出到网络输出节点。对于这样的网络组成形式,我们在同一网络结构中,可以直接用两个相反时间方向的输入信息来减少代价函数的误差而不需要额外的算法处理”未来”数据信息,较前面提及的传统循环神经网络方法更为简便。虽然双向循环神经网络结构发生了很大的变化,但是网络隐层中的两个传播层之间仍然互不连接,单个隐层网络完全可以看作是前馈网络结构,若仍旧采用传统网络训练时的反向传播算法,由于传播方向不同,前向传播层和后向传播层的神经元状态及输出与以往相比将不能同时进行。此外,对于t = 1时的前向层和t = T时的后向传播层它们的初始状态必须在训练之前给出。所以,网络训练方面我们可以参考部分以往循环神经网络的训练算法,只是训练算法因网络结构改变有所增加。

    2005年经过Graves等人的努力,完全参考双向循环神经网络结构的双向LSTM网络被引入到了语音识别领域,在TIMIT语音库相关的识别实验中超越了双向循环神经网络,多层感知机等传统网络的识别效果。除了识别效果有所提高外,相同结构下以LSTM替换循环网络神经元后,即使在普通配置的电脑运行环境下,双向LSTM网络仍然可以超越以往的网络训练时间达到最快的收敛速度,而前后背景信息参考后的充分权值微调是取得如此快训练时间的根本原因。

    以传统语音识别中音素(声音的最小组成单位)分类识别为例,受识别方式的影响网络训练必须要对训练数据进行初步处理:在标签数据中将语音中每个音素所在语音中的具体位置范围给出(如:标签0 230 d,数字0和230代表音素d存在于语音的起始位置为0,结束位置为230的区间位置),必须声音和标签必须严格对齐才能进行训练,然而包含音素位置范围的语音数据常通过人工方式处理得到。为此我们引入与概率相关的CTC(Connectionist Temporal Classification)声音分类识别,其中Temporal Classification指的是对序列长度大于或等于其对应标签的信号进行分类。CTC解决声音和标签严格对应问题的方法为引入新标签,在识别输出时除了样本类别标签外,在标签集加入代表空白输出的空白标签类别。

    CTC预测作为循环神经网络的最终输出部分主要包含softmax概率输出及概率解码两个部分,softmax概率输出部分用来计算每次网络输入信号所属标签的归属概率;概率解码用来计算所有信号输出标签的组合概率并结合该概率给出最终的输入信号的标签。

    以上整理的内容主要摘自:

    1. 《基于神经网络的篇章一致性建模》,2015年,硕论,哈尔滨工业大学

    2. 《基于循环神经网络的声学车型识别研究》,2015年,硕论,西安电子科技大学

    3. 《最少门结构的循环神经网络及其应用》,2016年,硕论,南京大学

    GitHub:https://github.com/fengbingchun/NN_Test

    展开全文
  • 循环神经网络(原理+代码)

    千次阅读 2019-08-13 14:31:30
      在传统的全连接神经网络中,从输入层到隐藏层再到输出层,每一层之间的节点是无连接的,因为输入和输出是独立的,所以这种普通的神经网络对于序列数据的处理是无能为力的。而现实中,绝大多数的数据都是序列数据...

    RNN(Recurrent Neural Network)
      在传统的全连接神经网络中,从输入层到隐藏层再到输出层,每一层之间的节点是无连接的,因为输入和输出是独立的,所以这种普通的神经网络对于序列数据的处理是无能为力的。而现实中,绝大多数的数据都是序列数据,比如音频、视频、文本等,都存在时间线,想要挖掘数据中的序列信息和语义信息,就需要神经网有更加特殊的结构,比如对于序列信息每一时刻的信息记忆能力。因此,RNN(Recurrent Neural Network)循环神经网络就应运而生,RNN循环神经网络相对于普通的全连接神经网络,其隐藏层多了一个信息记忆功能,即每一时刻隐藏层的输入不仅是输入层的输出,还包含上一时刻隐藏层的输出。所以,输出层每一时刻的输出都会考虑序列数据之前的信息。RNN在自然语言处理、图片描述、语音识别等领域有着广泛的应用。
    RNN的网络结构及前向传播
    这里写图片描述
      RNN的网络结构按时间展开如上图所示,其中x表示输入层、o表示输出层、s表示隐藏层,U、V、W表示权重参数。
      以t时刻为例,隐藏层st的输入除了当前时刻输入层的输出xt,还包含上一时刻隐藏层的输出状态st-1。RNN中隐藏层可以完成对信息的记忆,理论上RNN每一时刻的隐藏层都可以完成对上一时刻信息的记忆,也就是说在理论上RNN的隐藏层可以对信息无限记忆,处理任意长度的序列数据,但是在实际中会存在梯度消失或者梯度爆炸的问题,因此,在RNN中隐藏层st完成的只是信息的短时记忆。
    RNN中前向传播过程可以用如下公式表示:
    这里写图片描述
      式子1中,ot表示t时刻输出层的输出,g()表示输出层中神经元的激活函数,V表示t时刻隐藏层输出到输出层对应的权重参数;
      式子2中,st表示隐藏层t时刻的输出,f()表示隐藏层中神经元的激活函数,xt表示t时刻输入层的输出,st-1表示上一时刻隐藏层的输出,U表示输入层到隐藏层对应的权重参数,W表示上一时刻隐藏层输出到t时刻隐藏层的权重参数;
      从上面的公式可以看出,RNN循环神经网络与普通的全连接神经网络相比,隐藏层多了一个权重矩阵W。
      如果把式子2反复带入式子1中,可以得到:
    这里写图片描述
      从上面的结果可以看到,RNN中每一时刻的输出ot都是受前面历次输入xt、xt-1、xt-2…影响的,这也就是为什么说RNN可以处理序列数据的原因。
    RNN参数计算
      RNN中隐藏层参数(包括权重参数、偏置项)
         隐藏层参数 =(h + x)* h + h
      其中,h是隐藏层输出的状态向量的维度(该维度和隐藏层神经元个数一致),x是输入层的输出向量维度,(h + x)* h 是权重参数,h是隐藏层中偏置项个数。
    RNN长期依赖
      RNN的训练过程和全连接神经网络一样,都是采用反向传播算法通过计算梯度来更新参数。但是在RNN训练过程中会存在长期依赖问题,这是由于RNN在训练时会遇到梯度消失或者梯度爆炸,所谓梯度消失和梯度爆炸是指在训练时计算和反向传播时,梯度在每一时刻都是倾向于递增或者递减的,经过一段时间后,当梯度收敛到零(梯度消失)或发散到无穷大(梯度爆炸),此时,参数就不会再更新,也就是说后期的训练不会再对参数的更新产生影响。形象的说,长期依赖问题就是当时间间隔增大时,当前时刻隐藏层会丧失连接到远处信息的能力。
    这里写图片描述
      比如说,RNN在处理语言模型时,xo时刻输入的文本信息是“我家住在昆明市”,当时间间隔无限扩大,中间处理了很多其他的文本信息后,在t时刻突然输入的文本信息是“我在市政府上班”,那么此时神经网络模型就会无法理解这个市政府究竟指的是哪个城市,也就是说此时的隐藏层已经不具备记忆远处信息的能力了,这就是RNN中的长期依赖。
    双向循环神经网络
      有时候利用RNN在处理语言模型时,只是基于前面的文本信息是不够的,同时还要考虑后面的信息,综合判断才能够做出预测。
      比如下面这一句话:
      我的手机坏了,我打算()一部新手机。
      要预测()中出现的词,如果只是基于前面的文本信息,这里可能是修、买、或者心情不好,大哭一场等,但是如果考虑了后面的信息“一部新手机”,那么这里()出现“买”这个词的概率就最大。
    这里写图片描述
      双向循环神经网络的结构按时间展开如上,可以看到,在双向循环神经网络隐藏层中多了一个反向传输的隐藏层,其前向传播过程可以用下面公式表示:
         这里写图片描述
         这里写图片描述
      其中,g()表示输出层y2的激活函数,A2、A2’分别表示隐藏层正向、反向时输出,V、V’表示隐藏层到输出层的权重参数,f()表示隐藏层激活函数,x2表示输入,W、W’表示上一时刻隐藏层输出到当前时刻隐藏层的权重,U、U’表示输入值到隐藏层的权重。从公式中可以看出,正向和反向隐藏层不共享参数的。
    深层循环神经网络
      有时候当信息量太大时,简单RNN隐藏层是不能保证一次性记忆所有信息的,那么为了增加模型的表达能力,在有些循环神经网络隐藏层中会堆叠多个隐藏层,这样的神经网络我们成为深层循环神经网络。
    这里写图片描述
      深层循环神经网络按时间展开如上图所示。在深层循环神经网络中,隐藏层每一个循环体中参数是共享的,不同的循环体之间参数不共享。
    RNN案例实战
      利用深度学习工具keras建立一个RNN模型,处理IMDb在线电影数据库中影评数据,IMDb中包含50000项影评数据,分为训练集和测试集各25000项,每一项影评都带有情感分类标签(1:正面 ;0:负面)。

    #数据预处理
    from keras.datasets import imdb
    from keras.preprocessing import sequence
    from keras.preprocessing.text import Tokenizer
    
    import re
    re_tag = re.compile(r'<[^>]+>')
    
    def rm_tags(text):
        return re_tag.sub('', text)
    
    import os
    def read_files(filetype):
        path = "D:data/aclImdb/"
        file_list=[]
    
        positive_path=path + filetype+"/pos/"
        for f in os.listdir(positive_path):
            file_list+=[positive_path+f]
        
        negative_path=path + filetype+"/neg/"
        for f in os.listdir(negative_path):
            file_list+=[negative_path+f]
            
        print('read',filetype, 'files:',len(file_list))
           
        all_labels = ([1] * 12500 + [0] * 12500) 
        
        all_texts  = []
        
        for fi in file_list:
            with open(fi,encoding='utf8') as file_input:
                all_texts += [rm_tags(" ".join(file_input.readlines()))]
                
        return all_labels,all_texts
    
    y_train,train_text=read_files("train")
    
    y_test,test_text=read_files("test")
    
    token = Tokenizer(num_words=2000)
    token.fit_on_texts(train_text)
    
    x_train_seq = token.texts_to_sequences(train_text)
    x_test_seq  = token.texts_to_sequences(test_text)
    
    x_train = sequence.pad_sequences(x_train_seq, maxlen=100)
    x_test  = sequence.pad_sequences(x_test_seq,  maxlen=100)
    
    #建立RNN模型
    from keras.models import Sequential
    from keras.layers.core import Dense, Dropout, Activation
    from keras.layers.embeddings import Embedding
    from keras.layers.recurrent import SimpleRNN
    
    model = Sequential()
    
    model.add(Embedding(output_dim=32,
                        input_dim=2000, 
                        input_length=100))
    model.add(Dropout(0.2))
    
    model.add(SimpleRNN(units=16))
    
    model.add(Dense(units=256,activation='relu' ))
    model.add(Dropout(0.2))
    
    model.add(Dense(units=1,activation='sigmoid' ))
    
    model.summary()
    #模型训练
    model.compile(loss='binary_crossentropy', 
                  optimizer='adam', 
                  metrics=['accuracy'])
    
    train_history =model.fit(x_train, y_train,batch_size=100, 
                             epochs=10,verbose=2,
                             validation_split=0.2)
    
    import matplotlib.pyplot as plt
    def show_train_history(train_history,train,validation):
        plt.plot(train_history.history[train])
        plt.plot(train_history.history[validation])
        plt.title('Train History')
        plt.ylabel(train)
        plt.xlabel('Epoch')
        plt.legend(['train', 'validation'], loc='upper left')
        plt.show()
    
    show_train_history(train_history,'acc','val_acc')
    
    show_train_history(train_history,'loss','val_loss')
    
    # 评估模型的准确率
    
    scores = model.evaluate(x_test, y_test, verbose=1)
    scores[1]
    #预测结果
    predict=model.predict_classes(x_test)
    predict[:10]
    
    predict_classes=predict.reshape(-1)
    predict_classes[:10]
    
    # 查看预测结果
    
    SentimentDict={1:'正面的',0:'负面的'}
    def display_test_Sentiment(i):
        print(test_text[i])
        print('label真实值:',SentimentDict[y_test[i]],
              '预测结果:',SentimentDict[predict_classes[i]])
    
    display_test_Sentiment(2)
    
    display_test_Sentiment(12502)
    
    展开全文
  • 循环神经网络

    万次阅读 2019-01-18 11:00:14
    一、循环神经网络简介 循环神经网络的来源是为了刻画一个序列当前的输出与之前信息的关系。从网络结构上,循环神经网络会记忆之前的信息,并利用之前的信息影响后面结点的输出。即:循环神经网络的隐藏层之间的结点...

    一、循环神经网络(Recurrent neural network,RNN )

    循环神经网络的来源是为了刻画一个序列当前的输出与之前信息的关系。从网络结构上,循环神经网络会记忆之前的信息,并利用之前的信息影响后面结点的输出。即:循环神经网络的隐藏层之间的结点是有连接的,隐藏层的输入不仅包括输入层的输出,还包括上一时刻隐藏层的输出。

    循环神经网络对于每一个时刻的输入结合当前模型的状态给出一个输出。循环神经网络可以看做同一神经网络被无限复制的结果,出于优化考虑,现实生活中无法做到真正的无限循环。
    在这里插入图片描述
    在这里插入图片描述
    循环神经网络中的参数在不同时刻是共享的。

    为了将当前时刻的状态转换成最终的输出,循环神经网络需要另一个全连接神经网络完成此过程。不同时刻用于输出的全连接神经网络中的参数也是一致的

    循环神经网络的总损失:所有时刻(或部分时刻)上损失函数的总和。

    循环神经网络可以更好地利用传统神经网络结构所不能建模的信息,但同时,带来更大的技术挑战——长期依赖(long-term dependencies)问题

    二、长短时记忆网络(Long Short Term Memory,LSTM)

    解决长期依赖、有用信息的间隔有大有小、长短不一的问题。

    LSTM是一种拥有三个“门”结构的特殊网络结构。

    LSTM靠一些“门”的结构让信息有选择性地影响神经网络中每个时刻的状态。“门”结构就是一个使用sigmoid神经网络和一个按位做乘法结合在一起的操作。

    叫做“门”是因为使用sigmoid作为激活函数的全连接神经网络层会输出一个0到1之间的数值描述当前输入有多少信息量可以通过这个结构。这个结构的功能类似一扇门,当门打开时(sigmoid神经网络层输出为1),全部信息都可以通过;当门关上时(sigmoid神经网络层输出为0),任何信息无法通过

    在这里插入图片描述
    “遗忘门”和“输入门”至关重要。通过**”遗忘门“和”输入门“,LSTM结构可以更加有效的决定哪些信息应该被遗忘,哪些信息应该被保留**。

    遗忘门的作用:让循环神经网络”忘记“之前没有用的信息。遗忘门会根据当前的输入Xt、上一时刻状态Ct-1、上一时刻的输出Ht-1共同决定哪一部分记忆需要被遗忘。

    输入门:在循环神经网络"忘记"了部分之前的状态后,它还需要从当前的输入补充最新的记忆,这个过程需要”输入门“完成。输入门会根据Xt、Ct-1、Ht-1决定哪些部分将进入当前时刻的状态Ct。

    输出门:LSTM结构在计算得到新的状态Ct后需要产生当前时刻的输出,这个过程是由”输出门“完成。输出门根据最新的状态Ct、上一时刻的输出Ht-1和当前的输入Xt来决定该时刻的输出Ht。

    三、双向循环神经网络(Bidirectional RNN):

    在经典的循环神经网络中,状态的传输时从前往后单向传的,然而有些问题中,当前时刻的输出不仅和之前的状态有关,也与之后的状态有关,这就需要使用双向循环神经网络(Bidirectional RNN)解决此问题。

    双向循环神经网络是由两个单向循环神经网络上下叠加在一起组成的,输出由这两个循环神经网络的状态共同决定

    在每一个时刻t,输入会同时提供给这两个方向相反的循环神经网络,而输出则是由两个单向循环神经网络共同决定。
    在这里插入图片描述
    四、深层循环神经网络(deepRNN)

    为了增强模型的表达能力,可以将每一时刻上的循环体重复多次。深层循环神经网络在每一时刻上将循环体结构复制了多次。每一层循环体中参数是一致的,而不同层中的参数可以不同

    在这里插入图片描述
    五、循环神经网络的Dropout:

    通过dropout可以让卷积神经网络更加健壮。类似,再循环神经网络中使用dropout也有同样的功能。

    如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象。Dropout可以有效的缓解过拟合的发生,在一定程度上达到正则化的效果。

    Dropout可以作为训练深度神经网络的一种trick供选择。在每个训练批次中,通过忽略一半的特征检测器(让一半的隐层节点值为0),可以明显地减少过拟合现象。这种方式可以减少隐层结点间的相互作用隐层节点相互作用是指某些隐层结点依赖其他隐层结点才能发挥作用

    Dropout通俗讲,即:在前向传播的时候,让某个神经元的激活值以一定的概率p停止工作,这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征,

    类似卷积神经网络只在全连接层中使用dropout,循环神经网络一般只在不同层循环体结构之间使用dropout不在同一层循环结构之间使用。即:从时刻t-1传递到时刻t,循环神经网络不会进行状态的dropout;而在同一时刻t中,不同层循环体之间会使用dropout
    在这里插入图片描述

    展开全文
  • 深度学习之RNN(循环神经网络)

    万次阅读 多人点赞 2018-08-12 09:31:08
    一 RNN概述  前面我们叙述了BP算法, CNN算法, 那么为什么还会有RNN呢?... 细想BP算法,CNN(卷积神经网络)我们会发现, 他们的输出都是只考虑前一个输入的影响而不考虑其它时刻输入的影响, 比如简单的猫,狗,手写数...
  • 循环神经网络(RNN)原理通俗解释

    万次阅读 多人点赞 2018-07-24 21:21:44
    1.RNN怎么来的? 2.RNN的网络结构及原理 3.RNN的改进1:双向RNN 4.RNN的改进2:深层双向RNN...循环神经网络的应用场景比较多,比如暂时能写论文,写程序,写诗,但是,(总是会有但是的),但是他们现在还不能正常使...
  • RNN:循环神经网络or递归神经网络?

    千次阅读 多人点赞 2020-05-03 15:20:25
    前些天,导师看完我论文以后问我:RNN是循环神经网络吗,我看到论文里用递归神经网络的更多啊? 我(内心os):有吗,我感觉我看到的都是循环神经网络啊? 我:这个应该就是翻译的问题吧 回去以后我查了一下,...
  • 双向循环神经网络(BRNN)

    千次阅读 2018-07-27 21:19:24
    双向循环神经网络(BRNN) RNN和LSTM都只能依据之前时刻的时序信息来预测下一时刻的输出,但在有些问题中,当前时刻的输出不仅和之前的状态有关,还可能和未来的状态有关系。比如预测一句话中缺失的单词不仅需要...
  • 1. Recurrent Neural Network (RNN)尽管从多层感知器(MLP)到循环神经网络(RNN)的扩展看起来微不足道,但是这对于序列的学习具有深远的意义。循环神经网络(RNN)的使用是用来处理序列数据的。在传统的神经网络中...
  • 首先理解什么叫做卷积,或者说为什么要翻译为卷积神经网络。 卷积的定义:https://baike.baidu.com/item/%E5%8D%B7%E7%A7%AF/9411006?fr=aladdin 简单来说,卷积就是两个相对运动的几何图形,在相交到相离之间,...
  • 一般来说,神经网络的架构可以分为哪三类?   https://www.toutiao.com/a6636224355548267015/   什么是神经网络 神经网络是机器学习中的一种模型,是一种模仿动物神经网络行为特征,进行分布式并行信息处理...
  • 循环神经网络的反向传播算法其实只是BP算法的一个简单变体而已。 首先我们先看看循环神经网络的前向传播算法: 需要注意的是,该RNN中前一时刻到当前时刻只有一个权重矩阵,该权重矩阵与时间并没有什么关系。...
  • 一,循环神经网络: 原文:https://zybuluo.com/hanbingtao/note/541458 语言模型 RNN是在自然语言处理领域中最先被用起来的,比如,RNN可以为语言模型来建模。那么,什么是语言模型呢? 我们可以和电脑玩...
  • 写给自己的备忘内容:RNN的基础1概述Recurrentneural network,循环神经网络,在普通多层BP神经网络基础上,增加了隐藏层各单元间的横向联系,通过一个权重矩阵,可以将上一个时间序列的神经单元的值传递至当前的...
  • DL之RNN:循环神经网络RNN的简介、应用、经典案例之详细攻略 目录 循环神经网络RNN的简介 1、RNN的分类 1、RNN的常见算法分类 2、RNN的三种分类 2、循环神经网络RNN的重要进展 2.1、1982年反馈神经网络...
  • 1 循环神经网络(RNN)概念循环神经网络,是一种线性序列结构,前一个神经元的结果会传递给后一个神经元。 递归神经网络,是一种层次结构,前一个神经元会影响后一个神经元,后一个神经元同样也会影响前一个神经元...
  • 循环神经网络重要的论文博客汇总

    千次阅读 2017-03-24 16:34:27
    Recurrent Neural Network 学习之路 来源于...1. Read paper: “A critical review of Recurr
  • 系统学习深度学习(二十六)--BiRNN

    万次阅读 2018-10-13 14:22:04
    尽管从多层感知器(MLP)到循环神经网络(RNN)的扩展看起来微不足道,但是这对于序列的学习具有深远的意义。循环神经网络(RNN)的使用是用来处理序列数据的。在传统的神经网络中模型中,层与层之间是全连...
  • 序列到序列的网络seq2seq

    千次阅读 2017-12-10 15:38:34
    1、seq2seq使用两个循环神经网络,将一个语言序列直接转换到另一个语言序列。2、序列到序列的模型是循环神经网络的升级版,其联合了两个循环神经网络。一个神经网络负责接收源句子;另一个循环神经网络负责将句子...
1 2 3 4 5 ... 20
收藏数 55,371
精华内容 22,148
关键字:

循环神经网络