序列预测是序列建模中的一项重要任务,目标是根据序列的过去元素预测其未来元素。这项任务涉及如何专门为预测配置循环神经网络 (RNNs)、长短期记忆网络 (LSTMs) 和门控循环单元 (GRUs)。主要应用包括时间序列预测,也适用于预测句子中的下一个词或旋律中的下一个音符等场景。主要思路很简单:我们将序列历史的一部分输入到循环网络中,网络学习输出一个或多个未来值。网络在时间步之间保持的内部状态,使其能够捕获输入序列中的时间依赖关系,这对于做出准确预测非常重要。预测的输入-输出结构不同的预测问题需要不同的输入-输出映射。让我们来看看常见模式:多对一预测: 这可能是基本预测中最常见的设置。网络接收一系列输入值(历史数据),并预测下一个时间步的单个值。示例: 给出过去30天的股票价格,预测明天的价格。架构: RNN(LSTM/GRU)处理输入序列。通常,来自最终时间步的隐藏状态的输出被馈送到一个全连接层(Dense层)以生成单个预测值。循环层中的return_sequences参数通常设置为False(或等效于框架的设置),因为我们只需要最后一个输出。多对多预测(直接多步): 在这种方法中,网络接收一系列输入,并直接预测一系列未来输出。示例: 给出过去72小时的天气数据,预测未来12小时的温度。架构: RNN处理输入序列。与多对一类似,最终隐藏状态通常总结输入序列。然后,这个状态可能通过一个或多个全连接层,用于生成一个输出向量,该向量同时包含对多个未来步骤的预测。多对多预测(迭代多步): 另一种预测未来多个时间步的方式是迭代。训练一个多对一模型来预测下一个时间步。为了预测更远,模型对步长 $t+1$ 的预测被附加到输入序列中,然后用于预测步长 $t+2$,依此类推。示例: 通过重复预测下一个采样并将其反馈作为输入,来预测音频的未来5秒。架构: 这使用了如上所述的多对一架构,但预测需要一个循环,其中模型被重复调用。虽然简单,但误差可能会在更长的预测范围上累积。多对多预测(对齐输出 - 预测中较少见): 在这里,网络为每个输入时间步生成一个输出。这更常用于像序列标注(例如,词性标注)这样的任务,而不是标准预测,但它是一种可能结构。对于预测来说,这可能意味着在每个步骤预测输入的一个经过处理的版本。架构: RNN层需要为每个时间步输出隐藏状态(例如,return_sequences=True)。然后,这些输出通常由一个包裹在全连接层外部的TimeDistributed包装器(或等效机制)处理,为每个时间步生成一个输出。构建预测模型让我们关注常见的多对一设置,用于预测时间序列中的下一个值。输入形状: 如第8章所述,时间序列数据通常使用滑动窗口方法准备。如果我们要使用前 $k$ 个值预测时间 $t$ 的值,则输入序列为 $[x_{t-k}, x_{t-k+1}, ..., x_{t-1}]$,目标输出为 $x_t$。馈送到RNN的每个输入样本都将具有形状 (k, num_features),其中 num_features 是在每个时间步测量的独立数据流的数量(例如,仅温度为1,如果包括压力、湿度等则为多个)。批量输入将具有形状 (batch_size, k, num_features)。模型结构:一个输入层指定输入序列的形状(例如,(k, num_features))。一个或多个循环层(SimpleRNN、LSTM或GRU)处理输入序列。对于多对一,最后一个循环层通常具有return_sequences=False。这些层中的单元数量是一个需要调整的超参数。一个全连接输出层将循环层的最终隐藏状态映射到所需的输出形状。为了预测单个值,此层有1个单元。激活函数取决于所预测数据的特性。对于无界连续值(如股票价格或温度),线性激活(即没有激活函数)是常见的。对于介于0和1之间的值,可能会使用sigmoid函数。digraph G { rankdir=LR; node [shape=box, style="filled", fillcolor="#a5d8ff", fontname="sans-serif"]; edge [fontname="sans-serif"]; subgraph cluster_input { label = "输入序列 (k 步)"; style=filled; color="#e9ecef"; rankdir=TB; node [shape=point, width=0]; in1 [label="x_{t-k}", shape=plaintext]; in2 [label="...", shape=plaintext]; in3 [label="x_{t-1}", shape=plaintext]; } subgraph cluster_rnn { label = "循环层 (LSTM/GRU)"; style=filled; color="#e9ecef"; rnn_cell [label="处理序列\n(return_sequences=False)", fillcolor="#74c0fc"]; } subgraph cluster_output { label = "输出层"; style=filled; color="#e9ecef"; dense_out [label="Dense(1, activation='linear')", fillcolor="#74c0fc"]; prediction [label="预测值\n(x̂_t)", shape=plaintext]; } in3 -> rnn_cell [style=invis]; // 确保输入集群出现在RNN之前 {in1, in2, in3} -> rnn_cell [style=invis]; // 视觉指引,非实际数据流路径描绘 rnn_cell -> dense_out [label="最终隐藏状态"]; dense_out -> prediction; }用于序列预测的典型多对一架构。循环层处理输入序列,其最终隐藏状态被传递到一个全连接层以生成单个预测值。预测的考量"* 循环单元的选择: LSTM和GRU通常比SimpleRNN更受青睐,尤其是在可能存在长期依赖关系的数据中,因为它们能更好地处理梯度(如第4、5和6章所讨论)。"多步策略: 对于预测未来多个时间步,直接方法和迭代方法之间的选择需要权衡。直接预测需要一个设计用于输出多个值的模型,但可以一次性完成预测。迭代预测使用更简单的模型,但可能面临误差累积。最佳方法通常取决于具体问题和数据特点。评估: 评估预测模型通常涉及均方误差(MSE)或平均绝对误差(MAE)等指标,用于比较预测值与实际未来值(在第10章中介绍)。这些基本方法构成了将RNN应用于多种序列预测问题的根本。接下来的部分将了解如何调整类似架构以适应分类和生成任务。