递归神经网络教程(1)-RNN介绍

递归神经网络教程(1)-RNN介绍

Source: http://www.wildml.com/2015/09/recurrent-neural-networks-tutorial-part-1-introduction-to-rnns/

递归神经网络(RNNs)作为一种流行的模型,已经在NLP问题上显示巨大的应用前景。尽管最近很流行,但是对RNNs原理以及如何实施进行全面解释的资源却很少。因此就有了这个教程。这个教程将包含以下四个部分:

  1. RNNs介绍
  2. 使用Python和Theano实现RNN
  3. 理解BPTT算法和梯度消失问题
  4. GRU和LSTM的实现

作为本教程的一部分,我们将实现一个基于RNN的语言模型。这个语言模型的应用是双重的:首先,使用它我们可以基于现实可能性对任意句子评分。这也可以用来衡量句子语法与语义的正确性。这样的模型通常也是机器翻译系统的一部分。第二点,使用这个语言模型可以生成新的文本(这个应用会更酷)。比如说,我们使用莎士比亚作品训练模型将能生成与莎士比亚相似的文本。Andrej Karpathy的博客给出了基于RNNs的字符级语言模型可以实现的很多任务。

这里假定你已经对神经网络基础有一定了解。如果没有,你可以阅读我写的这个博客,这个博客给出了非递归网络的原理与实现。

RNNs是什么?

RNNs的背后原理是利用序列信息。在传统的神经网络中,我们假定所有的输入与输出都是相互独立的。但是对于很多问题,这是一个非常糟糕的想法。如果你想预测一个句子中的先一个单词,你最好知道它之前的单词。RNNs被称为递归神经网络是因为它对一个序列中的每个节点执行相同的任务,而且输出依赖于前面的计算。理解RNNs的另外一个方式是认为RNNs存在一个“记忆”,它能够捕获已经计算出的信息。理论上,RNNs可以利用任意长序列中的信息,但是实际上它们仅仅能够利用前面极少步的信息(后面会解释)。经典的RNNs如下所示:

RNNs
递归神经网络以及它在时间步长上展开的前向计算图(来源:Nature)

上面的图将RNNs展开成一个全网络。通过展开,我们得到了全序列的网络。例如,如果我们研究的是5单词的句子序列,网络将被展开成5层神经网络,每一层对应一个单词。RNNs计算图中的公式如下:

  • xt 是在 t 步的输入。例如,x1对应是句子序列中的第二个单词的one-hot词向量。
  • st 是在 t 步的隐含层状态。它是网络的“记忆”。st通过上一步的隐含层状态与当前步的输入来进行计算: st=f(Uxt+Wst1) 。函数 f 通常是非线性的,比如tanhReLU。为了计算第一步的隐含层状态,必须要知道s1,通常它被全部初始化为0。
  • ot 是在 t 步的的输出。例如,如果我们想预测句子中的下一个单词,它将是词汇表上的一个概率向量:ot=softmax(Vst)

有几点需要注意:

  • 你可以将 st 看做网络的记忆。 st 捕获了所有前面步中的计算信息。而输出 ot 的计算仅仅利用在 t 步的记忆。正如前面提及的那样,实际上处理st有点复杂,因为通常它不能捕获很多前面时间步的信息。
  • 传统的深层网络每层的参数是不同的,但是RNNs所有时间步上共享相同的参数( U,V,W )。这说明我们每个时间步执行相同的任务,仅仅是输入不同。这也大大减少了我们需要学习的参数总数。
  • 在上面的图中每个时间步都有输出,但是对于某些任务这可能不是必要的。例如,当做句子情感分析时,我们可能只关心最终的输出,而不是每个时间步的输出。同样,我们可能不需要在每个时间步都有输入。RNN的主要特征是它的隐含层状态能够捕获一个序列的一些信息。

RNNs可以做什么?

RNNs在NLP问题上已经取得了很大成功。此时,必须要说明的是最常用的RNNs模型是LSTMs,相比基本RNNs,它能够更好地捕获长期依赖。但是不要担心,LSTMs本质上与RNNs相同,在之后我们将会介绍,它们仅仅使用了一种计算隐含层状态的不同方法。后面的教程会详细介绍LSTMs。这里列出RNNs在NLP上的一些应用实例(并不是全部):

