《异常检测——从经典算法到深度学习》

  • 0 概论
  • 1 基于隔离森林的异常检测算法
  • 2 基于LOF的异常检测算法
  • 3 基于One-Class SVM的异常检测算法
  • 4 基于高斯概率密度异常检测算法
  • 5 Opprentice——异常检测经典算法最终篇
  • 6 基于重构概率的 VAE 异常检测
  • 7 基于条件VAE异常检测
  • 8 Donut: 基于 VAE 的 Web 应用周期性 KPI 无监督异常检测
  • 9 异常检测资料汇总(持续更新&抛砖引玉)
  • 10 Bagel: 基于条件 VAE 的鲁棒无监督KPI异常检测
  • 11 ADS: 针对大量出现的KPI流快速部署异常检测模型
  • 12 Buzz: 对复杂 KPI 基于VAE对抗训练的非监督异常检测
  • 13 MAD: 基于GANs的时间序列数据多元异常检测
  • 14 对于流数据基于 RRCF 的异常检测
  • 15 通过无监督和主动学习进行实用的白盒异常检测
  • 16 基于VAE和LOF的无监督KPI异常检测算法
  • 17 基于 VAE-LSTM 混合模型的时间异常检测
  • 18 USAD:多元时间序列的无监督异常检测
  • 19 OmniAnomaly:基于随机循环网络的多元时间序列鲁棒异常检测
  • 20 HotSpot:多维特征 Additive KPI 的异常定位
  • 21 Anomaly Transformer: 基于关联差异的时间序列异常检测
  • 22 Kontrast: 通过自监督对比学习识别软件变更中的错误
  • 23 TimesNet: 用于常规时间序列分析的时间二维变化模型
  • 24 TSB-UAD:用于单变量时间序列异常检测的端到端基准套件
  • 25 DIF:基于深度隔离林的异常检测算法
  • 26 Time-LLM:基于大语言模型的时间序列预测
  • 27 Dejavu: Actionable and Interpretable Fault Localization for Recurring Failures in Online Service Systems
  • 28 UNRAVEL ANOMALIES:基于周期与趋势分解的时间序列异常检测端到端方法

相关:

  • VAE 模型基本原理简单介绍
  • GAN 数学原理简单介绍以及代码实践
  • 单指标时间序列异常检测——基于重构概率的变分自编码(VAE)代码实现(详细解释)

28. Unravel Anomalies: An End-to-end Seasonal-Trend Decomposition Approach for Time Series Anomaly Detection

论文名称:UNRAVEL ANOMALIES: AN END-TO-END SEASONAL-TREND DECOMPOSITION APPROACH FOR TIME SERIES ANOMALY DETECTION
会议名称:ICASSP 2024
论文地址:ieee | 阿里云盘 |
PPT 下载:https://sigport.org/sites/default/files/docs/TADNet%20Oral.pdf 源码地址:https://github.com/zhangzw16/TADNet

Python 时间序列 mk 趋势检验_支持向量机

28.1 论文概述

论文很短(除去引用只有4页),我们可以很快地过一遍论文大体内容:

Python 时间序列 mk 趋势检验_算法_02


Python 时间序列 mk 趋势检验_异常检测_03


Python 时间序列 mk 趋势检验_Python 时间序列 mk 趋势检验_04

Python 时间序列 mk 趋势检验_算法_05

28.2 相关技术

见原文第1节 New insights.

New insights:时间序列本质上由多个重叠模式组成:季节性、趋势和残差。这种重叠性质可能会掩盖不同类型的异常值。使用季节性-趋势分解(STD)的优势在图 1 中有生动的展示,它显示了如何通过将其分离为各自的成分来有效地分离异常值。通过利用 STD 的能力,我们的方法可以独特地分解这些复杂的复合模式。此外,根据文献[4] 提出的分类法,我们发现不同类型的数据异常都可以与相应的组件相关联:季节性异常与季节性成分、趋势异常与趋势成分以及点异常与剩余成分。

Python 时间序列 mk 趋势检验_支持向量机_06


尽管现有研究已将时间序列分解纳入 TAD 任务,但这些方法并不遵循端到端的训练方式。具体而言,它们要么依赖于预定义的分解算法,需要精细的参数调整,要么仅将分解用于数据预处理。为了克服端到端训练缺乏监督信号的问题,我们引入了一种新的两步训练方法。最初,我们生成一个模拟真实世界数据分解成分的合成数据集。首先,我们在这个合成数据集上为分解任务预训练我们的模型。该模型随后根据真实世界的异常数据进行微调,从而增强时间序列分解和异常检测。

