Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

面向时间序列的 Transformer

北京大学光华管理学院

Transformer 改变了自然语言处理,也正在改变时间序列预测。本章讨论的是面向时间序列的 Transformer(Transformer for Time Series):它的核心优势是自注意力机制,模型可以在整个输入序列中自动学习哪些历史时刻最重要,而不是只按照固定滞后或短期记忆工作 Vaswani et al., 2023。本章介绍 Transformer 为什么适合通用预测模型,以及它在时间序列中的基本计算逻辑、练习方式和局限。

课程进入 Transformer,是因为前面几章已经说明了一个关键问题:数值时间序列必须被重新编码,才能进入大模型式的预测系统。一个孤立的价格 1940 只是数字;经过上下文、位置、趋势、节日和相似序列重新表示后,它才可能成为模型可以比较和迁移的 token 或 embedding。Transformer 正是处理这类序列表示的核心工具。

学习目标

完成本章后,你应该能够:

传统预测范式的局限

许多传统深度预测模型遵循“一模型对应一数据集、一上下文长度、一预测长度”的模式。每个数据集单独训练,每个任务设置单独调参。一旦数据频率、输入窗口或预测步长变化,模型往往需要重新训练。

这种范式有四个问题:

我们用即时零售说明这个规模问题。假设一个城市有 100 个小区,每天按 15 分钟切成 32 个重点时段,每个时段要预测 200 种商品需求,就会产生:

100×32×200=640000100 \times 32 \times 200 = 640000

如果每条序列还要比较 10 个候选模型,就会变成 640 万次建模或调用。更重要的是,这些预测可能每 15 分钟刷新一次。此时“给每条序列手工选模型”的方式已经不现实,预测系统必须能够批量处理、共享信息并自动更新。

单序列建模还浪费了跨序列知识。海淀和朝阳的消费需求不完全相同,但都受工作日、节假日、天气、通勤和促销影响;燃气、蔬菜、电力、外卖和交通数据也都和人的活动节奏有关。如果每条序列独立训练,模型看不到这些共同规律,也无法把一个场景中学到的季节、活动和异常经验迁移到另一个场景。

通用预测模型(Universal Forecaster)试图解决这些问题。它先在大规模、多领域时间序列上预训练(pretraining),再根据具体任务零样本使用或少量微调(fine-tuning)。我们把这种模型称为类似“预测核心能力”的 Universal Forecaster:它不是只会预测某一条销量曲线,而是在许多序列中学习“历史如何影响未来”的一般规律。

这条路线并不要求抛弃传统统计特征。趋势、季节、滞后和移动平均仍然有价值;深度模型的作用,是在这些显式结构之外学习更高维的 embedding 和非线性交互。

真正的变化是:预测工作从“为每个对象训练一个模型”转向“训练一个可迁移的预测能力,再把它适配到具体业务”。

为什么是 Transformer

时间序列和语言有共同点:二者都是序列。语言模型根据前文预测下一个 token,时间序列模型根据历史观测预测未来值。Transformer 的自注意力机制可以同时查看整个上下文,因此天然适合捕捉长程依赖。

相对 RNN 或 LSTM,Transformer 更容易并行训练;相对固定卷积,它能在任意位置之间建立联系。对于企业数据,这意味着模型可以同时关注近期点击、历史购买、节假日、促销、天气和长期趋势。

我们反复强调的一点是:Transformer 不要求我们先人工指定“最近 7 天”“去年同周”或“某个固定滞后”一定重要。模型会从数据中学习哪些历史片段对当前预测更有用。人工经验仍然重要,但它更多体现在数据组织、特征选择和评估设计上,而不是手工写死每一个依赖关系。

供暖或天然气需求是一个直观例子。预测今年冬天的用量时,只看昨天、前天或最近一周往往不够;去年同期、上一轮寒潮、供暖季开始前后的变化都可能影响当前判断。如果用 ARIMA 手工加入 365 天滞后,模型结构会变得很重;如果完全依赖短期记忆,又会漏掉长期周期。Transformer 的价值在于让远处的历史位置也有机会直接参与当前预测。

Transformer 还适合处理不同长度的历史。一个城市可能有 5 年数据,一个新区域可能只有 1 年数据,一个新品可能只有几周数据。实际系统不能要求所有序列都有完全相同的历史长度。更灵活的序列表示和注意力机制,使模型可以在不同上下文长度下提取可用信息。

