循环神经网络(RNN)

目录

简介

1 结构

1.1 循环单元

1.1.1 内部计算

1.1.2 连接性

1.1.3 输出模式

2 理论

2.1 学习范式

2.1.1 监督学习(supervised learning)——Teacher Forcing

2.1.2 监督学习(supervised learning)——随时间反向传播(BP Through Time, BPTT)

2.1.3 监督学习(supervised learning)——实时循环学习(Real-Time Recurrent Learning, RTRL)

2.1.4 非监督学习(unsupervised learning)

2.2 优化

2.2.1 梯度截断

2.2.2 正则化(regularization)

2.2.3 层归一化(Layer Normalization, LN)

2.2.4 储层计算(reservoir computing)

2.2.5 跳跃连接(skip connection)

2.2.6 渗漏单元(leaky unit)和门控单元(gated unit)

3 算法

3.1 简单循环网络SRN

3.2 门控算法

3.2.1 长短期记忆网络(Long Short-Term Memory networks, LSTM)

3.2.2 门控循环单元网络(Gated Recurrent Unit networks, GRU)

3.3 深度算法

3.3.1 堆叠循环神经网络(Stacked Recurrent Neural Network, SRNN)

3.3.2 双向循环神经网络(bidirectional recurrent neural network, BRNN)

3.4 扩展算法

3.4.1 外部记忆——Attention模型

3.4.2 与卷积神经网络相结合

3.4.3 递归神经网络和图网络

4 性质

5 应用

5.1 自然语言处理

5.2 计算机视觉

5.3 其它

6 RNN梯度消失和爆炸的原因

7 解决梯度爆炸和梯度消失的方案

7.1 采使用ReLu激活函数

7.2 LSTM


        循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network)  。

        对循环神经网络的研究始于二十世纪80-90年代,并在二十一世纪初发展为深度学习(deep learning)算法之一 ,其中双向循环神经网络(Bidirectional RNN, Bi-RNN)和长短期记忆网络(Long Short-Term Memory networks,LSTM)是常见的循环神经网络 。

        循环神经网络具有记忆性、参数共享并且图灵完备(Turing completeness),因此在对序列的非线性特征进行学习时具有一定优势 。循环神经网络在自然语言处理(Natural Language Processing, NLP),例如语音识别、语言建模、机器翻译等领域有应用,也被用于各类时间序列预报。引入了卷积神经网络(Convolutional Neural Network,CNN)构筑的循环神经网络可以处理包含序列输入的计算机视觉问题。

简介

        循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network)。

        对循环神经网络的研究始于二十世纪80-90年代,并在二十一世纪初发展为深度学习(deep learning)算法之一,其中双向循环神经网络(Bidirectional RNN, Bi-RNN)长短期记忆网络(Long Short-Term Memory networks,LSTM)是常见的的循环神经网络 。

        循环神经网络具有记忆性、参数共享并且图灵完备(Turing completeness),因此在对序列的非线性特征进行学习时具有一定优势。

        循环神经网络在自然语言处理(Natural Language Processing, NLP),例如语音识别、语言建模、机器翻译等领域有应用,也被用于各类时间序列预报

        引入了卷积神经网络(Convoutional Neural Network,CNN)构筑的循环神经网络可以处理包含序列输入的计算机视觉问题

        在SRN出现的同一时期,循环神经网络的学习理论也得到发展。在反向传播算法的研究受到关注后,学界开始尝试在BP框架下对循环神经网络进行训练 。

        1989年,Ronald Williams和David Zipser提出了循环神经网络的实时循环学习(Real-Time Recurrent Learning, RTRL)。随后Paul Werbos在1990年提出了循环神经网络的随时间反向传播(BP Through Time,BPTT),RTRL和BPTT被沿用至今,是循环神经网络进行学习的主要方法。

        1991年,Sepp Hochreiter发现了循环神经网络的长期依赖问题(long-term dependencies problem),即在对序列进行学习时,循环神经网络会出现梯度消失(gradient vanishing)梯度爆炸(gradient explosion)现象,无法掌握长时间跨度的非线性关系 。

        为解决长期依赖问题,大量优化理论得到引入并衍生出许多改进算法,包括神经历史压缩器(Neural History Compressor, NHC)长短期记忆网络(Long Short-Term Memory networks, LSTM)门控循环单元网络(Gated Recurrent Unit networks, GRU)回声状态网络(echo state network)独立循环神经网络(Independent RNN)等。

1 结构

1.1 循环单元

1.1.1 内部计算

循环神经网络(RNN)_第1张图片

                                                                                     图1 

                                                                                     图2

公式总结:

        循环神经网络(RNN)_第2张图片

          其中 f 和 g 为激活函数, U为输入层到隐含层的权重矩阵, W为隐含层从上一时刻到下一时刻状态转移的权重矩阵。 在文本分类任务中, f 可以选取 Tanh函数或者ReLU函数, g可以采用Softmax函数

详情:

        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.1.2 连接性

1. 循环单元-循环单元连接

           循环神经网络(RNN)_第3张图片

                                                                                     图3

        也被称为“隐含-隐含连接(hidden-hidden connection)”或全连接,此时每个循环单元当前时间步的状态由该时间步的输入上一个时间步的状态决定:

         ,

        是循环节点的权重,前者称为状态-状态权重,后者称为状态-输入权重  。正向、反向递归的循环单元-循环单元连接相堆叠可以得到BRNN。

