时间序列预测入门到实战八· RNN / LSTM / GRU让网络记住过去本文是「码海寻道」《时间序列预测入门到实战》系列的第 8 篇也是深度学习篇的开场。前面的模型要么手工造特征机器学习要么线性假设统计。深度学习换了个玩法让网络自己从原始序列里学表示。而第一个为序列而生的网络就是 RNN——它的核心能力是记忆。一、循环的核心一个会传递的隐藏状态普通神经网络一次吃一个独立样本没有记忆。RNN循环神经网络不一样它逐步读入序列每读一步就更新一个隐藏状态 h并把它传给下一步hₜ f(hₜ₋₁, xₜ)当前状态hₜ由上一步的状态hₜ₋₁和当前输入xₜ共同决定。这个h就是记忆它像接力棒一样沿时间轴一路往后传把早期信息带到后面。直觉上就像你读一句话——边读边更新理解读到后面还记得前面说了啥。二、致命伤梯度消失原始 RNN 有个学不会长期记忆的硬伤。训练时梯度要沿着时间链一路反向传播而这条链上梯度是连乘的连乘的因子普遍小于 1 → 传到远处梯度消失学不到长依赖偶尔大于 1 →梯度爆炸训练发散。举个具体的数就吓人了假设每步的因子是 0.8传 50 步就是0.8⁵⁰ ≈ 0.00001——梯度还没传回去就几乎归零50 步前的信息对当前的教训细到可以忽略模型根本学不到这么长的依赖。反过来若因子是 1.21.2⁵⁰ ≈ 9100梯度直接爆炸、训练发散。连乘这个结构注定了它对长距离要么记不住、要么炸掉。结果就是原始 RNN只记得住最近几步稍微长一点的依赖就抓瞎。这个问题不解决RNN 没法用。三、LSTM用门来管理记忆LSTM长短期记忆网络的解法很巧妙除了隐藏状态再加一条细胞状态cell state——一条几乎不受干扰的记忆传送带信息可以在上面平稳地流很远。然后用三个门来精细控制这条传送带遗忘门决定从记忆里丢掉什么“这段过时了忘了吧”输入门决定把当前的什么信息写入记忆输出门决定基于记忆输出什么。门本质是 0~1 的开合系数。靠这套闸门梯度能在传送带上平稳流动长期依赖就学得住了。你不需要背下门的公式记住三个闸门管理一条记忆传送带这个直觉就够用。为什么这条传送带就能治好梯度消失关键在一个字加法。原始 RNN 的记忆每一步都被乘一遍权重再传下去连乘一长就把梯度乘没了第二节说的连乘 1。而 LSTM 的细胞状态是加着更新的——新记忆是旧记忆 这一步该记的东西像传送带上不断叠放包裹而不是每步重新称重。反向传播时梯度沿着这条加法通道能近乎无损地一路流回很远的过去不再被反复连乘衰减。三个门只是决定这一步往传送带上加什么、扔什么真正救命的是这条加法式的记忆主干。这个用加法通道让梯度直达远处的思想后来在 ResNet 的残差连接、Transformer 里都能看到影子——是深度学习的一条通用解药。四、GRU精简版的 LSTMGRU门控循环单元是 LSTM 的瘦身版把三个门简化成两个更新门、重置门合并了记忆通道参数更少、训练更快。效果常常和 LSTM 不相上下——所以实务里数据不大时先试 GRU 往往更划算。五、怎么用它做预测单步把过去 L 步喂进去取最后一步的隐藏状态过一个全连接层输出下一个值。多步用Seq2Seq编码器-解码器结构——编码器读完历史、压缩成一个状态向量解码器从这个向量出发逐步生成未来 H 个值。机器翻译就是这么干的时序多步预测同理。一个能跑的 LSTM 预测器骨架PyTorchimporttorch,torch.nnasnnclassLSTMForecaster(nn.Module):def__init__(self,n_features1,hidden64,horizon24):super().__init__()self.lstmnn.LSTM(n_features,hidden,num_layers2,batch_firstTrue)self.headnn.Linear(hidden,horizon)defforward(self,x):# x: (batch, lookback, n_features)out,(h,c)self.lstm(x)returnself.head(out[:,-1])# 最后一步隐状态 → 未来 horizon 步modelLSTMForecaster()# 训练三件套输入先标准化、损失用 MSELoss、优化器用 Adam想真跑pip install torch把第 5 篇的滑窗数据整成(batch, lookback, features)张量喂进去即可。六、说句实话深度学习不是银弹参考量级在 ETTh1 这种规模的数据上调好的 LSTM 未必能碾压第 6 篇的 LightGBM还更慢、更难调。深度学习的真正优势在这些场景才显现数据量大成千上万条长序列多变量、多协变量关系复杂非线性要端到端不想手工造特征。小数据、要快、要可解释的场景传统方法往往更划算。别为了用深度学习而用深度学习——这是本系列反复强调的务实态度。小结RNN 的灵魂是沿时间传递的隐藏状态让网络有了记忆原始 RNN 栽在梯度消失记不住长期LSTM 用三个门管理一条记忆传送带学得住长依赖GRU是它更快的精简版多步预测用Seq2Seq 编码-解码深度学习不是银弹小数据上未必赢过 LightGBM优势在大数据、多变量、端到端。RNN 是按时间一步一步处理序列的天生难并行、也还是会淡忘很久以前的事。下一篇我们看两个用卷积处理时序的模型——TCN 和 TimesNet它们换了个角度把记忆问题解得又快又妙。思考题LSTM 要一步步顺序计算 hₜ没法像 CNN 那样并行。这个顺序依赖在训练超长序列时会带来什么麻烦提示这正是下一篇 TCN 和后面 Transformer 想解决的痛点之一。深度学习的大门已经打开。关注公众号「码海寻道」下一篇看卷积网络如何跨界做时序TCN 与 TimesNet 各显神通。