注意力机制

注意力机制可以理解为“让模型学会关注重点”。传统自回归模型其实也隐含一种注意力:AR(1) 默认昨天最重要,季节模型默认某些固定周期位置重要。但这种关注方式是人预先指定的。Transformer 的自注意力让模型自己在整个历史窗口中寻找相关位置。

它使用三个对象:

模型先计算 Query 与所有 Key 的相似度,再通过 softmax(归一化指数函数)转成权重,最后对 Value 加权求和。简化写法是:

Attention(Q,K,V)=softmax(QKdk)V\mathrm{Attention}(Q,K,V) = \mathrm{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V

在时间序列预测中,这相当于自动判断“哪些历史时刻最应该被听见”。如果当前预测目标是春节前销量,模型可能更关注往年春节前的时间点,而不是机械地只看最近几天。

我们还会用一个教学比喻:判断全班是否理解时,不应平均看每个学生一眼,而可能会特别观察后排、皱眉或没有跟上的同学。注意力机制也是如此,它把有限关注度分配给对当前判断更关键的位置。

直观地说,Query 是当前预测要问的问题,Key 是历史片段可被匹配的标签,Value 是真正被带入计算的信息。这个视角能把抽象矩阵运算和业务问题连接起来:模型不是平均看所有历史,而是在不同预测目标下重新分配关注。

这些 Q、K、V 通常不是原始输入本身,而是模型从输入中学出来的表示。假设输入窗口已经整理成矩阵 XX,模型会学习三组权重,把它们投影成:

Q=XWQ,K=XWK,V=XWVQ = XW_Q,\quad K = XW_K,\quad V = XW_V

这里的 WQW_QWKW_KWVW_V 都是训练得到的参数。也就是说,神经网络不只是计算相似度,还在学习“怎样把原始时间序列变成适合比较的特征”。这就是为什么同样一条销售序列,在不同任务中可以被编码成不同的内部表示。

以销售预测为例,Query 可以表示“明天销量会怎样”,Key 可以包含历史日期的节日、促销、季节和价格标签,Value 则包含真实销量、库存、折扣和流量。注意力权重决定哪些历史片段被更多带入预测。编码器把这些输入和注意力结果转换成中间表示,预测头或解码器(decoder)再输出未来数值。

Softmax 的作用

注意力分数本身可以很大也可以很小。softmax 把这些分数转换成一组非负权重,并让它们加总为 1。这样每个历史时刻都可以被赋予不同关注度。

除以 dk\sqrt{d_k} 是为了数值稳定。如果向量维度很高,点积可能过大,softmax 会变得过于极端,训练梯度不稳定。

这个机制的直觉很简单:模型不是平均看所有历史,而是学习在不同预测问题下如何重新分配注意力。

可以把 softmax 理解成一种“注意力预算”。模型面对很多历史片段时,不能让每个片段都无限重要,而是要把关注度分配到 0 到 1 之间,并让总量可比较。某些历史点权重高,某些历史点权重低,最终预测就由这些加权后的信息共同决定。

可以用 50, 70, 60 这组三个分数解释 softmax。原始分数不能直接当权重,因为它们没有加总为 1,也可能包含负值。softmax 先对每个分数取指数,再除以全部指数值之和,使输出全部为正并且总和等于 1。这样模型才能把“相似度分数”转成“可比较的注意力比例”。

时间序列输入如何进入 Transformer

原始时间序列不能直接被 Transformer 使用。需要先映射到内部表示空间。常见做法包括:

在实现中,用户输入的通常只是原始序列 xx。模型先通过可学习投影和偏置把它变成特征矩阵 XX,再从 XX 分别得到 Q=XWQQ=XW_QK=XWKK=XW_KV=XWVV=XW_V。也就是说,Q、K、V 不是人工填入的三张表,而是模型为了完成当前任务从同一组输入特征中学习出的三种视角。

映射后,每个时间步或时间块都有一个向量表示。Transformer 对这些向量做多头注意力(multi-head attention),得到新的序列表示,再由预测头(prediction head)输出未来值或分布。

这种输入映射解释了为什么时间序列 Transformer 经常和特征工程一起出现。原始数值可以进入模型,但频率、日历、促销、价格、天气、异常标记等信息会帮助模型形成更有预测意义的 embedding。可以用“把一个数值重新编码成更长的特征向量”来说明这个过程:数值本身只是一个点,编码后的向量则可以包含历史位置、波动、周期和上下文。

多头注意力可以理解为从多个角度看同一段历史。一个头可能更关注短期波动,一个头可能更关注节假日,一个头可能更关注长期趋势。实际训练中这些角色不是人工规定的,而是由数据和损失函数推动模型自己形成。

茅台价格可以继续说明 embedding 的含义。某天价格 1940 对普通人只是一个数字,但如果放进酒类市场、政策变化、渠道库存、节日前后和历史低点的上下文里,它就携带了丰富含义。Transformer 的编码器可以把这个点和周围历史一起编码成高维向量,例如 512 维 embedding。原来长度为 TT 的序列不再只是 TT 个数字,而可以被表示为 T×512T \times 512 的特征矩阵。

时间序列里的 token 也不一定只是单个数值。它可以是一个时间点、一个窗口 patch、一个降采样片段、一个分桶后的状态,或者一个已经包含上下文的 embedding。模型设计的关键,是让这些 token 足以表达趋势、周期、异常、冲击和局部形状,而不是机械模仿文本 token。

计算复杂度与改进

标准 Transformer 的注意力需要比较所有时间步两两关系,复杂度大约随序列长度平方增长。这让它在超长时间序列上成本较高。

如果输入长度扩大一倍,注意力比较的数量会增长得更快。我们把这点概括为:注意力很强,但它需要算力。长序列、细粒度和多变量都会增加成本,因此工业预测很少只靠最原始的 Transformer 结构直接处理所有时间点。

因此,时间序列模型发展出多种改进,代表性工作包括面向长序列预测的 Informer Zhou et al., 2021 和把时间序列切成 patch 的 PatchTST Nie et al., 2023

这些改进的目标不是放弃 Transformer,而是让注意力机制更适合长序列和大规模工业数据。

分解方法也可以和 Transformer 组合使用。先拆出趋势和季节,再让注意力机制处理残差和跨时间依赖,说明现代模型不是抛弃统计结构,而是把统计结构放入可学习框架。

Patch 和多尺度方法可以理解为先改变模型“看历史”的单位。秒级数据可以聚合到分钟、小时或天;一条很长的序列也可以切成多个时间块。这样做会牺牲一部分细节,但能让模型在更高层次上看到周期、趋势和突变。真正的设计问题是:哪些细节必须保留,哪些细节可以通过聚合换取更低成本。

一个最小 PyTorch 练习

本章练习的目的不是马上训练出最强模型,而是看清 Transformer 如何被放进一个预测流程。可以按下面的顺序实现:

  1. 生成或读取一条长度约为 100 的时间序列。

  2. 按 80% 和 20% 切分训练集与测试集。

  3. 用滑动窗口构造监督学习样本,例如 window_size=20,用前 20 个点预测第 21 个点。

  4. 用线性层把 input_size=1 的数值映射到 d_model=64 的内部表示。

  5. 使用 TransformerEncoderLayer 堆叠一到数层编码器。

  6. 用线性预测头把最后的表示映射回一个未来数值。

  7. 使用 MSE 作为损失函数(loss function),使用 Adam 优化器(Adam optimizer)训练模型。

  8. 在测试集上计算 RMSE、MAE 或 MAPE,并与简单基准比较。

关键超参数(hyperparameters)可以从小范围开始:

参数含义初始建议
window_size输入历史长度20
d_model内部表示维度32 或 64
nhead注意力头数2 或 4
num_layers编码器层数1 或 2
lr学习率0.001
epochs训练轮数先用较小轮数观察损失

训练时同时观察训练误差和测试误差。如果训练误差持续下降但测试误差上升,可能已经过拟合。此时可以减少层数、降低表示维度、缩短训练轮数或增加正则化(regularization)。小数据集上 Transformer 不一定超过 ARIMA、指数平滑或季节性朴素模型,这不是失败,而是提醒我们:复杂模型需要足够数据和合适任务。

练习的重点是形成实验习惯。改动 nheadd_modelnum_layerswindow_size 和学习率后,要记录结果;与 ARIMA 或朴素基准比较时,要使用同样的训练/测试切分。第六章和第七章的点预测和滚动评估方法仍然适用,不能因为模型换成 Transformer 就跳过评估。

如果在本地电脑运行较慢,可以使用学校集群或 GPU 资源。小型示例在 CPU 上也能完成;更大模型、更多序列或更长窗口才真正需要 GPU。我们的建议是先让最小 notebook 跑通,再逐步增加模型复杂度。

通用时间序列预测模型

本章列举了多个代表模型:

这些模型的共同点是把预测从“为每个任务单独建模”推向“训练一个可迁移的预测器”。

TimeGPT 的教学意义在于它把时间序列预测包装成 API:用户整理好 unique_iddsy,指定频率和预测步长,就可以调用预训练模型。Chronos 则展示了另一条路线:把连续数值离散化或 token 化,让模型像学习语言一样学习时间序列模式。Amazon 需要这类方法,是因为电商平台面对全球市场、长尾商品和大量冷启动对象,不能为每个商品单独维护一套专家模型。

这也要求把不同来源、不同频率的时间序列映射到统一特征空间。STL 分解、patch 化和 Transformer 是互补工具:一个提供可解释结构,一个降低长序列成本,一个学习跨时间依赖。

这条路线也解释了为什么后续会继续讨论时间序列基座模型。Transformer 本身只是结构;要让它成为可复用的预测能力,还需要大规模多领域数据、预训练目标、评估流程、部署成本控制和业务治理。

管理含义

Transformer 让企业预测从模型选择问题扩展为数据资产问题。模型能否泛化,取决于企业是否有多领域、多频率、高质量的时间序列数据,以及是否能把这些数据转化为一致的训练和评估格式。

管理者需要理解两个边界。第一,Transformer 能学习复杂模式,但不自动保证可解释性。第二,通用模型能降低建模门槛,但关键业务仍需回测、监控和人工判断。

更实际地说,企业采用 Transformer 或时间序列基座模型时,不应只问“模型是否先进”,还要问“是否有足够多序列可供学习”“评估是否覆盖高风险场景”“算力和延迟是否可接受”“模型失败时是否有回退规则”。这些问题决定模型能否从教学示例走向生产系统。

小结

Transformer 的核心贡献是让模型在整个序列中学习相关性。对于时间序列预测,它打开了通用预测模型的道路:预训练、迁移、零样本、多频率和概率预测。与此同时,长序列成本、数据质量、可解释性和业务落地仍是必须面对的问题。

本章主线可以概括为三点。第一,企业预测规模使“一条序列一个模型”难以持续。第二,注意力机制通过 Query、Key、Value 和 softmax 自动分配历史信息的重要性。第三,Transformer 练习必须回到可复现评估:小数据上不一定赢,真正价值来自多序列、大规模和可迁移能力。

练习

  1. 用 Query、Key、Value 解释一个节假日销量预测任务。

  2. 比较 ARIMA、LSTM 和 Transformer 对长期依赖的处理方式。

  3. 说明为什么 patch 化可以降低长序列建模成本。

  4. 写出 Q=XWQQ=XW_QK=XWKK=XW_KV=XWVV=XW_V 在一个销售预测任务中的直观含义。

  5. 找一个业务场景,判断它更适合单独训练模型还是使用通用预测模型。

  6. 讨论 Transformer 预测结果如何向业务人员解释。

  7. 修改一个 PyTorch Transformer 练习中的 nheadd_modelnum_layerswindow_size,记录测试误差变化,并与一个简单基准比较。

  8. 比较“单个数值点”“时间窗口 patch”和“高维 embedding”三种时间序列 token 表示各自保留了什么信息。

参考文献

References
  1. Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A. N., Kaiser, L., & Polosukhin, I. (2023). Attention Is All You Need. 10.48550/arXiv.1706.03762
  2. Zhou, H., Zhang, S., Peng, J., Zhang, S., Li, J., Xiong, H., & Zhang, W. (2021). Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting. Proceedings of the AAAI Conference on Artificial Intelligence, 35(12), 11106–11115. 10.1609/aaai.v35i12.17325
  3. Nie, Y., Nguyen, N. H., Sinthong, P., & Kalagnanam, J. (2023). A Time Series Is Worth 64 Words: Long-Term Forecasting with Transformers. 10.48550/arXiv.2211.14730