传说中的RNN是谁?(附上作者和相关信息)

假设你已经知道最基本的人工神经网络模型(即全连接前馈神经网络),希望这篇文章能帮助你了解RNN,即传说中的循环神经网络。严格地说,这篇论文是对互联网上一些最容易理解、写得最好的文章的综合(或翻译)。但问题是网上的文章良莠不齐,水平参差不齐。而且穷人远比(甚至被稀释的)优秀文章多。因此,本文的意义在于避免初学者陷入“垃圾”文章的窘境。当然,如果你觉得这篇文章还不够,也非常值得推荐阅读文末给出的所有经典文献。

如你所知,一个前馈(全连接)神经网络如下图所示,由输入层、隐含层和输出层组成。如果你想从头开始学习前馈神经网络,那么参考文献1和2是最好的教程!现在,假设你已经掌握了基本的前馈神经网络,下面这张图可能和你在一般教科书上看到的略有不同。对,是把通常的画图方法逆时针旋转90度得到的。这样做的目的主要是为了与后续的RNN图无缝连接。

就像人脑一样,当我们看到(接收到)一只熊的图像时,经过一系列的隐藏层(及其极其复杂的计算过程),最后在输出层得到“熊”的结果。

但前馈神经网络反映(或完成)的过程往往是相对静态的。人脑也有处理时间序列数据的能力。换句话说,大脑得到的一个结果,不仅与当前输入有关,还与最后时刻的输出有关。

比如我们看到一篇文章,里面有这样一句话:“大灰狼静静地躲在喜羊羊的家门前,等着猎物上钩。”很显然,当我们读到“猎物”这个词的时候,你会立刻反映,它应该是特指喜羊羊,而大野狼却在等待猎物。很明显,这种理解程度,仅仅依靠当前的输入(比如当前的句子或者词汇)是达不到的。最后一个阶段(或瞬间)的输出(即最后一句话的理解)也很重要。

因此,从一个时刻到下一个时刻,我们的大脑作为一种功能运行:它接受来自我们感官(外部)和思想(内部)的输入,并以行动(外部)和新思想(内部)的形式产生输出。

我们的大脑在时间中反复运转。我们看到一只熊,然后想到“熊”,然后想到“跑”。重要的是,将一只熊的形象转换成思想“熊”的功能也将思想“熊”转换成思想“跑”。这是一个递归函数,我们可以用递归神经网络(RNN)来建模。

RNN是由相同的前馈神经网络组成的,一个前馈神经网络用于一个时刻或一个时间步,我们称之为“RNN细胞”。

在上图中,神经网络A的一个块查看某个输入xt,并输出一个值ht。环路允许信息从网络的一个步骤传递到下一个步骤。

这里的一大块NN实际上相当于前馈神经网络中的隐层,即多层传输的NN结构。并且循环输入实际上输入到下一个状态,所以上图实际上暗示了需要一个延迟。

如果你对上述循环的“输入→输出”的结构感到困惑,如果你还对这个自我循环感到不解,其实你只需要“拉开”这个结构,就一目了然了。递归神经网络可以被认为是同一网络的多个副本,每个副本都向后继者传递消息。考虑一下如果我们展开循环会发生什么:

或者

另一个常见的图示如下(Arnn及其正向计算中涉及的计算的时间展开),但都是相同的例程。

或者表达为以下随时间扩展的循环神经网络:

循环神经网络可以应用于许多不同类型的机器学习任务。根据这些任务的特点,它们可以分为以下几种模式:

序列到类别模式:该模式是序列数据的分类问题。输入是一个序列,输出是一个类别。例如,在文本分类中,输入数据是单词序列,输出是文本的类别。

序列到序列模式:这种任务的输入和输出都是序列。具体来说,可以分为两种情况:

同步序列对序列模式:这种模式就是机器学习中的序列标注任务,即每一时刻都有输入和输出,输入序列和输出序列长度相同。例如,在词性标注中,每个单词都需要用其对应的词性标签进行标注。

异步序列对序列模式:这种模式也称为EncoderDecoder模式,即输入和输出不需要有严格的对应关系,也不需要保持相同的长度。例如,在机器翻译中,输入源语言的单词序列,输出目标语言的单词序列。

首先,我们来看序列到类别的应用模式。假设一个样本X={x1,?,xT}是长度为T的序列,输出是一个范畴y∈{1,?,C} .我们可以将样本X在不同时刻输入递归神经网络,得到不同时刻的隐状态h1。,hT .我们可以放hT;作为整个序列的最终表示(或特征),并将其输入到分类器G(),

这里g(...)可以是简单的线性分类器(如Logistic回归),也可以是复杂的分类器(如多层前馈神经网络)。

除了将最后一个时刻的隐藏状态表示为一个序列(如图A),我们还可以对整个序列的所有隐藏状态进行平均,并将这个平均状态作为整个序列的表示(如图B)。

在同步序列对序列模式下(如下图所示),输入是一个长度为t X={x1,?,xT},输出是序列Y={y1,?本年迄今.将样本x在不同时刻输入循环神经网络,得到不同时刻的隐状态h1。,hT .每个时刻的隐藏状态hT表示当前时刻和历史的信息,输入分类器G()得到当前时刻的标签。

在异步序列到序列模式下(如下图所示),输入是一个长度为t X={x1,?,xT},输出是序列Y={y1,?,yM } .将样本x在不同时刻输入循环神经网络,得到不同时刻的隐状态h1。,hT .然后RNN单元被执行m次。此时,每个RNN细胞的输入只是最后时刻的隐藏状态。对于每个时刻的隐藏状态hT,将t∈[T+1,T+M]输入到分类器G()中,得到当前时刻的标签。

参考

1左飞,R语言实践:机器学习和数据分析,电子工业出版社,第15章。

2迈克尔·尼尔森

3邱希鹏,循环神经网络,神经网络与深度学习?

4 DennyBritz,递归神经网络教程,第1部分RNNs简介

5 Christopher Olah,understanding glstm Networks(/baimafujinji/article/details/78279746