USAD-UnSupervised Anomaly Detection on Multivariate Time Series一种基于自编码器的多元时间序列无监督异常检测

KDD 2020年的paper,被引141次

引言

为了解决Orange公司的IT系统自动监测异常行为所需传感器过多导致的基于专家的监督方法变慢或容易出错的问题,作者提出了一种基于自编码器AE的多元时间序列的无监督异常检测,且创新点在于受到了GANs的启发,因为作者认为基于编码-解码架构的对抗训练允许去学习“怎样去放大重建误差(在输入包含异常时)”。
论文的主要贡献可以总结如下:

  • 提出了一种基于多元时间序列的无监督异常检测方法,其中对抗训练是“外壳”,里面包含的是两个自编码器的架构,以此结合了AE和GAN的双重优点,同时互相弥补了缺点,最终获得了一个性能与当前SOTA相当、同时支持快速和节能训练的异常检测的方法。具体来说:

(1)单纯的AE训练目的只是在执行最好的重构,无法检测到接近正常数据的异常;而带有对抗训练时的USAD引入了放大重建误差效应,弥补了这一缺陷。
(2)单纯的对抗训练容易产生模式崩溃和不收敛问题,而经过AE的训练之后的对抗训练可以有一个有利的初始权重,就有利于对抗训练的稳定和快速收敛。
(3)USAD:结合了AE和GAN,基于AE的架构进行两阶段的对抗训练。

训练+检测架构

下图说明了训练阶段(左)和检测阶段(右)的信息流。
在这里插入图片描述
上图中均包含一个输入时间序列W,一个E,两个D;我们最想知道的应是如何进行对抗训练,以及对抗训练的目的是什么,为什么实施对抗训练之后可以检测到接近正常的异常了?

1. 输入

下面我们先来了解一下用于训练和检测的输入❀W是什么,以便把问题公式化:

  • W t _t t:我们首先用W t _t t来表示一个在 t 时刻长度为 K 的时间窗口,即

W t _t

