循环神经网络 RNN 简介
传统的神经网络是层与层之间是全连接的,但是每层之间的神经元是没有连接的(其实是假设各个数据之间是独立的),这种结构不善于处理序列化的问题。比如要预测句子中的下一个单词是什么,这往往与前面的单词有很大的关联,因为句子里面的单词并不是独立的。下图是一个全连接网络,它的隐藏层的值只取决于输入的 x:
循环神经网络(Recurrent Neural Network, RNN)是根据”人的认知是基于过往经验和记忆”这一观点提出的,它不仅考虑当前时刻的输入,还考虑对前面内容记忆。即 RNN 对之前发生在数据序列中的事是有一定记忆的,对处理有序列的问题效果比较好。是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network)。RNN 的隐藏层的值 s 不仅仅取决于当前这次的输入 x,还取决于上一次隐藏层的值 s。这个过程画成简图是这个样子:
其中,t 是时刻,x 是输入层,s 是隐藏层,o 是输出层,矩阵 W 就是隐藏层上一次的值作为这一次的输入的权重。
传统的神经网络中间层每一个神经元和输入的每一个数据进行运算得到一个激励然后产生一个中间层的输出,并没有记忆能力,在输入为序列的情况下的效果有限。而很多东西是受到时域信息影响的,某一时刻产生的激励对下一时刻是有用的,递归神经网络就具备这样的记忆能力,它可以把这一刻的特征与上一刻保存的激励信息相结合(并不只是上一刻 $s_2$ 是由 $s_1,s_2$ 产生的,$s_n$ 不仅有 $s_n-1$ 的信息,还包括 $s_n-2,s_n-3,…,s_1$ 的信息。
CNN 与 RNN 的区别
类别 | 特点描述 |
相同点 | 1、传统神经网络的扩展。
2、前向计算产生结果,反向计算模型更新。 3、每层神经网络横向可以多个神经元共存,纵向可以有多层神经网络连接。 |
不同点 | 1、CNN 空间扩展,神经元与特征卷积;RNN 时间扩展,神经元与多个时间输出计算
2、RNN 可以用于描述时间上连续状态的输出,有记忆功能,CNN 用于静态输出(前一输入跟下一输入是否有关联) 3、CNN 需要固定长度的输入、输出,RNN 的输入可以是不定长的 4、CNN 只有 one-to-one 一种结构,而 RNN 有多种结构 |
循环神经网络 RNN 应用场景
标准的全连接神经网络(fully connected neural network)处理序列会有两个问题:1)全连接神经网络输入层和输出层长度固定,而不同序列的输入、输出可能有不同的长度,选择最大长度并对短序列进行填充(pad)不是一种很好的方式;2)全连接神经网络同一层的节点之间是无连接的,当需要用到序列之前时刻的信息时,全连接神经网络无法办到,一个序列的不同位置之间无法共享特征。而循环神经网络(Recurrent Neural Network,RNN)可以很好地解决问题。
RNN 已经被在实践中证明对 NLP 是非常成功的。如词向量表达、语句合法性检查、词性标注等。在 RNN 中,目前使用最广泛最成功的模型便是 LSTMs(Long Short-Term Memory,长短时记忆模型)模型,该模型通常比 vanilla RNNs 能够更好地对长短时依赖进行表达,该模型相对于一般的 RNN,只是在隐藏层做了手脚。对于 LSTM,后面会进行详细地介绍。下面对 RNN 在 NLP 中的应用进行简单的介绍。
语言模型与文本生成(Language Modeling and Generating Text)
给你一个单词序列,我们需要根据前面的单词预测每一个单词的可能性。语言模型能够一个语句正确的可能性,这是机器翻译的一部分,往往可能性越大,语句越正确。另一种应用便是使用生成模型预测下一个单词的概率,从而生成新的文本根据输出概率的采样。语言模型中,典型的输入是单词序列中每个单词的词向量(如 One-hot vector),输出时预测的单词序列。当在对网络进行训练时,如果,那么第步的输出便是下一步的输入。
机器翻译(Machine Translation)
机器翻译是将一种源语言语句变成意思相同的另一种源语言语句,如将英语语句变成同样意思的中文语句。与语言模型关键的区别在于,需要将源语言语句序列输入后,才进行输出,即输出第一个单词时,便需要从完整的输入序列中进行获取。机器翻译如下图所示:
语音识别(Speech Recognition)
语音识别是指给一段声波的声音信号,预测该声波对应的某种指定源语言的语句以及该语句的概率值。
图像描述生成(Generating Image Descriptions)
和卷积神经网络(convolutional Neural Network, CNN)一样,RNN 已经在对无标图像描述自动生成中得到应用。将 CNN 与 RNN 结合进行图像描述自动生成。这是一个非常神奇的研究与应用。该组合模型能够根据图像的特征生成描述。
循环神经网络 RNN 结构
以 (Vanilla) Recurrent Neural Network 为例:
首先看一个简单的循环神经网络,它由输入层、一个隐藏层和一个输出层组成:
对于 RNN,一个非常重要的概念就是时刻。RNN 会对每一个时刻的输入结合当前模型的状态给出一个输出。图中,t 时刻 RNN 的主体结构 A 的输入除了来自输入层 $X_t$,还有一个循环的边来提供从 $t-1$ 时刻传递来的隐藏状态。RNN 可以被看作是同一个神经网络结构按照时间序列复制的结果。下图展示了一个展开的 RNN。
从 RNN 的展开结构可以很容易得出它最擅长解决的问题是与时间序列相关的。RNN 也是处理这类问题时最自然的神经网络结构。RNN 的主体结构 A 按照时间序列复制了多次,结构 A 也被称之为循环体。如何设计循环体 A 的网络结构是 RNN 解决实际问题的关键。和卷积神经网络(CNN)过滤器中参数共享类似,在 RNN 中,循环体 A 中的参数在不同时刻也是共享的。下图展示了一个最简单的使用单个全连接层作为循环体 A 的 RNN,图中黄色的 tanh 小方框表示一个使用 tanh 作为激活函数的全连接层。
t 时刻循环体 A 的输入包括 $X_t$ 和从 $t-1$ 时刻传递来的隐藏状态 $h_{t-1}$(依据 copy 标志,$t-1$ 和 $t$ 时刻循环体 A 之间连接的箭头即表示隐藏状态 $h_{t-1}$ 的传递)。循环体 A 的两部分输入如何处理呢?如图,将 $X_t$ 和 $h_{t-1}$ 直接拼接起来,成为一个更大的矩阵/向量 $[X_t, h_{t-1}]$。假设 $X_t$ 和 $h_{t-1}$ 的形状分别为 [1,3] 和 [1,4],则最后循环体 A 中全连接层输入向量的形状为 [1,7]。拼接完后按照全连接层的方式进行处理即可。
为了将当前时刻的隐含状态 $h_t$ 转化为最终的输出 $y_t$,循环神经网络还需要另一个全连接层来完成这个过程。这和卷积神经网络中最后的全连接层意义是一样的。RNN 的前向传播计算过程如下图所示:
RNN 的类型:
- One-to-one: Vanilla Neural Networks。最简单的结构,其实和全连接神经网络并没有什么区别,这一类别算不得是 RNN。
- One-to-many: Image Captioning, image->sequence of works。输入不是序列,输出是序列。比如:输入一个图片,输出一句描述图片的话
- Many-to-one: Sentiment Classification, sequence of words->sentiment。输入是序列,输出不是序列。比如:输入一句话,判断是正面还是负面情绪
- Many-to-many: Machine Translation, seq of words->seq of words。输入和输出都是序列,但两者长度可以不一样。比如机器翻译。
- Many-to-many: Video classification on frame level。输出和输出都是序列,两者长度一样。比如:输入一个视频,判断每帧分类。
RNN 扩展和改进模型
这些年,研究者们已经提出了多种复杂的 RNN 去改进 vanilla RNN 模型的缺点。下面是目前常见的一些 RNN 模型:
Simple RNN (SRN) 基本循环神经网络
SRN 是 RNN 的一种特例,它是一个三层网络,并且在隐藏层增加了上下文单元,下图中的 y 便是隐藏层,u 便是上下文单元。上下文单元节点与隐藏层中的节点的连接是固定的,并且权值也是固定的,其实是一个上下文节点与隐藏层节点一一对应,并且值是确定的。在每一步中,使用标准的前向反馈进行传播,然后使用学习算法进行学习。上下文每一个节点保存其连接的隐藏层节点的上一步的输出,即保存上文,并作用于当前步对应的隐藏层节点的状态,即隐藏层的输入由输入层的输出与上一步的自己的状态所决定的。因此 SRN 能够解决标准的多层感知机(MLP)无法解决的对序列数据进行预测的任务。SRN 网络结构如下图所示:
Bidirectional RNN 双向循环神经网络
Bidirectional RNN(双向网络)的改进之处便是,假设当前的输出(第 t 步的输出)不仅仅与前面的序列有关,并且还与后面的序列有关。例如:预测一个语句中缺失的词语那么就需要根据上下文来进行预测。Bidirectional RNN 是一个相对较简单的 RNN,是由两个 RNN 上下叠加在一起组成的。输出由这两个 RNN 的隐藏层的状态决定的。如下图所示:
Deep (Bidirectional) RNN 深度循环神经网络
Deep (Bidirectional) RNN 与 Bidirectional RNN 相似,只是对于每一步的输入有多层网络。这样,该网络便有更强大的表达与学习能力,但是复杂性也提高了,同时需要更多的训练数据。Deep (Bidirectional) RNN 的结构如下图所示:
Echo State Network 回声状态网络
ESN(回声状态网络)虽然也是一种 RNN,但是它与传统的 RNN 相差很大。ESN 具有三个特点:
- 它的核心结构时一个随机生成、且保持不变的储备池(Reservoir),储备池是大规模的、随机生成的、稀疏连接(SD 通常保持 1%~5%,SD 表示储备池中互相连接的神经元占总的神经元个数 N 的比例)的循环结构;
- 其储备池到输出层的权值矩阵是唯一需要调整的部分;
- 简单的线性回归就可完成网络的训练。
从结构上讲,ESN 是一种特殊类型的循环神经网络,其基本思想是:使用大规模随机连接的循环网络取代经典神经网络中的中间层,从而简化网络的训练过程。因此 ESN 的关键是中间的储备池。网络中的参数包括:
- $W$ 为储备池中节点的连接权值矩阵
- $W_{in}$ 为输入层到储备池之间的连接权值矩阵,表明储备池中的神经元之间是连接的
- $W_{back}$ 为输出层到储备池之间的反馈连接权值矩阵,表明储备池会有输出层来的反馈
- $W_{out}$ 为输入层、储备池、输出层到输出层的连接权值矩阵,表明输出层不仅与储备池连接还与输入层和自己连接
- $W^{out}_{bias}$ 表示输出层的偏置项
对于 ESN,关键是储备池的四个参数,如储备池内部连接权谱半径 SR($SR=\lambda_{max}=max\{|W features|\}$,只有 SR<1 时,ESN 才能具有回声状态属性)、储备池规模 N(即储备池中神经元的个数)、储备池输入单元尺度 IS(IS 为储备池的输入信号连接到储备池内部神经元之前需要相乘的一个尺度因子)、储备池稀疏程度 SD(即为储备池中互相连接的神经元个数占储备池神经元总个数的比例)。对于 IS,如果需要处理的任务的非线性越强,那么输入单元尺度越大。该原则的本质就是通过输入单元尺度 IS,将输入变换到神经元激活函数相应的范围(神经元激活函数的不同输入范围,其非线性程度不同)。
ESN 的结构如下图所示:
Gated Recurrent Unit Recurrent Neural Network 门控循环单元
GRU 也是一般的 RNN 的改良版本,主要是从以下两个方面进行改进:
- 序列中不同的位置处的单词(以单词举例)对当前的隐藏层的状态的影响不同,越前面的影响越小,即每个前面状态对当前的影响进行了距离加权,距离越远,权值越小。
- 在产生误差 error 时,误差可能是由某一个或者几个单词而引发的,所以应当仅仅对对应的单词 weight 进行更新。
GRU 的结构如下图所示:
GRU 首先根据当前输入单词向量 word vector 已经前一个隐藏层的状态 hidden state 计算出 update gate 和 reset gate。再根据 reset gate、当前 word vector 以及前一个 hidden state 计算新的记忆单元内容 (new memory content)。当 reset gate 为 1 的时候,new memory content 忽略之前的所有 memory content,最终的 memory 是之前的 hidden state 与 new memory content 的结合。
LSTM Network 长短期记忆
LSTM 与 GRU 类似,目前非常流行。它与一般的 RNN 结构本质上并没有什么不同,只是使用了不同的函数去去计算隐藏层的状态。在 LSTM 中,i 结构被称为 cells,可以把 cells 看作是黑盒用以保存当前输入 $x_t$ 之前的保存的状态 $h_{t-1}$,这些 cells 更加一定的条件决定哪些 cell 抑制哪些 cell 兴奋。它们结合前面的状态、当前的记忆与当前的输入。已经证明,该网络结构在对长序列依赖问题中非常有效。LSTM 的网络结构如下图所示。
LSTM 与 GRU 的区别如图所示:
从上图可以看出,它们之间非常相像,不同在于:
- new memory 的计算方法都是根据之前的 state 及 input 进行计算,但是 GRU 中有一个 reset gate 控制之前 state 的进入量,而在 LSTMs 里没有这个 gate
- 产生新的 state 的方式不同,LSTM 有两个不同的 gate,分别是 forget gate (f gate) 和 input gate (i gate),而 GRU 只有一个 update gate (z gate)
- LSTM 对新产生的 state 又一个 output gate (o gate) 可以调节大小,而 GRUs 直接输出无任何调节。
Bidirectional LSTM
与 bidirectional RNN 类似,bidirectional LSTM 有两层 LSTM。一层处理过去的训练信息,另一层处理将来的训练信息。在 bidirectional LSTM 中,通过前向 LSTM 获得前向隐藏状态,后向 LSTM 获得后向隐藏状态,当前隐藏状态是前向隐藏状态与后向隐藏状态的组合。
Stacked LSTM
与 Deep RNN 类似,stacked LSTM 通过将多层 LSTM 叠加起来得到一个更加复杂的模型。不同于 bidirectional LSTM,stacked LSTMs 只利用之前步骤的训练信息。
Clockwork RNN (CW-RNN) 时钟频率驱动循环神经网络
CW-RNN 是 ICML 2014 上提出的一篇论文,与 LSTM 模型目的是相同的,就是为了解决经典的 SRN 对于长距离信息丢失的问题。但是与 LSTM(基于三个门进行过滤和调节)的思想完全不同,CW-RNN 利用的思想非常简单。CW 在原文中作者表示其效果较 SRN 与 LSTM 都好。CW-RNN 是一种使用时钟频率来驱动的 RNN。它将隐藏层分为几个块(组,Group/Module),每一组按照自己规定的时钟频率对输入进行处理。并且为了降低标准的 RNN 的复杂性,CW-RNN 减少了参数的数目,提高了网络性能,加速了网络的训练。CW-RNN 通过不同的隐藏层模块工作在不同的时钟频率下来解决长时间依赖问题。将时钟时间进行离散化,然后在不同的时间点,不同的隐藏层组在工作。因此,所有的隐藏层组在每一步不会都同时工作,这样便会加快网络的训练。并且,时钟周期小的组的神经元的不会连接到时钟周期大的组的神经元,只会周期大的连接到周期小的(认为组与组之间的连接是有向的就好了,代表信息的传递是有向的),周期大的速度慢,周期小的速度快,那么便是速度慢的连速度快的,反之则不成立。
CW-RNN 与 SRN 网络结构类似,也包括输入层(Input)、隐藏层(Hidden)、输出层(Output),它们之间也有向前连接,输入层到隐藏层的连接,隐藏层到输出层的连接。但是与 SRN 不同的是,隐藏层中的神经元会被划分为若干个组,设为 g,每一组中的神经元个数相同,设为 k,并为每一个组分配一个时钟周期 $T_{i}\in\{T_1,T_2,…,T_g\}$,每一个组中的所有神经元都是全连接,但是组 j 到组 i 的循环连接则需要满足大于 $T_j>T_i$。如下图所示,将这些组按照时钟周期递增从左到右进行排序,即 $T_1<T_2<…<T_g$,那么连接便是从右到左。例如:隐藏层共有 256 个节点,分为四组,周期分别是[1,2,4,8],那么每个隐藏层组 256/4=64 个节点,第一组隐藏层与隐藏层的连接矩阵为 64*64 的矩阵,第二层的矩阵则为 64*128 矩阵,第三组为 64*(3*64)=64*192 矩阵,第四组为 64*(4*64)=64*256 矩阵。这就解释了上一段的后面部分,速度慢的组连到速度快的组,反之则不成立。
CW-RNN 的网络结构如下图所示:
参考链接: