(四)MAD-GAN: Multivariate Anomaly Detection for Time Series Data with Generative Adversarial Networks

内含动画的PPT已经上传,可以在我上传的资源里看到,可免费下载

论文链接:https://arxiv.org/pdf/1901.04997.pdf
论文代码:https://github.com/LiDan456/MAD-GANs
本文一个大的贡献是开源了两个数据集
1、The Secure Water Treatment (SWaT)
2、The Water Distribution (WADI)

本篇论文“MAD-GAN:利用GAN对时间序列数据进行多元异常检测”,发表于2019ICANN上,文章主要围绕”异常检测+多元时间序列+网络入侵+GAN“展开,以下是我这几天阅读该篇文章的收获,其中,模型及结构我自己做了一个动画版,动画版我用了很久的时间去理顺作者的思想做出来的,能够更直观明确地表现出该模型的流程,但是我还不太清楚怎么怎么将动画展示在博客中,后期如果学会我会及时更新,如果有小伙伴着急需要,也可以私信我,对文章理解不到位的地方,也请各位小伙伴指正,共同学习进步!

本文背景

现实世界中的信息物理融合系统(Cyber-Physical Systems),如智能建筑、工厂、发电厂、数据中心等,变得越发巨大和复杂。通常会安装大量的传感器来监测系统的运行状态并检测异常,运维人员从而发现潜在的安全隐患并采取必要的措施。传感器通常生成的是大量的多变量的时间序列,因此本文是基于多变量时间序列的异常检测。异常检测就是找出和系统中正常行为的状态不一致的时间点。通常由于缺乏有标记的数据,异常检测通常是当作无监督的机器学习任务。

本文贡献

(1)提出了基于生成对抗网络(GAN)的多变量时间序列异常检测模型。
(2)以 LSTM 为基本模型来捕获时间上的依赖关系,并将其嵌入到 GAN 的框架中。
(3)同时利用 GAN 的生成器和判别器来检测异常,利用判别器得到判别损失,利用生成器得到重建的损失。

一、论文概括
  1. 研究对象
  2. 目标
  3. 方法
  4. 结论

在这里插入图片描述

二、相关的研究工作
  1. 异常检测
  2. MAD-GAN在这里插入图片描述
三、作者的研究方法
  • 模型及分析
  • 子序列的形成
  • DR评分
  • 算法流程
  • 两个CPS数据集介绍
  • 模型相关参数设置
  • 评测指标
  • 实验结果及比对
    在这里插入图片描述
    关于这个模型的理解,我说说我个人的想法,看似没什么,就是一个GAN模型,但是真正每一步去理解它的时候,总感觉有些地方理解的不透彻,怎么把这个模型的原理搞清楚,并且能够清晰地解释给别人听,让别人也能听明白并理解这个模型,我花了较长时间去思考,某天深夜,想喝奶茶,突然灵机一动,奶茶的例子能够解释这个模型。

(1)为了理解模型的每一块,花了很长的时间做了上面这张图的动态PPT,PPT会跳转出来该模型的怎么运行的,通过动画更能清楚明白地去理解,建议大家先下载定位到这一页再看下面的文字描述解释。

(2)首先分成两个部分,训练阶段+异常检测阶段

  • 训练阶段,看成是对奶茶店的新入职的员工进行培训,让她具备制作奶茶的技能;
  • 异常检测阶段,看成新员工通过培训,去上岗给顾客做奶茶,顾客的反馈就是检测

(3)具体理解

角色:制作奶茶新员工A(Generator)+品尝奶茶新员工B(Discriminator)+奶茶制作清单Random Latent Space

- 训练阶段

角色:制作奶茶新员工A(Generator)+品尝奶茶新员工B(Discriminator)+奶茶制作清单Random Latent Space

  • 首先新员工A(Generator生成器,做奶茶的人)进入培训阶段,首先会拿到一份奶茶制作清单Random Latent Space(可以看成一点点他们家所有饮品的列表)——>新员工需要根据所获得的这份清单去练习制作奶茶(生成样本)——>员工A将制作出来的奶茶给另一位新员工B(Discriminator)去判定自己制作的这杯奶茶怎么样——>B因为也是刚入职,所以她凭借自己品过的奶茶(训练样本)的少许经验去给A提出修改意见(Score)——>A收到修改意见继续努力进步,同时B也在不断地提高自己的鉴品能力——>在反复进行的过程中,A,B都满足了“一点点公司”上岗要求。

此时场景从幕后转换到幕前,A,B上岗啦!!

- 异常检测阶段