Python 时间序列 mk 趋势检验_算法_07


时间序列异常检测(Time-Series Anomaly Detection) 考虑一个长度为 Python 时间序列 mk 趋势检验_深度学习_08 的时间序列数据集 Python 时间序列 mk 趋势检验_Python 时间序列 mk 趋势检验_09,当 Python 时间序列 mk 趋势检验_异常检测_10 时称为单变量时间序列,当Python 时间序列 mk 趋势检验_深度学习_11 时称为多变量时间序列。TAD 任务的主要目标是在 Python 时间序列 mk 趋势检验_深度学习_08 中识别异常,并生成输出序列 Python 时间序列 mk 趋势检验_异常检测_13Python 时间序列 mk 趋势检验_异常检测_13 中的每个元素对应于 Python 时间序列 mk 趋势检验_深度学习_08 中相应数据点的异常状态,其中 1 表示异常。为此,使用基于点的方法(Point-wise score method)产生异常分数系列 Python 时间序列 mk 趋势检验_Python 时间序列 mk 趋势检验_16 ,其中 Python 时间序列 mk 趋势检验_算法_17。然后通过独立阈值处理将这些分数转换为二进制异常标签 Python 时间序列 mk 趋势检验_异常检测_13

季节性趋势分解 (Seasonal-Trend Decomposition) 对于一个单变量时间序列 Python 时间序列 mk 趋势检验_算法_19,它的结构成分包括趋势性和季节性,表示为 Python 时间序列 mk 趋势检验_支持向量机_20,其中 Python 时间序列 mk 趋势检验_Python 时间序列 mk 趋势检验_21Python 时间序列 mk 趋势检验_支持向量机_22Python 时间序列 mk 趋势检验_异常检测_23 分别表示在第 Python 时间序列 mk 趋势检验_深度学习_24

TAD 任务的方法的主要重点在于对单变量时间序列进行季节性-趋势分解。当前文献强调了评估每个变量以提高预测准确性的优点。因此,多元时间序列中的每个变量都会经历独立分解,而整体异常检测策略会考虑其多元本征特性。

时域音频分解(Time-domain Audio Separation):此任务可以描述为:给定混合的离散波形 Python 时间序列 mk 趋势检验_支持向量机_25,对源数据 Python 时间序列 mk 趋势检验_Python 时间序列 mk 趋势检验_26Python 时间序列 mk 趋势检验_Python 时间序列 mk 趋势检验_27) 进行评估时 。从数学上讲,这表示为 Python 时间序列 mk 趋势检验_Python 时间序列 mk 趋势检验_28

单声道音频源分离领域已经通过各种深度学习模型取得了进展。TasNet 在此领域引入了端到端学习的概念。Conv-TasNet 通过集成卷积层进一步发展了这种方法。DPRNN 专注于通过循环神经网络改善长期建模。最近,像 SepFormer 这样的架构整合了注意力机制。

时域音频分离的理论框架与季节性趋势分解任务表现出惊人的相似性,从而使我们思考在这些领域之间可能的方法转换,以改进时间序列分解和异常检测。

28.3 核心方法

28.3.1 总体架构 Overall Framework

TADNet 的总体流程图如图 2 所示。预处理包括数据标准化 normalization 和分段(segmentation)。首先将输入数据被归一化到 [0,1) 范围内。分段采用长度为 Python 时间序列 mk 趋势检验_算法_29 的滑动窗口方法,将归一化的 Python 时间序列 mk 趋势检验_深度学习_08 转换为长度为 Python 时间序列 mk 趋势检验_算法_29 的非重叠块(non-overlap blocks),表示为 Python 时间序列 mk 趋势检验_支持向量机_32。值得注意的是,虽然分段提供了更灵活的方法来管理较长的序列,但它不会影响结果。

在 TADNet 主干网中,我们利用TasNet架构及其语音(speech separation)分离的变体。将季节和趋势分量视为不同的音频信号,如图 2 所示,TasNet 有助于有效的 STD。

由于训练只使用正常样本,异常情况通常会破坏重构过程。为了检测这些异常值,我们计算重构误差,表示为Python 时间序列 mk 趋势检验_Python 时间序列 mk 趋势检验_33,其中 Python 时间序列 mk 趋势检验_Python 时间序列 mk 趋势检验_34 表示 L2 范数。

Python 时间序列 mk 趋势检验_异常检测_35

28.3.2 TADNet 主要部分