2. 输出节点-循环单元连接

         循环神经网络(RNN)_第4张图片 

                                                                                     图4

        Teacher Forcing 导师驱动过程:

                循环神经网络(RNN)_第5张图片

                                                                                     图5

        该连接方式下循环单元的状态由该时间步的输入上一个时间步的输出(而不是状态)决定:

         

         由于潜在假设了前一个时间步的输出节点能够表征先前所有时间步的状态,输出节点-循环单元连接的RNN不具有图灵完备性,学习能力也低于全连接网络。但其优势是可以使用Teacher Forcing进行快速学习。

3. 基于上下文的连接

        因为在图网络的观点下呈现闭环结构,该连接方式也被称为闭环连接(closed-loop connection),其中循环单元的系统状态引入了其上一个时间步的真实值 。使用基于上下文连接的RNN由于训练时将学习样本的真实值作为输入,因此是一个可以逼近学习目标概率分布的生成模型(generative model)。基于上下文的连接有多种形式,其中常见的一类使用了该时刻的输入、上一时刻的状态和真实值:

          

        其它的类型可能使用固定长度的输入,使用上一时刻的输出代替真实值,或不使用该时刻的输入 。

(1)使用单个向量 x 作为输入

        当 x 是一个固定大小的向量时,我们可以简单地将其看作产生 y 序列 RNN 的额外输入。将额外输入提供到 RNN 的一些常见方法是:

  1. 在每个时刻作为一个额外输入,或
  2. 作为初始状态 h(0),或
  3. 结合两种方式

             循环神经网络(RNN)_第6张图片

    图 6: 将固定长度的向量 x 映射到序列 Y 上分布的 RNN。这类 RNN 适用于很多任务如图注,其中单个图像作为模型的输入,然后产生描述图像的词序列。观察到的输出序列的每个元素 同时用作输入(对于当前时间步)训练期间的目标(对于前一时间步)

(2)接收向量序列 x(t) 作为输入

           循环神经网络(RNN)_第7张图片

    图 7: 将可变长度的 x 值序列映射到相同长度的 y 值序列上分布的条件循环神经网络。对比图 3 ,此 RNN 包含从前一个输出当前状态的连接。这些连接允许此RNN对给定 x 的序列后相同长度的 y 序列上的任意分布建模。图 3 的 RNN 仅能表示在给定 x 值的情况下, y 值彼此条件独立的分布。

1.1.3 输出模式

        通过建立输出节点,RNN可以有多种输出模式,包括序列-分类器(单输出)序列-序列(同步多输出)编码器-解码器(异步多输出)等。

(1)序列-分类器

        序列-分类器的输出模式适用于序列输入和单一输出的机器学习问题,例如文本分类(sentiment classification)。给定学习数据和分类标签: ,序列-分类器中循环单元的输出节点会直接通过分类器,常见的选择是使用最后一个时间步的输出节点 ,或递归计算中所有系统状态的均值。常见的序列-分类器使用全连接结构。

例如:

循环神经网络(RNN)_第8张图片

图 8: 关于时间展开的循环神经网络,在序列结束时具有单个输出。这样的网络可以用于概括序列并产生用于进一步处理的固定大小的表示。在结束处可能存在目标(如此处所示),或者通过更下游模块的反向传播来获得输出 上的梯度。

(2)序列-序列

        序列-序列的输出模式中,序列的每个时间步对应一个输出,即输入和输出的长度相同 。给定学习目标 ,序列-序列的输出模式在每个时间步都输出结果 。循环单元-循环单元连接输出节点-循环单元连接基于上下文的连接都支持序列-序列输出,其中前两者常见于词性标注(part-of-speech tagging)问题,后者可被应用于文本生成(text generation)和音乐合成(music composition)。例如图3,图4,图6,图7。

(3)编码器-解码器(encoder-decoder)

        在输入数据和学习目标都为序列长度可变时,可以使用两个相耦合的基于上下文连接的RNN,即编码器-解码器进行建模。编码器-解码器也被称为“seq2seq”,是语言模型中的RNN构架。以机器翻译为例。给定嵌入的原始文本和翻译文本: ,编码器在工作时对原始文本进行处理,并输出到解码器,解码器根据编码器的输出生成新序列。编码器-解码器结构的RNN以最大化 为目标更新权重系数。

图 9: 在给定输入序列 (x(1); x(2); : : : ; x(nx)) 的情况下学习生成输出序列 (y(1); y(2); : : : ; y(ny))的编码器-解码器或序列到序列的 RNN 架构的示例。它由读取输入序列的编码器 RNN 以及生成输出序列(或计算给定输出序列的概率)的解码器 RNN 组成。 编码器 RNN 的最终隐藏状态用于计算一般为固定大小的上下文变量 C, C 表示输入序列的语义概要并且作为解码器 RNN 的输入。

(4)总结

循环神经网络(RNN)_第9张图片

  • 一个RNN网络可以接受一个序列(sequence)的输入,产生一个序列输出,如左上角所示,例如在预测股票价格时,神经网络接受过去N天的股票价格,返回从N-1天到明天的价格。
  • 如右上角所示,RNN也可以接受一个序列的输出但只输出最后一个时间状态的Y,这是一种序列→向量(Vector)的模式,例如你可以feed一个词序列给RNN,然后让它输出一个态度分数。
  • 你也可以只在t=0时输入,此后均输入0,让RNN输出一个序列,如左下角图所示,例如输入一张图片,输出一个说明。
  • 最后一种是先序列到向量的编码器再结合一个向量到序列的解码器,如右下角所示。这种方式可以用于两种语言之间的翻译。这种“Encoder-Decoder”的模型优于左上角的Seq-Seq模型,因为有时必须等全句结束才能正确翻译一句话。