语言建模和生成文本

给定一个单词序列,我们想预测每个单词在给定前面的单词后的概率。语言模型允许我们衡量句子的可能性,这是机器翻译的一个重要输入(由于高概率的句子一般正确)。能预测下一个单词带来一个好处是我们可以得到一个生成模型,这允许我们可以通过输出概率进行抽样而生成新的文本。训练数据不同,我们可以得到各种各样的模型。语言建模的输入通常是单词序列(例如使用one-hot向量编码),输出是预测单词的概率。训练网络时,我们令 ot=xt+1 ,因为我们希望每一步的输出恰好是实际的下一个单词。

语言建模和生成文本的相关论文如下:

机器翻译

机器翻译与语言建模的相同之处是源语言(比如德语)的输入也是单词序列。我们想要的输出是对应目标语言(比如英语)的单词序列。一个关键差别在于当我们看到了所有的输入后才开始输出,因为在翻译的句子中的第一个单词要依赖于从整个输入序列中捕获的信息。

Machine Translation
递归神经网络用于机器翻译(来源:http://cs224d.stanford.edu/lectures/CS224d-Lecture8.pdf

机器翻译的相关论文如下:

语音识别

输入一个声波的声信号序列,我们可以预测一个语音序列以及它们的概率。

语音识别方面的相关论文如下:

生成图像描述

结合卷积神经网络,RNNs已经被用于无标记图像描述生成模型的一部分。很惊奇的是其实现的效果。组合模型甚至将生成的文字描述与图像中的特征对其。

Generating Image Descriptions
用于生成图像描述的深层视觉语义对齐(来源:http://cs.stanford.edu/people/karpathy/deepimagesent/

训练RNNs

训练RNNs与训练传统神经网络类似。我们同样使用反向传播算法(BP),但是需要一些变化。因为网络中的参数在所有的时间步上是共享的,每个输出的梯度不仅仅与当前时间步的计算相关,而且依赖于前面的时间步。比如,为了计算 t=4 时的梯度我们必须反向传播到前面的 3 个时间步,然后总和这些梯度。这被成为通过时间的反向传播(BPTT)。如果这些介绍还很难理解,不用担心,后面会有一整篇文章详细介绍BPTT。现在,你要知道普通RNNs通过BPTT训练很难学习到长期依赖(比如在很远时间步间的依赖),这是由于梯度消失或者爆炸问题。存在一些方法来解决这些问题,还有些特定的RNNs(如LSTMs)是专门用来解决这类问题。

RNN扩展

多年来,研究人员开发了更复杂的RNN来处理普通 RNN模型的一些缺点。我们将在后面的文章中更详细地介绍这些内容,而这部分只作为简要概述,以便你熟悉这些模型的分类。

双向RNNs基于这样的创想,即在时间t的输出不仅取决于序列中的先前元素,而且还取决于未来元素。例如,要预测序列中缺少的单词,你要了解上下文。双向RNNs非常简单。它们只是两个RNN相互堆积而成。然后基于两个RNN的隐含层状态计算输出。

Bidirectional RNNs

深层双向RNNs与双向RNNs相似,只是每个时间步是多层网络。因此实际上,它将有更高的学习能力(但是你也需要更大的训练样本)

Deep bid RNNs

LSTM网络在最近很受欢迎,我们在前面简单地介绍过。 LSTM与RNN基本架构相同,但是它们使用不同的函数来计算隐含层状态。 LSTM中的记忆称为单元,你可以将它们视为黑箱,其输入是前一状态 ht1 和当前输入 xt 。内部的这些单元决定记忆中哪些部分保存与遗忘。然后,它们组合先前的状态,当前记忆和输入。事实证明,这些类型的单元在捕获长期依赖性方面非常有效。 LSTMs在刚开始接触时非常难懂,但如果你感兴趣,你可以从这篇文章中学习到更多。

结语

目前为止一切都很好。我希望你已经对RNNs是什么以及能做什么有一个基本的了解。在下一篇文章我们将使用Python和Theano实现RNN语言模型的第一个版本。请在评论里提问题!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值