论文标题 | Multivariate Time-series Anomaly Detection via Graph Attention Network
论文来源 | ICDM 2020
论文链接 | https://arxiv.org/abs/2009.02040
源码链接 | https://github.com/mangushev/mtad-gat

TL;DR

针对当前大部分多时间序列异常检测方法未考虑不同时间序列间相关性的问题,论文中提出了一种新颖的自监督学习框架 MTAD-GAT 进行多变量时间序列异常检测。MTAD-GAT 考虑将每个单指标时间序列作为特征,然后利用 2 种并行的 GAT 网络层来学习多个时间序列间的时序和特征依赖关系。此外,MTAD-GAT 还联合优化了基于预测的模型和基于重构的模型,以此来获得更好地时间序列表示。实验部分不仅在三个真实时间序列数据集中验证了 MTAD-GAT 优于当前 baselines,还通过分析说明模型学习到参数具有较好的可解释性。

Problem Definition

单变量指标异常检测时仅考虑了某个系统的一个指标进行告警,因此很多时候下都会产生误报的情况。如下图所示,绿色区域表示单指标存在异常但整体不异常,红色区域表示系统整体指标异常。

多变量时间序列示例

从上面的情况可以看出综合多变量时间序列进行异常检测是必要的,可以推送的告警信息更加准确。

问题定义:多变量时间序列的输入可以表示为xRn×kx\in R^{n\times k},其中nn 表示最大时间戳长度(或者固定滑动窗口),kk 表示输入特征维度。多变量时间序列异常检测的目标是输出异常检测结果yRny\in R^n 其中yi{0,1}y_i\in\{0,1\} 表示对应时间戳ii 是否为异常。

论文中涉及的符号含义如下表所示

符号含义

Algorithm/Model

论文提出的 MTAD-GAT 模型架构如下图所示

MTAD-GAT 模型架构

主要由以下模块组成:

  1. 1-D 卷积 (k=7) 获取时间序列高维特征;

  2. 两种 GAT 来捕获时间序列的特征和时序关系;

  3. 2 GAT 特征 + 1-D 卷积特征输入 GRU 来捕获序列模式;

  4. 将特征输入预测模型和重构模型来获取最终结果;

以下详细介绍每个模块度中的详细处理过程。

Data Preprocessing

主要包括数据归一化和数据清洗。

数据归一化:使用的是最大-最小归一化方法。

x~=xmin(Xtrain )max(Xtrain )min(Xtrain )\widetilde{x}=\frac{x-\min \left(X_{\text {train }}\right)}{\max \left(X_{\text {train }}\right)-\min \left(X_{\text {train }}\right)}

数据清洗:使用谱残差 (Spectral Residual,SR) 的方法去除训练数据中的异常点。

Graph Attention

GAT 层可以表示任意图中两节点间的关系。假设给定nn 个节点特征的图{v1,v2,...,vn}\{v_1, v_2,...,v_n\},节点ii 的输出特征hih_i 如下:

hi=σ(j=1Lαijvj)h_{i}=\sigma\left(\sum_{j=1}^{L} \alpha_{i j} v_{j}\right)

其中αij\alpha_{ij} 表示节点ii 和节点jj 间的注意力分数。计算方式如下:

eij=LeakyReLU(w(vivj))αij=exp(eij)l=1Lexp(eil)\begin{aligned} e_{i j} &=\operatorname{LeakyReLU}\left(w^{\top} \cdot\left(v_{i} \oplus v_{j}\right)\right) \\ \alpha_{i j} &=\frac{\exp \left(e_{i j}\right)}{\sum_{l=1}^{L} \exp \left(e_{i l}\right)} \end{aligned}

其中\oplus 表示节点特征连接操作。wR2mw^{\top}\in R^{2m} 表示可学习权重且mm 表示节点特征维度。

论文中使用了两种类型的 GAT 层:

  • Feature-oriented graph attention layer

    考虑不同时间序列的相关性,输出维度为k×nk\times nkk 个时间序列作为图中节点,每个节点对应的特征向量为xi={xi,tt[0,n)}x_i=\{x_{i,t}|t\in[0,n)\},其关系可以通过图注意力机制学习注意力分数。如下图所示

    Feature-oriented
  • Time-oriented graph attention layer

    考虑时间序列的时序依赖关系,输出维度为n×kn\times k。滑动窗口内每个时间戳作为节点,每个节点xtx_t 表示tt 时刻的特征向量。

论文中将每个模块的输出 concatenate 得到n×3kn\times 3k 作为下一个模块的输入,每行表示每个时间戳对应的3k3k 维特征。👏 原始数据+相关序列特征+时序依赖特征

Joint Optimization

基于预测的和基于重构的时间序列异常检测各有优势,所以论文中同时考虑了这两种类型的模型,优化的目标函数如下:

Loss=Lossfor+LossrecLoss=Loss_{for}+Loss_{rec}

  • Forecasting-based 通过给定nn 个时间戳对应的值预测下一个时间戳对应的值,论文中使用的是 GRU 单元堆叠。

    Lossfor =i=1k(xn,ix^n,i)2\operatorname{Loss}_{\text {for }}=\sqrt{\sum_{i=1}^{k}\left(x_{n, i}-\hat{x}_{n, i}\right)^{2}}

  • Reconstruction-based 通过历史数据学习正常数据分布,论文中使用的是 VAE 模型,细节可以参考我的另一篇博客:基于变分自编码器重构概率的异常检测模型

Model Inference

基于预测的和基于重构的时间序列异常检测模型都有对应的输出结果

  • 预测值输出结果为{x^ii=1,2,,k}\{\hat{x}_i | i=1,2,\cdots,k\}
  • 概率值输出结果为{p^ii=1,2,,k}\{\hat{p}_i | i=1,2,\cdots,k\}

综合考虑每个特征的推断分数sis_i 作为最终异常分数,计算公式如下所示:

score=i=1ksi=i=1k(x^ixi)2+γ×(1pi)1+γscore=\sum_{i=1}^{k} s_{i}=\sum_{i=1}^{k} \frac{\left(\hat{x}_{i}-x_{i}\right)^{2}+\gamma \times\left(1-p_{i}\right)}{1+\gamma}

如果scorescore 大于某一阈值即为异常的,至于阈值可以使用 POT(Peak Over Treshold) 方法自动判断。其中γ\gamma 为超参数,可以通过训练集进行网格搜索最优参数。

Experiments

实验部分采用了三种数据集,评价指标采用Precision,Recall,F1Precision, Recall, F1,不用AUCAUC 是因为作者发现所有的方法AUCAUC 都太高了…

实验结果

每个模块的消融实验结果如下

实验结果

至于提到的可解释性,意思是可以从 attention score 看出故障前后指标的相关关系会发生变化,如下图所示

实验结果

但是实际情况是异常前后故障指标间的仍存在比较相关的指标变化趋势,因此觉得这个解释并不靠谱。其它参数实验不再解释,感兴趣的可以参考原文~

Thoughts

  • 整体论文思路清晰,每个模块的设计思路及其需要解决的问题差强人意 👏。
  • 图注意力机制模块设计可以参考,类似自动学习不同指标间的关联强度。