Anomaly Transformer:基于关联差异的时间序列异常检测思路整理
Anomaly Transformer:基于关联差异的时间序列异常检测思路整理
本文主要参考 Xu 等人在 ICLR 2022 发表的论文Anomaly Transformer: Time Series Anomaly Detection with Association Discrepancy。这篇文章的思路很有启发性:它没有只把异常检测看成“重构误差大不大”的问题,而是进一步观察时间点之间的关联模式,并用Association Discrepancy(关联差异)来刻画正常点和异常点之间的区别。
下面内容更多是个人学习和整理,尝试用较通俗的方式解释这篇论文的背景、核心方法、数学思想和实验现象。理解上难免有不完善的地方,欢迎大家一起交流指正。
1. 背景:为什么时间序列异常检测并不简单
时间序列异常检测在工业监控、服务器运维、航天器遥测、水处理系统、金融风控等场景中都很常见。真实系统通常会连续产生大量传感器数据或业务指标,例如 CPU 使用率、网络延迟、流量、压力、温度、电压等。异常点往往意味着设备故障、攻击行为、系统退化或潜在风险,因此及时发现异常非常重要。
不过,从建模角度看,时间序列异常检测并不是一个轻松任务。首先,异常本身通常很稀少,正常点远多于异常点;其次,异常标签往往难以获得,人工标注成本比较高;再次,很多异常并不是单点突变,而是与上下文、趋势、周期或局部模式相关。例如一个数值在某个时刻看起来并不大,但放在对应周期或上下文里可能就是异常。
因此,很多实际方法会选择无监督或自监督方式:模型只从大量时间序列中学习一般规律,然后根据某种异常评分来判断哪些时间点“不像正常模式”。常见思路包括:
- 基于密度或距离的方法,例如 LOF、OCSVM、Isolation Forest;
- 基于重构的方法,例如 AutoEncoder、VAE、LSTM-VAE;
- 基于预测的方法,例如 RNN/Transformer 预测下一个时间点;
- 基于图结构或关联关系的方法,例如建模变量之间或时间点之间的关系。
这些方法都有各自价值,但也存在一些不足。单纯依赖点级表示或重构误差时,模型可能会把异常也重构得不错,从而降低异常和正常之间的区分度;如果只建模局部片段或固定图结构,又可能难以表达复杂时间依赖。Anomaly Transformer 的出发点,正是想从 Transformer 的注意力机制中挖掘“时间点之间的关联模式”,并进一步把这种关联模式变成异常检测信号。
2. 本文主要想法:异常点的关联更容易“局部集中”
这篇论文中最关键的直觉是:正常时间点更容易和整个序列中多个相关位置建立有意义的关联,而异常点由于稀少且模式特殊,往往更难和全局正常模式建立强关联,因此它的关联更可能集中在相邻时间点附近。
论文把这种现象称为一种adjacent-concentration bias(邻近集中偏置)。换句话说,异常点虽然可能在数值上很突出,但从“和其他时间点的关系”来看,它更像是一个只和附近片段抱团的局部模式;而正常点因为重复出现、具有周期性或趋势结构,更容易和更远位置的时间点建立关联。
Transformer 的 self-attention 恰好会为每个时间点生成一组对其他时间点的注意力权重。这个注意力权重分布可以理解成该时间点对全序列的series-association(序列关联)。如果再人为构造一个偏向邻近位置的prior-association(先验关联),就可以比较二者之间的差异:
- 如果真实学到的序列关联和邻近先验差异较大,说明这个时间点可能可以和更广范围建立关系;
- 如果真实学到的序列关联和邻近先验差异较小,说明这个时间点的关联可能更局部、更邻近集中;
- 论文认为异常点更容易呈现较小的关联差异。
这个“关联差异”就是论文提出的Association Discrepancy。它不是简单替代重构误差,而是和重构误差结合,形成最终的异常评分。
3. Anomaly Transformer 整体架构
Anomaly Transformer 的整体结构仍然保留了 Transformer 的基本骨架,例如注意力层、残差连接、LayerNorm 和前馈网络。但它对标准 self-attention 做了改造,提出了Anomaly-Attention,用两条分支同时建模先验关联和序列关联。
图1 Anomaly Transformer 整体架构
如图1所示,模型中比较值得关注的是左侧的 Anomaly-Attention 模块。它不是只计算普通的QK⊤QK^\topQK⊤注意力,而是同时产生两类关联:
- Series-Association:由输入序列通过 Query、Key 计算得到,类似标准 self-attention 中的注意力分布,用于表示当前时间点从原始序列中学习到的真实关联。
- Prior-Association:由可学习的 Gaussian Kernel(高斯核)构造,主要体现“相邻时间点更相关”的先验假设。
从系统结构上看,Anomaly Transformer 可以理解为:
输入时间序列 ↓ Embedding ↓ 多层 Anomaly-Attention + Feed Forward ↓ 重构输出 ↓ 计算重构误差 + 关联差异 ↓ 得到每个时间点的异常分数这里的核心并不只是“用了 Transformer”,而是利用 Transformer 注意力分布表达时间点之间的关联,再设计一个先验关联分布与之对比。这个角度对时间序列异常检测很有启发:异常不一定只体现在数值大小,也可能体现在“它和其他时间点建立关系的方式”。
4. 关键技术一:Anomaly-Attention
4.1 Series-Association:从数据中学到的真实关联
在普通 Transformer 中,每个时间点会通过 Query 和 Key 与其他时间点计算相似度,再通过 Softmax 得到注意力权重。对时间序列而言,这组权重可以看作一个时间点对整段序列的关联分布。
论文将这种由原始序列学习出来的关联称为Series-Association。它的形式大致可以理解为:
S=Softmax(QKT/d)S=Softmax(QK^T/\sqrt{d})S=Softmax(QKT/d)
其中:
- QQQ表示 Query 矩阵;
- KKK表示 Key 矩阵;
- ddd是特征维度,用于缩放点积结果;
- SSS的每一行可以看成某个时间点对其他时间点的关联分布。
如果某个时间点属于正常模式,它可能会关注到很多具有相似周期、趋势或上下文的位置;如果某个时间点是异常模式,它与全局正常模式的可关联性可能更弱。
4.2 Prior-Association:用高斯核表达邻近先验
论文并没有直接把注意力分布拿来作为异常分数,而是额外构造了一个Prior-Association。这个先验关联希望表达一种朴素假设:如果没有更多信息,离当前时间点越近的位置越可能相关。
论文使用可学习尺度参数σ\sigmaσ的高斯核来表达这种邻近集中关系。可以粗略理解为:
Pi,j=12πσiexp(−∣j−i∣22σi2)P_{i,j}={1\over \sqrt{2\pi}\sigma_i}exp(-{|j-i|^2\over 2\sigma_i^2})Pi,j=2πσi1exp(−2σi2∣j−i∣2)
其中:
- iii表示当前时间点;
- jjj表示被关联的另一个时间点;
- ∣j−i∣|j-i|∣j−i∣表示时间距离;
- σi\sigma_iσi控制关联分布的宽窄;
- Pi,jP_{i,j}Pi,j越大,说明先验上认为iii与jjj越相关。
这里的σ\sigmaσ是可学习的,这一点很关键。不同数据集、不同异常类型、不同时间片段的邻近范围并不一样,固定一个尺度往往过于死板。让模型学习σ\sigmaσ,可以让 prior-association 对不同时间模式更加自适应。
4.3 Association Discrepancy:用分布差异刻画异常性
有了先验关联PPP和序列关联SSS后,论文用二者之间的分布差异来定义Association Discrepancy。具体使用的是对称 KL 散度:
AssDis(P,S,X)=1L∑l=1L(KL(Pil∣∣Sil)+KL(Sil∣∣Pil))AssDis(P,S,X)={1\over L}\sum_{l=1}^{L}(KL(P_i^l||S_i^l)+KL(S_i^l||P_i^l))AssDis(P,S,X)=L1l=1∑L(KL(Pil∣∣Sil)+KL(Sil∣∣Pil))
这里:
- LLL表示模型层数;
- PilP_i^lPil表示第lll层中第iii个时间点的先验关联分布;
- SilS_i^lSil表示对应的序列关联分布;
- KL(P∣∣S)KL(P||S)KL(P∣∣S)表示 KL 散度,用来衡量两个离散分布之间的差异;
- 最终得到的是每个时间点对应的关联差异。
直观来看,Association Discrepancy 不是在问“这个点重构得好不好”,而是在问“这个点学到的真实关联,和邻近先验之间差得多不多”。论文的观察是,异常点往往更邻近集中,因此其关联差异可能更小;正常点能建立更丰富的远距离关联,因此差异更明显。
5. 关键技术二:Minimax Association Learning
如果只是简单计算两个分布之间的差异,模型未必能自动学出足够明显的正常/异常区分。因此论文进一步设计了一个minimax association learning(极小极大学习策略),通过两个阶段放大 prior-association 和 series-association 之间的可区分性。
图2 Minimax Association Learning 思路
图2可以理解为一个“拉近再拉开”的训练过程:
- 在minimize phase中,让 prior-association 尽量靠近 series-association;
- 在maximize phase中,让 series-association 在重构约束下尽量拉开与 prior-association 的差异;
- 同时通过 stop-gradient 控制梯度传播,避免两个分支互相干扰。
这个策略的目的不是为了制造一个抽象的对抗过程,而是为了让正常点和异常点在关联差异上的表现更加可分。正常点由于存在更多可学习的全局关联,在重构约束下更容易把 series-association 推向非邻近区域;异常点由于稀少且局部集中,更难做到这一点,于是二者差异被放大。
从工程直觉看,这有点像给模型施加一个额外压力:不只是要求它重构好序列,还要求它解释每个时间点如何与其他时间点建立关系。正常模式通常有更多“解释路径”,异常模式则更局促。
6. 异常评分:重构误差与关联差异的结合
论文最终没有单独使用重构误差,也没有单独使用关联差异,而是把二者结合起来构造异常分数:
AnomalyScore(X)=Softmax(−AssDis(P,S,X))∗∣Xi−Xhati∣2AnomalyScore(X)=Softmax(-AssDis(P,S,X))*|X_i-Xhat_i|^2AnomalyScore(X)=Softmax(−AssDis(P,S,X))∗∣Xi−Xhati∣2
这个公式可以拆成两部分理解:
- ∣Xi−Xhati∣2|X_i-Xhat_i|^2∣Xi−Xhati∣2是重构误差,表示模型对当前时间点重构得是否困难;
- Softmax(−AssDis)Softmax(-AssDis)Softmax(−AssDis)则利用关联差异对重构误差进行加权;
- ∗*∗表示将关联差异权重与重构误差相乘。
为什么是−AssDis-AssDis−AssDis?因为论文认为异常点的 Association Discrepancy 往往更小,取负后再 Softmax,可以让这些点获得更高权重。这样一来,即使某些异常点的重构误差并不极端,也可能因为关联模式异常而得到更高的异常评分。
我觉得这个设计的价值在于,它把“点的数值是否异常”和“点的关联方式是否异常”放在了同一个评分框架中。对于真实系统里的复杂异常,这种组合通常比单一重构误差更有表达力。当然,这也意味着模型训练和解释都会更复杂,实际落地时还需要结合具体业务做调参和可视化分析。
7. 实验现象简要说明
论文在多个真实时间序列异常检测数据集上进行了实验,包括 SMD、MSL、SMAP、SWaT、PSM、NeurIPS-TS 等。这些数据集覆盖服务器监控、航天器遥测、水处理系统等场景。这里不展开过多指标细节,主要关注几个对理解方法比较有帮助的结果现象。
图3 不同数据集上的检测结果对比
从论文给出的结果表可以看到,Anomaly Transformer 在多个数据集上取得了较好的表现。这里更值得注意的是,性能提升并不是只来自 Transformer 本身,而是与关联差异、可学习先验关联、minimax 策略等模块共同相关。
论文的消融实验也显示,如果只使用普通 Transformer 或只依赖重构误差,效果会明显弱一些;加入 association-based criterion 后,模型对异常点的区分能力更强。这个结论和前面的直觉是一致的:异常检测不只是重构问题,也可以从关联模式角度补充信息。
图4 不同异常类型下的可视化效果
图4展示了不同异常类别下,原始序列、重构结果以及 association-based criterion 的变化。相比单纯重构误差,关联差异相关的评分在一些场景下能更清晰地突出异常区域,尤其是上下文异常、季节模式异常等不一定表现为简单尖峰的情况。
这类可视化对理解模型很有帮助。因为在实际业务中,很多异常并不是“数值突然爆炸”,而是“当前数值放在当前模式里不太合理”。如果模型能给出更稳定、更成段的异常评分,后续报警和人工排查都会更容易。
图5 窗口大小和损失权重的参数敏感性
图5展示了滑动窗口大小和损失权重λ\lambdaλ对模型表现的影响。论文中使用窗口大小为 100,并用λ\lambdaλ平衡重构损失和关联差异相关损失。从趋势上看,模型对部分参数具有一定稳定性,但不同数据集仍然会有差异。
这也提醒我们,实际使用这类模型时不宜完全照搬论文参数。窗口大小会影响模型能看到的上下文长度,也会影响显存和计算开销;λ\lambdaλ则会影响模型到底更重视重构,还是更重视关联差异。对于具体业务数据,最好结合采样频率、周期长度、异常持续时间做调试。
8. 从实现角度如何理解这套方法
如果尝试从工程实现角度复现或改造 Anomaly Transformer,可以把它拆成几个相对清晰的模块。
8.1 数据窗口化
论文中使用非重叠滑动窗口,将长时间序列切成固定长度片段。窗口长度决定了模型一次能观察到多少上下文。窗口太短,可能看不到周期和趋势;窗口太长,计算成本会上升,也可能引入无关噪声。
8.2 Anomaly-Attention 模块
实现上需要同时计算:
- 标准注意力得到的 series-association;
- 基于时间距离和可学习σ\sigmaσ的 prior-association;
- 两个分布之间的 KL 差异。
这里要注意数值稳定性,例如 Softmax、KL 散度中可能需要添加极小值避免log(0)\log(0)log(0)。
8.3 Minimax 训练
训练时需要区分 minimize phase 和 maximize phase,并通过 stop-gradient 控制某些分支不回传梯度。这个部分如果实现不当,很容易出现两个问题:
- 梯度方向不符合论文设计;
- 两个分支同时被更新,导致约束关系失效。
因此,如果只是初步学习,建议先实现重构损失和 Association Discrepancy 的计算,再逐步加入 minimax 策略。
8.4 异常评分与阈值
最终异常评分需要结合重构误差和关联差异。得到分数后,还需要设置阈值判断异常。论文中使用验证集上的比例来选阈值,并采用时间段调整策略:如果某个连续异常段中有一个点被检测到,则认为整个异常段被检测到。这种评估方式在时间序列异常检测论文中比较常见,但实际业务中仍需结合报警策略进一步设计。
9. 个人理解与可借鉴之处
这篇论文对我比较有启发的地方主要有三点。
第一,它没有把异常检测局限在“误差大不大”,而是引入了“关联方式是否异常”。很多复杂异常确实不一定有特别大的重构误差,但它和上下文之间的关系可能发生了变化。
第二,它利用 Transformer 注意力天然产生的分布来做解释和检测。注意力权重本身并不一定等同于解释,但在时间序列中,将每个时间点对其他时间点的注意力看成关联分布,是一个比较自然的切入点。
第三,它通过可学习高斯先验和 minimax 策略,把一个直觉性的邻近集中偏置变成了可训练目标。这种做法也提示我们,在深度学习模型中加入合理先验,并不一定要牺牲模型表达能力,关键在于如何设计可学习的约束形式。
当然,这个方法也有一些需要继续思考的地方。例如:
- Transformer 的注意力复杂度较高,长序列场景下成本会比较大;
- 关联差异的有效性可能依赖数据模式和异常类型;
- 阈值选择、窗口长度、异常段调整策略都会影响最终效果;
- 对业务人员而言,Association Discrepancy 的解释仍需要可视化辅助。
因此,本文更多是整理一种值得参考的思路。如果要落到具体业务系统,还需要根据数据频率、异常类型、实时性要求和可解释性需求做进一步适配。
10. 总结
Anomaly Transformer 的核心可以概括为一句话:利用 Transformer 建模时间点之间的关联分布,再通过先验关联与序列关联之间的差异来辅助异常检测。
它提出的 Association Discrepancy 为时间序列异常检测提供了一个很有意思的视角:异常点不仅可能在数值上异常,也可能在“和其他时间点建立关联的方式”上异常。通过 Anomaly-Attention、可学习高斯先验和 minimax association learning,模型尝试把这种差异放大,并与重构误差结合形成最终异常评分。
从学习角度看,这篇论文适合用来理解 Transformer 在时间序列异常检测中的一种改造方式;从实践角度看,它也提示我们在做异常检测时,可以同时关注点值误差、上下文关系和时间关联结构。本文只是对论文思路的一个整理和理解,欢迎大家补充不同看法,也欢迎一起讨论它在具体业务数据上的适配方式。