2 理论

2.1 学习范式

2.1.1 监督学习(supervised learning)——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.1.2 监督学习(supervised learning)——随时间反向传播(BP Through Time, BPTT)

        RNN BPTT算法推导:CSDN

        在循环神经网络中主要有两种计算梯度的方式:随时间反向传播(BPTT)实时循环学习(RTRL)算法。RNN的训练方法除了BPTT以外,还有两种算法:Real-time Recurrent Learning(RTRL)以及Extended Kalman Filtering(EKF),不过工业上基本上都被BPTT占领了。

        BPTT是反向传播算法(BP)由前馈神经网络向RNN的推广  ,BPTT将RNN的链式连接展开,其中每个循环单元对应一个“层”,每个层都按前馈神经网络的BP框架进行计算 。考虑RNN的参数共享性质,权重的梯度是所有层的梯度之和:

             

        式中 为损失函数。这里以循环单元-循环单元连接的多输出网络为例介绍BPTT的计算步骤。首先给定如下的更新方程:

              循环神经网络(RNN)_第10张图片

        式中需要求解的权重为 。对最末端的时间步 和其余的时间步 ,求解总损失函数对循环单元状态的偏导数是一组递归计算:

               循环神经网络(RNN)_第11张图片

        由于RNN参数共享,因此在计算当前时间步的梯度时需要将共享的参数对其它时间步的损失函数的变化“固定”,这里使用"”表示该关系,在一些文献中,该符号被称为“实时导数(intermediate derivative)”  。式中 为激励函数的导数, 与输出函数 有关。

        在实际应用中,由于损失函数对状态的偏导数 需要被完整地保存直到该样本的所有参数更新完毕,因此在学习长序列样本时,BPTT的空间复杂度会对应地增加 。对BPTT按固定长度截断,即截断的BPTT(truncated BPTT)是被用于解决上述问题的方法之一。

2.1.3 监督学习(supervised learning)——实时循环学习(Real-Time Recurrent Learning, RTRL)

        与反向传播的BPTT算法不同的是,RTRL通过前向传播梯度来进行计算。

        RTRL通过前向传播的方式来计算梯度,在得到每个时间步的损失函数后直接更新所有权重系数至下一个时间步,类似于自动微分的前向连锁(forward accumulation)模式。这里以BPTT中的状态-状态权重 为例做简单介绍。在时间步 ,损失函数 对权重中元素 的实时更新规则如下:

        循环神经网络(RNN)_第12张图片

        其它权重的更新可以按相近的方式导出。

随时间反向传播算法(BPTT) VS 实时循环学习算法(RTRL)

 在RNN中,一般网络输出维度远低于输入维度,因此BPTT算法计算量更小
 BPTT需要保存所有时刻的中间梯度,空间复杂度较高RTRL算法不需要梯度回传,无需存储反向传播的误差梯度,内存开销更小,适合在线学习或者无限序列任务

2.1.4 非监督学习(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)算法 

2.2 优化

        RNN在误差梯度在经过多个时间步的反向传播后容易导致极端的非线性行为,包括梯度消失(gradient vanishing)梯度爆炸(gradient explosion)。不同于前馈神经网络,梯度消失和梯度爆炸仅发生在深度结构中,且可以通过设计梯度比例得到缓解,对RNN,只要序列长度足够,上述现象就可能发生 。在理解上,RNN的递归计算类似于连续的矩阵乘法,由于RNN使用固定的权重处理所有时间步,因此随着时间步的推移,权重系数必然出现指数增长或衰减,引发梯度的大幅度变化 。

        在实践中,梯度爆炸虽然对学习有明显的影响,但较少出现,使用梯度截断可以解决 。梯度消失是更常见的问题且不易察觉,发生梯度消失时,RNN在多个时间步后的输出几乎不与序列的初始值有关: ,因此无法模拟序列的长距离依赖(long-term dependency) 。在数值试验中,SRN对时间步跨度超过20的长距离依赖进行成功学习的概率接近于0   。恰当的权重初始化(weight initialization),或使用非监督学习策略例如神经历史压缩器(NHC)可提升RNN学习长距离依赖的能力 ,但对更一般的情形,RNN发展了一系列优化策略和构筑。

        出现梯度消失(主要)与爆炸问题后,有很多解决方法提出来,比如设计更好的初始化权重,限制权重范围等等。这种''通用''的方法的作用有限。在RNN中有人提出设计隐藏单元用来储存信息,称为储层计算(Reservoir Computing),比如回声状态网络(Echo State Network, ESN)、流体状态机。也有人提出在不同的时间粒度上处理数据,不同的时间处理单元称为渗透单元(Leaky Unit)。但目前效果最好的,通用性最高的还是门限(Gated) RNN。其中最火的就是LSTM(Long-Short Term Memory)及GRU(Gated Recurrent Unit)。

