一、从单层网络谈起

在学习RNN之前,首先要了解一下最基本的单层网络,它的结构如图:

循环神经网络三种经典模型-LMLPHP

输入是x,经过变换Wx+b和激活函数f得到输出y。相信大家对这个已经非常熟悉了。

二、经典的RNN结构(N vs N)

在实际应用中,我们还会遇到很多序列形的数据:

 

循环神经网络三种经典模型-LMLPHP

如:

  • 自然语言处理问题。x1可以看做是第一个单词,x2可以看做是第二个单词,依次类推。

  • 语音处理。此时,x1、x2、x3……是每帧的声音信号。

  • 时间序列问题。例如每天的股票价格等等

序列形的数据就不太好用原始的神经网络处理了。为了建模序列问题,RNN引入了隐状态h(hidden state)的概念,h可以对序列形的数据提取特征,接着再转换为输出。先从h1的计算开始看:

循环神经网络三种经典模型-LMLPHP

图示中记号的含义是:

  • 圆圈或方块表示的是向量。

  • 一个箭头就表示对该向量做一次变换。如上图中h0和x1分别有一个箭头连接,就表示对h0和x1各做了一次变换。

在很多论文中也会出现类似的记号,初学的时候很容易搞乱,但只要把握住以上两点,就可以比较轻松地理解图示背后的含义。

h2的计算和h1类似。要注意的是,在计算时,每一步使用的参数U、W、b都是一样的,也就是说每个步骤的参数都是共享的,这是RNN的重要特点,一定要牢记。

循环神经网络三种经典模型-LMLPHP

依次计算剩下来的(使用相同的参数U、W、b):

循环神经网络三种经典模型-LMLPHP

 

我们这里为了方便起见,只画出序列长度为4的情况,实际上,这个计算过程可以无限地持续下去。

我们目前的RNN还没有输出,得到输出值的方法就是直接通过h进行计算:

循环神经网络三种经典模型-LMLPHP

 

正如之前所说,一个箭头就表示对对应的向量做一次类似于f(Wx+b)的变换,这里的这个箭头就表示对h1进行一次变换,得到输出y1。

剩下的输出类似进行(使用和y1同样的参数V和c):

循环神经网络三种经典模型-LMLPHP

 

OK!大功告成!这就是最经典的RNN结构,我们像搭积木一样把它搭好了。它的输入是x1, x2, .....xn,输出为y1, y2, ...yn,也就是说,输入和输出序列必须要是等长的

