做者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明。谢谢!html
本文翻译自 RECURRENT NEURAL NETWORKS TUTORIAL, PART 1 – INTRODUCTION TO RNNS 。git
Recurrent Neural Networks(RNNS) ,循环神经网络,是一个流行的模型,已经在许多NLP任务上显示出巨大的潜力。尽管它最近很流行,可是我发现可以解释RNN如何工做,以及如何实现RNN的资料不多。这个系列将会涵盖以下几个主题,github
咱们将会实现一个 基于语言模型的循环神经网络 。语言模型有两个应用。第一,基于句子在真实世界中出现的可能性,语言模型可让咱们对任意的句子进行打分。这个就给予咱们一种度量语法和语义正确性的方式。语言模型一般应用在机器翻译系统中。第二,语言模型容许咱们生成新的文本(我认为这是一个更酷的应用)。在莎士比亚的做品上训练一个语言模型,容许咱们生成莎士比亚风格的文本。Andrej Karpathy所写的 blog 显示了基于RNN的字符级的语言模型的能力。web
我假设你已经在必定程度上熟悉基本的神经网络。若是你对基本的神经网络还不熟悉,你能够先看这篇blog IMPLEMENTING A NEURAL NETWORK FROM SCRATCH IN PYTHON – AN INTRODUCTION , 它将会让你理解非循环网络背后的思想和具体实现。算法
循环神经网络背后的思想就是使用序列信息。在传统的神经网络中,咱们认为全部的输入(和输出)彼此之间是互相独立的。可是对于不少任务而言,这个观点并不合适。若是你想预测句子中的下一个词,你最好须要知道它以前的词。循环神经网络之因此称之为循环,就是由于它们对于序列中每一个元素都执行相同的任务,输出依赖于以前的计算。另外一种思考循环神经网络的方法是,它们有一个记忆,记忆能够捕获迄今为止已经计算过的信息。理论上,循环神经网络能够利用任意长度序列的信息,可是,在实际中,它们仅能利用有限长步(具体缘由会在后续解释)。下面就是一个典型的循环神经网络。网络
上图展现了一个循环神经网络展开为全网络。经过展开,咱们简单的认为咱们写出了所有的序列。例如,若是咱们关心的序列是一个有5个词的句子,那么这个网络就会展开为5层的神经网络,一层对应一个词。循环神经网络中管理计算的公式以下所示,架构
这里有一些注意事项,以下:函数
循环神经网络在不少NLP任务中显示出巨大的成功。在这里,我须要提醒一下,大部分循环神经网络是 LSTM ,它比普通的循环神经网络能够更好的捕获长期依赖。不用担忧,LSTM本质上依然是循环神经网络,它仅仅是在计算隐层状态时采用一种不一样的方式,咱们将会在后续的文章中详细介绍它。下面是一些循环神经网络应用到NLP的例子。post
给定一个词序列,咱们想要预测每一个词在给定前面的词的条件几率。语言模型容许咱们度量一个句子的可能性,这是机器翻译的重要输入(高几率的句子一般是正确的)。预测下一个词的副产品就是咱们能够获得一个生成模型,这容许咱们经过在输出几率中采样来生成下一个文本。依赖于咱们的训练数据,咱们能够生成 各类类型的文本 。在语言模型中,咱们的输入一般是一个词序列(例如,编码为one-hot向量),输出就是待预测的词序列。当训练网络时,咱们设置 \(o_{t} = x_{t+1}\) ,由于,咱们想要时刻t的输出为正确的下一个词。学习
下面是一些关于语言模型和文本生成的文献,
Recurrent neural network based language model
Extensions of Recurrent neural network based language model
Generating Text with Recurrent Neural Networks
机器翻译相似于语言模型,输入是一个源语言的词序列(例如,德语)。咱们想输出一个目标语言的词序列(例如,英语)。关键的区别就是咱们的输出只能在咱们已经看见整个输入以后开始,由于,咱们翻译句子的第一个词可能须要从整个输入句子获取信息。
下面是一些关于机器翻译的文献,
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
给定一个声学信号的输入序列,咱们能够预测语音段序列以及它们的几率。
下面是一些关于语音识别的文献,
Towards End-to-End Speech Recognition with Recurrent Neural Networks
结合卷积神经网络,循环神经网络也做为模型的一部分,用于对无标注图像 生成描述。让人惊讶的是它是如何工做的。组合模型甚至能够将生成的文字与图像上的特征进行对齐。
针对生成图像描述的深度图像-语义对齐,来源:http://cs.stanford.edu/people/karpathy/deepimagesent/
循环神经网络的训练相似于传统神经网络的训练。咱们也使用反向传播算法,可是有所变化。由于循环神经网络在全部时刻的参数是共享的,可是每一个输出的梯度不只依赖当前时刻的计算,还依赖以前时刻的计算。例如,为了计算时刻 t = 4 的梯度,咱们还须要反向传播3步,而后将梯度相加。这个被称为Backpropagation Through Time(BPTT)。若是你不能彻底理解这个,不要担忧,咱们会在后面的文章详细地介绍它。如今,咱们仅仅须要了解到利用BPTT算法训练出来的普通循环神经网络很难学习长期依赖(例如,距离很远的两步之间的依赖),缘由就在于梯度消失/发散问题。目前已经有一些机制来解决这些问题,特定类型的循环神经网络(如LSTM)专门用于规避这些问题。
近年来,研究者已经提出了更加复杂的循环神经网络,用以解决普通循环神经网络的缺陷。咱们将会在后续的文章中详细介绍,可是,我想在这部分大体介绍一些,以便大家能够熟悉这些模型。
Bidirectional RNNs(双向循环神经网络)基于这样一种思想,时刻t的输出不只依赖序列中以前的元素,也依赖于后续的元素。例如,要预测序列中缺失的词,你会看一下左边和右边的上下文。双向循环神经网络很是简单。它们仅仅是两个循环神经网络堆在一块儿。输出是基于两个循环神经网络的隐层状态进行计算的。
双向循环神经网络的结构以下所示。
Deep (Bidirectional) RNNs(深度(双向)循环神经网络)很是相似于双向循环神经网络,区别在于,每一时刻,网络有多层。实际上,这个可让网络具有更强的学习能力(固然,也须要更多的训练数据)。
深度循环神经网络的结构以下所示。
最近,LSTM网络很是流行,咱们以前已经简单提到。LSTM在架构上与循环神经网络并无本质的不一样,可是它们计算隐层状态的函数会有所不一样。LSTM中的记忆称为cell,你能够将它视为以以前的状态 \(h_{t-1}\) 和当前的输入 \(x_{t}\) 做为输入的一个黑盒。在内部,cell决定记忆中哪些保留(哪些删除)。而后,以前的状态,当前的记忆和输入进行组合。这类单元在捕获长期依赖上被证实是很是有效的。刚开始,LSTM会使人感到困惑,可是,若是你感兴趣,你能够看这篇博客 Understanding LSTM Networks 。
到目前为止,我但愿你已经对什么是循环神经网络以及它们可以作什么有一个基本的了解。在下一篇文章中,咱们将会使用Python和Theano实现循环神经网络语言模型的第一个版本。
RECURRENT NEURAL NETWORKS TUTORIAL, PART 1 – INTRODUCTION TO RNNS