2.2.1 梯度截断

        梯度截断是处理RNN梯度爆炸现象的有效方法,具体分为两种,一是在参数更新之前,设定阈值并逐个元素筛查,若梯度超过阈值则截断至阈值 ;二是在参数更新前,若误差对参数的梯度超过阈值,则按范数(norm)截断,即截断梯度 g 的范数 ∥g∥:

         循环神经网络(RNN)_第13张图片

        式中 为范数上界, g 用来更新参数。比较可知,按范数截断保持了截断前后梯度的方向不变,因此逻辑上更合理,但试验表明,两种方法效果相当。事实上作为经验方法,只要梯度截断将权重系数带离数值不稳定区域,就能很好地应对梯度爆炸现象。

                         循环神经网络(RNN)_第14张图片

                             图 10.17: 梯度截断在有两个参数 w 和 b 的循环网络中的效果示例。

        梯度截断可以使梯度下降在极陡峭的悬崖附近更合理地执行。这些陡峭的悬崖通常发生在循环网络中,位于循环网络近似线性的附近。悬崖在时间步的数量上呈指数地陡峭,因为对于每个时间步,权重矩阵都自乘一次。

  • (左)没有梯度截断的梯度下降越过这个小峡谷的底部,然后从悬崖面接收非常大的梯度。大梯度灾难性地将参数推到图的轴外。
  • (右) 使用梯度截断的梯度下降对悬崖的反应更温和。当它上升到悬崖面时,步长受到限制,使得它不会被推出靠近解的陡峭区域。

2.2.2 正则化(regularization)

        RNN的正则化是应对其长距离依赖问题的方法之一,其理念是控制循环节点末端状态对初始状态导数,即雅可比矩阵的范数以提升RNN对长距离误差的敏感性 。在误差反向传播至第 个时间步时,其对应的正则化项有如下表示:

        循环神经网络(RNN)_第15张图片

        在BP中加入上述正则化项会提升计算复杂度,此时可将包含损失函数的项近似为常数,并引导雅可比矩阵的范数向1靠近 。研究表明,正则化和梯度截断结合使用可以增加RNN学习长距离依赖的能力,但相比于门控单元,正则化没有减少模型的冗余

        在前馈神经网络中被使用和证实有效的随机失活(dropout)策略也可用于RNN。在输入序列的维度大于1时,RNN在每个时间步的输入和状态的矩阵元素都可以被随机归零:

        

        式中为(0,1)-矩阵,也被称为maxout矩阵(maxout array)随机决定需要失活的连接。maxout矩阵可以对一组学习样本的所有时间步保持不变,其中与系统状态相乘的maxout矩阵也可随时间步变化。在长序列的学习中,不断生成随机数进行随机失活会降低算法的运行效率,一个可能的改进是假设距离过长的元素影响很小,并只对与当前时间步相隔一定范围的循环单元连接使用随机失活。

2.2.3 层归一化(Layer Normalization, LN)

        应用于RNN时,LN将RNN的每个循环单元视为一个层进行归一化。对时间步 ,包含LN的循环节点的内部计算如下表示:

         

         式中 和 为代表缩放平移的参数,随BP算法进行更新。在RNN中,循环节点的均值和标准差会发生改变,产生协变漂移(covariate shift)现象,该现象会导致梯度爆炸和梯度消失,因此LN是缓解长距离依赖问题的方法之一。

2.2.4 储层计算(reservoir computing)

        从 的循环权重映射以及从 的输入权重映射是循环网络中最难学习的参数。研究者 (Jaeger, 2003; Maass et al., 2002; Jaeger and Haas,2004; Jaeger, 2007b) 提出避免这种困难的方法是设定循环隐藏单元,使其能很好地捕捉过去输入历史,并且只学习输出权重。 回声状态网络(echo state network)或 ESN (Jaeger and Haas, 2004; Jaeger, 2007b),以及 流体状态机(liquid state machine) (Maass et al., 2002) 分别独立地提出了这种想法。后者是类似的,只不过它使用脉冲神经元(二值输出)而不是 ESN 中的连续隐藏单元。 ESN 和流体状态机都被称为 储层计算(reservoir computing) (Lukoševičius and Jaeger, 2009),因为隐藏单元形成了可能捕获输入历史不同方面的临时特征池。
        回声状态网络(Echo State Network)提出于2001年,曾经是研究的热点,但近年来随着RNN,LSTM与其它一些变种的网络的出现,现在研究比较少了,但是其在时间序列预测上还有着很不错的应用。传统的MLP(多层感知器)网络的隐层是一层层的全连接的神经元,而ESN引入了一个储备池计算模式来替代原始的隐层,这个储备池是什么呢?先来看下下图: 

          循环神经网络(RNN)_第16张图片

  ESN通过随机地部署大规模系数链接的神经元构成网络隐层,一般称为"储备池"。ESN网络具有的特点如下:

  • 包含数目相对较多的神经元;
  • 神经元之间的连接关系随机产生;
  • 神经元之间的链接具有稀疏性;

可以看出网络主要三层结构构成:

1、输入层(Input Layer):

  • 输入向量 其维度为:
  • 输入层 → 存储池的连接权重为:

        注意该权重是不需要训练的,随机初始化完成即可。

2、储存池(Reservoir):

        存储池接受两个方向的输入:一个来自于输入层,另外一个来自存储池前一个状态的输出 ,其中状态反馈权重相同均不需要训练,由随机初始状态决定,所以 为大型稀疏矩阵,其中的非0元素表明了存储池中被激活的神经元:

        

