Recurrent Neural Networks Tutorial阅读笔记

来源:互联网 发布:什么物流淘宝不能跟踪 编辑:程序博客网 时间:2024/06/06 00:55

最近看了几篇优秀的RNN入门介绍博客文章,生动形象地讲述了普通的RNN与LSTM的RNN算法原理,并利用RNN实现语言建模来生成语句作为实践案例,完成手把手的RNN入门教学。接下来我主要把这几篇博客的几个关键点总结出来,而原文的内容不做赘述,以避免原作者的重复劳动。以下先给出原文链接。
Part1 Introduction to RNNs
Part2 Implementing a RNN with Python, Numpy and Theano
Part3 Backpropagation Through Time and Vanishing Gradients
Part4 Implementing a GRU/LSTM RNN with Python and Theano


什么是递归神经网络

RNNs被叫做递归神经网络是因为它的当前时刻神经元状态受前一时刻的影响,这意味着它能够有记忆功效来捕捉时序数据的信息。在理论上,RNNs能够应用于任意长的时序数据,但是在实际上它们往往只能往回看几步。一个典型的RNNs具有如下结构:

rnn

好像RNNs具有类似于HMM的特性。把隐藏单元考虑为HMM中的隐藏状态,而输入和输出为观测数据。那么图中的权值矩阵W起着状态转移矩阵的作用。利用RNNs生成时序数据就类似于HMM不断地根据观测数据预测状态序列,再根据状态序列生成观测数据的过程。(这一段是我自己的理解,非原文)

从上图中也可以看到,按时间序列展开后的RNNs就像普通的前馈神经网络,不同的是,我们在每一步所采用的权值矩阵与上一时间步相同,类似于卷积神经网络里的权值共享。这反映了RNNs在每一步执行相同的任务,只是输入不同,在这个过程中,中间的隐藏单元记住前面时间步的信息。

尽管每个时间步都有输出,但并不一定需要每一步的输出,这依赖于具体的任务,同样的,也并不一定需要在每一步都给予输入


沿时间前向传播

这里我们同前馈神经网络一样,根据每个结点的输出计算每个节点的输出,然后向前传递,只是在这里需要按照时间一步一步的计算。
这里写图片描述


沿时间反向传播

定义损失函数为交叉熵
这里写图片描述
这里写图片描述
以t=3的时间步为例,计算误差沿时间的传播。误差关于V的梯度和前阔神经网络一样计算
这里写图片描述
而计算误差关于W的梯度则有很大不同,这因为,s3=tanh(Uxt+Ws2),而s2是是W的因变量,这意味着需要不停的利用链式向前求关于W的导数,直到最初的时间步或者达到指定的步数。具体如下
这里写图片描述
这里写图片描述
这里写图片描述
这样我们完成了第三步的误差沿时间的传递,之后我们将每一步的误差计算出来并向沿时间往回传递,最后我们将各自的梯度求和,因为我们每一步的权值都是相同的。


梯度消失

普通的RNNs无法像理论上那样可以应用于任意长的序列数据,这是因为,在将误差沿时间反向传播是,梯度不断地连乘,会很快成为成为非常小的接近于零的数,这使得训练很快就停止了。
另外梯度当然也会爆炸,不断的连乘也有可能成为很大的数。然后梯度爆炸的问题较好解决,可以采用设置阈值的方式进行截断。
这篇文章On the difficulty of training recurrent neural networks详细地解释了这个问题


LSTMs and GRUs

这篇文章Understanding LSTM Networks详细的讲述了什么是LSTM,以及LSTM如何工作的。需要知道的是,同普通RNNs一样,LSTM也是将前一时刻的隐藏单元的输出输入到当前时刻的隐藏单元中作为输入的一部分,不同的是LSTM的在其中加了一些环节,使得网络可以解决梯度消失的问题。
LSTM结构图
这里写图片描述
GRU结构
这里写图片描述


文本生成模型实践

目标是采用RNN建立语言模型,语言模型允许预测给定语句下一个词的概率分布:
这里写图片描述
有了这样一个模型。我们便可以不断地产生下一个词从而得到一个完整的句子。

  • 在这个例子中,原作者采用的Reddit上的评论作为训练数据
  • 作者采用nltk来实现原始数据的分割成一个个单独的句子和单词,并提取高频词去除低频词得到词汇表。在细节上,将低频词统一用UNKNOW-TOKEN代替,在每个句子上加入SENTENCE-START-TOKEN和SENTENCE-STOP-TOKEN作为句子开始和结束的标志。
  • 为词汇表建立Word_to_index和Index_to_Word查询表,将单词编码为One-hot
  • 共实现了两个模型,前一个为普通的RNN,其结构为:输入层8000个节点,代表词汇表为8000个单词。隐藏单元节点100个,输出单元节点8000个,输出节点为Softmax节点。第二个模型为GRU
  • 训练好模型以后,根据输入计算出输出每个单词的概率,之后不是直接选择最高概率的单词作为下一个词,而是根据得到的概率分布进行选择。
  • 由于普通RNN不能无限制的沿时间反向传播,因此,设置了最大反向传播时间步为4,这个值可以根据任务自己调整
  • 整个案例实现过程为:1)划分句子与单词,提取频繁词得到词汇表;2)替代低频词为某一个TOKEN,设置开始结束TOKEN,建立Word_to_index,index_to_word表;3)将数据转化为one-hot 形式;4)设置网络结构,完成初始化;5)写好前向传播代码;6)写好损失计算代码,梯度反向传播代码;7)进行梯度检查;8)写好SGD代码;9)完成训练
  • 事实上关于优化有很多技巧,文中提到了用RMSRprop来自适应调整学习速度
  • 文中的SGD是单个单个实例来计算的,可以优化成小批量的以加速训练过程
  • 文中采用Theano来加速,但是在我的机器上运行好像不是太行,特别的慢,不知道哪里出了问题。
  • 作者在GRU例子里在输入层和隐藏层之间添加了一个嵌入层来实现将word转换为vector,达到类似与word2vector的功效。然而这里的嵌入层只能根据当前的任务来学习,最好的是采用已经训练好的嵌入表示。另外作者表示还添加了一个隐藏层以允许模型捕捉更高层的信息,但是作者并没有添加,由于训练数据不够,从而使得梯度很容易消失

一些链接

The Unreasonable Effectiveness of Recurrent Neural Networks

语言建模与文本生成

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

语音识别

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

图像描述生成

Deep Visual-Semantic Alignments for Generating Image Descriptions

RNN训练的困难性

On the difficulty of training recurrent neural networks

LSTM及其变种

LSTM: A Search Space Odyssey

原创粉丝点击