9. 循环神经网络

到目前为止,我们主要关注的是定长数据。在 第 3 节第 4 节 中介绍线性回归和逻辑回归,以及在 第 5 节 中介绍多层感知机时,我们乐于假设每个特征向量 \(\mathbf{x}_i\) 由固定数量的分量 \(x_1, \dots, x_d\) 组成,其中每个数值特征 \(x_j\) 对应一个特定的属性。这些数据集有时被称为*表格*数据,因为它们可以排列在表格中,每个样本 \(i\) 占一行,每个属性占一列。至关重要的是,对于表格数据,我们很少假设列之间存在任何特定的结构。

随后,在 第 7 节 中,我们转向了图像数据,其中输入由图像中每个坐标处的原始像素值组成。图像数据很难符合典型表格数据集的特征。在那里,我们需要调用卷积神经网络(CNN)来处理层次结构和不变性。然而,我们的数据仍然是定长的。每张 Fashion-MNIST 图像都表示为一个 \(28 \times 28\) 的像素值网格。此外,我们的目标是开发一个模型,只看一张图像,然后输出一个单一的预测。但是,当面对像视频这样的图像序列,或者当任务是生成像图像字幕这样的序列结构化预测时,我们该怎么办呢?

许多学习任务都需要处理序列数据。图像字幕、语音合成和音乐生成都要求模型产生由序列组成的输出。在其他领域,如时间序列预测、视频分析和音乐信息检索,模型必须从作为序列的输入中学习。这些需求常常同时出现:例如,将文本段落从一种自然语言翻译成另一种、进行对话或控制机器人等任务,都要求模型既能接收又能输出序列结构化数据。

循环神经网络(RNN)是深度学习模型,通过*循环*连接来捕捉序列的动态,这可以被认为是节点网络中的循环。乍一看这似乎违反直觉。毕竟,正是神经网络的前馈特性使得计算顺序明确。然而,循环边的定义方式非常精确,确保不会出现这种模糊性。循环神经网络按时间步(或序列步)*展开*,每个时间步都应用*相同*的底层参数。标准连接是*同步*应用的,用于将每层的激活传播到*同一时间步*的下一层,而循环连接是*动态*的,在相邻的时间步之间传递信息。正如 图 9.1 中的展开图所示,RNN 可以被认为是前馈神经网络,其中每一层的参数(包括常规和循环参数)在所有时间步上共享。

../_images/unfolded-rnn.svg

图 9.1 左侧,循环连接通过循环边描绘。右侧,我们将RNN按时间步展开。在这里,循环边跨越相邻的时间步,而常规连接是同步计算的。

与更广泛的神经网络一样,RNN 有着悠久的跨学科历史,最初是由认知科学家推广的脑模型,随后被机器学习社区采纳为实用的建模工具。正如我们对整个深度学习所做的那样,在本书中我们采用机器学习的视角,将 RNN 视为在 2010 年代因在手写识别 (Graves et al., 2008)、机器翻译 (Sutskever et al., 2014) 和医学诊断识别 (Lipton et al., 2016) 等多样化任务上取得突破性成果而普及的实用工具。我们向对更多背景材料感兴趣的读者推荐一篇公开的综合综述 (Lipton et al., 2015)。我们还注意到,序列性并非 RNN 所独有。例如,我们已经介绍过的 CNN 可以被改造以处理变长数据,例如不同分辨率的图像。此外,RNN 最近已将相当大的市场份额让给了 Transformer 模型,这将在 第 11 节 中介绍。然而,RNN 作为深度学习中处理复杂序列结构的默认模型而声名鹊起,并且至今仍是序列建模的主要模型。RNN 的故事和序列建模的故事是密不可分的,本章既是关于序列建模问题基础知识的章节,也是关于 RNN 的章节。

一个关键的见解为序列建模的革命铺平了道路。虽然机器学习中许多基本任务的输入和目标不能轻易地表示为定长向量,但它们通常可以表示为由定长向量组成的可变长度序列。例如,文档可以表示为单词序列;医疗记录通常可以表示为事件序列(就诊、用药、手术、实验室检查、诊断);视频可以表示为可变长度的静止图像序列。

虽然序列模型已在众多应用领域出现,但该领域的基础研究主要由自然语言处理核心任务的进展所驱动。因此,在本章中,我们将把我们的阐述和示例集中在文本数据上。如果你掌握了这些示例,那么将这些模型应用于其他数据模态应该会相对直接。在接下来的几节中,我们将介绍序列的基本表示法和一些用于评估序列结构化模型输出质量的评估指标。之后,我们将讨论语言模型的基本概念,并以此为契机引出我们的第一个 RNN 模型。最后,我们描述在 RNN 中反向传播时计算梯度的方法,并探讨训练此类网络时常遇到的一些挑战,从而引出将在 第 10 节 中介绍的现代 RNN 架构。