3、输出层(Readout):

        存储池 → 输出层为线性连接关系,即满足:

          

        实际训练过程中需要训练线性连接的权重。

        核心思想:使用大规模随机稀疏网络(存储池)作为信息处理媒介,将输入信号从低维输入空间映射到高维度状态空间,在高维状态空间采用线性回归方法对网络的部分连接权重进行训练,而其他随机连接的权重在网络训练过程中保持不变。

总结:

        储层计算将RNN中链式连接转变为一个“储层(reservoir)”,储层内循环单元的状态在每个时间步更新。储层与输出层相连,其对应的输出权重由学习数据求解:

           

        式中 为储层的输入权重,在计算中随机初始化并且固定, 为输出权重,按线性参数模型的计算方法求解。注意到上式中 向 的递归是随机的,因此储层计算的构筑本身缓解了RNN的长距离依赖问题。同时,为确保储层不发生梯度爆炸,其输出权重有两个设定:

(1)使用稀疏矩阵和特征值的最大绝对值小于谱半径(spectural radius)。谱半径是一个超参数,用于控制 随时间步的指数增长 。

(2)稀疏矩阵控制储层与输出层间的松散连接,此时储层中的信息只能在有限的输出中“回声”,不会扩散至网络的所有输出中  。

        储层计算可以被视为RNN的学习理论或对RNN的结构优化。使用储层计算的RNN包括回声状态网络(Echo State Network, ESN)流体状态机(liquid state machine),二者的不同点是流体状态机的储层单元是二元节点 。储层计算中随机初始化并固定隐含层输入权重的方法接近于极限学习机(Extreme Learning Machine, ELM),但后者基于前馈神经网络构建,其隐含层节点不是循环单元,不具有记忆性 。

2.2.5 跳跃连接(skip connection)

        梯度消失是时间步的函数,因此可以通过使用跳跃连接提高RNN学习长距离依赖的能力。跳跃连接是跨多个时间步的长距离连接,引入跳跃连接后,长时间尺度的状态能够更好地在神经网络中传递,缓解梯度消失现象。有研究在使用跳跃连接的同时直接删除循环单元-循环单元连接,强迫RNN以阶层结构在长时间尺度上运行。

2.2.6 渗漏单元(leaky unit)和门控单元(gated unit)

        渗漏单元也被称为线性自连接单元(linear self-connection unit)是在循环单元间模拟滑动平均(moving average)以保持RNN中长距离依赖的方法:

               

        式中的权重 是预先给定的。由上式容易发现,渗漏单元会在迭代中优先记忆系统先前的状态 ,因此提升了RNN建立长期依赖的能力。当 接近 1 时,滑动平均值能记住过去很长一段时间的信息,而当 接近 0,关于过去的信息被迅速丢弃。线性自连接的隐藏单元可以模拟滑动平均的行为。

        d 时间步的跳跃连接可以确保单元总能被 d 个时间步前的那个值影响。使用权重接近 1 的线性自连接是确保该单元可以访问过去值的不同方式。线性自连接通过调节实值 α 更平滑灵活地调整这种效果,而不是调整整数值的跳跃长度。 

        研究表明ESN可以引入渗漏单元进行优化以提升其学习效果。

        我们可以通过两种基本策略设置渗漏单元使用的时间常数。一种策略是手动将其固定为常数,例如在初始化时从某些分布采样它们的值。另一种策略是使时间常数成为自由变量,并学习出来。在不同时间尺度使用这样的渗漏单元似乎能帮助学习长期依赖 (Mozer, 1992; Pascanu et al., 2013a)。

        渗漏单元在应用中有两个不足,一是人为给定的权重不是记忆系统状态的最优方式,二是渗漏单元没有遗忘功能,容易出现信息过载,在过去的状态被循环单元充分使用后,将其遗忘可能是有利的 。 以此出发,门控单元是渗漏单元的推广,门控单元的类型包括输入门(input gate)输出门(output gate)遗忘门(forget gate)每个门都是一个封装的神经网络,其计算方式可参见算法部分。总体而言,门控单元是减少学习误差的长距离依赖的有效方法,使用门控单元的算法,包括长短期记忆网络(Long Short-Term Memory networks, LSTM)门控循环单元网络(Gated Recurrent Unit networks, GRU)被证实在各类问题中有优于SRN的表现。

3 算法

3.1 简单循环网络SRN

        简单循环网络(Simple Recurrent Networks,SRN)又称为 Elman Network,是由杰夫·埃尔曼(Jeff Elman)在 1990 年提出来的。埃尔曼在 Jordan Network 的基础上进行了创新,并且简化了它的结构,最终提出了 Elman Network。Jordan Network 和 Elman Network 的网络结构如图  所示。

                                                  图 :Jordan Network(左)和Elman Network(右)

        从图 1 中可以很直观地看出,两种网络结构最主要的区别在于记忆单元中保存的内容不同。Jordan Network 的记忆单元中保存的是整个网络的最终输出,而 Elman Nnetwork 的记忆单元只保存中间的循环层,所以如果是基于 Elman Network 的深层循环神经网络,那么每一个循环的中间层都会有一个相应的记忆单元。

        Jordan Network 和 Elman Network 都可以扩展应用到深度学习中,但由于 Elman Network 的结构更易于扩展(Elman Network 的每一个循环层都是相互独立的,因此网络结构的设计可以更加灵活。另外,当 Jordan Network 的输出层与循环层的维度不一致时还需要额外的调整,而 Elman Network 则不存在该问题),因此当前主流的循环神经网络都是基于 Elman Network 的,例如我们后面会介绍的 LSTM 等。

         通常我们所说的循环神经网络(RNN),默认指的就是 Elman Network 结构的循环神经网络。本教程中所提到的循环神经网络,如果没有特别注明,均指 Elman Network 结构的循环神经网络。

         简单循环网络(Simple Recurrent Network, SRN)是仅包含一组链式连接(单隐含层)的RNN,其中循环单元-循环单元连接的为Elman网络闭环连接的为Jordan网络。对应的递归方式如下 :

                循环神经网络(RNN)_第17张图片

        式中 和 为激励函数,例如逻辑斯蒂函数双曲正切函数。SRN在提出时使用BPTT进行监督学习,但不包含任何优化理论,因此无法学习长距离依赖 ,在现代的机器学习问题中很少直接使用。

