04-Seq2Seq:序列到序列的时间序列预测

04-Seq2Seq:序列到序列的时间序列预测

导出时间:2026/1/14 20:36:27

1)研究背景:深度神经网络很强,但“只能处理固定长度输入输出”

传统神经网络 就像“固定模板机器”:
  • 你喂进去的数据长度必须固定
  • 输出也必须固定
但现实世界很多任务不是固定长度的,例如:
  • 机器翻译:英文一句话可能 5 个词,法语可能 7 个词
  • 语音识别:说 3 秒和说 30 秒长度完全不同
  • 问答系统:问题和答案长度不确定
这些任务都更自然地表示成“序列到序列”的映射
论文明确指出:如果有一种领域无关的方法能学会

把一个变长序列映射成另一个变长序列

那么非常有价值。

通俗理解(放到时间序列预测里)

这就对应了你现在真正关心的预测任务:

输入过去 48 个点 → 输出未来 24 个点 输入过去 7 天小时数据 → 输出未来 1 天小时数据

这就是 Seq2Seq 的典型使用方式。

当时的困难:RNN 可以吃序列,但难以解决“输入输出不对齐”的问题

论文解释:标准 RNN 的一个问题是——
  • 如果输入输出长度相同,并且对齐关系明确,很容易做
  • 但如果输入序列和输出序列长度不同,且对齐关系复杂(非单调),就不清楚怎么做

Seq2Seq 的核心思路(动机落地):先“压缩理解”,再“展开生成”

论文提出的解决方案非常像人类做翻译/做预测的方式:

✅ Step A:Encoder(编码器):先把整段输入读完,变成一个“理解向量”

论文说:用一个 LSTM 逐步读取输入序列,生成一个固定维度向量表示。
你可以把它理解成:

Encoder = 把历史压缩成总结(提炼成一个“语义/状态”)

✅ Step B:Decoder(解码器):再根据这个总结,一步一步生成输出序列

论文说:再用另一个 LSTM 从这个向量里解码出目标序列。
你可以把它理解成:

Decoder = 拿着总结开始写答案(逐步生成未来)


如果一句话总结论文提出 Seq2Seq 的动机:

现实任务(翻译/语音/预测)大多是变长输入输出,而传统 DNN 不支持; RNN 虽能处理序列,但不擅长输入输出长度不同、依赖很长的场景; 因此提出 Encoder–Decoder LSTM:先把输入压缩成固定向量,再解码生成输出序列。




2、模型网络结构

这张图表达的是:

模型先把输入序列 “ABC” 全部读完(Encoder 阶段), 再根据读完后的“理解结果”,一步一步输出 “WXYZ”,直到输出 <EOS> 结束(Decoder 阶段)。

换成人类语言就是:

先阅读理解题目 → 再开始写答案。

image.png

2)你图里的每个方块是什么?

图中一排排白色方块,本质上是:

同一个 LSTM 在不同时间步的展开(unroll)

也就是:
  • 每个方块是一个时间步的 LSTM 单元(共享参数)
  • 横向箭头代表“状态传递”(记忆在往后传)
你可以把它想象成“流水线处理器”:
  • 每读一个符号/数据,更新一次内部记忆
  • 记忆沿着箭头一路传下去

3)图为什么分成两段?左边是 Encoder,右边是 Decoder

你注意看:图其实分成两部分:

✅ 左半段:Encoder(编码器)

输入是 A → B → C
方块下面有向上的箭头,表示把 A/B/C 喂给 LSTM。
Encoder 的任务很像:

把整句 ABC 读完,并在脑子里形成“总结”

这时 LSTM 的隐藏状态/记忆状态相当于形成了一个浓缩理解

✅ 中间那个 <EOS> 的方块:分界点

你会看到读完 C 后,紧接着给了一个 <EOS> 输入。
它的意义是:

告诉模型:输入到此结束了,接下来要开始输出了。

就像你读题目读到最后看到句号:

“题目读完了,可以开始回答了。”


✅ 右半段:Decoder(解码器)

右边开始输出 W → X → Y → Z → <EOS>
注意这里有个关键现象:
  • 每个方块下面输入的是上一步输出的词
  • 每个方块上面输出的是当前预测的词
也就是说:

Decoder 每一步都是“自己喂自己”往后生成。

通俗点说就是:

模型写作文:写出第一个字 W,再根据 W 写 X,再根据 X 写 Y…

最后输出 <EOS> 表示:

答案写完了,停止。


4)为什么 Decoder 的输入也有 W/X/Y/Z?(很多人卡在这里)

你图里每个 Decoder 方块下面都有 W、X、Y、Z,看上去像“答案怎么提前知道了?”
这里要区分 训练推理(预测) 两种情况:

✅ 训练时(Teacher Forcing)

训练阶段为了让模型学得更快、更稳定:

我们会把“正确答案”喂给 Decoder 作为输入

所以训练时确实是:
  • 输入 W → 输出 X
  • 输入 X → 输出 Y
  • 输入 Y → 输出 Z
这个就叫 Teacher Forcing(教师强制)
形象比喻:

老师一边提示正确的上句,你一边学习写下句。


✅ 推理/预测时(真正用模型时)

预测阶段,你没有真实 WXYZ(未来你并不知道),所以变成:

模型自己预测 W,把 W 喂回去,再预测 X,再喂回去…

这叫 自回归生成(autoregressive generation)

5)这张图最核心的思想:先“压缩理解”,再“逐步生成”

你可以用一个超级形象的比喻来理解:

Encoder = 阅读理解

把 ABC 读完后,你脑子里形成一个“意思总结”。

Decoder = 翻译/写答案

拿着这个总结,开始一个字一个字写出 WXYZ。
所以 Seq2Seq 的本质就是:

输入的序列长度可以是 3(ABC),输出可以是 4(WXYZ),长度不要求相等。

这对时间序列预测特别重要,因为:

过去 48 步 → 未来 24 步(长度不同) 用 Seq2Seq 正好。


6)图注里提到的“反向读取输入”是什么意思?为什么这么做?

你图下方文字说:

LSTM 会反向读取输入句子(reverse input)

也就是说:
  • 输入不是 A→B→C
  • 而是 C→B→A

为什么反向读更好?

论文发现反向读取会更容易训练,因为:

它让“输入和输出”在时间上更接近,减少了长距离依赖,让优化更容易。

通俗解释:
  • 你要输出 W 时,最相关的信息可能是输入句尾的 C
  • 如果正向读 A B C,那 C 离输出 W 很远
  • 反向读 C B A,C 离输出 W 很近,更容易记住、更容易训练