循环神经网络
循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network)1。
对循环神经网络的研究始于二十世纪80-90年代,并在二十一世纪初发展为深度学习(deep learning)算法之一,其中双向循环神经网络(Bidirectional RNN, Bi-RNN)和长短期记忆网络(Long Short-Term Memory networks,LSTM)是常见的循环神经网络2。
循环神经网络具有记忆性、参数共享并且图灵完备(Turing completeness),因此在对序列的非线性特征进行学习时具有一定优势。循环神经网络在自然语言处理(Natural Language Processing, NLP),例如语音识别、语言建模、机器翻译等领域有应用,也被用于各类时间序列预报。引入了卷积神经网络(Convolutional Neural Network,CNN)构筑的循环神经网络可以处理包含序列输入的计算机视觉问题。
基本信息
- 中文名
循环神经网络
- 外文名
Recurrent Neural Network, RNN
- 所属学科
人工智能
- 类型
机器学习算法、神经网络算法
- 提出者
M. I. Jordan、Jeffrey Elman
- 提出时间
1986-1990年
- 应用
自然语言处理、计算机视觉
历史
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)现象,无法掌握长时间跨度的非线性关系3。为解决长期依赖问题,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)12。通常地,循环单元构成的链式连接可类比前馈神经网络中的隐含层(hidden layer),但在不同的论述中,RNN的“层”可能指单个时间步的循环单元或所有的循环单元,因此作为一般性介绍,这里避免引入“隐含层”的概念。给定按序列输入的学习数据,RNN的展开长度为。待处理的序列通常为时间序列,此时序列的演进方向被称为“时间步(time-step)”。对时间步,RNN的循环单元有如下表示1:
式中称为RNN的系统状态(system status),在动力系统的观点下,系统状态描述了一个给定空间中所有点随时间步的变化1。是内部状态(internal status),与系统状态有关。由于求解当前的系统状态需要使用前一个时间步的内部状态,因此循环单元的计算包含递归(recursion)。在树结构的观点下,所有先前时间步的循环单元都是当前时间步循环单元的父节点。式中是激励函数或一个封装的前馈神经网络,前者对应简单循环网络(SRN),后者对应门控算法和一些深度算法1。常见的激励函数选择包括logistic函数和双曲正切函数(hyperbolic tangent function)。是循环单元内部的权重系数,与时间步无关,即对一组学习样本,RNN使用共享的权重计算所有时间步的输出1。
仅由循环单元构成的RNN在理论上是可行的,但RNN通常另有输出节点,其定义为一个线性函数1:
式中是权重系数。根据RNN结构的不同,一个或多个输出节点的计算结果在通过对应的输出函数后可得到输出值。例如对分类问题,输出函数可以是归一化指数函数(softmax function)或其它机器学习算法建立的分类器1。
连接性