3.2 门控算法

        门控算法是RNN应对长距离依赖的可行方法,其设想是通过门控单元赋予RNN控制其内部信息积累的能力,在学习时既能掌握长距离依赖又能选择性地遗忘信息防止过载 。门控算法使用BPTTRTRL进行学习,其计算复杂度和学习表现均高于SRN。

3.2.1 长短期记忆网络(Long Short-Term Memory networks, LSTM)

详见:长短期记忆网络(Long Short-Term Memory networks, LSTM)_意念回复的博客-CSDN博客_长短期记忆网络

视频:【中英字幕】吴恩达深度学习课程第五课 — 序列模型_哔哩哔哩_bilibili

        循环神经网络(RNN)_第18张图片

        LSTM是最早被提出的RNN门控算法,其对应的循环单元,LSTM单元包含3个门控:输入门遗忘门输出门。相对于RNN对系统状态建立的递归计算,3个门控对LSTM单元的内部状态建立了自循环(self-loop) 。具体地,

  • 输入门决定当前时间步的输入和前一个时间步的系统状态对内部状态的更新;
  • 遗忘门决定前一个时间步内部状态对当前时间步内部状态的更新;
  • 输出门决定内部状态对系统状态的更新。

LSTM单元的更新方式如下:

     循环神经网络(RNN)_第19张图片

        式中 为系统状态和内部状态的激励函数,通常为双曲正切函数, 为随时间步更新的门控,本质上是以Sigmoid函数为激励函数的前馈神经网络,使用Sigmoid函数的原因是其输出在 区间,等效于一组权重。式中脚标 表示输入门、遗忘门和输出门。

        除上述更新规则外,LSTM也可进一步引入内部状态更新门控,使用该策略的算法被称“peephole LSTM”:

       循环神经网络(RNN)_第20张图片

        最初版本的LSTM没有遗忘门,以全连接的方式进行序列-序列输出 ,但本质上LSTM单元可以被引入其它各类RNN构筑中,例如LSTM自编码器(LSTM Autoencoder) 、堆叠LSTM(stacked LSTM)等。

        对LSTM进行权重初始化时,需要为遗忘门设定较大的初始值,例如设定 。过小的值会使得遗忘门在学习中快速遗忘先前时间步的信息,不利于神经网络学习长距离依赖, 并可能导致梯度消失。

3.2.2 门控循环单元网络(Gated Recurrent Unit networks, GRU)

详见:门控循环单元(Gate Recurrent Unit,GRU)_意念回复的博客-CSDN博客_门控循环单元

        由于LSTM中3个门控对提升其学习能力的贡献不同,因此略去贡献小的门控和其对应的权重,可以简化神经网络结构并提升其学习效率。GRU即是根据以上观念提出的算法,其对应的循环单元仅包含2个门控:更新门和复位门,其中:

  • 复位门的功能与LSTM单元的输入门相近
  • 更新门则同时实现了遗忘门和输出门的功能

GRU的更新方式如下:

​​​​​​​               循环神经网络(RNN)_第21张图片

        式中符号含义参考LSTM,脚标表示更新门和复位门。对比LSTM与GRU的更新规则可以发现,GRU的参数总量更小,且参数更新顺序与LSTM不同,GRU先更新状态再更新门控,因此当前时间步的状态使用前一个时间步的门控参数,LSTM先更新门控,并使用当前时间步的门控参数更新状态。GRU的2个门控不形成自循环,而是直接在系统状态间递归,因此其更新方程也不包含内部状态

         LSTM和GRU有很多变体,包括在循环单元间共享更新门复位门参数,以及对整个链式连接使用全局门控,但研究表明这些改进版本相比于标准算法未体现出明显优势,其可能原因是门控算法的表现主要取决于遗忘门,而上述变体和标准算法使用了的遗忘门机制相近。

3.3 深度算法

        RNN的“深度”包含两个层面,即序列演进方向的深度每个时间步上输入与输出间的深度。对前者,循环神经网络的深度取决于其输入序列的长度,因此在处理长序列时可以被认为是直接的深度网络;对后者,循环神经网络的深度取决于其链式连接的数量,单链的循环神经网络可以被认为是“单层”的。

        RNN能够以多种方式由单层加深至多层,其中最常见的策略是使用堆叠的循环单元。

