想象一位经验丰富的连锁超市财务总监,面对即将到来的节假日,她需要预测未来几周各门店的销售额。她不会只看昨天的数据——她还会关注今年是否新开了门店(静态信息)、节假日的确切日期(已知未来信息)、以及近期天气变化对客流的影响(观测历史信息)。更可贵的是,当她给出预测时,她能清楚地说出“因为去年同期促销效果好,加上本周天气晴好,所以预测销量将上涨15%”——这正是 TFT(Temporal Fusion Transformer,时序融合Transformer)要实现的:既能做出精准的多时间点预测,又能解释每个因素对预测的贡献。
TFT 是当前时序预测领域“能解释”的标杆模型。掌握它,你就能在零售、金融风控等业务场景中,既交出预测结果,又讲清楚预测依据,成为业务方信赖的数据科学家。
可视化演示
展示矩阵变换下特征向量的方向不变性,通过交互式坐标平面演示特征值缩放和特征向量方向。
本节配有交互动效(进入视口后自动加载,约 3KB)。
矩阵变换 线性变换 Av 将向量 v 映射到新位置 特征向量:Av = λv,方向不变仅缩放 Av = λv
三类输入融合
财务总监开始做预算了。她面前摆着三叠资料:第一叠是门店的固定档案——店型、商圈、开业年限,这些几乎不变,叫静态特征;第二叠是日历上已经定好的安排——下周有促销、下月是国庆节,这些日期已知且一定会发生,叫已知未来特征;第三叠是每日流水——销量、客流、天气,这些随日子起伏,叫观测历史特征。TFT 的起点,正是像这位总监一样,把三叠资料整整齐齐地摆上桌。
在 TFT 中,三类输入各有各的编码方式。静态特征通过一个特殊的编码器变成“上下文向量”,这个向量不会随时间变化,作为全局背景贯穿整个预测过程。已知未来特征(比如未来的促销计划、节假日)是强力先验——它们尚未发生,但一定会发生,模型可以直接把它们作为未来时间步的输入。观测历史特征则是自回归地提供“到目前为止发生了什么”。
摆好三叠资料后,总监会先快速浏览一遍,把每叠资料里真正重要的信息圈出来——这就是下一节要讲的门控机制。
- 时间步 $t$ 的输入向量$x_t$ 是模型在时刻 $t$ 看到的完整信息,由三部分拼成。
- 静态特征项$\text{static}_s$ 表示门店的固定属性,同一门店所有时间步共享这份“档案”。
- 已知未来特征项$\text{known}_t$ 是时刻 $t$ 的日历信息,如“明天是促销日”——模型在预测未来时,这些是确定知道的。
- 观测历史特征项$\text{observed}_t$ 是时刻 $t$ 之前实际观测到的数据,如“昨天销量 500 件”。
门控残差网络
资料太多了,有些信息是噪音。比如“门店编号 1024”,对预测销量毫无帮助;但“开业年限”,对判断成熟门店的稳定销量很关键。总监需要一道“筛选滤镜”,把重要的信息放大,把噪音过滤掉。这道滤镜,就是 TFT 中的门控残差网络(GRN, Gated Residual Network)。
门控机制像一个可学习的“阀门”:它通过一个 Sigmoid 函数,输出 0 到 1 之间的数值,决定信息通过的比例——数值接近 1 就全放行,接近 0 就几乎截断。残差连接则像一条“安全旁路”,即使门控把主通路的信息过滤得太多,原始信息依然可以通过旁路直达输出,保证梯度能顺畅回流,训练更稳定。层归一化就像把每层输出的“音量”统一调到标准水平,加快收敛。
总监的“筛选滤镜”会自动学习:哪些变量值得关注,哪些可以被忽略。但同样是“值得关注”,不同变量的重要程度还有差别——接下来,她要给每个变量分配“话语权”。
- 输入向量$a$ 是上一层的输出,比如拼接后的三类特征。
- 两层全连接加激活$\phi(\text{FC}(a))$ 先用一个全连接层降维,再用激活函数(如 ELU)引入非线性,第二个 FC 把它映射回特征维度。
- 门控线性单元 GLU$\text{GLU}(\cdot)$ 用 Sigmoid 门控对变换后的特征做“逐元素开关”,决定保留多少信息。
- 残差加和$a + \text{GLU}(\cdot)$ 是残差连接,即使门控全关,原始信息 $a$ 也能通过旁路传递,相当于“保底”。
- 层归一化$\text{LayerNorm}(\cdot)$ 对加和结果做归一化,稳定训练。
变量选择网络
假设总监要预测门店下周的销量,手头有 20 个候选变量。凭经验,她会重点关注促销力度、历史销量和天气;门店编号这种变量基本不看。但她如何“定量”地分配关注度?给每个变量打一个权重分,重要的权重高、次要的权重低,再加权求和——这,就是变量选择网络(VSN, Variable Selection Network)。
变量选择网络首先为每个变量独立编码,然后通过一个打分模块输出该变量的重要性分数,再用 Softmax 把这些分数归一化成总和为 1 的权重。Softmax 的特点是“赢者通吃”:分数最高的变量获得最大的权重,而噪声变量的权重被压缩到接近 0。最后,所有变量的编码按权重加权融合,得到一条“净化后”的特征流。
有了净化后的特征流,总监开始布局未来几周的预测节奏——这就是多 horizon 预测。
- 第 $i$ 个变量的编码$\mathbf{e}_t^{(i)}$ 是第 $i$ 个变量在 $t$ 时刻的嵌入向量。
- 打分函数$\text{score}(\cdot)$ 是一个小网络,对每个变量编码输出一个标量得分,衡量该变量的重要程度。
- Softmax 归一化把所有变量的得分变成和为 1 的权重。
- 加权融合各变量编码按权重相加,得到综合特征。
多horizon预测
总监的目标不是只预测明天,而是未来 4 周每天的销量。这需要一套“滚动预测”机制:先预测第 1 天的销量,然后用预测值(连同已知未来特征)作为输入,预测第 2 天……但这样误差会累积。TFT 用了一种更优雅的方式:Decoder 逐步生成,但每步都有已知未来特征做锚点,减少误差漂移。
TFT 的预测不是一次性吐出全部未来值,也不是简单自回归,而是用 Transformer 的 Decoder 结构,在每个未来时间步 $t+\tau$,结合历史编码的信息和已知的未来特征,逐点生成预测。位置编码让模型知道“这是未来第几天”。多 horizon 的预测输出是一整条未来曲线,同时每个点上还能给出预测区间(下一节的分位数)。
总监现在有了未来四周的预测曲线,但如果有人问“你为什么预测第三周销量会反弹”——她需要摊开自己的思考过程。对 TFT 而言,这个“思考过程”就是注意力机制。
- 历史编码$\text{Encoder}(\tilde{\mathbf{e}}_{t-k:t})$ 对最近 $k$ 个时间步的净化特征做编码,提炼规律。
- 未来步长$\tau$ 表示预测未来第几天,从 1 到最大预测步长 $\tau_{max}$。
- 解码生成$\text{Decoder}(\cdot)$ 结合历史信息和第 $\tau$ 天的已知未来特征,输出第 $\tau$ 天的预测值。
注意力解释
总监的决策依据不是凭空而来。她会说:“因为去年第三周有类似促销,而且历史上每次这个季节促销后一周销量都会小幅反弹。”她的“依据”是一连串历史对照。TFT 的多头注意力机制做的正是这件事:对每个预测时间步,模型在历史序列中找到最相关的若干时间步,给它们分配较高的注意力权重。多头意味着模型同时从多角度(比如趋势、季节性、促销效应)去“回顾”历史。
这些注意力权重可以被提取出来形成热力图,展示“预测未来某天时,模型主要参考了过去的哪些天”。这就是 TFT 可解释性的第一层:时序注意力归因。第二个可解释性来自前面说的变量选择网络:模型告诉你每个变量的重要性权重。三层解释叠加,预测就变成了“可审计的决策报告”。
总监不但能给出预测,还能报出一个区间:“下周销量大概在 4800 到 5200 件之间。”这个区间不是拍脑袋,而是来自分位数预测。
- 查询与键的相似度$QK^{\top}$ 计算当前预测目标与每个历史时间步的点积相似度。
- 缩放因子$\sqrt{d_k}$ 是键的维度,用来防止点积过大导致梯度消失。
- 权重加权求和$V$ 是历史值向量,按注意力权重做加权和,得到输出。
分位数预测
如果总监只说“下周卖 5000 件”,采购部门没法判断库存缓冲该备多少。但如果她说“中位数 5000 件,10% 分位 4800 件,90% 分位 5200 件”,采购就能按上限备货,避免缺货。分位数预测输出的不是单点,而是一组分位数——比如 10%、50%、90%——刻画了预测的不确定性。模型在训练时使用分位数损失函数(Pinball Loss),它对预测偏高于实际和偏低于实际的惩罚是不对称的,从而学出不同分位的预测值。
分位数损失的数学形式是:当实际值高于预测值时,惩罚是 $(y - \hat{y}) \times q$;低于预测值时,惩罚是 $(\hat{y} - y) \times (1 - q)$。最小化这个损失,模型学到的是条件分位数。这比只学均值更能捕捉不确定性。
有了预测、权重、区间、归因,最后就是把这些能力放进真实业务中——让 TFT 在零售和金融场景里发光发热。
- 实际情况高于预测当 $y \geq \hat{y}$ 时,损失是 $q \cdot (y - \hat{y})$,即低估的惩罚权重是 $q$。
- 实际情况低于预测当 $y < \hat{y}$ 时,损失是 $(1-q) \cdot (\hat{y} - y)$,即高估的惩罚权重是 $1-q$。
- 分位数参数$q$ 是目标分位,取 0.5 时就是中位数回归,取 0.9 时是 90% 分位回归。
可解释性应用
回到我们开头的老财务总监。她之所以受信任,不是因为预测永远正确,而是因为每次预测都能给出依据和风险区间。TFT 在业界最受欢迎的应用场景,正是把这种“可解释的预测能力”带到实际业务中。
在零售需求预测中,TFT 融合门店静态特征、促销日历和销售历史,预测未来 8 周各 SKU 销量。当预测某款饮料销量将大涨时,模型的热力图会显示“最近两周高温天气的注意力权重极高”,业务部门便能据此安排备货。在金融风控中,TFT 对客户的时序行为建模,预测其未来违约概率。变量选择网络显示“近三个月账户余额波动”贡献最大,风控人员就能据此决定授信调额。在供应链优化中,TFT 同步预测多仓需求,分位数区间帮助决策者权衡库存成本与缺货风险。
理解 TFT 之后,我们用一段简洁的 Python 代码,把“变量加权 + 分位数预测 + 归因”这个核心链条走一遍。
AI 应用场景
零售促销响应预测
阶段:预测建模与解释归因
解决的问题:传统销量预测只看历史销量曲线,无法量化“促销活动对销量的拉动有多少”。TFT 通过融合促销日历(已知未来)、门店静态信息(静态特征)和历史销量(观测特征),能预测未来 4 周每日销量,并输出每个变量对预测的贡献度。
具体案例:某连锁便利店接入 TFT 后,对 200 家门店做未来 4 周销量预测。模型输出显示,“促销力度”变量在促销日前 3 天的注意力权重显著上升。运营部门据此调整了各店的备货计划,促销期间缺货率下降了 18%,促销后积压库存减少了 25%。
金融风控时序评分
阶段:可解释风险评估
解决的问题:传统信用评分卡模型难以利用用户的时序行为数据(如近 6 个月消费频次变化),而深度学习模型又缺乏解释能力。TFT 的变量选择网络能输出“哪些时序行为指标驱动了风险评分”,满足监管对模型可解释性的要求。
具体案例:某消费金融公司用 TFT 对用户进行贷中风险监测。模型发现“近 3 个月小额贷款申请频次”是风险贡献权重最高的变量。风控团队据此设置了专项规则,在保持通过率不变的前提下,将逾期率降低了 12%。
供应链多仓补货决策
阶段:多 horizon 区间预测
解决的问题:补货决策需要知道未来 2-4 周的库存变化区间,而非单一数字。TFT 的分位数预测输出 10%、50%、90% 三条预测曲线,帮助计划员评估“安全库存应该覆盖到哪个分位”。
具体案例:某电商企业用 TFT 预测全国 5 个仓的手机壳库存需求。90% 分位预测帮助计划员在高销量区域按上限备货,在低销量区域按下限备货,整体库存周转率提升了 20%,缺货损失减少 15%。
Python 演示
import numpy as np # 模拟 30 天的历史销量数据(单位:件)np.random.seed(42)t_days = np.arange(30)sales = 50 + 5 * np.sin(t_days / 5) + np.random.normal(0, 3, 30)promo = np.array([0 if i % 7 != 3 else 1 for i in range(30)]) # 每周三促销temp = 20 + 5 * np.sin(t_days / 10) + np.random.normal(0, 2, 30) # 简化的变量选择:用相关性打分代替完整神经网络var_names = ['历史销量', '促销标志', '气温']pearson = lambda x, y: np.corrcoef(x, y)[0, 1]scores = np.array([pearson(sales, sales), pearson(sales, promo), pearson(sales, temp)])scores = np.maximum(scores, 0) # 负相关不计入正贡献weights = np.exp(scores - scores.max()) / np.sum(np.exp(scores - scores.max())) # 分位数预测:用历史分位数 + 变量加权修正def quantile_forecast(horizon=7, q=0.5): base = np.percentile(sales, int(q * 100)) future_promo = promo[-1] # 假设未来促销状态不变 adjust = weights[1] * future_promo * 8 + weights[2] * (temp[-1] - 20) * 0.5 return base + adjust * np.ones(horizon) # 输出预测与解释print('变量重要性权重:', dict(zip(var_names, np.round(weights, 3))))for q in [0.1, 0.5, 0.9]: fc = quantile_forecast(q=q) print(f'{int(q*100)}% 分位预测未来 7 天销量: {fc[0]:.1f} 件/天')print('解释: 促销对预测的拉动贡献最大, 权重 =', round(weights[1], 3))
pearson(sales, sales)计算历史销量与自身的相关性,作为该变量的“重要性打分”,模拟变量选择网络的打分模块。np.maximum(scores, 0)把负相关变量的得分置为 0,模拟 TFT 中噪声变量被门控过滤。weights = np.exp(...) / np.sum(...)Softmax 归一化,让权重和为 1,突出关键变量。quantile_forecast(q=0.5)用历史分位数作为基准预测,模拟分位数损失训练出的条件分位输出。future_promo * 8促销变量对预测的“拉动效应”,对应 TFT 中变量选择后的加权贡献。
常见误区
误区我一开始以为 TFT 和普通 Transformer 一样,Encoder 一次性读取整个输入序列,然后 Decoder 一次性并行输出全部未来时刻的预测值。
正解TFT 的 Decoder 是逐步自回归生成的——每一时间步的预测会作为下一步的已知信息参与计算。但它的聪明之处在于,每一步都有“已知未来特征”作锚点(比如未来促销计划),所以误差不会像纯自回归那样无限累积。就好比总监预测未来四周,不是闭眼一次说完全部数字,而是每周根据已知安排逐步更新预估。
为何常见:因为 TFT 名字里有 Transformer,而标准 Transformer 的 Decoder 在训练时确实可以并行(教师强制),容易让人误以为推理时也是一次性并行输出。
误区分位数预测是不是就是先预测均值,然后加一个固定的误差带?比如预测 5000 件,10% 分位就是 5000 减一个固定值?
正解不是。分位数预测的每个分位都是独立优化的——50% 分位和 90% 分位的预测曲线可以有不同的形状。比如在促销日,90% 分位可能会“跳得更高”(因为促销效果不确定性大),而 10% 分位可能只微涨。这相当于总监不仅说“大概卖 5000”,还说“最差也能卖 4800,最好可能到 5500 且促销日的不确定性更大”。误差带的宽度是逐点学习的,不是固定常数。
为何常见:传统回归默认输出条件均值,给误差带时习惯用均方误差的近似方差,把不确定性看成全局一致的,忽略了不确定性本身会随时间变化。
误区TFT 输出变量权重 0.4,是不是意味着该变量对销量有 40% 的因果驱动作用?
正解变量选择权重反映的是“该变量对预测的统计贡献”,不是因果效应。它衡量的是:模型在拟合历史数据时,发现该变量对降低预测误差有多大帮助。这好比总监说“促销和过往销量是我的主要参考依据”,但这不等于“做促销就一定能带来 40% 的增长”——那是因果推断的范畴,TFT 不保证。用它做归因解释可以,但别把它当因果结论。
为何常见:人天生倾向于把“相关性”理解为“因果性”,尤其是看到模型给出一个看起来精确的数值权重时,很容易把注意力权重和变量重要性误解为因果效应。
误区静态特征(门店类型、商圈)反正不随时间变化,对预测未来走势应该没什么用,只是给模型多一个“背景说明”罢了。
正解静态特征在 TFT 中作用巨大——它通过编码器生成全局上下文向量,这个向量会参与调节注意力机制和门控机制。就好比总监拿到两家店:一家是社区店,一家是商圈店。即使它们的历史销量曲线相似,未来的促销响应也可能截然不同——社区店的促销效果往往更持久,商圈店则更受节假日客流影响。静态特征让模型学会“对不同店采用不同的预测规则”,而不是所有店套用一个模板。
为何常见:认知上容易把“不随时间变化”等同于“信息量小”,忽略了静态特征与动态特征之间的交互作用(比如“哪类店对促销更敏感”)。
误区只要把 TFT 的注意力权重画成热力图,整个模型的预测逻辑就完全透明了,业务方可以完全信任模型的每个决策。
正解注意力权重确实是 TFT 可解释性的重要一环,但它不是全部。模型决策还受变量选择权重、门控机制的内部状态等影响。而且注意力权重只能说明“模型关注了什么”,不能说明“模型为什么关注它”。好比总监能给出一份参考依据清单(最近哪些天的数据、哪些变量),但她的完整思考过程(如何综合这些依据)依然是一个“黑箱”。TFT 的可解释性是有边界的——它提供的是“局部归因”而非“完全透明”。
为何常见:对“可解释 AI”的期望过高,认为“有注意力可视化 = 模型完全可解释”。实际上注意力只是解释的一种近似手段,业务部署时仍需配合其他验证手段。
面试题
Q1. TFT 融合的三类输入分别是什么?
- A.静态特征、已知未来特征、观测历史特征← 正确答案
- B.训练集、验证集、测试集
- C.高频信号、低频信号、噪声信号
- D.图像特征、文本特征、语音特征
答案:A。TFT 专门为时序预测设计,三类输入对应“不随时间变的属性、未来一定会发生的事、以及过去发生了什么”。B 是数据切分,C 是信号处理概念,D 是其他模态,均与 TFT 输入设计无关。
Q2. 门控残差网络(GRN)中,残差连接的主要作用是什么?
- A.增加模型参数量
- B.防止门控过滤过多导致信息丢失← 正确答案
- C.让模型变深
- D.替代注意力机制
答案:B。残差连接提供一条“旁路”,即使主通路的信息被门控压缩得很低,原始输入仍能直达输出,既保证信息不丢失,又缓解深层网络的梯度消失问题。它不是为了增加参数量或替代注意力。
Q3. 变量选择网络使用什么函数将变量得分归一化为权重?
- A.Sigmoid
- B.Tanh
- C.Softmax← 正确答案
- D.ReLU
答案:C。Softmax 能把一组实数变成和为 1 的正权重,且具有“赢者通吃”的特性,适合做变量重要性归一化。Sigmoid 输出 0~1 但和为不固定,Tanh 和 ReLU 都不满足归一化要求。
Q4. 分位数损失函数中,当实际值大于预测值时,惩罚项的系数是多少?
- A.q← 正确答案
- B.1-q
- C.0.5
- D.1
答案:A。当 $y \geq \hat{y}$ 时,损失是 $q \cdot (y - \hat{y})$,即偏低的惩罚系数是 $q$。q 越大(如 0.9),模型越不愿意低估实际值,因为低估的代价更高。这符合高百分位预测的业务直觉。
Q5. TFT 的 Decoder 在预测未来时,为什么能减少纯自回归的误差累积?
- A.因为用 LSTM 替换了 Transformer
- B.因为每个未来时间步都有已知未来特征做锚点← 正确答案
- C.因为使用了更大的学习率
- D.因为输出直接就是最终结果,无需迭代
答案:B。TFT 在自回归生成每个未来时间步时,都利用已知未来特征(如促销计划、节假日)作为附加信息。这些特征已经确定,能修正预测方向,避免误差滚雪球。它仍是逐步生成,不是一步到位。
Q6. TFT 的多头注意力主要用来做什么?
- A.对变量做降维
- B.捕捉时序依赖并支持解释← 正确答案
- C.替代分位数损失
- D.生成静态特征
答案:B。多头注意力让每个预测时间步“回顾”历史时间步,从不同子空间捕捉时序依赖。其权重矩阵可提取为热力图,作为“模型关注了哪些历史时刻”的解释依据。它不是降维工具,也不替代损失函数。
Q7. 变量选择网络的 Softmax 权重之所以能实现“稀疏选择”,主要原因是什么?
- A.Softmax 输出全是 0 或 1
- B.Softmax 对指数级差异会放大,趋于“赢者通吃”← 正确答案
- C.权重是随机初始化的
- D.Softmax 有正则化项
答案:B。Softmax 使用指数运算,变量得分之间微小的差异会被指数级放大,导致高得分变量获得压倒性权重,低得分变量趋近于 0。它不是严格的 0/1 稀疏,而是近似稀疏,但足以抑制噪声变量的影响。
Q8. 分位数预测对业务决策的核心价值是什么?
- A.让预测结果更美观
- B.提供预测的不确定性区间,支撑库存和风控决策← 正确答案
- C.降低模型训练时间
- D.替代人工经验
答案:B。分位数预测输出 10%、50%、90% 等区间的预测值,让决策者知道“最坏能到什么程度、最好能到什么程度”。比如库存按 90% 分位备货可避免缺货,风控按 90% 分位做损失预估更稳健。这是单点预测无法提供的价值。
Q9. TFT 的输入融合中,已知未来特征包括哪些?
- A.明天的促销安排← 正确答案
- B.下周的节假日← 正确答案
- C.昨天的实际销量
- D.门店的商圈类型
答案:AB。已知未来特征是未来时间点一定会发生且提前知道的信息,如促销日历、节假日安排。昨天的实际销量属于观测历史特征;门店商圈属于静态特征,二者不属于已知未来特征。
Q10. 关于 TFT 的可解释性,下列说法正确的有哪些?
- A.变量选择权重可说明各变量的相对特征重要性← 正确答案
- B.注意力热力图可显示模型重点关注的历史时间步← 正确答案
- C.注意力权重等于变量的因果效应
- D.分位数区间提供了不确定性的量化表达← 正确答案
答案:ABD。TFT 的可解释性来自两个维度:变量权重(哪些变量重要)和时序注意力(哪些历史时刻重要)。分位数区间量化了不确定性。但注意力权重只表示统计相关性,不构成因果效应,不能解读为“改变变量就导致结果改变”,所以 C 错误。