RNN教程之-1 入门

引言

这篇RNN教程翻译是翻译自WILDML上的RNN系列教程. 译者是一位在当地较为牛逼的深度学习大神, 凡事多做不装逼, 如果有不当之处欢迎大家指正, 希望此教程能给入门者一些思路和想法.

PART-1 循环神经网络教程之RNNs介绍

RNNs也就是Recurrent Neural Network现如今已经应用很广了,很多领域在RNN上取得了可喜的成果, 比如语音识别, 自然语言处理等方面. 但是尽管这种技术在科学领域得到了广泛运用, 然而我却发现少有资料或者资源教授这方面的内容, 并且没有人告诉我们怎么去实现它. 因此我写下了本教程, 本教程将分为以下四个部分:

  • 循环神经网络教程之RNNs介绍
  • 用Python和Theano实现RNN
  • 理解时间反向传播算法(BPTT)以及认识梯度消失问题
  • 实现一个GRU或者LSTM(译者: GRU就是Gated Recurrent Unit)
    在进入本教程之前, 我假设你已经对神经网络有一些了解.

什么是RNNs?

RNN背后的深刻思想就是充分利用序列的信息, 举个例子, 我现在要解决一个问题, 就是我每周都有一个计划, 我周一上午会去一趟健身房, 周二去约一个朋友聊天, 周三参加一个技术分享会, 周四宅在办公室研究技术, 周五去上音乐课. 那我每周都是如此的话, 假如我要让机器来预测我周三会去干什么, 如果用神经网络或者之前的CNN等来做, 你会发现它无法预测, 因为这是一个基于时间序列的问题. 而RNN就是基于这个发明的. 话太多容易让你产生疑惑, 好吧, 从最简单的情况你可以这样理解, 好了, 现在有一个大概的印象了吗? 非常好, 接下来将会稍微复杂一点. 我放一张图

图1 RNNs示意图
图1 RNNs示意图

好的,就是这张图, 你看到了什么? 对就是RNN的结构. 你可以这样理解, 如果说NN是基于空间的多层之间的链接, 那么RNN就是基于时间的多层之间的链接. 从图中你看到了吗? xt表示的是t时刻, 那么xt-1 表示前一个时刻, 这都是输入的数据, 在格式上就是NN中的输入向量, 但是你发现了吗, 前一个时刻从隐藏层输出的值会作用到t时刻, 这说明什么呢? 对! 我们用RNN实现了对历史的学习! 令人振奋的是, 这种学习是NN所不能的, RNN可以从历史的序列中发现规律, 并把这种规律保存在网络中! 你可以把RNN当做是NN在时间上的无限延伸, 设想一下, 假如时间序列足够长, 那么我们需要足够大的RNN来储存这些历史的信息.

RNN可以用来做什么?

RNN在自然语言处理中取得了相当大的成功, 其中你可以料想, 假如我们把大量的文本输入到RNN中, 那么RNN就可以学习一个模型, 根据输入预测出下一个字将会是什么, 这有什么用呢? 简单的应用就是语法检查, 因为根据它的输出可以判断一段话是不是正常人说的话.

机器翻译

机器翻译就是把英文翻译为中文, 或者德文, 人们发现用RNN来做机器翻译简直再合适不过了, 看看下面的示意图
图2 机器翻译

语音识别

RNN的另一个巨大应用就是语音识别了, 语音识别就是从语音序列中识别出要表达的信息, 这个你说话的上下文很重要, 因此也是序列信息, 而RNN就擅长做这个, 事实证明效果确实很好.

产生图像描述

RNN和CNN一起确实可以做几件酷炫到没有朋友的事情, 比如下面这个, 机器识别图片中的物体并生成文字描述
图3 图像描述生成

训练RNNs

那么问题来了, RNN这么屌这么牛逼, 怎么训练它呢? 他的输入输出是什么样的呢? 我相信看到这里你显然还没有明白, 不要着急, 要想深入理解RNN你还需要继续看下去, 我现在还只是简单的介绍, 后面还有一堆推理在后面. 刚才说到训练RNN, 实际上训练RNN和普通的神经网络确实没有什么区别, 不过又有一些变种, 在反向传播算法中, 我们通过正向先计算出所有的激活值a和输出值z, 来计算误差, 从而进一步梯度, 最后用梯度下降算法得到最终的权值和激活值, 在RNN中, 它的梯度已经不仅仅是用误差能计算的了, 也就是说误差不仅仅是当前时间的误差, 还与上一个时间有关, 举个例子, 我们要计算t=4时候的梯度, 那么我们要沿着时间线往回计算3个, 然后累加起来就是第四个时间的梯度, 也也叫作基于时间的反向传播算法.

RNN的变体

这么多年来, 科学家们已经发明了无数种RNN的变体, 下面介绍一些比较有名的变体

  • 双向RNNs 是一种当前时刻不仅仅取决于以前时刻同时还取决于未来时刻的RNN变体, 这个就比较吊了, 举个例子, 比如我的一段文本不仅仅和前面有关系, 还和后面有一定的关系,那么这个用双向RNN就很容易了, 这个网络的英文名字叫做Bidirectional RNNs
  • LSTM RNNs 是近几年比较火的一种RNN变体, 实际上也是运用最为广泛的一种形式, 它克服了我后面会降到的梯度衰减问题, 这个问题在NN中也同样存在, LSTM本身也有变体, 至少不下十几种形式, 但是本质都差不多

总结

说了这么多, 其实并没有说到重点, 包括很多人想知道RNN公式怎么推导的, 输入数据是怎么样的等等, 这些我下面会接着讲述, 欢迎大家指正.

你可能感兴趣的:(RNN教程之-1 入门)