递归神经网络 part1
递归神经网络(RNNs)是一种很受欢迎的模型,在许多NLP任务中都显示出良好的应用前景。
What are RNNs?
RNNs背后的思想是利用顺序信息。在传统的神经网络中,我们假设所有的输入(和输出)都是相互独立的。但对于很多任务来说,这是一个非常糟糕的主意。如果你想预测一个句子中的下一个单词,你最好知道哪个单词出现在它之前。之所以称RNNs为递归的,是因为它们对序列的每个元素执行相同的任务,输出依赖于前面的计算。另一种理解RNNs的方法是,它们有一个“内存”,可以捕捉到迄今为止所计算的信息。从理论上讲,RNNs可以在任意长的序列中使用信息,但在实践中,它们仅限于回顾几个步骤(稍后将详细介绍)。典型的RNN是这样的:
上图显示了一个RNN被展开成一个完整的网络。展开的意思就是写出完整序列的网络。例如,如果我们关心的序列是一个5个单词的句子,那么这个网络就会被展开成一个5层的神经网络,每个单词对应一个层。控制RNN计算量的公式如下:
- 是第t步的输入,是句子中单词对应的词向量。
- 是第t步的隐藏状态,是网络的“内存”。根据前面的隐藏状态和当前步骤的输入计算: 。函数f通常是一个非线性函数,如 tanh或 ReLU 。计算第一个隐藏状态所需的通常初始化为所有零。
- 是步骤t的输出。例如,如果我们想预测一个句子中的下一个单词,它将是我们词汇表中的概率向量。
这里有几件事需要注意:
- 可以将隐藏状态看作是网络的内存。捕获关于前面所有时间步骤中发生的事情的信息。步骤的输出仅根据时间时的内存计算。s_t$通常不能从太多时间步骤中获取信息。
- 与传统的深度神经网络中每一层使用不同的参数不同,RNN在所有步骤中共享相同的参数。这反映了这样一个事实,即我们在每一步执行相同的任务,只是输入不同,这大大减少了我们需要学习的参数总数。
- 上面的图在每个时间步骤都有输出,但是根据任务的不同,可能没有必要这样做。例如,当预测一个句子的情绪时,我们可能只关心最后的输出,而不是每个单词后的情绪。类似地,我们可能不需要在每个时间步骤都输入。RNN的主要特征是它的隐藏状态,它捕捉序列的一些信息。
What can RNNs do?
在许多NLP任务中,RNN都取得了巨大的成功。在这一点上,我应该提到最常用的RNNs类型是LSTM,它比普通的RNN更擅长捕获长期依赖关系。但是不用担心,LSTM本质上和我们在本教程中将要开发的RNN是一样的,只是它们有不同的计算隐藏状态的方法。我们将在后面的文章中更详细地讨论LSTM。下面是一些RNNs在NLP中的示例应用程序。
Language Modeling and Generating Text
在一个单词序列中,我们可以预测每个单词的在其前边单词的条件下出现概率。语言模型允许我们测量一个句子的可能性,这是机器翻译的一个重要输入(因为高概率的句子通常是正确的)。预测下一个单词的副作用是我们得到了一个生成模型,它允许我们通过从输出概率中采样来生成新文本。
根据训练数据我们可以生成各种各样的东西。在语言建模中,我们的输入通常是单词序列(编码为独热向量),而我们的输出是预测单词序列。在训练网络时,可以设置,因为我们希望第步的输出是实际的下一个单词。
关于语言建模和生成文本的研究论文:
Machine Translation
机器翻译类似于语言建模,因为我们的输入是源语言(例如德语)中的单词序列。我们想要输出目标语言(如英语)中的单词序列。一个关键的区别是,我们的输出只在看到完整的输入之后才开始,因为我们翻译的句子的第一个单词可能需要从完整的输入序列中获取信息。
RNN for Machine Translation. Image Source: http://cs224d.stanford.edu/lectures/CS224d-Lecture8.pdf
关于机器翻译的研究论文:
- A Recursive Recurrent Neural Network for Statistical Machine Translation
- Sequence to Sequence Learning with Neural Networks
- Joint Language and Translation Modeling with Recurrent Neural Networks
Speech Recognition
给出声波信号的输入序列,可以预测语音段序列及其概率。
关于语音识别的研究论文:
Generating Image Descriptions
将RNN与CNN组合来用于生成未标记图像的描述,其效果非常好。组合模型甚至将生成的单词与图像中的特征相对应。
Deep Visual-Semantic Alignments for Generating Image Descriptions. Source: http://cs.stanford.edu/people/karpathy/deepimagesent/
Training RNNs
训练RNN类似于传统的神经网络,也使用了反向传播算法。由于参数由网络中的所有时间步所共享,因此每个输出的梯度不仅取决于当前的计算,而且还取决于以前的计算。例如,为了计算t=4处的梯度,我们需要反向传播3个步骤并对梯度求和。这称为时间反向传播(BPTT)。
注意:使用BPTT训练的普通RNNs在学习长期依赖关系方面有困难(例如,步骤之间相隔很远的依赖关系)。由于所谓的梯度消失/爆炸问题,存在一些机制来解决这些问题如LSTM。
RNN Extensions
双向RNN Bidirectional RNNs 的基本思想是,t时刻的输出不仅依赖于序列中先前的元素,而且还依赖于未来的元素。例如,要预测序列中缺少的单词,您需要同时查看左上下文和右上下文。双向RNNs非常简单。它们只是两个相互叠在一起的RNN。然后根据两个RNN的隐藏状态计算输出。
深度(双向)RNN Deep (Bidirectional) RNNs 类似于双向RNNs,只是我们现在每一步都有多个层。在实践中,这给了我们更高的学习能力(但我们也需要大量的培训数据)。
现在LSTM网络 LSTM networks 非常流行,我们在上面简要地讨论了一下。LSTM没有与RNN完全不同的体系结构,但是它们使用不同的函数来计算隐藏状态。LSTM中的内存称为cells,您可以将它们看作黑盒,将以前的状态和当前的输入作为输入。在内部,这些cells决定保存什么(以及删除什么)内存。然后,它们组合以前的状态、当前内存和输入。事实证明,这些类型的单元在捕获长期依赖关系方面非常有效。LSTM在开始的时候可能会让你很困惑,但是如果你有兴趣了解更多,这篇文章有一个很好的解释。
到目前为止一切顺利。我希望您已经基本了解了什么是RNN以及它们可以做什么。
本文章翻译自 http://www.wildml.com/2015/09/recurrent-neural-networks-tutorial-part-1-introduction-to-rnns/