上周,我们分享了一篇来自硅谷工程师的TensorFlow教程,有读者反馈希望了解更多关于RNN的相关内容。因此,在接下来的几周中,科技行者为大家准备了一套RNN系列的入门教程,供大家参考。
该教程细分为以下部分:
1.循环神经网络(RNN)的基本介绍(本部分)
2.利用Python和Theano实现RNN
3.理解时间进化反传算法(BPTT)的算法和梯度消失问题
4.建立基于门控循环单元(GRU)或者长短时记忆(LSTM)的RNN模型
那么今天,我们将先对RNN做一个基本介绍。
在这一教程里,我们将会建立一个基于RNN的语言模型。语言模型的应用有双重目的:第一,可以根据句子在现实中出现的可能性和概率对任意句子进行评分。这给了我们语法和语义上的度量,在机器翻译系统中,这类模型非常常见。第二,一个语言模型可以生成新文本。例如,Andrej Karpathy的这篇博文(模型的作用和有效性,它可以训练莎士比亚的诗集,从而生成类似莎士比亚诗集的文本。
在开始本次教程前,需要您对神经网络(NNs)的基本概念有了一定的了解。神经网络是是一种应用类似于大脑神经突触联接的结构进行信息处理的数学模型。
-1-何为RNN?
RNN的本质概念是利用时序信息,在传统神经网络中,假设所有的输入(以及输出)都各自独立。但是,对于很多任务而言,这非常局限。举个例子,假如你想根据一句没说完的话,预测下一个单词,最好的办法就是联系上下文的信息。而RNN(循环神经网络)之所以是“循环”,是因为它们对序列的每个元素执行相同的任务,而每次的结果都独立于之前的计算。
另一种思考RNN的方式是,它拥有“记忆”模块,可以获取已经计算过的信息。理论上讲,RNN可以利用任意长度的序列信息,但只可以利用有限的前几步的信息。
下面便是一个典型的RNN模型:
上图显示的是RNN模型全部展开时的情况。“展开”指的是用网络描述出所有序列。
例如,如果序列中的句子有5个单词,那么,横向展开网络后将有五层神经网络,一层对应一个单词。
下面解释一下其中的计算公式:
Xt是时刻t时的输入。例如,X1对应于一个句子的第二个词的实数向量
St是在时刻t时的隐藏状态,类似于网络的“大脑”,也就是“记忆模块”的值
St的运算是基于以前隐藏状态St-1和当前的输入Xt决定的,公式为:St=f(Uxt+Wst-1).其中,f通常是非线性的,例如,tanh or ReLU函数。在计算第一个隐藏状态时,初始值通常设为0.
Ot是时刻t时的输出结果。如,预推测句子中的下一个词,那么在这里的输出就可以表示为一个词典序列,值为每一个词的概率。公式为:Ot=softmax(Vst)
需要注意的有几点:你可以将隐藏状态St作为神经网络的记忆单元。St记录了前面步骤的信息。在时刻t时的输出结果仅仅计算了时间t时的记忆信息。但如前面说的,实际操作中会有些复杂,因为St不能从以前的时段中捕捉到太多信息。
传统DNN(深度神经网络)模型一般在不同层采用不同参数权重,与之不同,RNN在各层的参数是一样的(如上述的U、V、W等)。这意味着这个模型对于每一步的作用是一致的,只是输入不同。这样的方式大幅降低了需要学习的参数总数,减少了很多计算量。
在上面的图片中显示,不同的时间节点会产生不同的结构输出。但是,不同任务中,有一些输出则是多余的。例如,在情感分析里,我们只关心这个句子最终表达的情绪,而不是每一个单词表达的情绪。同样的,也不是必须得在每一个时间点都有输入。
-2-RNN有何用处?
在众多自然语言处理的任务中,RNN已经取得了巨大成功。这里,需要指出的是RNN中最常用的类型是长短时记忆(LSTMs)模型,相比较于原始的RNN,LSTM可以存储更长的时序信息。并且,本教程中LSTM在本质上和我们所要开发的RNN是一致的,只不过LSTM计算隐藏状态的方式有所不同。在下一个教程中,我们将会更详细地讲解LSTM。
接下来,我们主要介绍一下在自然语言处理中应用RNN的例子:
2.1 语言建模和文本生成
通过训练RNN模型,我们可以基于给出的一个单词序列,预测下一个单词。这对于语言建模和文本生成而言是非常有价值的。
同时,语言模型可以用于评估一个句子出现的可能性,这对机器翻译而言也是非常重要的(因为高概率的句子通常是正确的)。
能够预测下一个单词出现的概率,那是因为我们所得到的衍生模型能够根据输出的可能性来生成新文本。而根据我们的训练数据,模型还可以得到所有类型的文本。在语言建模中,我们的输入属于典型的单词序列(例如利用one-hot载体进行编码),而在训练该神经网络时,我们希望t时刻的输出是精确的,因此,我们会设定Ot=Xt+1。
下面是关于语言建模和文本生成的研究论文:
Recurrent neural network based language model
《基于循环神经网络的语言模型》
Extensions of Recurrent neural network based language model
《基于循环神经网络拓展的语言模型》
Generating Text with Recurrent Neural Networks
《利用循环神经网络生成文本》
2.2 机器翻译
机器翻译类似于语言建模,我们首先输入源语(例如德语),需要输出是目标语(例如英语)。关键区别是,在机器翻译中,翻译的第一个字可能会需要所有已输入句子的信息,所以只有看到全部输入之后才能输出。
▲ 上图是用于机器翻译的RNN模型
图片来源:
下面是关于机器翻译的研究论文:
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
《利用循环神经网络进行语言和翻译的建模》
2.3 语音识别
根据从声音中得到的一系列声波信号,并以此作为输入,可以预测出一系列语音片段及其可能性。
下面是关于语音识别的研究论文:
Towards End-to-End Speech Recognition with Recurrent Neural Networks
《利用循环神经网络进行端对端的语音识别》
2.4 生成图片的文字描述
和CNN(卷积神经网络)一样,RNN也被应用于生成描述未被标签的图片模型。并且,两者结合的模型组合甚至可以依据图片特征排列生成文字,以及图片中特征的对应位置。如下图:
▲用于生成图像描述的深度视觉 - 语义示例
来源:/
2.5 训练RNN模型
训练RNN模型与训练传统的神经网络类似。我们同样采用反向传播算法,但也有不同。因为在RNN中,横向展开的每一层都是共享权重的,每一个输出的梯度(gradient)不仅仅依赖于当下这个时间点,还依赖于过去的时间点。举个例子,想要计算时间点t=4的梯度,我们需要反向传播3个时间点,并把梯度相加。这个算法就叫做BPTT(Backpropagation Through Time)。现在只需要知道,BPTT算法本身是有局限性的,它不能长期记忆,还会引起梯度消失和梯度爆炸问题,LSTM就是用来解决这个问题的。
2.6 RNN模型的拓展
多年以来,为了克服传统循环神经网络(vanilla RNN)的弱点,研究人员已经开发出更多统计型的循环神经网络。之后的部分,我们将更细致地对此进行讲解,但是,我希望这部分概要有助于大致了解一下模型分类。下面是一些典型的模型:
双向循环神经网络(Bidirectional RNN)的理念是,时间t时的输出不仅仅取决于过去的记忆,也同样取决于后面发生的事情。例如,某一序列中,想要预测一个单词,会联系前文和后文。双向循环神经网络便是如此简单。仅仅是两套循环神经网络前后交叠在一起而已。输出的计算结果便基于这两套循环神经网络的隐藏状态。如下图:
深度(双向)(Deep (Bidirectional) RNN)循环神经网络类似于双向循环神经网络,只不过是每个时长内都有多层。实际上,这一点意味着它有更强的学习能力(但是相应地,也需要大量训练数据)。
LSTM网络:近来,LSTM非常流行。本质上,LSTM与RNN的基础架构并无不同,但是,LSTM在计算隐藏状态时会采用不同的函数。LSTM中的记忆被称为“细胞”,而可以把这些“细胞”视作黑匣子,记忆之前状态为h_t-1的输入和当前为Xt的输入。本质上,这些“细胞”将决定将保留或剔除相关记忆,“细胞”可以整合之前的状态、当前的记忆和输入。而结果证明,对于长期的记忆来说,这些单元的类型非常高效。
-3-总结
希望通过第一篇教程,你已经对RNN的定义和作用有了一个基本的了解。下周,我们将介绍如何利用Python和Theano建立起第一个基于RNN的语言模型。
相关研究论文获取方式:关注科技行者公众号(itechwalker),并打开对话界面,回复关键字“RNN论文”,即可获得下载地址。
| 来源:WILDML;作者:Denny Britz;编译:科技行者