第 6 章 循环神经网络 递归神经网络
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
本章我们将介绍递归神经网络(RNN),这是一类用于处理数据序列的神经网络架构。迄今为止,我们所见过的神经网络都将接收到的每批数据视为一组独立的观测数据;无论是第 4 章中的全连接神经网络,还是第 5 章中的卷积神经网络,都不存在 MNIST 中某些数字在其他数字之前或之后出现的概念。然而,许多类型的数据本质上都是有序的,无论是在工业或金融背景下可能需要处理的时间序列数据,还是字符、单词、句子等都是有序的语言数据。递归神经网络旨在学习如何接收此类数据序列,并将正确的预测作为输出返回,无论这种正确的预测是对金融资产次日价格的预测,还是对句子中下一个单词的预测。
与我们在前几章中看到的全连接神经网络相比,处理有序数据需要做出三种改变。首先,它需要为我们输入神经网络的ndarray"增加一个新维度"。以前,我们提供给神经网络的数据本质上是二维的--每个ndarray 都有一个维度代表观测值的数量,另一个维度代表特征的数量;1另一种看法是,每个观测值都是一维向量。对于递归神经网络,每个输入仍将有一个维度代表观察结果的数量,但每个观察结果将表示为一个二维ndarray :一个维度将代表数据序列的长度,第二个维度将代表每个序列元素上存在的特征数量。因此,RNN 的整体输入将是一个三维ndarray 的形状[batch_size, sequence_length, num_features],即一批序列。
其次,当然,为了处理这种新的三维输入,我们必须使用一种新的神经网络架构,这将是本章的重点。然而,第三个变化也是我们本章要开始讨论的地方:我们必须使用一个完全不同的框架和不同的抽象来处理这种新形式的数据。为什么?在全连接神经网络和卷积神经网络中,每个 "操作",即使实际上代表了许多单独的加法和乘法(如矩阵乘法或卷积),都可以被描述为一个单一的 "迷你工厂",它在前向和后向传递中都接收一个ndarray 作为输入,并产生一个ndarray 作为输出(可能使用另一个ndarray 代表操作的参数作为这些计算的一部分)。事实证明,递归神经网络无法以这种方式实现。在进一步阅读了解原因之前,请花些时间思考一下:神经网络架构的哪些特征会导致我们迄今为止建立的框架崩溃?虽然答案很有启发性,但完整的解决方案涉及深入实施细节的概念,超出了本书的范围。2首先,让我们来揭示一下我们迄今为止所使用的框架的一个关键局限。
关键限制:处理分支
事实证明,我们的框架无法使用图 6-1 所示的计算图来训练模型。
图 6-1. 导致我们的 Operation 框架失效的计算图:同一数量在前向遍历中多次重复,这意味着我们不能像之前那样简单地在后向遍历中依次向后发送梯度。
这有什么问题吗?将前向传递转化为代码似乎没有问题(注意,我们在这里编写了Add 和Multiply 操作,仅供参考):
a1=torch.randn(3,3)w1=torch.randn(3,3)a2=torch.randn(3,3)w2=torch.randn(3,3)w3=torch.randn(3,3)# operationswm1 ...