递归神经网络

递归神经网络 (RNN) 是一种人工神经网络,该网络具有可以更好识别数据模式的记忆或反馈回路。RNN 是常规人工神经网络的延伸,其增加了向自身回馈神经网络隐藏层的连接,即循环连接。循环连接不仅可让递归网络显示所获得的当前数据样本,而且还会显示之前的隐藏状态。具有反馈回路的递归网络能够可视化为多个神经网络副本,并将一个副本的输出用作下一个副本的输入。与传统的神经网络不同,递归网络借助对过往事件的了解来处理输入向量,而非每次都从头开始。

RNN 在处理数据序列以决定分类或进行回归估算时尤为有用,不过其也可用于非序列数据。递归神经网络通常用于处理与时间序列数据相关的任务。递归神经网络的应用包括自然语言处理、语音识别、机器翻译、字符级语言建模、图像分类、图像说明、股市预测以及金融工程。我们可以教 RNN 学习和理解单词序列。此外,RNN 还可用于生成各种序列来模拟莎士比亚、Linux 源代码以及婴儿名字等各类内容。

序列学习

某些类型的递归神经网络具有记忆,能使它们记住在过去多个时段中发生的重要事件。序列学习与其他回归和分类任务的区别在于,序列学习需要使用 LSTM(长短期记忆)等模型来学习输入数据的时间依从关系。这种对过往输入的记忆对于顺利进行序列学习至关重要。

我们可以将数据向量馈送至常规神经网络来处理序列数据(文本、语音、视频等)。但是,这种方法会受到固定大小的输入向量的限制,而且序列中的重要事件还可能位于输入窗口之外。使用递归网络则能克服这些限制。

我们可以向递归网络馈送任意长度的数据序列,并在每个时间步馈送一个序列元素 — 例如,我们可对输入至 RNN 的视频每次馈送一帧。再比如,我们还可使用常规前馈神经网络或 RNN 完成二进制加法任务。对于前馈网络,我们需要提前选择每个二进制数中的最大位数,并且关于如何将向量开头数字加到向量结尾数字中,我们还无法应用所学到的这些知识。

递归神经网络在机器翻译中的应用

机器翻译是指使用机器将一种语言的源序列(句子、段落、文档)转换成另一种语言的相应目标序列或向量。由于一个源语句子可通过多种不同方式进行翻译,因此翻译在本质上是一种一对多模式,翻译功能由此也会按照条件而非确定性进行建模。在神经机器翻译 (NMT) 中,我们让神经网络学习如何根据数据(而非一系列设计的规则)进行翻译。由于所处理的时间序列数据中的上下文和词序十分重要,因此我们为 NMT 选择了递归神经网络。NMT 可通过一种注意力技术来增强,该技术可帮助模型更专注于重要的输入部分,并改进预测过程。

recurrentneuralnetwork

RNN 训练与挑战

与多层感知器和卷积神经网络类似,训练递归神经网络时也可采用随机梯度下降 (SGD)、批量梯度下降或小批量梯度下降算法。而唯一的区别在于,反向传播步骤需为更复杂的网络结构计算权重更新值。在计算第一次经过网络中的预测误差后,神经网络会从最后一个输出神经元开始计算误差梯度,并会将其反向传播给该时间步的隐藏单元。之后,神经网络会依次针对之前的每个时间步重复该过程。反向传播至隐藏单元的梯度来自输出神经元,以及序列前一个时间步中处于隐藏状态的单元。我们将该过程称为随时间反向传播 (BPTT)。

我们可以增加隐藏层中的神经元数量,还可以堆叠多个隐藏层以创建深层 RNN 架构。遗憾的是,拥有多个堆叠层的简单 RNN 不太可靠,且难以进行训练。由于神经网络内的梯度反向传播是一个递归乘法过程,因此会出现这种不可靠情况。这表示,若梯度较小,则将呈指数级缩减;若梯度较大,则将呈指数级增大。这两个问题分别称为梯度“消失”和梯度“爆炸”。

RNN 架构

如上详述,由于简单的 RNN 在反馈回路中循环时,指定输入的输出要么衰减要么呈爆炸式增长,因而这种网络难以进行训练。

长短期记忆网络

相比于其他 RNN 架构,LSTM 可缓解所谓的梯度消失问题(每层梯度会变得越来越小,直至无法影响最深的网络层),从而提供更出色的性能。

门控循环单元

GRU 是一种更简单的 LSTM 变体。它们具有更少的参数、无输出门,并将单元状态与隐藏状态进行合并。因此,GRU 的训练速度要比 LSTM 更快。

神经图灵机

神经图灵机 (NTM) 是结合了外部记忆资源的递归神经网络。NTM 可视为具有软性注意机制的 NMT 的延伸网络。

双向递归神经网络

双向递归神经网络在两个递归网络上训练输入向量,其中一个是在常规输入序列上训练,而另一个则在反向输入序列上训练。之后,这两个网络的输出将会连接在一起。

借助 GPU 加速递归神经网络

与常规神经网络相比,递归神经网络具有额外的循环连接,能使它们记住过去处理过的信息。但是,这些连接会在训练 RNN 时增加计算量。GPU 的并行处理功能可加速 RNN 的训练和推理过程。cuDNN 是 GPU 加速深度神经网络基元库,可使用 NVIDIA GPU 优化 RNN 性能。TensorRT 是一款高性能深度学习推理优化器和运行时引擎,可为深度学习应用程序实现低延迟和高吞吐量推理。cuDNN 和 TensorRT 均为 NVIDIA 深度学习 SDK 的组成部分,且支持四种 RNN 模式:具有 ReLU 激活函数的简单 RNN、具有 tanh 激活函数的简单 RNN、门控循环单元 (GRU) 以及长短期记忆 (LSTM)。

其他资源

1. “Deep Learning in a Nutshell: Sequence Learning”作者:Tim Dettmers,Parallel For All,NVIDIA,2016 年 3 月 7 日。
2. “Understanding Natural language with Deep Neural Networks Using Torch”作者:Soumith Chintala,Parallel For All,NVIDIA,2015 年 3 月 3 日。
3. “The Unreasonable Effectiveness of Recurrent Neural Networks”作者:Andrej Karpathy,AK 博客,2015 年 5 月 21 日。
4. “Optimizing Recurrent Neural Networks in cuDNN 5”作者:Jeremy Appleyard,Parallel For All,NVIDIA,2016 年 4 月 6 日。
5. “5 Examples of Simple Sequence Prediction Problems”作者:Jason Brownlee,Machine Learning Mastery,2017 年 7 月 19 日。
6. “Introduction to Neural Machine Translation with GPUs”作者:Kyunghyun Cho,NVIDIA 开发者博客,2015 年 5 月 27 日。
7. “Introduction to Recurrent Neural Networks”作者:Jon Barker,NVIDIA 深度学习学院,2016 年 7 月 1 日。