RNN循环神经网络

Posted on By Jason Hao

宏观理解

我们在CNN和R-CNN中学到了怎么来处理一张图片,但是我们默认的是图片和图片之间是没有任何联系的,但是循环神经网络(RNN)来处理的无论文字信息还是图像我们都默认为其间是存在关联的,这种关联的体现就是时间的顺序。比如我给你一张清晨的图片让你来预测再过几小时是什么样子,RNN就能知道按顺序的话输出就应该是中午1点半的图片。文字也是一样。曾经在github上见到一种可以自动填充代码的code,它做的就是根据你目前为止的输入,我推断你接下来应该会写些什么。当然还有我们大家应该都听过的技术叫做时间序列分析,股票预测,用的就是每天收盘的信息来预测这只股票未来走势如何。比如著名的RNN家族里的LSTM模型。

我们在计算机视觉的图片识别上机器已经超过了人类的能力,但是在机器翻译上或者说NLP中机器离人类还有一段距离,这段距离就是人们还没能很好的用机器来做到时间顺序的拟合。因为我们说过神经网络处理图片的时候是根据的人体生物学得到的启发,模拟的人类视觉接收图片到处理图片识别图片。但是RNN目前在生物学中没有找到很好的切合点,到目前为止的RNN设计思路是由1995年被证实和图灵机在数学意义上等价来的,所以RNN未来的发展势必有很大空间。

微观分析

我们先来看看RNN长什么样子:

绿色的箭头是我们的输入值,红色的箭头是我们的输出值。RNN很有意思,它有不止一次的输入也可以有不止一次的输出。我们可以把每次的输入对应到股票预测中的每天的收盘价,中间的灰色区域就是RNN网络,这个里面是一个神经网络就像我们以前见过的一样,下标(t-1)就是指的前一天,今天,和明天。中间的蓝色箭头代表神经网络之间的信息传递,既然时间顺序,那么第N天的神经网络就也一定要有第一天的输出结果。

右图中是我们把左边的网络折叠起来,这就说明了整个网络的RNN的共享权重的,在反向传播中也是照样往回传的。下面我们来推公式,假设我们有一个这样的RNN:

跟之前的展开和折叠的图像含义一样。我们假设有了这些参数U, W, V,一个输入值Xt和两个输出值St, Ot。

U, W, V是三个参数矩阵,也就是一开始我们先把输入值Xt和U点乘,然后加上前一个的输出值St-1和W点乘的和,过一个激活函数比如说f:

对于Ot,我们只需要用St点乘V然后过一个激活函数比如说g:

除了我们见过的这种结构的网络,还有很多的衍生品:

这些网络由于输入值和输出值的不同(输出值-to-输出值)可以针对不同的问题进行训练:

  • one-to-one:我们管这种网络叫Vanilla Neural Networks,算是递归神经网络的基础型。
  • one-to-many:我们可以输入一张图片,然后生成描述这个图片的一句话一个自然段甚至是一篇文章,这叫Image Captioning
  • many-to-one:我们可以输入一段话,输出关于这段话的评价比如说积极的还是消极的,这叫Sentiment Classification
  • many-to-many:我们可以输入中文句子,输出英文的翻译,这叫Machine Translation
  • many-to-many:另一种many-to-many的结构也可以做视频中每帧的分类,比如这一帧包不包含暴力情节,也可以针对一个1小时的视频来过滤无关的帧,精简到10分钟的内容。

我更觉得RNN是一种思想,基于这种思想我们有了很多的模型比如做机器翻译的NMT,比如可以时序分析的LSTM等等。当然还有大量的未被发掘的应用等待着我们。