### 关于八种异常检测算法的详细解释 #### 1. 监督异常检测 (Supervised Anomaly Detection) 监督异常检测依赖于已标注的数据集来区分正常和异常情况。通过这些标签,可以构建分类模型以预测新数据点的状态。常用的算法有逻辑回归、支持向量机和支持向量机变体如C-SVM、ν-SVM等,还有决策树及其集成版本随机森林。 ```python from sklearn.svm import SVC clf = SVC() clf.fit(X_train, y_train) predictions = clf.predict(X_test) ``` 这种类型的检测适用于拥有充足标记样本的情况[^2]。 #### 2. 无监督异常检测 (Unsupervised Anomaly Detection) 当缺乏足够的带标签数据时,则可采用无监督的方法来进行异常探测。这类方法利用了数据内在结构特性而不需额外的信息指导。典型代表包括k-means聚类、DBSCAN密度基空间聚类以及孤立森林(Isolation Forests),后者特别适合处理高维稀疏数据。 ```python from sklearn.ensemble import IsolationForest iso_forest = IsolationForest(contamination=0.1) y_pred = iso_forest.fit_predict(X) ``` 此方式能够有效应对未知类别或难以获取标签的情形。 #### 3. 半监督异常检测 (Semi-Supervised Anomaly Detection) 介于两者之间的是半监督模式,在这里仅有部分实例被赋予真值指示其状态;其余大部分保持未定。此类场景下常见的策略涉及自编码器(autoencoders)与生成对抗网络(GANs)相结合的形式——即所谓的“深度置信网”。 ```python import tensorflow as tf autoencoder = tf.keras.models.Sequential([ ... ]) history = autoencoder.fit(x_train_noisy, x_train, epochs=epochs, batch_size=batch_size, shuffle=True, validation_data=(x_val_noisy, x_val)) ``` 这种方法充分利用有限数量的手动标注资源提升整体效果。 #### 4. 在线异常检测 (Online Anomaly Detection) 在线环境下的挑战在于必须即时响应不断流入的新观测值,并及时调整内部参数适应变化趋势。为此设计了一系列增量更新机制,比如Hoeffding Trees(霍夫丁树)、Adaptive Resonance Theory Networks(ART神经网络),它们能够在不影响现有知识的前提下逐步纳入最新信息源。 ```python from skmultiflow.trees.hoeffding_tree import HoeffdingTreeClassifier ht = HoeffdingTreeClassifier() for i in range(n_samples): ht.partial_fit([X[i]], [y[i]]) ``` 该方案非常适合动态背景下连续监控任务的需求。 #### 5. 基于距离/相似度测量的距离型异常检测(Distance-based Anomaly Detection) 基于欧几里得或其他形式的距离测度计算个体间差异程度作为判断依据之一。LOF局部离群因子(Local Outlier Factor)便是其中一员,它衡量目标对象相对于周围邻居位置偏离平均状况的程度。 ```python from pyod.models.lof import LOF detector = LOF() detector.fit(X) scores_pred = detector.decision_function(X_test) ``` 这种方式直观易懂且易于实现,但在维度灾难面前可能遭遇瓶颈[^1]。 #### 6. 统计学基础的概率型异常检测(Statistical-based Anomaly Detection) 运用经典统计理论框架内建立假设检验流程,例如格鲁布斯准则(Grubbs' test)用于单变量集合中寻找极端偏差成员。对于多元情形则存在马氏距离(Mahalanobis Distance)这样的工具可供选用。 ```python from scipy.stats import chi2 def mahalanobis(x=None, data=None, cov=None): """Compute the Mahalanobis distance.""" x_minus_mu = x - np.mean(data) inv_covmat = sp.linalg.inv(np.cov(data.T)) left_term = np.dot(x_minus_mu, inv_covmat) mahal_dist = np.dot(left_term, x_minus_mu.T) return math.sqrt(mahal_dist) ``` 上述过程严格遵循数理推导路径确保结论可靠性。 #### 7. 时间序列特定的时间序列异常检测(Time Series-specific Anomaly Detection) 考虑到顺序排列特点而专门定制化的解决方案,像ARIMA差分整合移动平均自回归模型(Autoregressive Integrated Moving Average Model)就专攻于此领域。近年来兴起的一些研究还探索了如何借助LSTM长短记忆单元(Long Short-Term Memory Units)捕捉长期依赖关系从而改善预报精度。 ```python model = Sequential() model.add(LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1],1))) model.compile(optimizer='adam', loss='mean_squared_error') model.fit(X_train, y_train, epochs=1, batch_size=1, verbose=2) ``` 这有助于更精准地把握随时间演变规律并提前预警潜在风险事件的发生可能性[^4]。 #### 8. 对抗性训练增强的异常检测(Adversarial Training-enhanced Anomaly Detection) 引入GAN架构理念创造一对相互对立又彼此促进的学习实体:一个是负责生成看似真实的伪造品的生成器(generator),另一个则是试图分辨真假混杂输入流判别器(discriminator). USAD就是这样一种创新性的尝试,旨在克服传统单一视角局限性的同时提高泛化能力。 ```python class Generator(tf.keras.Model): def __init__(self): super().__init__() ... class Discriminator(tf.keras.Model): def __init__(self): super().__init__() ... generator_optimizer = tf.keras.optimizers.Adam(1e-4) discriminator_optimizer = tf.keras.optimizers.Adam(1e-4) checkpoint_prefix = os.path.join(checkpoint_dir, "ckpt") checkpoint = tf.train.Checkpoint(generator_optimizer=generator_optimizer, discriminator_optimizer=discriminator_optimizer, generator=generator, discriminator=discriminator) ``` 如此这般既强化了系统的稳健性和灵活性,也为后续改进留下了广阔的空间。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值