3.3.1 堆叠循环神经网络(Stacked Recurrent Neural Network, SRNN)

        循环神经网络(RNN)_第22张图片

        SRNN是在全连接的单层RNN的基础上堆叠形成的深度算法。SRNN内循环单元的状态更新使用了其前一层相同时间步的状态当前层前一时间步的状态:

           循环神经网络(RNN)_第23张图片

        式中符号含义参见循环单元部分,上标 分别表示时间步和层数。参与构建SRNN的RNN可以是简单循环网络(SRN)门控算法。使用SRN构建的SRNN也被称为循环多层感知器(Recurrent Multi-Layer Perceptron,RMLP),是1991年被提出的深度RNN。

3.3.2 双向循环神经网络(bidirectional recurrent neural network, BRNN)

               循环神经网络(RNN)_第24张图片

    图 : 典型的双向循环神经网络中的计算,意图学习将输入序列 映射到目标序列 (在每个步骤 t 具有损失)。循环性 h 在时间上向前传播信息(向右),而循环性 g 在时间上向后传播信息(向左)。因此在每个点 t,输出单元 可以受益于输入 中关于过去的相关概要以及输入 中关于未来的相关概要。

        BRNN是至少包含两层的深度RNN,被应用于学习目标与完整(而不是截止至当前时间步)输入序列相关的场合。例如在语音识别中,当前语音对应的词汇可能与其后出现的词汇有对应关系,因此需要以完整的语音作为输入。Bi-RNN的两个链式连接按相反的方向递归,输出的状态会进行矩阵拼接并通过输出节点,其更新规则如下:

        循环神经网络(RNN)_第25张图片

        式中符号含义参见循环单元部分, 表示矩阵拼接。和SRNN类似,Bi-RNN也可以由各种类型的循环单元构成,例如由LSTM构成的版本被称为双向LSTM

3.4 扩展算法

3.4.1 外部记忆——Attention模型

【中英字幕】吴恩达深度学习课程第五课 — 序列模型_哔哩哔哩_bilibili

【中英字幕】吴恩达深度学习课程第五课 — 序列模型_哔哩哔哩_bilibili

详见:Attention_意念回复的博客-CSDN博客

        RNN在处理长序列时有信息过载的问题,例如对编码器-解码器结构,编码器末端的输出可能无法包含序列的全部有效信息  。门控算法的遗忘门/更新门可以有选择地丢弃信息,减缓循环单元的饱和速度,但更进一步地,有研究通过注意力自注意力(self-attention)机制将信息保存在外部记忆(external memory)中,并在需要时再进行读取,以提高RNN的网络容量(network capacity)。在RNN框架下使用注意力机制的例子包括Hopfield神经网络 、神经图灵机(Neural Turing Machine, NTM)等。

循环神经网络(RNN)_第26张图片

 上下文:C

注意力参数:

深度学习中的注意力模型:深度学习中的注意力模型(2017版) - 知乎

attention examples:

循环神经网络(RNN)_第27张图片

3.4.2 与卷积神经网络相结合

        RNN与卷积神经网络相结合的常见例子是循环卷积神经网络(Recurrent CNN, RCNN)。RCNN将卷积神经网络的卷积层替换为内部具有递归结构的循环卷积层(Recurrent Convolutional Layer, RCL),并按前馈连接建立深度结构。

        除RCNN外,RNN和卷积神经网络还可以通过其它方式相结合,例如使用卷积神经网络在每个时间步上对序列化的格点输入进行特征学习(time-distributed),并将结果输入RNN。

3.4.3 递归神经网络和图网络

        RNN按序列演进方向的递归可以被扩展到树(tree)结构图(graph)结构中,得到递归神经网络(recursive neural network)图网络(Graph Network, GN)

        递归神经网络是RNN由链式结构向树状结构的推广 。不同于RNN的链式连接,递归神经网络的每个子节点都可以和多个父节点相连并传递状态。当其所有子节点都仅与一个父节点相连时,递归神经网络退化为RNN 。递归神经网络的节点可加入门控机制,例如通过LSTM门控得到树状长短期记忆网络(tree-structured LSTM)  。图网络是RNN和递归神经网络的推广,或者说后两者是图网络在特定结构下的神经网络实现 。在图网络观点下,全连接的RNN是一个有向无环图,而上下文连接的RNN是一个有向环图。递归神经网络和图网络通常被用于学习数据具有结构关系的场合,例如语言模型中的语法结构。

4 性质

        权重共享:RNN的权重系数是共享的,即在一次迭代中,循环节点使用相同的权重系数处理所有的时间步。相比于前馈神经网络,权重共享降低了RNN的总参数量。权重共享也意为着RNN可以提取序列中随时间变化的特征,因此其在学习和测试序列具有不同长度时可表现出泛化能力 。

         计算能力:一个循环单元间完全连接的RNN满足通用近似定理,即全联接循环神经网可以按任意精度逼近任意非线性系统,且对状态空间的紧致性没有限制,只要其拥有足够多的非线性节点。在此基础上,任何图灵可计算函数(Turing computable function)都可以由有限维的全联接计算,因此RNN是图灵完备(Turing completeness)的 。

        作为时间序列模型的性质:在时间序列建模的观点下,RNN是一个无限冲激响应滤波器(Infinite Impulse Response filter, IIR) 。这将RNN与其它应用于序列数据的权重共享模型,例如一维的卷积神经网络相区分,后者以时间延迟网络为代表,是有限冲激响应滤波器(Finite Impulse Response filter, FIR)

5 应用

5.1 自然语言处理

        RNN在NLP问题中有得到应用。在语音识别(speech recognition)中,有研究使用双向LSTM对英语文集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也被用于与自然语言处理有关的异常值检测问题,例如社交网络中虚假信息/账号的检测。

5.2 计算机视觉

        RNN与卷积神经网络向结合的系统可被应用于在计算机视觉问题,例如在字符识别(text recognition)中,有研究使用卷积神经网络对包含字符的图像进行特征提取,并将特征输入LSTM进行序列标注。对基于视频的计算机视觉问题,例如行为认知(action recognition)中,RNN可以使用卷积神经网络逐帧提取的图像特征进行学习 。

5.3 其它

        在计算生物学(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 等。

6 RNN梯度消失和爆炸的原因

RNN梯度消失和爆炸的原因 - 知乎

LSTM如何解决梯度消失问题 - 知乎

RNN神经网络产生梯度消失和梯度爆炸的原因及解决方案 - 早起的小虫子 - 博客园

​​​​​​为什么LSTM可以缓解梯度消失?_了不起的赵队的博客-CSDN博客_lstm为什么能解决梯度消失问题RNN_了不起的赵队的博客-CSDN博客_rnn

循环神经网络(RNN)_第28张图片

         上图为RNN的结构图,对于t时刻,其前向传播的公式为:

               循环神经网络(RNN)_第29张图片

         其中 ϕ 为激活函数,一般来说会选择tanh函数,b为偏置; 为输出, 为最终预测值; σ 为网络尾部的函数,若为分类任务,一般为softmax。

       假设我们的时间序列只有三段, 

        RNN的反向传播为BPTT,需要寻优的参数有三个,分别是U、V、W,与BP算法不同的是,其中W和U两个参数的寻优过程需要追溯之前的历史数据,参数V相对简单只需关注目前。我们只对t3时刻的参数求导(其他时刻类似),三者的偏导数为:

 循环神经网络(RNN)_第30张图片

        我们根据上面两个式子可以写出L在任意t时刻对W和U偏导数的通式: 

            循环神经网络(RNN)_第31张图片 

        整体的偏导公式就是将其按时刻再一一加起来。

  激活函数是嵌套在里面的,如果我们把激活函数放进去,拿出中间累乘的那部分:

          循环神经网络(RNN)_第32张图片

         或是

           循环神经网络(RNN)_第33张图片

         对于训练过程大部分情况下 tanh、sigmoid 的导数是小于 1 的,因为很少情况下会出现 ,如果  也是一个大于0小于1的值,则当t很大时,  就会趋近于0,和  趋近与0是一个道理。同理当  很大时  就会趋近于无穷,这就是RNN中梯度消失和爆炸的原因。

7 解决梯度爆炸和梯度消失的方案

7.1 采使用ReLu激活函数

        面对梯度消失问题,可以采用ReLu作为激活函数,下图为ReLu函数:

循环神经网络(RNN)_第34张图片

        ReLU函数在定义域大于0部分的导数恒等于1,这样可以解决梯度消失的问题,(虽然恒等于1很容易发生梯度爆炸的情况,但可通过设置适当的阈值可解决)。

        另外计算方便,计算速度快,可以加速网络训练。但是,定义域负数部分恒等于零,这样会造成神经元无法激活(可通过合理设置学习率,降低发生的概率)。

  ReLU有优点也有缺点,其中的缺点可以通过其他操作取避免或者减低发生的概率,是目前使用最多的激活函数。

        还可以通过更改内部结构来解决梯度消失和梯度爆炸问题,那就是LSTM了。

7.2 LSTM

长短期记忆网络(Long Short-Term Memory networks, LSTM)_意念回复的博客-CSDN博客_长短期记忆网络

RNN详解及BPTT详解:RNN_机器学习/NLP/搜广推/算法开发工程/大数据-CSDN博客_rnn

RNN BPTT算法推导:RNN BPTT算法推导_qq_14962179的博客-CSDN博客_bptt推导

[神经网络学习笔记]递归神经网络,即循环神经网络(Recurrent Neural Network,RNN)综述:[神经网络学习笔记]递归神经网络,即循环神经网络(Recurrent Neural Network,RNN)综述 - BetterBench的的主页 - OSCHINA - 中文开源技术交流社区

循环神经网络:循环神经网络 - 简书

漫谈RNN之梯度消失及梯度爆炸:漫谈RNN之梯度消失及梯度爆炸 - 工程师社区-智造家IMEfuture-e非标|非标管家|非标交易|透明工厂|设备备件云|工程师社区|图纸云|智客平台

循环神经网络:循环神经网络 · 大专栏

简单循环神经网络及基本结构:简单循环神经网络及基本结构_Python教程网

机器学习:回声状态网络(Echo State Networks):机器学习:回声状态网络(Echo State Networks)_竹石破岩-CSDN博客_回声状态网络

回声状态网络(ESN)教程:回声状态网络(ESN)教程_cassiePython的专栏-CSDN博客_esn网络

GRU:

循环神经网络(RNN)_第35张图片

循环神经网络(RNN)_第36张图片

循环神经网络(RNN)_第37张图片

循环神经网络(RNN)_第38张图片

吴恩达视频:【中英字幕】吴恩达深度学习课程第五课 — 序列模型_哔哩哔哩_bilibili

笔记:深度学习笔记

深度学习笔记-目录

你可能感兴趣的:(深度学习,rnn,深度学习,神经网络)