《异常检测——从经典算法到深度学习》13 MAD: 基于GANs的时间序列数据多元异常检测

本文主要是介绍《异常检测——从经典算法到深度学习》13 MAD: 基于GANs的时间序列数据多元异常检测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

  • 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: 通过自监督对比学习识别软件变更中的错误

相关:

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

重要说明

感谢小伙伴的提醒,从这一篇开始为了突出重点,将翻译部分全部移到自己的 个人博客 中( 5 M 带宽并且配置了 CDN 的服务器应该不会太慢,就是有点伤钱)。

所以接下来的内容将是简单明了的部分,一般而言会提到几个大家都关心的问题:

  • 这是什么论文?值得看吗?一般而言节选的论文不一定是很厉害的会议或者期刊上的,而是一些相对基础一些的,容易理解的,甚至比较简单的。因为个人认为读那种非常复杂高深的论文参考意义不一定很大。
  • 论文算法开源吗?很抱歉大多数论文不开源,但是我会尽量找一些开源的论文。
  • 论文用到的是什么数据集?数据集这个问题非常难以解决,但是论文提到的也会在下面记下。
  • 论文最最最主要在讲什么?一般论文有个总体思路,算法有个最主要的模型等等。这里希望自己能够概括一下这部分内容。有必要的话,我也会制作成 PPT 的形式和大家交流。
  • 论文的优缺点。

13. MAD: 基于GANs的时间序列数据多元异常检测

2018 Anomaly Detection with Generative AdversarialNetworks for Multivariate Time Series
论文下载以及源码地址:MAD-GANs 翻译
期刊:Lecture Notes in Computer Science(普刊)
引用索引 bib

13.1 简要概述论文内容

13.1.1 核心思想与方法

论文提出了一种新的基于无监督GAN的异常检测 (GAN- AD) 方法,该方法通过建模多个时间序列之间的非线性关联,并基于训练好的 GAN 模型检测异常。
论文图1
上图分为训练和检测两部分,这两部分之间的联系就是隐变量。这个与 VAE 异常检测类似,把数据特征存储在隐变量中,检测的时候隐变量则会派上用场。因为生成模型本身是不能直接输出与异常有线性关系的结果的。

继续看上图左边部分,这个是典型的 GAN 模型,GAN 模型的判别器与生成器 “相爱相杀”,生成器想方设法欺骗判别器而判别器又不断提高自己的识别能力。论文在 GAN 标准模型上添加了 LSTM 与 RNN。

继续看上图右边部分,异常检测部分首先从测试数据开始,将样本数据与隐变量空间建立映射关系,然后再把映射结果作为输入交给 GAN 的生成器,注意看上面的虚线,是指这个生成器是训练得到的。使用生成器对隐变量输入进行重构,然后与测试数据进行计算得到 Residual Loss ,同样将测试数据直接交给判别器进行计算得到 Discrimination Loss ,最后将这两个损失结合,得到最终的检测结果。

13.1.2 主要贡献

  • 提出了一种基于 GAN 的无监督异常检测方法,用于检测具有网络传感器和执行器的复杂多进程网络物理系统的异常(网络攻击)。
  • 使用多个时间序列对GAN模型进行训练,采用LSTM-RNN (Long - Short - Term-Recurrent Neural Networks, LSTM-RNN) 捕获时间相关性,从图像生成域自适应生成GAN进行时间序列生成。
  • 均匀使用高维的正规序列训练GAN模型区分真伪,同时从特定的潜在空间重构测试序列;
  • 将训练好的鉴别器计算的鉴别损失与重构序列与真实测试序列之间的残差损失(训练好的鉴别器与生成器同时使用)结合起来检测高维时间序列中的异常点,在具有六级的复杂安全水处理(SWaT)系统中,该方法在检测网络攻击导致的异常方面优于现有方法。

13.1.3 论文算法

