论文:ICLR2022 | Anomaly transformer: Time series anomaly detection with association discrepancy [1]
作者:徐介晖,吴海旭,王建民,龙明盛
机构:清华大学软件学院BNRist
代码:https://github.com/thuml/Anomaly-Transformer
录播:https://www.bilibili.com/video/BV16g411k7Pi?share_source=copy_web&vd_source=0748bb4a444fdca08eb0f7e55738fd4e
引用量:12
一、历史瓶颈
基于异常判断标准,作者将异常检测方法分为:
● 基于密度:LOF、COF、DAGMM、MPPCACD;
● 基于聚类:SVDD、Deep SVDD、THOC、ITAD;
● 基于重建:LSTM-VAE、GAN;
● 基于自回归:VAR、ARIMA、LSTM;
● 其他:基于子序列等。
而在深度网络上,异常检测的研究主要在:
● 学习时序数据点级别的表征,进而依靠重建或预测误差进行判定,例如RNN;
● 通过图来显式关联建模,将具有不同时间点的时间序列表示为顶点,并通过随机游走检测异常。例如GNN。
但上面两种方式分别有以下缺点:
● pointwise表征信息量较少,并且可能被正常模式主导,使得异常点难以区分。
● 学习到的图仍然仅限于单个时间点,这对于复杂的时间模式是不够的,无法捕捉每个时间点与整个时间序列的关联。
二、论文贡献
该论文的3点贡献:
● 提出Anomaly-Attention机制的Anomaly Transformer,它可以同时对先验关联(Prior-Association)和序列关联(Series-Association)进行建模,以计算关联差异(Association Discrepancy);
● 提出了一种极小极大策略(Minimax Strategy)来放大关联差异的normal-abnormal可区分性;
● Anomaly Transformer真实数据中,对比多个benchmarks,发生模型实现SOTA的异常检测结果。
1. 模型结构
图1:Anomaly Transformer模型结构
图1左边是Anomaly-Attention。右边是Anomaly Transformer重建的整体模型结构,用公式可表示为: 图1中L为堆叠层数,l为第几层。 ,N为输入时序长度,d为时序维度。 计算关联差异。
2. Anomaly-Attention
Anomaly-Attention内有两个关联(可以把它理解成点与时序的关联分布,前者是先验假设,后者是模型自学的经验分布)[2]:
● 先验关联 :采用了可学习的高斯核函数,其中心在对应时间点的索引上。这种设计可以利用高斯分布的单峰特点,使数据更加关注邻近的点。同时,为了使得先验关联能够适应不同的时序模式,高斯核函数包含可学习的尺度$\sigma$参数;
● 序列关联 :它是由标准Transformer中注意力计算获得,一个点的序列关联即是该点在注意力矩阵中对应行的注意力权重分布。该分支是为了挖掘原始序列中的关联,让模型自适应地捕捉最有效果的关联。
这两个关联是为了服务于后续的关联差异,关联差异是异常度量的一个标准。这里提前简单解释下这两个关联设计的出发点:先验关联采用具有单峰特性的正态分布,当异常发生时,当前点的周围临近点极大可能发生异常,所以先验关联和序列关联都关注局部信息,从而这两个关联有小的差异。而在正常序列上,attention map具有全局关注特性,会分布在非临近点上,例如周期型序列,这对比于单峰明显的先验关联,这两个关联之间便存在很大差异。所以关联差异能被用于异常检测。详见ICLR的审稿意见[3]。
关注模块的公式如下: 具体地,在先验关联中,对于第i个时间点,它与第j个点的关联权重由高斯核计算得到的: 。另外,关注是多头机制的,可参见伪代码:
图2:Anomaly-Attention多头机制的伪代码
3. Association Discrepancy和Minimax Strategy
除了使用重建误差来优化模型表征,为了加大正常点和异常点之间的差距,我们使用了一个额外关联差异损失来增大关联差异[2],注意这里的出发点是为了让正常序列更加明显是正常。所以损失如下: 其中AssDis是关联差异。它的计算形式是对称KL距离: 当 ,如果模型最小化损失,我们要最大化关联差异,而直接最大化关联差异,将使得高斯核的尺度参数 急剧变小,结果就会导致先验分布无意义。因此,为了更好的控制关联学习的过程,作者采用了一种Minimax策略。
图3:Minimax关联学习
● 在最小化阶段,优化先验关联P,让先验关联P近似从原始时序中学得的序列关联S,该过程将使得先验关联适应不同的时序模式,同时也避免先验关联的 学习的很小。
● 在最大化阶段,优化序列关联S,来最大化关联之间的差异,该过程将使得序列关联更加注意非临接的点,使得异常点的重建更加困难。
为了实现最大最小学习方向的切换,可通过改变Loss里 方向: 由于要分开优化先验关联和序列关联,所以梯度回传时要注意,最小化时回传梯度给先验关联,最大化时回传梯度给序列先验。
图4:Minimax关联学习的梯度回传
异常检测依据是用关联差异标准化重建误差: AssDis越小,异常分数越大。reconstruction error越大,异常分数越大。还是提醒一句:对于异常点,这两个关联有小的差异,对于正常点,这两个关联之间存在很大差异。
三、实验结果
实验很详实,这边我只展示部分结果,建议看论文。
在5个真实数据集上,对比其他模型的效果:
图5:5个真实数据集的模型效果对比
在Lai等人在2021提出的合成数据集上的效果如下,但建议客观看待,因为这块只是对比深度模型,没对比非深度模型。而且应该是加了detection adjustment后处理的。
图6:在Lai等人剔除的合成数据集上的表现
模型各组件的消融实验:
图7:模型组件的消融实验
在不同异常类型数据上的,模型结果可视化分析:
图8:各异常类型数据下的异常检测结果的可视化。红圈代表真实点异常,红区段代表真实子序列异常。错误检测的例子被红框标记
在代码issue里,有些朋友提到移除detection adjustment后处理之后,模型效果就很差:
作者给出回复说:detection adjustment是广泛被其他论文所使用的一个后处理技巧,且实验比较其他模型时,都加了该后处理,detection adjustment源于Xu等人在2018提到的一种做法,是参考真实异常标签,修正预测结果以符合异常事件检测任务的要求。讨论详见[4]。
detection adjustment是结合真实异常标签,修正点预测结果。代码如下:
# detection adjustment
anomaly_state = False
for i in range(len(gt)):
if gt[i] == 1 and pred[i] == 1 and not anomaly_state:
anomaly_state = True
for j in range(i, 0, -1):
if gt[j] == 0:
break
else:
if pred[j] == 0:
pred[j] = 1
for j in range(i, len(gt)):
if gt[j] == 0:
break
else:
if pred[j] == 0:
pred[j] = 1
elif gt[i] == 0:
anomaly_state = False
if anomaly_state:
pred[i] = 1
虽然论文假设说真实异常标签可透过设定阈值检测出来,但实际业务场景,真实标签的获取难度没那么简单,所以这块还有待业务实践去考量模型效果。
另外,关于阈值怎么设定,作者提供在附录里,是基于KMeans下gap统计值方法选择的:
● 训练完,将模型应用在验证集获取异常分数;
● 计算验证集所有异常分数下的频率分布图,透过观察分布找出离群的异常分数阈值。
四、总结
这篇文章还是很有亮点的,构建先验关联和序列关联,通过计算关联差异,来辅助异常检测,在不同类型的异常数据上取得了SOTA的表现。思路简单直接,中间Minimax学习策略的设计,也是挺巧妙的,非常值得一读。
参考资料
[1] Xu, J., Wu, H., Wang, J., & Long, M. (2021). Anomaly transformer: Time series anomaly detection with association discrepancy. *arXiv preprint arXiv:2110.02642*.
[2] ICLR 2022 Spotlight | Anomaly Transformer:基于关联差异的时序异常检测方法 - 游凯超,知乎:https://zhuanlan.zhihu.com/p/466970544
[3] Anomaly Transformer的审稿意见,OpenReview.net:https://openreview.net/forum?id=LzQQ89U1qm_
[4] About "detection adjustment" in the line 339-360 of solver.py, 关于detection adjustment的问题讨论,https://github.com/thuml/Anomaly-Transformer/issues/14
推荐阅读:
我的2022届互联网校招分享
我的2021总结
浅谈算法岗和开发岗的区别
互联网校招研发薪资汇总
2022届互联网求职现状,金9银10快变成铜9铁10!!
公众号:AI蜗牛车
保持谦逊、保持自律、保持进步
发送【蜗牛】获取一份《手把手AI项目》(AI蜗牛车著)
发送【1222】获取一份不错的leetcode刷题笔记
发送【AI四大名著】获取四本经典AI电子书