编码器接受单变量时间序列 Python 时间序列 mk 趋势检验_算法_36,其中 Python 时间序列 mk 趋势检验_支持向量机_37 来源于多元变量 Python 时间序列 mk 趋势检验_深度学习_38。它将该序列划分为多个重叠窗口(frames)。每个窗口具有长度 Python 时间序列 mk 趋势检验_Python 时间序列 mk 趋势检验_39,并且与相邻窗口重叠 Python 时间序列 mk 趋势检验_异常检测_40 个步长。然后按顺序将这些窗口合并为Python 时间序列 mk 趋势检验_算法_41。通过随后的线性变换,编码器将 Python 时间序列 mk 趋势检验_支持向量机_42映射到潜在空间 Python 时间序列 mk 趋势检验_Python 时间序列 mk 趋势检验_43。矩阵 Python 时间序列 mk 趋势检验_异常检测_44 的行(rows) 包含可训练的转换基(transformation),而 Python 时间序列 mk 趋势检验_深度学习_45

分离器接收编码表示,并负责为分解的每个组件生成掩码(masks)。形式上表示为,Python 时间序列 mk 趋势检验_异常检测_46 ,其中Python 时间序列 mk 趋势检验_异常检测_47Python 时间序列 mk 趋势检验_异常检测_48Python 时间序列 mk 趋势检验_算法_49分别表示趋势、季节性和剩余成分的掩码。在这里,Python 时间序列 mk 趋势检验_支持向量机_50 表示分离子网络,可以使用各种架构如CNN,RNN或者Transformer 来实现。利用这些掩码,全局特征 Python 时间序列 mk 趋势检验_异常检测_51

Python 时间序列 mk 趋势检验_Python 时间序列 mk 趋势检验_52

通过相应掩模的逐点乘积来实现。

解码器架构镜像编码器,采用分离器生成的屏蔽嵌入。这些嵌入通过线性变换 Python 时间序列 mk 趋势检验_支持向量机_53

Python 时间序列 mk 趋势检验_支持向量机_54

这里,Python 时间序列 mk 趋势检验_异常检测_55Python 时间序列 mk 趋势检验_Python 时间序列 mk 趋势检验_56 个解码器基 (decoder bases)。重构的趋势、季节性和余数,表示为 Python 时间序列 mk 趋势检验_算法_57Python 时间序列 mk 趋势检验_算法_58Python 时间序列 mk 趋势检验_支持向量机_59,是从它们各自的嵌入中导出的。输出时域信号通过重叠和相加运算(overlap-and-add operation)获得 Python 时间序列 mk 趋势检验_Python 时间序列 mk 趋势检验_60Python 时间序列 mk 趋势检验_支持向量机_61Python 时间序列 mk 趋势检验_异常检测_62

28.3.3 合成数据集

在异常检测中,现实世界的数据通常缺乏 STD 所必需的微妙趋势和季节性模式。为了使 TADnet 具有鲁棒的 STD 能力,我们构建了一个合成数据集。该数据集经过精心设计,具有复杂的季节性和趋势变化、异常值和噪声,以模拟真实环境,如图 1 所示。确定性和随机趋势都被用来构造趋势和季节成分,然后对其进行归一化,以保持零均值和单位方差。

趋势(Trend) 确定性趋势使用具有固定系数的线性趋势函数生成:Python 时间序列 mk 趋势检验_支持向量机_63,其中 Python 时间序列 mk 趋势检验_深度学习_64Python 时间序列 mk 趋势检验_Python 时间序列 mk 趋势检验_65 是可调参数。 随机趋势成分通过 ARIMA (0,2,0) 过程进行建模,并按如下方式整合到趋势模型中:
Python 时间序列 mk 趋势检验_深度学习_66 ,其中 Python 时间序列 mk 趋势检验_算法_67 是服从正态分布的白噪声项,满足 Python 时间序列 mk 趋势检验_算法_68

周期性(Seasonal) 确定性的季节性成分结合了各种类型的周期信号。它包括振幅、频率和相位随时间变化的正弦波,以及振幅、周期和相位各不相同的方波。

对于缓慢变化的随机序列,季节性成分由重复的周期组成一个缓慢变化的趋势系列 Python 时间序列 mk 趋势检验_支持向量机_69。 这个系列是由趋势生成算法生成的,以确保在周期之间平滑过渡。 每个周期都由周期 Python 时间序列 mk 趋势检验_异常检测_70 和相位 Python 时间序列 mk 趋势检验_支持向量机_71 唯一地刻画出来。 随机季节性分量因此被定义为 Python 时间序列 mk 趋势检验_深度学习_72

为了丰富数据集,我们对周期长度和振幅进行了一些微调,包括重新采样单个周期并对周期内的值进行缩放,以实现更多样化和泛化的信号分解。

余项(Remainder) 通过使用具有可调方差的白噪声过程来定义余项部分。

为了增强分解模型对异常值的鲁棒性并确保稳定的分解性能,我们按照文献 [4] 中概述的方法向合成数据集中注入了部分异常值。

28.3.4 两阶段训练策略(Two-Phase Training Strategy)

我们为TADnet提出了一个两阶段训练策略,以确保其在时间序列分解和异常检测中的有效性。

在第一阶段,TADnet 在合成数据集上进行预训练,重点是时间序列分解。相应的损失函数由下列公式给出:

Python 时间序列 mk 趋势检验_深度学习_73

这里,Python 时间序列 mk 趋势检验_深度学习_74Python 时间序列 mk 趋势检验_Python 时间序列 mk 趋势检验_75Python 时间序列 mk 趋势检验_Python 时间序列 mk 趋势检验_76 分别表示第 Python 时间序列 mk 趋势检验_支持向量机_77 维度的实际季节性、趋势性和残差分量,而 Python 时间序列 mk 趋势检验_深度学习_74Python 时间序列 mk 趋势检验_Python 时间序列 mk 趋势检验_75Python 时间序列 mk 趋势检验_Python 时间序列 mk 趋势检验_76

在第二阶段,使用一个真实的TAD数据集来微调TADnet。 这个阶段强调了在分解后准确重建原始时间序列,这是有效检测异常的关键要求。 该阶段的重点是整体重构精度的损失函数如下:

Python 时间序列 mk 趋势检验_算法_81

这里,Python 时间序列 mk 趋势检验_深度学习_82 表示在第 Python 时间序列 mk 趋势检验_支持向量机_77 维上的原始时间序列,Python 时间序列 mk 趋势检验_Python 时间序列 mk 趋势检验_84

28.4 源码分析

源码地址为:https://github.com/zhangzw16/TADNet/tree/main

这里只对项目各个 .py 文件的功能概述:

  • pot:
  • constants.py 主要用于配置和初始化一个时间序列异常检测任务的参数;
  • pot.py 用于评估时间序列异常检测模型的性能,包括采用Point-Onset (POT) 方法进行异常检测,并计算相关的评估指标。
  • spot.py 实现了 SPOT 、 biSPOT、dSPOT、bidSPOT 四个算法,在 pot.py 文件中使用。
  • src:
  • data.py 数据读取与格式转换等,用于处理音频数据的PyTorch自定义数据集和数据加载器。
  • loss.py 损失函数、损失的计算相关函数;
  • mask.py 该函数用于在给定数组arr中随机选择一个长度为len0的子数组,并将该子数组用零填充,然后返回填充后的数组和选择的子数组的起始和结束位置。
  • models.py 模型核心相关内容,应用循环神经网络(RNN)和Sepformer进行音频信号处理。
  • preprocess.py 主要实现了对指定目录下的.npy文件进行预处理的功能
  • separate.py 一个使用FaSNet_base模型进行时间序列分离的程序。
  • solver.py 类用于训练和验证深度学习模型。它接收数据加载器、模型、优化器和参数,然后在多个epoch上执行训练和交叉验证。训练过程中,每过一定epoch会调整学习率,并保存最佳验证性能的模型。_run_one_epoch方法处理单个epoch的训练或验证,包括前向传播、计算损失和(在训练时)反向传播。
  • test.py 测试类
  • train.py 一个命令行接口,用于使用FaSNet_base模型进行时间序列异常检测网络的训练。
  • utils.py 相关工具类
  • synthetic:合成数据
  • anomaly.py 用于生成包含异常子信号的序列。类初始化时接受两个参数:amplitude表示序列的振幅,默认为1;type表示异常类型,可选值为’point’、‘interval’、‘contextual’、‘collective’、‘shapelet’、‘noise’。类中的generate方法接受一个时间序列作为输入,并根据设定的异常类型,在时间序列中添加相应的异常子信号,最后返回生成的异常序列。
  • const.py 相关参数常量。
  • generate.py 生成具有给定信息的完整序列。
  • main.py 这段代码主要实现了从给定的pk_info信息中生成时间序列数据,并将其分为趋势、噪声、季节性和完整序列四类,然后将这些序列保存到指定的文件夹中。
  • noise.py 用于生成具有给定振幅的噪声序列
  • season.py 周期性相关代码
  • trend.py 趋势性相关代码
  • run.py: 执行入口

28.5 Ablation Study (消融学习)