角色:制作奶茶新员工A(Generator)+品尝奶茶新员工B(Discriminator)+奶茶制作清单Random Latent Space+顾客下单饮品(测试样本,测试样本中的订单中有一点点,Coco,星巴克,鹿角巷等,正常的订单是一点点,其它的视为异常)

  • AB开始上班啦!有顾客开始点单啦!但是顾客点单的方式并不完全中规中矩,比如,红茶玛奇朵,顾客会说成玛奇朵(订单是一点点的,匹配度高,正常);但是会有顾客说我要一杯香草榛果拿铁(订单是星巴克家的,匹配度低,异常)
  • 检测正常:A收到订单(测试集),顾客说要波霸奶茶,波霸奶茶被映射到Random Latent Space(一点点的菜单里能找到)——>A对应找到波霸奶茶,顾客订单和菜单匹配度100%——>根据制作出来波霸奶茶——>顾客拿到做好的奶茶与自己的订单比较——>一致,重构损失0,并且旁边的B在监督的过程中观察到A是根据菜单里做的,匹配,判别损失0——>这个订单正常
  • 检测异常:A收到订单(测试集),顾客说要香草榛果拿铁,香草榛果拿铁映射到Random Latent Space(一点点的菜单里没有找到)——>A没有找到100%匹配的,根据最高相似度找到香草奶茶,制作出香草奶茶——>顾客拿到做好的奶茶与自己的订单比较——>不一致,重构损失大,原来香草榛果拿铁是星巴克的,一点点没有,只好按照最高匹配度找到一杯和香草榛果拿铁差不多的饮品制作——>这个订单异常

在这里插入图片描述

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

  • 33
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 29
    评论
根据提供的引用内容,Mad-Gan是使用LSTM作为生成器和判别器的GAN模型,用于异常检测。由于没有提供具体的代码,以下是一个Mad-Gan的异常检测代码的示例: ```python import numpy as np import tensorflow as tf from tensorflow.keras.layers import Input, Dense, Reshape, LSTM, Dropout from tensorflow.keras.models import Model from tensorflow.keras.optimizers import Adam from tensorflow.keras import backend as K # 定义生成器模型 def build_generator(latent_dim, n_features): # 输入层 input_layer = Input(shape=(latent_dim,)) # 将输入转换为3D张量 reshaped_input = Reshape((1, latent_dim))(input_layer) # LSTM层 lstm_layer = LSTM(100, activation='relu')(reshaped_input) # Dropout层 dropout_layer = Dropout(0.2)(lstm_layer) # 输出层 output_layer = Dense(n_features)(dropout_layer) # 定义模型 model = Model(input_layer, output_layer) return model # 定义判别器模型 def build_discriminator(n_features): # 输入层 input_layer = Input(shape=(1, n_features)) # LSTM层 lstm_layer = LSTM(100, activation='relu')(input_layer) # Dropout层 dropout_layer = Dropout(0.2)(lstm_layer) # 输出层 output_layer = Dense(1, activation='sigmoid')(dropout_layer) # 定义模型 model = Model(input_layer, output_layer) return model # 定义GAN模型 def build_gan(generator, discriminator): # 冻结判别器的权重 discriminator.trainable = False # 定义GAN模型 gan_input = Input(shape=(latent_dim,)) x = generator(gan_input) gan_output = discriminator(x) gan = Model(gan_input, gan_output) # 编译GAN模型 gan.compile(loss='binary_crossentropy', optimizer=Adam(lr=0.0002, beta_1=0.5)) return gan # 定义损失函数 def custom_loss(y_true, y_pred): mse = K.mean(K.square(y_pred - y_true), axis=1) return mse # 加载数据 data = np.load('data.npy') # 定义超参数 latent_dim = 5 n_features = data.shape[1] # 构建生成器和判别器模型 generator = build_generator(latent_dim, n_features) discriminator = build_discriminator(n_features) # 构建GAN模型 gan = build_gan(generator, discriminator) # 训练GAN模型 for epoch in range(epochs): # 生成随机向量 random_latent_vectors = np.random.normal(size=(len(data), latent_dim)) # 生成异常数据 generated_data = generator.predict(random_latent_vectors) # 将异常数据和真实数据合并 X = np.concatenate([data, generated_data]) # 为真实数据和异常数据创建标签 y = np.zeros(2 * len(data)) y[:len(data)] = 1 # 训练判别器 discriminator.trainable = True discriminator.train_on_batch(X, y) # 训练生成器 noise = np.random.normal(size=(len(data), latent_dim)) y2 = np.ones(len(data)) discriminator.trainable = False gan.train_on_batch(noise, y2) # 使用生成器生成异常数据 random_latent_vectors = np.random.normal(size=(len(data), latent_dim)) generated_data = generator.predict(random_latent_vectors) # 计算异常数据的损失 loss = custom_loss(data, generated_data) # 输出异常数据的损失 print('Loss:', loss) ```
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是肉球哇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值