随风@时间序列分析

时间序列分析的核心是挖掘该序列中的自相关性

特征

  • 趋势
  • 季节变化
  • 相关性 serial correlation
    • 自相关性是时间序列可以预测未来的前提
    • 波动聚类 volatility clustering
  • 随机噪声

[[时间序列分解]]

  • 从时间序列的波动中挖掘信息
  • 核心
    • 数据序列本身是隐藏着规律的,不可预测的部分很小
    • 分解方法要合适,周期判断准确
  • [[Python/package]] statsmodels.tsa.seasonalseasonal_decompose
    • trend 趋势序列
    • seasonal 季节序列
    • resid 残差序列

[[平稳性]]

  • [[ADF 检验]]
  • [[ACF]]
    • graphics.tsa.plot_acf
  • [[PACF]]
    • graphics.tsa.plot_pacf
  • 相关图可以帮助判断模型是否合适
    • 自相关性
      • 原始时间序列与模型拟合的时间序列之间的残差应该近似于随机噪声
      • 标准的随机噪声的自相关满足 $\rho_0 = 1, \rho_k =1$
        • 任意不为 0 的间隔,随机噪声的自相关均为 0

[[传统时间序列预测]]

[[Linear Regression]] 预测

  • 残差散点图
  • [[R2 score]]评分指标
    • $R^2=1-\frac{S S_{r e s}}{S S_{t o t}}, S S_{r e s}=\sum\left(y_i-f_i\right)^2, S S_{t o t}=\sum\left(y_i-\bar{y}\right)^2$
    • fi预测,yi样本
    • SSres 残差平方和
    • SStot 真实值与其平均值的残差的平方和
    • 将拟合模型与数据均值相比较
      • R2=0 模型拟合和均值一样
      • R2 越接近于 1 说明模型效果越好
      • R2 < 0 说明拟合模型还不如均值模型

线性与非线性模型应用于同一时间序列

  • [[ARIMA]] 从线性自相关角度进行建模
  • 单时间序列 LSTM 从非线性自相关角度进行建模
  • 多元 LR 从线性互相关角度进行建模
  • 多元 LSTM 从非线性互相关角度进行建模

[[TCN]]

Ref


@Transformers in Time Series: A Survey

[[Abstract]]

[[Attachments]]

Input Encoding and Positional Encoding

Network Modifications for Time Series

Applications of Time Series Transformers

Experimental Evaluation and Discussion

模型鲁棒性、模型大小以及对时序季节性和趋势捕捉能力

seasonal-trend decomposition analysis

Future Research Opportunities

Ref


@Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting

[[Abstract]]

[[Attachments]]

Long sequence [[Time Series Forecasting]] (LSTF)

LSTF 中使用 [[Transformer]] 需要解决的问题 #card

  • self-attention 计算复杂度 $O(L^2)$
  • 多层 encoder/decoder 结构内存增长
  • dynamic decoding 方式预测耗时长

网络结构

