TL;DR
论文中提出一种基于 GNN 的结构学习模型 GDN(Graph Deviation Network)来解决多变量时间序列异常检测的问题,此外还利用 GAT 学习到的注意力权重来解释检测到的异常。实验部分在两个真实 sensors 数据集中验证了 GDN 模型不仅比 baselines 更加准确地检测出异常,还可以捕获不同传感器间的关系来辅助定位异常根因。感觉和另一篇文章思路有些类似 MTAD-GAT:基于图注意力网络的多变量时间序列异常检测模型
Problem Statement
论文中的训练数据包括N 个 sensors 在Ttrain 范围内数据strain =[strain (1),⋯,strain (Ttrain )],在每个时刻t 的数据strain(t)∈RN 为N 维向量表示N 个 sensors 对应的值。对于无监督模型训练数据中一般仅包含正常数据。
模型的目标是检测测试数据集stest =[stest (1),⋯,stest (Ttest )] 的Ttest 个时刻中是否为异常,每个时刻数据结果为a(t)∈{0,1}。
Algorithm/Model
论文中提出的模型框架如下图所示:

GDN 模型框架
主要包括四部分:
- Sensor Embedding:学习到每个 sensor 的特征向量表示;
- Graph Structure Learning:学习 sensors 间依赖关系的图结构表示;
- Graph Attention-Based Forecasting:基于图注意力机制预测每个 sensor 下个时刻的值;
- Graph Deviation Scoring:从学习到的关系中确认偏差并且定位和解释偏差;
Sensor embedding
对于每个 sensor 学习到一个 embedding vector 来表示其特征
vi∈Rd, for i∈{1,2,⋯,N} embedding vector 首先是实际初始化然后进行训练,论文将每个 sensor 的 embedding 用于两方面:
- 结构学习:判断 sensor 间的相关性;
- 注意力系数学习:考虑不同种类 sensor 间的异质影响程度;
图结构学习
考虑到不同 sensor 间依赖模式是不对称的,论文中利用有向图来表示 sensor 间的关系,其对应的邻接矩阵为Aij。
对于每个 sensori 其依赖的 condidate relations 为Ci⊆{1,2,⋯,N}\{i}。如果有先验知识那么Ci 可以自定义,如果没有那么为除本身外的全集。
为了选择 sensori 的依赖,需要计算其对于每个 condidate relations 中j∈C 的相似性:
ejiAji=∥vi∥⋅∥vj∥vi⊤vj for j∈Ci=1{j∈TopK({eki:k∈Ci})} 然后选择 top-k 个最相似的作为其依赖 sensor,至于k 值需要根据稀疏性进行判断。
基于图注意力预测
为什么采用预测模型?1. 判断哪个 sensor 偏离异常 2. 判断 sensor 如何偏离异常的。
在时刻t 模型输入为x(t)∈RN×w,其w 表示历史序列时间窗口,目标是需要判断在当前时刻值s(t)
x(t):=[s(t−w),s(t−w+1),⋯,s(t−1)] 为了考虑 sensor 间的关系,论文中采用图注意力机制来融合 sensor 特征vi,对于节点i 聚合特征zi 计算方法如下
zi(t)=ReLU⎝⎛αi,iWxi(t)+j∈N(i)∑αi,jWxj(t)⎠⎞ 这种模式太熟悉了就不再介绍每个参数代表的含义。注意力系数计算方法如下
gi(t)π(i,j)αi,j=vi⊕Wxi(t)= LeakyReLU (a⊤(gi(t)⊕gj(t)))=∑k∈N(i)∪{i}exp(π(i,k))exp(π(i,j)) 其中⊕ 表示链接操作,a 是注意力机制学习到的系数向量。
以上特征融合的过程就可以得到N 个节点的特征表示{z1(t),⋯,zN(t)}。对于每个zi(t), 论文中又 element-wise 乘特征表示vi ,再经过 FC 得到输出维度N 的向量来预测t 时刻 sensor 的值s(t)
s^(t)=fθ([v1∘z1(t),⋯,vN∘zN(t)]) 对于数值型就直接采用 MSE 作为损失函数,
LMSE=Ttrain −w1t=w+1∑Ttrain ∥∥∥∥s^(t)−s(t)∥∥∥∥22 图偏差评分
为了检测和解释 sensor 的异常,论文中的模型首先针对每个 sensor 计算一个异常值,然后再合并得到一个组合分数。
对于t 时刻 sensori 的异常值为
Erri(t)=∣∣∣∣si(t)−s^i(t)∣∣∣∣ 由于不同 sensor 的偏差值有不同的量纲,因此需要标准化
ai(t)=σiErri(t)−μi 其中μi 和σi 表示中位数和四分位数,至于为什么不用均值和标准差作者认为这种方式对于异常检测更加 robust。🤔
取所有 sensor 最大的异常值为异常分数
A(t)=imaxai(t) 由于模型难以预测到突刺,因此作者使用 SMA (simple moving average) 来生成平滑分数As(t),最后得到的值如果超过设定的阈值那么该时刻被标记为异常。
Experiments
实验部分采用了两个真实数据集来测试 GDN 及其 baselines 的性能对比。
实验中考虑的问题非常齐全,包括准确率测试、消融实验、模型解释性、异常定位等。👍
每个部分的实验结果如下所示

性能对比

消融实验对比

可解释-可视化效果

异常解释和定位
Thoughts
- 论文整体思路简洁明了,尤其是实验部分比较 solid 符合对模型的认知 👍
- 需要改进的点在于模型的设计及其采用的方法:
- 图结构学习部分采用有向图是非常合理的,但是采用了相似度计算和 top-k 的构图方法,相似度计算是对称的明显达不到想要的有向图效果。
- 最后的 output layer 采用了 embedding 和 feature 进行 element-wise multiply,有点硬。
- 异常评分模块给人感觉是 tricks 堆叠,🐂 啊 🐂。