论文中提出的Ablation Study是一种系统性的实验方法,用于评估模型或算法中各个组成部分对整体性能的贡献。通过有选择地移除或替换模型的部分组件(例如,在TADNet模型中的Separator、Decomposition模块或数据增强预训练步骤),并观察模型性能的变化,特别是使用F1分数作为评价指标,研究者能够量化每个部分的重要性。

在TADNet的Ablation Study中,进行了以下实验:

  1. w/o Sep:移除了模型中的Separator(分隔器),导致所有数据集上的F1分数显著下降,显示了Separator在区分和处理时间序列复杂模式中的关键作用。
  2. w/o Decomp:将分解模块(Ldec)替换为一个简单的重建模块(Lrec),导致性能降低,强调了季节趋势分解在异常检测任务中的有效性。
  3. w/o Augment:省略了在合成数据集上的预训练步骤,降低了模型在所有数据集上的表现,证明了预训练对于提升模型在真实世界数据上的表现至关重要。
  4. Iterative:采用迭代训练方法,在分解和异常检测任务之间交替进行训练,虽然在特定数据集(如WADI)上提高了F1分数至92.06%,但考虑到增加的计算成本,作者选择了预训练-微调范式作为主要方法,并认为迭代训练的进一步探索可以留作未来工作。

通过这些Ablation Study,研究者不仅验证了TADNet各组成部分的有效性,而且为模型的优化和调整提供了指导,同时也为读者展示了如何在自己的研究中实施类似的实验来深入理解模型内部机制和组件的功能。

28.5 本章总结

论文提出了一种名为TADNet的模型,用于有效识别时间序列中的异常。该模型通过将复杂的时间序列数据分解为季节性、趋势和残差三个组成部分来简化分析,并与各类异常关联,从而提升检测性能。

TADNet采用两阶段训练策略。首先,在合成数据集上进行预训练,该数据集包含了模拟的季节性、趋势和残差组件,以及故意注入的异常数据以增强模型鲁棒性。预训练阶段的损失函数旨在最小化每个分解组件(季节性、趋势和残差)的均方误差。其次,模型在真实世界的时间序列异常检测(TAD)数据集上进行微调,重点是精确重构原始时间序列,这对于有效异常检测至关重要。此阶段的损失函数关注于整体重构精度。

论文还介绍了合成数据集中各组成部分的生成方法,如确定性季节性成分结合了不同幅度、频率和相位的正弦波及方波,慢变随机序列的周期性趋势则通过特定算法生成以确保周期间平滑过渡。此外,为了丰富数据集并提高信号分解的多样性和泛化能力,对周期长度和振幅进行了微调。

论文可以参考的地方

  1. 端到端季节趋势分解(STD):TADNet利用季节趋势分解将时间序列拆解成季节性、趋势和残余三个部分,这有助于单独分析和理解每个部分的异常,简化了复杂时间序列的分析过程。
  2. 两阶段训练策略:首先在合成数据集上预训练模型以学习如何有效地分解时间序列,然后在真实世界的异常检测数据集上微调,平衡了有效分解与精确异常检测的需求。这种策略可以作为新算法设计中数据处理和模型优化的重要参考。
  3. 合成数据集生成:论文中详细介绍了一种合成数据集的生成方法,包括慢变随机序列、包含各种周期信号的季节性组件以及残差组件的白噪声过程,甚至在其中注入异常数据以增强模型的鲁棒性。这种方法可以用来为新算法设计提供高质量的训练数据,尤其是在缺乏足够标注的真实数据情况下。
  4. Ablation Study:(详情请参考原论文 4.1节 Ablation Study )通过对模型不同组件(如分离器、分解模块、数据增强步骤和迭代训练策略)的消融实验,论文揭示了每个部分对模型性能的重要性。在设计新算法时,可以借鉴这些发现来决定哪些组件是必不可少的,以及它们如何影响最终性能。
  5. Reconstruction-based Anomaly Detection:(前面提到的 Donut / Bagel / LOF-VAE 等都是这类算法)通过计算重构误差来检测异常,该方法简单直观且有效。模型预测的重构误差与实际异常区域高度相关,表明这种方法能准确识别异常同时减少误报。
  6. 可解释性:TADNet不仅提高了检测准确性,还提供了清晰的分解可视化,使得结果具有更强的可解释性。新算法设计时考虑增强模型的解释能力,有助于用户理解和信任检测结果。
  7. 适应多变量时间序列:尽管主要针对单变量时间序列设计,TADNet也扩展到了多变量场景。虽然在某些复杂多变量情况下可能面临限制,但其框架为处理更广泛的数据类型提供了基础。

希望能帮到各位小伙伴 ~ 万分感谢各位的点赞、评论与关注支持 ~

Smileyan
2024.05.20 00:17