《异常检测——从经典算法到深度学习》17 基于 VAE-LSTM 混合模型的时间异常检测

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

相关:

17. 基于 VAE-LSTM 混合模型的时间异常检测

论文题目:Anomaly Dection For Time Series using VAE-LSTM hybrid model
CCF B类会议 ICASSP 2020
论文下载:源地址 | 蓝奏云地址2
论文翻译 | 源码地址

17.1 论文概述

论文提出一种 VAE 与 LSTM 的组合模型,并通过实验证明自己的模型是可靠的,有效的。

这是一篇小论文(共5页,参考文献占1页),简单精悍类型的,值得一读。

我们需要重点关注作者是如何结合这两个模型、以及实验是怎么完成的。

17.2 如何结合VAE与LSTM两个模型

在这里插入图片描述
从上往下看,首先是一个原始的时间窗口,接下进行编码(VAE 的 encoder),得到的是低维度的向量集。把它们内嵌(embedding)到 LSTM 中,用来预测下一个窗口的内嵌(embedding)。再进行 解码(VAE的Decoder),得到的是重构的窗口。

从左往右看,首先 异常检测值=预测误差。中间是整个网络结构,右边是对每一层的解释。

总结一下,变分自编码的隐变量(即图片中的embedding)作为LSTM的输入,用来预测下一个隐变量(embedding),最后将预测误差作为异常值。

2024.05.31 补充 ,感谢 所有小伙伴们的评论支持 ~