ProbSparse self-attention

  • 替换 inner product self-attention
    • [[Sparse Transformer]] 结合行输入和列输出
    • [[LogSparse Transformer]] cyclical pattern
    • [[Reformer]] locally-sensitive hashing(LSH) self-attention
    • [[Linformer]]
    • [[Transformer-XL]] [[Compressive Transformer]] use auxiliary hidden states to capture long-range dependency
    • [[Longformer]]
  • 其他优化 self-attention 工作存在的问题
    • 缺少理论分析
    • 对于 multi-head self-attention 每个 head 都采用相同的优化策略
  • self-attention 点积结果服从 long tail distribution
    • 较少点积对贡献绝大部分的注意力得分
    • 现实含义:序列中某个元素一般只会和少数几个元素具有较高的相似性/关联性
  • 第 i 个 query 用 $q_i$ 表示
    • $\mathcal{A}\left(q_i, K, V\right)=\sum_j \frac{f\left(q_i, k_j\right)}{\sum_l f\left(q_i, k_l\right)} v_j=\mathbb{E}_{p\left(k_j \mid q_i\right)}\left[v_j\right]$
    • $p\left(k_j \mid q_i\right)=\frac{k\left(q_i, k_j\right)}{\sum_l f\left(q_i, k_l\right)}$
    • $k\left(q_i, k_j\right)=\exp \left(\frac{q_i k_j^T}{\sqrt{d}}\right)$
  • query 稀疏性判断方法
    • $p(k_j|q_j)$ 和[[均匀分布]] q 的 [[KL Divergence]]
      • q 是均分分布,相等于每个 key 的概率都是 $\frac{1}{L}$
      • 如果 query 得到的分布类似于均匀分布,每个概率值都趋近于 $\frac{1}{L}$,值很小,这样的 query 不会提供什么价值。
      • p 和 q 分布差异越大的结果越是我们需要的 query
      • p 和 q 的顺序和论文中的不同 ((9bc63e03-0f2f-4639-b481-5d7925ba8858))
    • $K L(q | p)=\ln \sum_{l=1}^{L_k} e^{q_i k_l^T / \sqrt{d}}-\frac{1}{L_k} \sum_{j=1}^L q_i k_j^T / \sqrt{d}-\ln L_k$
      • 把公式代入,然后化解
    • $M\left(q_i, K\right)=\ln \sum_{l=1}^{L_k} e^{q_i k_l^T / \sqrt{d}}-\frac{1}{L_k} \sum_{j=1}^{L_k} q_i k_j^T / \sqrt{d}$
      • 第一项是经典难题 log-sum-exp(LSE) 问题
      • 稀疏性度量 $M\left(q_i, K\right)$
        • $\ln L \leq M\left(q_i, K\right) \leq \max j\left{\frac{q_i k_j^T}{\sqrt{d}}\right}-\frac{1}{L} \sum{j=1}^L\left{\frac{q_i k_j^T}{\sqrt{d}}\right}+\ln L$
        • LSE 项用最大值来替代,即用和当前 qi 最近的 kj,所以才有下面取 top N 操作
          • $\bar{M}\left(\mathbf{q}_i, \mathbf{K}\right)=\max _j\left{\frac{\mathbf{q}_i \mathbf{k}j^{\top}}{\sqrt{d}}\right}-\frac{1}{L_K} \sum{j=1}^{L_K} \frac{\mathbf{q}_i \mathbf{k}_j^{\top}}{\sqrt{d}}$
    • $\mathcal{A}(\mathbf{Q}, \mathbf{K}, \mathbf{V})=\operatorname{Softmax}\left(\frac{\overline{\mathbf{Q}} \mathbf{K}^{\top}}{\sqrt{d}}\right) \mathbf{V}$
      • $\bar{Q}$ 是稀疏矩阵,前 u 个有值
    • 具体流程
      • 为每个 query 都随机采样 N 个 key,默认值是 5lnL
        • 利用点积结果服从长尾分布的假设,计算每个 query 稀疏性得分时,只需要和采样出的部分 key 计算
      • 计算每个 query 的稀疏性得分
      • 选择稀疏性分数最高的 N 个 query,N 默认值是 5lnL
      • 只计算 N 个 query 和所有 key 的点积结果,进而得到 attention 结果
      • 其余 L-N 个 query 不计算,直接将 self-attention 层输入取均值(mean(V))作为输出
        • 除了选中的 N 个query index 对应位置上的输出不同,其他 L-N 个 embedding 都是相同的。所以新的结果存在一部分冗余信息,也是下一步可以使用 maxpooling 的原因
        • 保证每个 ProbSparse self-attention 层的输入和输出序列长度都是 L
    • 将时间和空间复杂度降为 $$O(L_K \log L_Q)$$
    • 如何解决 ((6326d1c6-fce8-42c5-a1db-57f7ce74e6ca)) 现象?
      • 每个 query 随机采样 key 这一步每个 head 的采样结果是相同的
      • 每一层 self-attention 都会先对 QKV 做线性转换,序列中同一个位置不同 head 对应的 query、key 向量不同
      • 最终每个 head 中得到的 N 个稀疏性最高的 query 也是不同的,相当于每个 head 都采取不同的优化策略

Self-attention distilling

  • 突出 dominating score,缩短每一层输入的长度,降低空间复杂度到 $\mathcal{O}((2-\epsilon) L \log L)$
  • encoder 层数加深,序列中每个位置的输出已经包含序列中其他元素的信息,所以可以缩短输入序列的长度
    • 过 attention 层后,大部分位置值相同
  • 激活函数 [[ELU]]
  • 通过 Conv1d + max-pooling layer 缩短序列长度
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class ConvLayer(nn.Module):
def __init__(self, c_in):
super(ConvLayer, self).__init__()
self.downConv = nn.Conv1d(in_channels=c_in,
out_channels=c_in,
kernel_size=3,
padding=2,
padding_mode='circular')
self.norm = nn.BatchNorm1d(c_in)
self.activation = nn.ELU()
self.maxPool = nn.MaxPool1d(kernel_size=3, stride=2, padding=1)

