传说中的RNN到底是何方神圣?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baimafujinji/article/details/78279746

假设你已经知道最基本的人工神经网络模型(也就是全连接的前馈神经网络),那么希望本文可以帮助你理解RNN,也就是传说中的循环神经网络。严格来说,本文是综合了(或翻译了)网上若干最容易理解、写得最棒的文章而成的。但问题在于网上的文章龙蛇混杂,水平参差不齐。而且拙劣者远远多于(甚至已经稀释了)优秀的文章。所以本文的意义就在于令初学者免于陷入“垃圾”文章之海洋的窘境。当然,如果你觉得本文看得还不过瘾,那么详阅文末给出的各篇经典文献也是非常值得推荐的。


如你所知的,一个前馈(全连接)神经网络如下图所示,由输入层、隐藏层和输出层构成。如果你想从零开始前馈神经网络,那么参考文献【1】和【2】就是最佳的教程!现在假设你已经掌握了基本的前馈神经网络,那么下面这幅图可能跟你在一般教科书上见到它时的样子稍微有点不一样,是的,它是将通常的画法逆时针旋转90度得到的。这样做的目的,主要是为了与后续的RNN图示进行无缝衔接。


如同人类的大脑一样,当我们看到(接收到)熊(的图像时),经过一系列隐藏层的逐层传递(以及其内部极其复杂的计算过程),最终在输出层上,我们得到“熊”这个结果。


但是由前馈神经网络所反映(或者完成)的过程往往是相对静态的。人类的大脑还具有处理时序数据的能力。也就是说,大脑得到的某个结果不仅跟当前的输入有关,还跟上一时刻的输出有关。


例如,我们在读一篇文章时,有这样一句话:“灰太狼悄悄地藏在喜羊羊家的门口,等待猎物自己上钩。”显然,当我们读到“猎物”一词时,你马上回反映到它具体指代的应该是喜羊羊,而等待猎物的则是灰太狼。这种程度的理解显然仅仅依靠当前的输入(例如当前的句子或者词汇)是无法实现的。上一阶段(或时刻)的输出(即对上一个句子的理解)也非常重要。


可见,From one moment to the next, our brain operates as a function: it accepts inputs from our senses (external) and our thoughts (internal) and produces outputs in the form of actions (external) and new thoughts (internal).


Our brain runs repeatedly through time. We see a bear, then think “bear”, then think “run”. Importantly, the very same function that transforms the image of a bear into the thought “bear” also transforms the thought “bear” into the thought “run”. It is a recurring function, which we can model with a recurrent neural network (RNN).


An RNN is a composition of identical feedforward neural networks, one for each moment, or step in time, which we will refer to as “RNN cells”.


In the above diagram, a chunk of neural network, A, looks at some input xt and outputs a value ht. A loop allows information to be passed from one step of the network to the next.


这里的 a chunk of NN 其实就相当于前馈神经网络中的隐藏层,也就是多层传递的NN结构。而其中的循环输入,其实向下一个状态进行输入,所以上图中其实隐含地表示需要一个延迟器。


如果你对上面这种循环“输入→输出”的结构感到困惑,如果你还在为这种自循环感到不解,其实你只要把这个结构“拉开”,便会一目了然。 A recurrent neural network can be thought of as multiple copies of the same network, each passing a message to a successor. Consider what happens if we unroll the loop:


或者


另外一种常见的图示如下(A RNN and the unfolding in time of the computation involved in its forward computation),但其实都是万变不离其宗的同一个套路.


或者表示成下面这样的按时间展开的循环神经网络:



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

  • 序列到类别模式:这种模式就是序列数据的分类问题。输入为序列,输出为类别。比如在文本分类中,输入数据为单词的序列,输出为该文本的类 别。
  • 序列到序列模式:这类任务的输入和输出都为序列。具体又可以分为两种情况:
  1. 同步的序列到序列模式:这种模式就是机器学习中的序列标注(Sequence Labeling)任务,即每一时刻都有输入和输出,输入序列和输出序列的长度相同。比如词性标注(Part-of-Speech Tagging)中,每 一个单词都需要标注其对应的词性标签。
  2. 异步的序列到序列模式:这种模式也称为编码器-解码器(EncoderDecoder)模型,即输入和输出不需要有严格的对应关系,也不需要保持相同的长度。比如在机器翻译中,输入为源语言的单词序列,输出为目标语言的单词序列。


首先,我们来看下序列到类别的应用模式。假设一个样本X={x1,⋯,xT }为一个长度为 T 的序列,输出为一个类别y∈{1,⋯,C}。我们可以将样本X按不同时刻输入到循环神经网络中,并得到不同时刻的隐藏状态h1,⋯,hT 。我们可以将hT; 看作整个序列的最终表示(或特征),并输入给分类器g(·),


此处g(·)可以是简单的线性分类器(比如Logistic回归)或复杂的分类器(比如多层前馈神经网络)。


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



在同步的序列到序列模式中(如下图所示),输入为一个长度为 T 的序列X={x1,⋯,xT },输出为序列Y={y1,⋯,yT }。样本X按不同时刻输入到循环神经网络中,并得到不同时刻的隐状态h1,⋯,hT 。每个时刻的隐状态 hT 代 表了当前时刻和历史的信息,并输入给分类器g(·)得到当前时刻的标签



在异步的序列到序列模式中(如下图所示),输入为一个长度为T 的序列X={x1,⋯,xT },输出为序列Y={y1,⋯,yM }。样本X按不同时刻输入到循环神经网络中,并得到不同时刻的隐状态h1,⋯,hT 。然后RNN cell再执行M次,此时,每个RNN Cell的输入仅为上一时刻的隐状态,对于每个时刻的隐状态 hT,t∈[T+1,T+M],并输入给分类器g(·)得到当前时刻的标签




参考文献

【1】 左飞,R语言实战:机器学习与数据分析,电子工业出版社,第15章

【2】 Michael Nielsen,http://neuralnetworksanddeeplearning.com/

【3】 邱锡鹏,循环神经网络《神经网络与深度学习》 

【4】 DennyBritz, RecurrentNeural Networks Tutorial, Part 1 – Introduction to RNNs

【5】 Christopher Olah,UnderstandingLSTM Networks(http://colah.github.io/posts/2015-08-Understanding-LSTMs/)——这是网上写的最好的关于LSTM的通俗讲解


(本文完)


展开阅读全文

没有更多推荐了,返回首页