这里我们再梳理一下 embedding 的作用(将VAE的编码结果作为LSTM的输入embedding,并将LSTM的输出结果(预测结果)输入到 VAE 中,经过解码后得出结果 Reconstructed Window。参考论文提出的主要贡献,大概可以确定这样做的好处:

  1. 起到降维的作用,减少计算复杂度;
  2. 增强鲁棒性:这个与降维也是相关的,维度降低在一定程度上可以增强鲁棒性。
  3. 提高异常检测的准确性。通过对 embedding 序列进行建模,LSTM 可以更准确地预测未来的 embedding,并通过与实际的 embedding 进行比较来检测异常。当 LSTM 无法准确预测未来的 embedding 时,表示当前时间点可能存在异常,这种异常检测机制结合了局部和全局的信息,提高了检测的准确性。

17.3 如何训练VAE-LSTM模型

在这里插入图片描述
图片左侧不含异常数据,用于训练。

训练VAE的过程没有做修改,使用的是默认的ELBO作为损失函数。

训练LSTM的过程与其他LSTM一样,希望训练后的模型具有很好的预测能力。

[ e ^ t 2 , ⋅ ⋅ ⋅ , e ^ t k ] = LSTM ( [ e t 1 , ⋅ ⋅ ⋅ , e t k − 1 ] ) (1) [\hat{e}_t^2, \cdot\cdot\cdot, \hat{e}_t^k] = \text{LSTM}([e_t^1,\cdot\cdot\cdot,e_t^{k-1}]) \tag{1} [e^t2,,e^tk]=LSTM([et1,,etk1])(1)

这个地方省略了LSTM的原理,损失函数,就把它当成一个预测回归模型即可。

17.4 VAE-LSTM如何进行异常检测

完成训练以后,VAE-LSTM已经具备很好的预测能力,注意是预测下一个窗口的对应的VAE的隐变量,并根据这个隐变量,使用训练好的VAE进行重构。

w ^ t − ( k − i ) × p = Decoder ( e ^ t i ) ,     i = 2 , . . . , k . (2) \hat{w}_{t-(k-i)\times p}=\text{Decoder}(\hat{e}_t^i), \ \ \ i=2,...,k. \tag{2} w^t(ki)×p=Decoder(e^ti),   i=2,...,k.(2)

对于重构的窗口,可以定义一个函数 d t d_t dt,通过总结 w t w_t wt 的预测误差来评估是否异常。

d t = ∑ i = 2 k ∥ w ^ t − ( k − i ) × p − w t − ( k − i ) × p ∥ (3) d_t= \sum_{i=2}^k \left\| \hat{w}_{t-(k-i)\times p} -w_{t-(k-i)\times p} \right\| \tag{3} dt=i=2k w^t(ki)×pwt(ki)×p (3)

然后根据实际情况定义一个阈值 θ \theta θ ,将 d t d_t dt 的输入转换成0或者1的异常标志。

17.5 实验部分

17.5.1 数据集与实验效果

论文使用了五个数据集,对比实验包括 VAE与ARMA。
在这里插入图片描述
具体的数据集可以在 github 源码上看到,具体地址是:https://github.com/lin-shuyu/VAE-LSTM-for-anomaly-detection/tree/master/datasets

17.5.2 使用源码

源码地址

步骤1 克隆源码到本地。

$ git clone https://github.com/lin-shuyu/VAE-LSTM-for-anomaly-detection

步骤 2 查看一下本地是不是安装了 tennsorflow,并看一下版本。

$ pip show tensorflow

如果安装了高版本的tensorflow,尽量降低到1.x,避免后面出现问题。需要注意的是如果出现如下问题是python版本太高而导致的,需要降低python版本后再安装 tensorflow 1.x ,我环境下python的版本是3.7,安装的tensorflow是 1.15.4
在这里插入图片描述
确保tensorflow1.x安装完成以后,就可以准备跑代码了。

步骤4 安装其他所需依赖

$ cd VAE-LSTM-for-anomaly-detection
$ pip install -r requirements.txt

步骤5 跑源码提供的测试代码。

注意首先要跳转到 code 目录下,然后执行以下的 train.py 脚本。

$ cd code
$ python train.py --config NAB_config.json

需要大概几分钟的时候,训练完成以后,再打开源码提供的 NAB-anomaly-detection.ipynb,因此需要环境安装了 anaconda,打开后,就可以Restart & Run All 即可。

在这里插入图片描述
在这里插入图片描述
运行后会生成一个文件夹,experiments 训练与测试均已完成。
在这里插入图片描述

为了查看效果,可以考虑运行一下项目中自带的 ipynb 文件,如下图所示:

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

17.6 再次实验,更加详细的记录

考虑到不少小伙伴遇到了环境安装的问题,这里我重新实验一次,并从头到尾(不包括cuda等等这些配置)的环境安装过程。

这里我花了一些人民币租用了云GPU,但小伙伴们只要保证环境一致即可,不一定也需要租用云GPU哈。此外,由于我们这里不添加广告,所以也不会介绍哪家的云 GPU,抱歉。

17.6.1 环境说明

  • Python 3.7
  • CUDA 11.1
  • pip

关于 tensorflow 我们先不用安装,可以直接根据这个源码的 requirements.txt 文件来安装依赖。

17.6.2 详细过程

步骤一: 下载源码并上传到 jupyter notebook 平台上,并解压源码压缩包;
在这里插入图片描述

步骤二: 命令行 cd VAE-LSTM-for-anomaly-detection 并通过命令 pip install -r requirements.txt 安装依赖。
在这里插入图片描述
在这里插入图片描述
步骤三: 命令行跳转到 code,并开始训练。

$ cd code
$ python train.py --config NAB_config.json

如果遇到错误提示 TypeError: Descriptors cannot not be created directly. 则需要指定 protobuf 的版本并安装。

pip install protobuf==3.19.0

如下图所示:
在这里插入图片描述
步骤四: 等待训练完成。

如图所示,如果没有GPU,则使用CPU训练也是可以的。
在这里插入图片描述
后面的内容和上面介绍的就基本一致了。

需要注意的是,如果发现自己的cuda版本与 requirements.txt 不符的话,就把小版本删除,使用大版本即可,比如 1.15 。

此外,如果因为 GPU 用不了就不要浪费太多时间了,还不如看看源码,理解大致思路。

17.7 环境搭建遇到问题

很多小伙伴搭建环境时遇到各种各样的问题,毕竟每个人的机器的环境都会有一些差异,一般而言包括以下几种情况:

  • 无 python 环境;
  • python 版本不符合(一般3.6/3.7就够了);
  • tensorflow 未正确安装;
  • tensorflow 版本不符;很多论文用的仍然是低版本的 tensorflow;
  • 其他问题,文件找不到、缺某某依赖包,等等。

很难找到一个教程保证所有人都能正常运行,但是希望小伙伴们多一些耐心,多查查资料,与其他小伙伴们交流交流。当然也可以邮箱联系我 root@smileyan.cn 或者在下方留言,一定回复~

但最主要的应该还是得靠自己学习、查资料、DEBUG,抱歉~

17.8 总结

小论文言简意赅,主要收获应该包括:

  • 了解如何做一个组合模型;
  • 跑通源码后可以基于这个基础上修改,实现一些自己的算法;
  • 数据集在git仓库中提供,可以拿过来用。

Smileyan
2022.3.28 15:42

感谢您的 点赞收藏评论关注,您的支持是我继续更新的动力!

  • 32
    点赞
  • 152
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 83
    评论
基于ARIMA-LSTM模型是将传统时间序列分析方法ARIMA和深度学习模型LSTM结合起来,用于时间序列预测。ARIMA模型是一种常用的传统统计模型,通过对时间序列的自相关和移动平均进行拟合,来捕捉时间序列的趋势和季节性。LSTM模型是一种循环神经网络,能够学习时间序列数据中的长期依赖关系。 ARIMA-LSTM模型的基本思想是,在ARIMA模型中先对时间序列进行预处理和特征提取,得到ARIMA模型的拟合结果,然后将其作为LSTM模型的输入,继续进行进一步的特征学习和预测。这种模型结合了传统统计模型深度学习的优势,能够充分利用ARIMA模型的长期依赖建模能力和LSTM模型的非线性拟合能力。 在具体实现上,首先使用ARIMA模型时间序列进行建模和预测,得到ARIMA模型的预测结果。然后,将ARIMA的预测结果和原始时间序列作为LSTM模型的输入,通过LSTM网络进行特征学习和预测。最后,将LSTM模型的预测结果与ARIMA模型的预测结果进行融合,得到最终的预测结果。 ARIMA-LSTM模型在预测时间序列数据上有一定的优势,能够克服ARIMA模型对线性假设的限制,更好地适应非线性和复杂的时间序列。然而,在具体应用中,仍需根据具体问题和数据集的特点,选择合适的模型和参数,并且进行合理的模型评估和验证,以确保预测结果的准确性和稳定性。
评论 83
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

smile-yan

感谢您的支持!

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

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

打赏作者

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

抵扣说明:

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

余额充值