4. Transformer基础回顾
在进入 PatchTST 之前,我们必须先把 Transformer 的“地基”重新夯实。很多同学在金融时序任务中直接套用 Transformer,却忽略了它最初是为离散符号序列(如机器翻译)设计的。理解自注意力的计算本质、位置编码的注入方式以及编码器-解码器的信息流,才能明白 PatchTST 为什么要“打补丁”、为什么要做通道独立。本节将围绕四个核心问题展开:注意力如何计算、位置信息如何注入、编码解码如何分工、长序列为何成为瓶颈。
一、自注意力机制:从“查字典”到加权求和
自注意力的本质是一次可学习的软性检索。给定输入序列的嵌入矩阵 X ∈ R^(L×d),通过三个线性变换得到查询 Q、键 K、值 V:
Q = X W_Q, K = X W_K, V = X W_V
Attention(Q, K, V) = softmax(Q K^T / sqrt(d_k)) V
其中 Q K^T 计算任意两个时间步之间的相似度,除以 sqrt(d_k) 防止点积过大导致 softmax 梯度消失,softmax 归一化后对 V 加权求和。多头注意力则把 d 维空间切成 h 个子空间并行计算,再拼接投影,使模型能同时关注不同时间尺度与不同模式。
在金融预测中,这意味着模型可以自动学习“昨天收盘价与今天开盘价强相关”“成交量突增对后续波动有滞后影响”等关系。但要注意:标准自注意力对序列长度 L 是二次复杂度,这正是长序列瓶颈的根源。
二、位置编码:让无序的注意力感知时间
自注意力本身是置换不变的——打乱输入顺序,输出只是跟着换位置,模型无法感知“谁在前谁在后”。因此必须注入位置信息。常见方案有两类:
- 正弦位置编码:用不同频率的 sin/cos 函数生成固定向量,与词嵌入相加。优点是无需训练、可外推到更长序列,但对金融中非平稳的周期结构未必最优。
- 可学习位置编码:为每个位置分配一个可训练向量。灵活但受限于最大训练长度,超出后无法直接外推。
金融时序的位置含义与 NLP 不同:时间步之间存在不等间隔、交易日缺失、周期(日/周/月)叠加。PatchTST 的做法是把连续时间步切成 patch,再对 patch 加位置编码,既缩短了有效序列长度,又保留了局部时序结构。
三、编码器-解码器结构:信息如何流动
原始 Transformer 采用编码器-解码器架构。编码器由多层自注意力加前馈网络组成,负责把输入序列压缩成上下文表示;解码器在自注意力基础上增加交叉注意力,用编码器输出作为键和值,逐步生成目标序列。金融预测中常见三种用法:
- 仅编码器:如 PatchTST、Informer,直接对历史窗口编码后接预测头,适合单步或多步直接预测。
- 仅解码器:如 类自回归模型,逐点生成未来值,适合概率预测但推理慢。
- 完整编码解码:适合输入与输出长度差异大、需要显式对齐的任务,金融中较少直接使用。
理解这一分工后,就能明白 PatchTST 为何选择仅编码器结构:金融预测通常给定固定历史窗口,直接映射到未来窗口,不需要自回归解码,编码器足够且更高效。
四、计算复杂度与长序列瓶颈:为什么必须改造
标准自注意力的时间与空间复杂度均为 O(L² · d)。当 L 从 512 增长到 4096,注意力矩阵元素数量增长 64 倍。金融场景中,长历史窗口往往包含更多周期与 regime 信息,但直接拉长序列会带来三个问题:
| 瓶颈 | 具体表现 | 对金融预测的影响 |
|---|---|---|
| 显存占用 | 注意力矩阵随 L² 增长 | 无法使用长窗口,batch size 被迫缩小 |
| 计算延迟 | 训练与推理时间急剧上升 | 高频策略无法满足实时性要求 |
| 过拟合风险 | 参数量与序列长度同时增大 | 金融信噪比低,长序列更易记住噪声 |
| 位置外推 | 固定位置编码无法覆盖更长序列 | 跨周期泛化能力下降 |
常见缓解思路包括稀疏注意力、局部窗口注意力、低秩近似、以及 PatchTST 采用的 patch 化与通道独立。patch 化把 L 个时间步压缩为 L/P 个 patch,注意力复杂度降为 O((L/P)²);通道独立则把多变量序列拆成单变量分别建模,避免通道间虚假相关干扰。
五、案例场景:从原始 Transformer 到 PatchTST 的改造路径
假设我们要预测某只股票未来 5 个交易日的收益率,历史窗口 512 天,包含开盘、收盘、成交量、换手率等 8 个通道。若直接使用原始 Transformer 编码器:
输入: (batch, 512, 8)
注意力矩阵: 512 × 512 × 8 heads
显存占用高,且 8 个通道被混合建模
位置编码: 可学习,最大长度 512,无法外推
PatchTST 的改造路径是:先把每个通道的 512 步切成 16 个 patch(每 patch 32 步),序列长度降为 16;再对每个通道独立做自注意力,最后拼接或融合输出。这样注意力矩阵从 512×512 降到 16×16,显存与计算量大幅下降,同时保留了局部时序模式。