由于这个限制的存在,经典RNN的适用范围比较小,但也有一些问题适合用经典的RNN结构建模,如:

  • 计算视频中每一帧的分类标签。因为要对每一帧进行计算,因此输入和输出序列等长。

  • 输入为字符,输出为下一个字符的概率。这就是著名的Char RNN(详细介绍请参考:The Unreasonable Effectiveness of Recurrent Neural Networks,地址:http://karpathy.github.io/2015/05/21/rnn-effectiveness/。Char RNN可以用来生成文章,诗歌,甚至是代码,非常有意思)。

三、N VS 1

有的时候,我们要处理的问题输入是一个序列,输出是一个单独的值而不是序列,应该怎样建模呢?实际上,我们只在最后一个h上进行输出变换就可以了:

循环神经网络三种经典模型-LMLPHP

 

这种结构通常用来处理序列分类问题。如输入一段文字判别它所属的类别,输入一个句子判断其情感倾向,输入一段视频并判断它的类别等等。

四、1 VS N

输入不是序列而输出为序列的情况怎么处理?我们可以只在序列开始进行输入计算:

循环神经网络三种经典模型-LMLPHP

 

还有一种结构是把输入信息X作为每个阶段的输入:

循环神经网络三种经典模型-LMLPHP

 

下图省略了一些X的圆圈,是一个等价表示:

循环神经网络三种经典模型-LMLPHP

 

这种1 VS N的结构可以处理的问题有:

  • 从图像生成文字(image caption),此时输入的X就是图像的特征,而输出的y序列就是一段句子

  • 从类别生成语音或音乐等

五、N vs M

下面我们来介绍RNN最重要的一个变种:N vs M。这种结构又叫Encoder-Decoder模型,也可以称之为Seq2Seq模型。

原始的N vs N RNN要求序列等长,然而我们遇到的大部分问题序列都是不等长的,如机器翻译中,源语言和目标语言的句子往往并没有相同的长度。

为此,Encoder-Decoder结构先将输入数据编码成一个上下文向量c:

循环神经网络三种经典模型-LMLPHP

得到c有多种方式,最简单的方法就是把Encoder的最后一个隐状态赋值给c,还可以对最后的隐状态做一个变换得到c,也可以对所有的隐状态做变换。

拿到c之后,就用另一个RNN网络对其进行解码,这部分RNN网络被称为Decoder。具体做法就是将c当做之前的初始状态h0输入到Decoder中:

 

循环神经网络三种经典模型-LMLPHP

还有一种做法是将c当做每一步的输入:

循环神经网络三种经典模型-LMLPHP

 

由于这种Encoder-Decoder结构不限制输入和输出的序列长度,因此应用的范围非常广泛,比如:

  • 机器翻译。Encoder-Decoder的最经典应用,事实上这一结构就是在机器翻译领域最先提出的

  • 文本摘要。输入是一段文本序列,输出是这段文本序列的摘要序列。

  • 阅读理解。将输入的文章和问题分别编码,再对其进行解码得到问题的答案。

  • 语音识别。输入是语音信号序列,输出是文字序列。

  • …………

RNN( Recurrent Neural Networks循环神经网络)

循环神经网络的主要用途是处理和预测序列数据,在全连接神经网络或卷积神经网络中,网络结果都是从输入层到隐含层再到输出层,层与层之间是全连接或部分连接的,但每层之间的结点是无连接的。考虑这样一个问题,如果要预测句子的下一个单词是什么,一般需要用到当前单词以及前面的单词,因为句子中前后单词并不是独立的,比如,当前单词是“很”,前一个单词是“天空”,那么下一个单词很大概率是“蓝”。循环神经网络的来源就是为了刻画一个序列当前的输出与之前信息的关系。从网络结果上来说,RNN会记忆之前的信息,并利用之前的信息影响后面的输出。也就是说,RNN的隐藏层之间的结点是有连接的,隐藏层的输入不仅包括输入层的输出,还包含上一时刻隐藏层的输出。

典型的RNN结构如下图所示,对于RNN来说,一个非常重要的概念就是时刻,RNN会对于每一个时刻的输入结合当前模型的状态给出一个输出,从图中可以看出,RNN的主体结构A的输入除了来自输入层的Xt,还有一个循环的边来提供当前时刻的状态。同时A的状态也会从当前步传递到下一步。

循环神经网络三种经典模型-LMLPHP

我们将这个循环展开,可以很清晰地看到信息在隐藏层之间的传递:

循环神经网络三种经典模型-LMLPHP

链式的特征揭示了 RNN 本质上是与序列和列表相关的。他们是对于这类数据的最自然的神经网络架构。
并且 RNN 也已经被人们应用了!在过去几年中,应用 RNN 在语音识别,语言建模,翻译,图片描述等问题上已经取得一定成功,并且这个列表还在增长。

RNN的隐藏层的计算是一个全连接,循环神经网络三种经典模型-LMLPHP
 


长期依赖(Long-Term Dependencies)问题

RNN 的关键点之一就是他们可以用来连接先前的信息到当前的任务上,例如使用过去的视频段来推测对当前段的理解。如果 RNN 可以做到这个,他们就变得非常有用。但是真的可以么?答案是,还有很多依赖因素。
有时候,我们仅仅需要知道先前的信息来执行当前的任务。例如,我们有一个语言模型用来基于先前的词来预测下一个词。如果我们试着预测 “the clouds are in the sky” 最后的词,我们并不需要任何其他的上下文 —— 因此下一个词很显然就应该是 sky。在这样的场景中,相关的信息和预测的词位置之间的间隔是非常小的,RNN 可以学会使用先前的信息。

但是同样会有一些更加复杂的场景。假设我们试着去预测“I grew up in France... I speak fluent French”最后的词。当前的信息建议下一个词可能是一种语言的名字,但是如果我们需要弄清楚是什么语言,我们是需要先前提到的离当前位置很远的 France 的上下文的。这说明相关信息和当前预测位置之间的间隔就肯定变得相当的大。
不幸的是,在这个间隔不断增大时,RNN 会丧失学习到连接如此远的信息的能力。

在理论上,RNN 绝对可以处理这样的 长期依赖 问题。人们可以仔细挑选参数来解决这类问题中的最初级形式,但在实践中,RNN 肯定不能够成功学习到这些知识。如果序列过长会导致优化时出现梯度消散的问题。
然而,幸运的是,LSTM 并没有这个问题!


LSTM 网络

Long Short Term Memory 网络—— 一般就叫做 LSTM ——是一种特殊的 RNN 类型,可以学习长期依赖信息。LSTM 由Hochreiter & Schmidhuber (1997)提出,并在近期被Alex Graves进行了改良和推广。在很多问题,LSTM 都取得相当巨大的成功,并得到了广泛的使用。

LSTM 通过刻意的设计来避免长期依赖问题。记住长期的信息在实践中是 LSTM 的默认行为,而非需要付出很大代价才能获得的能力!
所有 RNN 都具有一种重复神经网络模块的链式的形式。在标准的 RNN 中,这个重复的模块只有一个非常简单的结构,例如一个 tanh 层。
LSTM 同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于 单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。LSTM是一种拥有三个“门”结构的特殊网络结构。

循环神经网络三种经典模型-LMLPHP

LSTM 靠一些“门”的结构让信息有选择性地影响RNN中每个时刻的状态。所谓“门”的结构就是一个使用sigmod神经网络和一个按位做乘法的操作,这两个操作合在一起就是一个“门”结构。之所以该结构叫做门是因为使用sigmod作为激活函数的全连接神经网络层会输出一个0到1之间的值,描述当前输入有多少信息量可以通过这个结构,于是这个结构的功能就类似于一扇门,当门打开时(sigmod输出为1时),全部信息都可以通过;当门关上时(sigmod输出为0),任何信息都无法通过。

如上图所示,我们用以下几个公式来描述LSTM一个循环体的结构组成:

输入门:循环神经网络三种经典模型-LMLPHP

遗忘门:循环神经网络三种经典模型-LMLPHP

候选记忆单元:循环神经网络三种经典模型-LMLPHP

当前时刻记忆单元:循环神经网络三种经典模型-LMLPHP

输出门:循环神经网络三种经典模型-LMLPHP

输出:循环神经网络三种经典模型-LMLPHP

 

 

GRU网络

GRU可以看成是LSTM的变种,GRU把LSTM中的遗忘门和输入们用更新门来替代。 把cell state和隐状态ht进行合并,在计算当前时刻新信息的方法和LSTM有所不同。 下图是GRU更新ht的过程:

循环神经网络三种经典模型-LMLPHP

重置门:循环神经网络三种经典模型-LMLPHP

更新门:循环神经网络三种经典模型-LMLPHP

候选记忆单元:循环神经网络三种经典模型-LMLPHP

当前时刻记忆单元:循环神经网络三种经典模型-LMLPHP

先给出一些结论:

  1. GRU和LSTM的性能在很多任务上不分伯仲。
  2. GRU 参数更少因此更容易收敛,但是数据集很大的情况下,LSTM表达性能更好。
  3. 从结构上来说,GRU只有两个门(update和reset),LSTM有三个门(forget,input,output),GRU直接将hidden state 传给下一个单元,而LSTM则用memory cell 把hidden state 包装起来。

 

双向RNN

在经典的循环神经网络中,状态的传输是从前往后单向的。然而,在有些问题中,当前时刻的输出不仅和之前的状态有关系,也和之后的状态相关。这时就需要双向RNN(BiRNN)来解决这类问题。例如预测一个语句中缺失的单词不仅需要根据前文来判断,也需要根据后面的内容,这时双向RNN就可以发挥它的作用。

双向RNN是由两个RNN上下叠加在一起组成的。输出由这两个RNN的状态共同决定。
循环神经网络三种经典模型-LMLPHP

从上图可以看出,双向RNN的主题结构就是两个单向RNN的结合。在每一个时刻t,输入会同时提供给这两个方向相反的RNN,而输出则是由这两个单向RNN共同决定(可以拼接或者求和等)。

同样地,将双向RNN中的RNN替换成LSTM或者GRU结构,则组成了BiLSTM和BiGRU。

在Encoder-Decoder结构中,Encoder把所有的输入序列都编码成一个统一的语义特征c再解码,因此, c中必须包含原始序列中的所有信息,它的长度就成了限制模型性能的瓶颈。如机器翻译问题,当要翻译的句子较长时,一个c可能存不下那么多信息,就会造成翻译精度的下降。

Attention机制通过在每个时间输入不同的c来解决这个问题,下图是带有Attention机制的Decoder:

循环神经网络三种经典模型-LMLPHP

 

每一个c会自动去选取与当前所要输出的y最合适的上下文信息。具体来说,我们用 循环神经网络三种经典模型-LMLPHP 衡量Encoder中第j阶段的hj和解码时第i阶段的相关性,最终Decoder中第i阶段的输入的上下文信息 循环神经网络三种经典模型-LMLPHP 就来自于所有 循环神经网络三种经典模型-LMLPHP 对 循环神经网络三种经典模型-LMLPHP 的加权和。

以机器翻译为例(将中文翻译成英文):

循环神经网络三种经典模型-LMLPHP

输入的序列是“我爱中国”,因此,Encoder中的h1、h2、h3、h4就可以分别看做是“我”、“爱”、“中”、“国”所代表的信息。在翻译成英语时,第一个上下文c1应该和“我”这个字最相关,因此对应的 循环神经网络三种经典模型-LMLPHP 就比较大,而相应的 循环神经网络三种经典模型-LMLPHP 、 循环神经网络三种经典模型-LMLPHP 、 循环神经网络三种经典模型-LMLPHP 就比较小。c2应该和“爱”最相关,因此对应的 循环神经网络三种经典模型-LMLPHP 就比较大。最后的c3和h3、h4最相关,因此 循环神经网络三种经典模型-LMLPHP 、 循环神经网络三种经典模型-LMLPHP 的值就比较大。

至此,关于Attention模型,我们就只剩最后一个问题了,那就是:这些权重 aij 是怎么来的?

事实上, aij同样是从模型中学出的,它实际和Decoder的第i-1阶段的隐状态、Encoder第j个阶段的隐状态有关。

同样还是拿上面的机器翻译举例, a1j 的计算(此时箭头就表示对h'和 循环神经网络三种经典模型-LMLPHP 同时做变换):

循环神经网络三种经典模型-LMLPHP

a2j 的计算:

循环神经网络三种经典模型-LMLPHP

 

a3j的计算:

循环神经网络三种经典模型-LMLPHP

 

以上就是带有Attention的Encoder-Decoder模型计算的全过程。

Attention机制代表了在解码Decoder阶段,每次都会输入一个Context上下文的向量Ci, 隐藏层的新状态Si根据上一步的状态Si-1, Yi, Ci 三者的一个非线性函数得出。

 

Context向量在解码的每一步都会重新计算,根据一个MLP模型计算出输出序列i对每个输入序列j的隐含层的对应权重aij,并对所有隐含层加权平均。文章中说的Alignment Model就是代表这种把输入序列位置j和输出序列位置i建立关系的模型。

 

aij 即可以理解为Decoder解码输出序列的第i步,对输入序列第j步分配的注意力权重。

 

 

eij为一个简单的MLP模型激活的输出;aij的计算是对eij做softmax归一化后的结果。

 

10-03 10:06