RNN教程1-RNN的基本介绍

了解RNN循环神经网络,我是从wildml的博客开始的。为了加深印象和理解,将其博客的系列教程作一个翻译,加上自己的理解,和大家分享。原文在这里:http://www.wildml.com/2015/09/recurrent-neural-networks-tutorial-part-1-introduction-to-rnns/

RNN翻译教程目录:

英文出处

这是教程系列第一篇:RNN的基本介绍。

Recurrent Neural Networks (RNNs),也就是循环神经网络,在NLP任务上非常流行。

在这个教程里,我们将会使用RNN来实现一个语言模型。语言模型的应用是有两方面,第一方面,它允许我们给任意句子打分,打分的依据则是这些句子在现实世界中出现的可能性,这给了我们语法和语义上的度量,在机器翻译领域应用较多。第二方面,一个语言模型可以让我们生成新的文本,Andrej Karpathy的这篇博文(http://karpathy.github.io/2015/05/21/rnn-effectiveness/)就展示了RNN的强大和有效性,它可以训练莎士比亚的诗集,从而生成类似莎士比亚诗集的文本。

以下内容是基于你已经对基本的神经网络和反向传播算法有了一定的了解,如果没有,可以先行了解。

1.什么是RNN

RNN背后的思想,是要利用时序信息。在传统的神经玩咯中,我们假设所有的输入(包括输出)都是相互独立的,然而对于许多任务而言,这太局限了。比如,你想根据一句没说完的话,来预测下一个词语,那你就需要上文的信息了。RNN中的Recurrent之所以称为循环,是因为它们对序列的每个元素执行相同的任务,输出取决于先前的计算。从另一个角度来思考RNN,我们可以想象它有一个“记忆”模块,储存着之前计算的信息。理论上,RNN是可以利用任意长的序列信息的,然而实际上,它只能利用有限的前几步的信息,下面是一个典型的RNN模型:典型的RNN模型

左边是RNN模型,展开之后,就是右边的样子。

举个简单的例子,如果我们关注的是由5个单词组成的句子,那么这个神经网络可以横向展开成5层,一层代表一个单词。下面解释一下图里的字母符号代表的意义:

x_{t}:在时刻t时的输入。

s_{t}:在时刻t时的隐藏状态,也就是“记忆模块”,它的值,由当前的输入x_{t}和前一个状态s_{t-1}决定,计算公式为s_{t}=f(Ux_{t}+Ws_{t-1}),f通常是非线性的激活函数,比如tanh或者ReLU函数。

o_{t}:在时刻t时的输出。比如,如果我们想要预测一句话里的下一个单词,那么在这里的输出就可以表示为一个词典序列,值为每一个词的概率。 o_{t}=softmax(Vs_{t})

需要注意的几点:

  • 你可以将s_{t}认为是神经网络的记忆单元,s_{t}存储了前面步骤的信息。在时刻t时的输出o_{t}仅仅是通过当前的记忆单元算出来的。虽然这个模型看起来比较理想化,但事实上它无法存储太多前面步骤的信息。
  • 传统的DNN模型一般对于每一层都使用不同的参数权重,而RNN横向的每一步都是共享参数权重的,也就是上面的U、V、W。这反映出一个事实,那就是这个模型对于每一步都在做同样的事情,只不过他们的输入不同而已。这样的好处是减少了很多计算量。
  • 上面的图片里的每一个时间节点,都会有一个输出,对于一些任务来说这是多余的。比如在情感分析里,我们只关心这个句子最终表达的情绪,而不是每一个单词表达的情绪。同样的,也不是必须得在每一个时间点都有输入。

2.RNN 能干嘛

RNN在许多NLP任务中取得了成功,当然这里也得提一下,通常用的最多的是LSTM模型,它能比原始的RNN存储更长的时序信息,而且你不用担心,LSTM只是RNN的一个改进,在之后的教程会介绍,它们的区别在于,LSTM计算隐藏状态s_{t}的方式不同。

好了,来看看RNN 能干嘛。

2.1 语言模型和文本生成

通过训练RNN模型,我们可以基于给定的一个单词序列,预测下一个单词是是什么。这对语言模型和文本生成来说是很有用的。

语言模型能让我们去度量生成一个句子的概率,这在机器翻译里面是非常重要的(因为如果能算出来一个高概率的句子,那么这个句子通常来讲是比较准确的)。

文本生成就更不用说了,通过训练大量的样本,我们可以用一个模型来生成新的文本。
下面是三篇论文,都是关于语言模型和文本生成的。

2.2 机器翻译

机器翻译和语言建模异曲同工,对于机器翻译而言,输入就是某一种语言的单词序列,输出是另一种语言的单词序列。区别在于,机器翻译需要读取了所有的输入之后,才能生成完整的输出,毕竟完整的上下文才能推导出最终的意思。

下图是应用于机器翻译的一个RNN模型,图片来源:http://cs224d.stanford.edu/lectures/CS224d-Lecture8.pdf:
应用于机器翻译的一个RNN模型

下面是关于机器翻译的一些论文:

2.3 语音识别

根据输入的语音信号,输出生成的文字。相关论文:

Towards End-to-End Speech Recognition with Recurrent Neural Networks

2.4 生成图片的文字描述

RNN还可以和CNN(convolutional Neural Network即卷积神经网络)组合一起做模型,为没有标记的图片生成文字描述,并取得了惊人的效果。这个组合模型甚至还能将生成的文字和图片中特征的位置对应。如下图:
生成图片的文字描述

以下是相关研究:
http://cs.stanford.edu/people/karpathy/deepimagesent/

3.训练RNN模型

RNN模型的训练过程和传统神经网络训练过程是类似的,我们同样的使用反向传播算法,当然了,具体的过程会有点不同,因为在RNN中,横向展开的每一层都是共享权重的,每一个输出的梯度(gradient)不仅仅依赖于当下这个时间点,还依赖于过去的时间点。举个例子,想要计算时间点t=4的梯度,我们需要反向传播3个时间点,并把梯度相加。这个算法就叫做BPTT(Backpropagation Through Time),后面会介绍。现在只需要知道,BPTT算法本身是有局限性的,它不能长期记忆,还会引起梯度消失和梯度爆炸问题,LSTM就是用来解决这个问题的,后面也会介绍LSTM。

4.扩展的RNN模型

过去这些年,许多学者提出了一些复杂的RNN模型的变体,用来克服原始RNN(vanilla RNN)的缺点。下面是一些典型的模型。

4.1 双向RNN( Bidirectional RNNs )

双向RNN从字面上就比较好理解,它的特点是:某个时间点的输出不仅仅依赖于过去的记忆,也依赖于后面发生的事情。最简单的例子那就是我们常做的英文完形填空了,填写缺失的单词,需要综合上下文的意思。

这个模型实现起来也很简单,只需要在原始RNN的基础上,加一个反方向的RNN即可。如下图:
双向RNN模型

4.2 多层(双向)RNN

在双向RNN的基础上,加多几层神经网络,就是多层RNN了,它有更强的学习能力,也需要更多的训练数据,如下图:
多层(双向)RNN

4.3 LSTM网络

LSTM在业界非常流行。它和基本RNN的结构是一样的,只不过它用不同的函数来计算隐藏层而已,LSTM的记忆被称为“cell”,我们暂且把它当作黑盒吧,从本质上来讲,这一些cell决定了要从前一段记忆中“记住”或者“忘记”什么东西。对于长期的记忆来说,这种模型非常奏效,这里有一篇很好的文章解释LSTM:
http://colah.github.io/posts/2015-08-Understanding-LSTMs/

5.总结

通过这第一篇教程,希望你能对RNN有一个初步的了解,并且知道它能干什么。在下一篇教程,我们将用python来实现一个简单的、基于RNN的语言模型。

发表评论

电子邮件地址不会被公开。 必填项已用*标注