论文算法:LSTM-RNN-GAN-based Anomaly Dection Strategy。
算法图
训练时

  • 对于第 k 个批次训练数据:
    • 从隐变量空间中生成样本 Z = { z i , i = 1 , 2 , . . . , m } ⇒ G R N N ( Z ) Z=\{z_i, i=1,2,...,m\} \Rightarrow G_{RNN}(Z) Z={zi,i=1,2,...,m}GRNN(Z)
    • 进行判别操作 X = { x i , i = 1 , 2 , . . . , m } ⇒ D R N N ( X ) X=\{x_i,i=1,2,...,m\} \Rightarrow D_{RNN}(X) X={xi,i=1,2,...,m}DRNN(X)
    • G R N N ( Z ) ⇒ D R N N ( G R N N ( Z ) ) G_{RNN}(Z)\Rightarrow D_{RNN}(G_{RNN}(Z)) GRNN(Z)DRNN(GRNN(Z)) 即进行对抗训练
    • 通过梯度下降来最小化 D l o s s D_{loss} Dloss 更新判别器的参数: min ⁡ 1 m ∑ i = 1 m ( − log ⁡ D R N N ( x i ) − log ⁡ ( 1 − D R N N ( z i ) ) ) \min \frac{1}{m}\sum_{i=1}^m(-\log D_{RNN}(x_i)-\log(1-D_{RNN}{(z_i)})) minm1i=1m(logDRNN(xi)log(1DRNN(zi)))
    • 通过梯度下降来最小化 G l o s s G_{loss} Gloss 更新判别器的参数: min ⁡ ∑ i = 1 m log ⁡ ( − D R N N ( G R N N ( z i ) ) ) \min \sum_{i=1}^m \log (-D_{RNN}(G_{RNN}(z_i))) mini=1mlog(DRNN(GRNN(zi)))。(注: 这个地方应该是指更新生成器的参数。应该是论文书写错误。
    • 记录当前迭代中生成器与判别器的参数。
  • 本次循环建立测试数据与隐变量之间的映射关系
  • 计算残差(residuals): R e s = ∣ X t e s − G R N N ( Z k ) ∣ Res = |X^{tes}-G_{RNN}(Z^k)| Res=XtesGRNN(Zk)
  • 计算判别结果: P r o = D R N N ( X t e s ) Pro=D_{RNN}(X^{tes}) Pro=DRNN(Xtes)
  • 计算异常分数: S = R e s + P r o S=Res+Pro S=Res+Pro

13.1.4 其他部分

算法这一块儿的内容大致如上,其他部分内容比如 Anomaly Detection Framework 中提到的使用 PCA 建立映射关系比较简单,而其他部分比如根据阈值进行异常打标实在是有凑公式凑字数的嫌疑。

13.2 实验数据与结果

实验使用的是 SWaT 数据集,可以前去 https://itrust.sutd.edu.sg/ 进行申请,一般填写学生邮箱就能申请成功,但是给的是谷歌云盘的资源地址,并且数据集非常大,一般是几个 G 起。

SWaT 数据是一个高维数据(共有51个维度),光从谷歌云下载下来就需要花费大量的时间。因此,不建议使用这个数据集。但是如果环境允许可以申请一下,了解一下。

论文源码https://github.com/LiDan456/MAD-GANs 提到可以考虑跑一下 KDD CUP 数据,数据集附加在源码文件夹中,解压即可用。并且已经是进行一些处理后的,比如不考虑异常的类型,只要是异常就把标签设置为 1 等。

具体步骤:

环境说明

  • tensorflow 1.x
  • keras:1.x

克隆项目

git clone https://github.com/LiDan456/MAD-GANs.git

解压文件夹

需要注意解压后的是这样的,不要添加额外的路径:
在这里插入图片描述
直接运行

python RGAN.py --settings_file kdd99 

如果是使用 notebook 的话前面添加感叹号即可,具体效果如下:
在这里插入图片描述
对测试数据进行异常检测

 python AD.py --settings_file kdd99_test

在这里插入图片描述
同样需要一些时间,输出的结果大致包括:

在这里插入图片描述
常见问题

一般情况下肯定都会出问题,莫方莫烦,逐个解决即可。

首先确保tensorflow版本

一般情况下 1.x 即可。我自己的环境是 1.15.4

在这里插入图片描述
其次是 keras 的版本

一般也是 1.x 即可,我的环境是 1.1.2
在这里插入图片描述
scipy报错

运行训练的时候报错。具体的报错内容是 ModuleNotFoundError: No module named 'scipy.misc.pilutil'

查了一下官网,这个库是旧版本的,所以方法就是降低版本或者不使用这个库,我们选择不使用这个库,所以前去源码指定位置进行一波注释即可。

具体的文件地址是 data_utils.py ,其中的第14行,from scipy.misc.pilutil import imresize 根本后面就没用到,所以直接注释掉就好了。

numpy报错

在进行测试的时候,看到的报错。具体报错内容是 ValueError: Object arrays cannot be loaded when allow_pickle=False

方法也非常简答,把 model.py 中所有 np.load 都添加一个参数以及值为 True。如图所示:

在这里插入图片描述
在这里插入图片描述

linux解压7z文件

如果和我一样使用的是云服务器跑代码的话,或者本身自己用的就是linux系统的话,希望通过命令行解压也非常简单。安装方法与解压请 参考。

p7zip x data.7z

需要多长时间执行完

跟自己的机器性能有关,一般情况下……很久。叫上你的小伙先去吃顿饭吧。

在这里插入图片描述
运行时间太长

模型的训练需要很长时间(约半个小时),而模型的测试却需要更长的时间,简直可怕,我居然非常有耐心让它跑完了(睡觉第二天出结果)。

在这里插入图片描述
约 4.5 小时。所以如果希望早点结束运行的话,需要修改源码文件夹中的配置文件。experiments/settings/kdd99_test.txt 找到这个文件中的 num_epochs ,默认是 100 修改为 10 或者更小即可。

其他错误

我没有遇到其他问题,如果有遇到其他问题请在后面留言。

13.3 论文的优缺点

个人认为最大的优点就是开源,让大家可以跑一下玩一下了解一下,说不定也写到自己的论文的 REFERENCE 中。

其次论文相对而言比较简单,没有高深的数学理论和复杂的推导公式。

还有很不错的地方在于提供数据集让大家解压即可使用,这一点必须给作者以及作者团队点赞。

缺点就是凑字数的嫌疑太大了,比如 f1-score 的计算公式也写到论文中而且还算是5个公式是不是有点不太好,而且在算法中更新判别器和生成器的时候那个地方应该是存在错误的,两个地方都是更新判别器参数是非常不科学的。

但总体而言虽然这只是一个普刊上的论文,但是还是值得读一下,跑一下代码,了解一下的。如果觉得作者写得可以的话也请前去 github 点星星吧。自己的论文也可以考虑引用一下。作为对比实验之类的。

13.4 致谢

不知不觉这方面的博客写了这么长时间了,存在很多很多问题,也有不少小伙伴留言与私信交流这方面的内容,对我也有一些帮助,感谢!

如果有这方面的疑问欢迎留言讨论!


感谢 您的 阅读、点赞、收藏评论 ,别忘了 还可以 关注 一下哈,感谢 您的支持!

Smileyan
2021.8.5 17:02

这篇关于《异常检测——从经典算法到深度学习》13 MAD: 基于GANs的时间序列数据多元异常检测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/326509

相关文章

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

C#自动化实现检测并删除PDF文件中的空白页面

《C#自动化实现检测并删除PDF文件中的空白页面》PDF文档在日常工作和生活中扮演着重要的角色,本文将深入探讨如何使用C#编程语言,结合强大的PDF处理库,自动化地检测并删除PDF文件中的空白页面,感... 目录理解PDF空白页的定义与挑战引入Spire.PDF for .NET库核心实现:检测并删除空白页

Python异常处理之避免try-except滥用的3个核心原则

《Python异常处理之避免try-except滥用的3个核心原则》在Python开发中,异常处理是保证程序健壮性的关键机制,本文结合真实案例与Python核心机制,提炼出避免异常滥用的三大原则,有需... 目录一、精准打击:只捕获可预见的异常类型1.1 通用异常捕获的陷阱1.2 精准捕获的实践方案1.3

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda