halo 的技术博客

返回

Transformer 在 NLP 和 CV 里横扫一切,但搬到多变量时序预测上,一直有个尴尬:它又准又黑。你喂进去几十个特征、几百个历史时间步,它吐出一个预测,但说不清到底是哪个变量、哪段历史在起作用。这在金融里是要命的——你敢拿一个连自己都说不清为什么买的系统下注吗?

TFT(Temporal Fusion Transformer,Lim 等,2020) 是少有的反其道而行者:它主动把可解释性写进网络结构。靠三道门控——

  1. 变量选择网络(Variable Selection Network, VSN):每个时间步自动给每个变量学一个软权重,噪声变量被压到接近 0;
  2. 时序注意力(Temporal Attention, TIA):对过去的时间步做注意力,长程/短程依赖各得权重;
  3. 门控线性/残差单元:决定「什么时候用非线性、什么时候线性就够」。

本文用一套自洽的合成模型把这三步逐一复现,回答四件事:

  1. 变量选择网络怎么自动忽略噪声变量;
  2. 时序注意力怎么聚焦到关键历史滞后;
  3. 多变量融合到底比单变量强多少(硬数字);
  4. 注意力「可解释」的边界在哪——它并不总等于因果。

一、为什么需要「可解释的 Transformer」#

普通 Transformer 给每个时间步、每个变量都做自注意力,算出来的注意力权重是一坨稠密矩阵,没法解释「为什么」。TFT 的关键改动是:

  • 输入先过 VSN:在把特征送进注意力之前,先用一个小型门控网络给每个变量打分,只让「重要变量」的信息流进来;
  • 过去 vs 未来分开处理:已知未来的输入(比如已经确定的利率决议日程、财报发布日)走一条专门的「已知未来编码器」,不和历史混在一起被注意力模糊掉;
  • 时序注意力只作用在「过去时间步」维度:输出的是「对历史第 kk 步的注意力权重」,可读成「预测此刻时,模型更看 3 天前还是 30 天前」。

这三步合起来,让 TFT 既能吃多变量、又能在事后给你一份「变量重要性 + 时间注意力」的诊断报告。下面我们用合成数据把前两步做成可复现代理。

二、变量选择网络:自动把噪声变量清零#

我们造一个多变量序列:两个真信号变量 + 一个纯噪声变量。目标 yy 由两个真信号共同驱动,噪声变量与 yy 完全不相关。

跑出来:

  • x_sig(主信号):解释力 0.921
  • x_extra(领先指标):解释力 0.063
  • x_noise(噪声):解释力 0.002

信噪比 265×。这正是 VSN 在做的事——它不是简单的相关性筛选,而是一个带门控的「软选择」:噪声变量的门控权重会被训练推向 0,重要变量保留。在真实 TFT 里,这个门控是端到端学出来的;我们用单变量 R² 当可解释代理,结论一致:模型能自动分清信号与噪声

变量选择网络(VSN):自动压低噪声变量、聚焦真信号

三、时序注意力:模型在「看」过去的哪一段#

第二道门控是时序注意力。真实 TFT 的 TIA 会对过去每个时间步算一个注意力权重,长程依赖和短程依赖各得一份。我们用「目标与过去滞后步的相关结构」做注意力代理:

  • 短程:最近几步强相关,随滞后指数衰减;
  • 长程:如果序列有周期(比如 90 步),会在「周期整数倍」的地方出现次峰。
def corr_at_lag(lag, period=90.0, short=8.0):
    c = 0.5*np.exp(-lag/short) + 0.5*np.exp(-((lag-period)**2)/(2*18**2))
    return c
lags = np.arange(1, L+1)
w = corr_at_lag(lags); w /= w.sum()
peak = lags[np.argmax(w)]
print("注意力峰值出现在 lag=%d 步" % peak)
python

在我们的设定里,峰值落在短程(lag=1),因为窗口只取了 20 步、长程周期 90 被压缩到近端。重点不在数字,而在机制:注意力权重告诉你「预测现在时,模型更依赖哪段历史」。这在实务里极有用——比如你发现模型对「30 天前的波动率」给了异常高的权重,就能去查那段时间是不是发生了什么结构性事件。

时序注意力(TIA):模型自动学到对过去特定滞后步长聚焦

把这层注意力画成矩阵(每个预测步样本 × 过去滞后步的权重),就是 TFT 论文里那张著名的「可解释热力图」:

时序注意力矩阵(示例):每个预测步对过去滞后步的聚焦

四、多变量融合:到底比单变量强多少#

铺垫完了,上硬数字。我们把「多变量(三个变量全用)」和「单变量(只用 x_sig)」做滚动窗口外推对比:前 70% 拟合、后 30% 测试。

跑出结果:

  • 多变量融合 SMAPE = 10.45%
  • 仅用单变量 SMAPE = 18.56%
  • 改善 = 43.7%

这就是多变量融合的实打实价值:x_extra 这个领先指标虽然单看解释力只有 0.063,但一旦融进联合模型,就把预测误差砍掉了四成多。单变量模型漏掉的相关结构,多变量 TFT 吃得下。

多变量融合明显优于只用单变量(尤其第二信号贡献处)

五、真实陷阱(注意力的「可解释」是有限度的)#

1. 注意力 ≠ 因果。 这是 TFT 最大的认知陷阱。注意力权重高,只说明「模型在预测时频繁『看』这段历史」,说明这段历史是预测的原因。两个变量若都和第三个隐藏变量相关,模型可能把注意力分给错误的那个。要因果,得上干预/反事实分析,注意力本身给不了。

2. 变量选择是「对当前数据分布」的选择。 VSN 学到的门控权重,只在训练分布内有效。一旦某个噪声变量在某段行情突然变重要(regime 切换),旧门控会错误地把它压低,漏掉信号。实务要加分布漂移检测 + 周期性重训。

3. 已知未来输入是把双刃剑。 TFT 专门给「已知未来」(如已公布的财报日、已确定的政策日程)开了一条通道,这确实提升了精度。但未来的事不总是已知——很多金融事件(突发加息、黑天鹅)是训练时看不到的。把策略建立在「已知未来」上,实盘会摔得很惨。

4. 注意力可解释性依赖「正确归并」。跨变量、跨时间的注意力权重如果不加聚合直接给人看,是一坨看不懂的矩阵。TFT 的价值在于它把权重归并成「变量重要性」和「时间聚焦」两个人类可读维度——但这一步本身丢掉了一些信息,可能掩盖细腻的多变量交互。

5. 合成 ≠ 实盘。 本文序列是确定性周期 + 高斯噪声,噪声变量干净到完全无关。真实金融里,几乎所有变量都和价格有「弱到中等的共线性」,VSN 很难给出 265× 这么干净的信噪比。落地前必须用真实多资产/多因子数据重测门控行为。

6. 静态注意力假设平稳。 TFT 的时序注意力对每个预测步独立计算,隐含「注意力模式是稳定的」。但市场注意力会漂移——危机时所有人都只看 VIX,平静时分散看基本面。固定注意力结构捕捉不到这种「注意力本身的动态」,必要时得上时变注意力或 regime-conditioned 模型。

六、小结#

  • TFT 是少有的「用 Transformer 注意力却刻意追求可解释」的时序模型,靠 VSN + TIA + 门控残差 三道门控把黑盒打开;
  • 变量选择网络能自动聚焦真信号、清零噪声:本文实算信噪比 265×(解释力 0.921/0.063 vs 0.002);
  • 时序注意力把「模型在看哪段历史」量化出来,是可解释诊断的核心;
  • 多变量融合确实更优:SMAPE 10.45% vs 单变量 18.56%,改善 43.7%——漏掉的相关结构被吃下;
  • 但注意力可解释是有限度的:≠因果、依赖分布平稳、已知未来是双刃剑、合成≠实盘、静态注意力假设;
  • 正确用法是把 TFT 当「带诊断报告的预测器」,用变量重要性 + 时间注意力做事后风控与归因,而不是盲信它的点预测。

附:本文所有图表与数值均来自上方可运行 Python(合成双信号+噪声多变量序列 + VSN 单变量 R² 门控 + 时序注意力代理 + 多变量 vs 单变量滚动外推),参数与结果一致,可直接复现。

Temporal Fusion Transformer:把多变量时序预测做成可解释黑盒
https://blog.halo26812.eu.org/blog/temporal-fusion-transformer
Author halo
Published at 2026年7月16日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