def forward(self, x):
x = self.downConv(x.permute(0, 2, 1))
x = self.norm(x)
x = self.activation(x)
x = self.maxPool(x)
x = x.transpose(1,2)
return x

Generative style decoder

  • 预测阶段通过一次前向得到全部预测结果,避免 dynamic decoding
  • 不论训练还是预测,Decoder 的输入序列分成两部分 $X_{feed dcoder} = concat(X_{token}, X_{placeholder})$
    • 预测时间点前一段已知序列作为 start token
    • 待预测序列的 placeholder 序列
  • 经过 deocder 后,每个 placeholder 都有一个向量,然后输入到一个全链接层得到预测结果
  • 为什么用 generative style decoder #card
    • 解码器能捕捉任意位置输出和长序列依赖关系
    • 避免累积误差

Experiment

Input representation

See Also

Ref


@Temporal Fusion Transformers for Interpretable Multi-horizon Time Series Forecasting

核心贡献

  • Temporal Fusion Transformer 框架 #card
    • ((6428093d-c9dc-487f-8840-9b7a43376502))
    • ((64280946-0abb-40ac-b6b9-7a83c10ed74e))
    • ((6428096f-ea71-4205-a89f-1d718e53255e))
    • ((64280981-cfd3-47e7-afa8-e8c839f949f7))
  • 模型可解释性 ((6428091b-78f2-4d1b-8e87-f83d0953e693)) #card
    • 区分全局重要特征 ((64284111-cae0-4a63-a822-bc047e99b95b))
    • 持久的时间模式 ((64284147-5c0d-4d47-b4b0-aadfd7737b6f))
    • 显著事件 ((64284159-ab32-4882-9c0e-a3a34cd643d4))

核心问题

  • [[Multi-horizon Forecasting]] 包含复杂的输入特征组合 ((642807a6-6348-4f39-b439-a891603d2a58)) #card
    • 静态变量
      • 与时间无关的静态变量 ((642807f6-54d8-4ca5-888e-d35261d7cee6))
    • 时变变量 Time-dependent Inputs
      • 已知未来输入 ((64280800-1dd7-43af-9fa1-6f25847d003b))
        • 未来节假日信息
      • 外生时间序列 ((6428080d-b6f1-490d-bc32-faf89b228644))
        • 历史顾客流量 ((64280a80-2be7-489e-9b49-923eaaf0ef30))
    • 相关示意图
      • ((642809ea-81f1-46a6-aad5-ed0bff26e75e))
  • 使用 attention 机制增强 → 选择过去相关特征 ((64280ad6-b21a-499b-83cc-7ddc6c890a3f))
  • 之前基于 DNN 方法的缺陷 #card
    • 没有考虑不同类型输入特征 ((64283e4e-a40e-4a44-993f-bc934ecef477))
      • 万物皆时序 构建模型时,将所有的特征按 time step 直接 concat 在一起,所有变量全部扩展到所有的时间步,无论是静态、动态的变量都合并在一起送入模型。
    • 假定所有外生输入都已知与未来 ((64283e5b-8387-464c-81af-527aa4542538))
    • 忽略重要的静态协变量 ((64283e84-bd1d-45d2-886a-0df596a16137))
      • 通常处理方法是预测时和其他时间相关特征连接
  • 已有深度学习方法是黑箱,如何解释模型的预测结果?#card
    • ((642808d2-0b60-4b5f-bf20-b6bb1a790c01))

相关工作

  • [[@A Multi-Horizon Quantile Recurrent Forecaster]] Multi-horizon Quantile Recurrent Forecaster MQRNN 结构,同时预测未来多个时间步的值
  • deep state space 状态空间模型,统计学,hybrid network,类似工作 [[ESRNN]] [[N-BEATS]]
  • [[Explainable AI]]
    • post-hoc methods 事后方法(因果方法),不考虑输入特征的时间顺序 ((64283f9d-dfcb-4263-a527-546ea1fc58e4))
    • 基于 attention 的架构对语言或语音序列有很好的解释,但是很难适用于多维度预测 ((64284031-ae1a-4815-8137-f599ecbbdaaf))

解决方法

  • [[Multi-horizon Forecasting]]
    • prediction intervals [[区间预测]] #card
      • [[DeepAR]] 直接修改模型的输出,模型不拟合原始标签,而是拟合人工指定的分布,通过蒙特卡洛采样取平均得到最终的点预测。
    • 分位数回归 [[Quantile Regression]],每一个 time step 输出 $10^{th}$ $50^{th}$ $90^{th}$ #card
      • 不同分位数下预测能够产生预测区间,通过区间大小反应预测结果的不确定性。某个点在不同分位数线性回归的预测结果很接近,则预测确定性搞。
      • Quantile Outputs
      • $\hat{y}i(q, t, \tau)=f_q\left(\tau, y{i, t-k: t}, \boldsymbol{z}{i, t-k: t}, \boldsymbol{x}{i, t-k: t+\tau}, \boldsymbol{s}_i\right)$
      • 设计 [[quantile loss]]
        • $\begin{gathered}\mathcal{L}(\Omega, \boldsymbol{W})=\sum_{y_t \in \Omega} \sum_{q \in \mathcal{Q}} \sum_{\tau=1}^{\tau_{\max }} \frac{Q L\left(y_t, \hat{y}(q, t-\tau, \tau), q\right)}{M \tau_{\max }} \end{gathered}$
          • $Q L(y, \hat{y}, q)=q(y-\hat{y}){+}+(1-q)(\hat{y}-y){+}$ #card
            • q 代表分位数
            • $()_+ = \max (0,)$
            • 假设拟合分位数 0.9


+ $Q L(y, \hat{y}, q=0.9)=\max (0.9 *(y-\hat{y}), 0.1 *(\hat{y}-y))$
+ $y-\hat{y} \gt 0$ 模型预测偏小,Loss 增加更多
+ loss 中权重 9:1,模型倾向预测出大的数字,Loss 下降快
+ 假设拟合分位数 0.5,退化成 MAE
+ $Q L(y, \hat{y}, q=0.5)=\max (0.5 *(y-\hat{y}), 0.5 (\hat{y}-y)) = 0.5|y-\hat{y}|$
+ q-Risk 避免不同预测点下的预测量纲不一致问题,对结果做正则化处理。目前只关注 P50 和 P90 两个分位数 #card
+ $q$-Risk $=\frac{2 \sum_{y_t \in \tilde{\Omega}} \sum_{\tau=1}^{\tau_{\max }} Q L\left(y_t, \hat{y}(q, t-\tau, \tau), q\right)}{\sum_{y_t \in \tilde{\Omega}} \sum_{\tau=1}^{\tau_{\max }}\left|y_t\right|}$

  • 模型结构
    image.png
    • ((642845bf-6e28-467a-8c0a-5b4e84f34c2c))
  • 输入部分
    • [[Static Covariate Encoders]] 通过 {{c1 GRN}} 将静态特征编码变成 4 个不同向量
    • 动态特征 #card
      • post inputs
      • known future inputs
    • [[Variable Selection Networks]] 通过选择重要的特征,减少不必要的噪音输入,以提供模型性能。#card
      • [[GLU]] 灵感来自 LSTM 的门控机制,sigmoid 取值范围 0-1
    • 对不同类型的输入变量应该区别对待 #card
      • 静态变量通过特殊的 [[Static Covariate Encoders]],后续做为 encoder 和 decoder 的输入
      • 过去的动态时变变量+动态时不变变量进入 encoder 结构中(蓝色 variable seletcion)
      • 未来的动态时不变变量进入 decoder 结构中
    • seq2seq with teacher forcing 架构 #card
      • encoder 部分动态特征 embedding 和静态特征 embedding concat 在一起做为输入
        • 静态变量 + 动态时变变量
      • decoder
        • 静态变量 + 动态时不变变量
  • 模型组成
    • [[Gated Residual Network]] 模型能够灵活地仅在需要时应用非线性处理 #card
      • 外生输入和目标之间的确切关系通常是事先未知的,因此很难预见那些变量是相关的。
      • 很难确定非线性处理的程度该多大,并且可能存在更简单的模型就能满足需求。
    • [[Interpretable Multi-Head Attention]]
    • [[Temporal Fusion Decoder]] 学习数据集中的时间关系
    • 通过 dense 层得到多个 [[Quantile Outputs]] #card
      • $\hat{y}(q, t, \tau)=\boldsymbol{W}_q \tilde{\boldsymbol{\psi}}(t, \tau)+b_q$

[[TFT Interpretability Use Cases]] #card

  • 输入特征重要性 ((643eb0f7-d9cc-4b51-992a-aea215af0d68))
  • 可视化当前时间模式 ((643eb151-fc5d-491c-b690-d6b7f19fd93c))
  • 识别导致任何导致时间动态显著变化的时间 ((643eb1bc-a6a5-4342-9611-83aa4e249d6b))

[[Ref]]