1 论文信息
名称:A Deep Neural Network for Unsupervised Anomaly Detection and Diagnosis in Multivariate Time Series Data
出处:AAAI19
下载地址:https://arxiv.org/abs/1811.08055
原作者代码:https://github.com/7fantasysz/MSCRED
2 论文介绍
2.0 研究背景
时间序列异常检测发现,一般是解决一个这样的问题:对于一串时序数据,比如传感器采集空调的能耗,每分钟采集一次,采集了1000分钟,想要找出这1000个点中,哪一个点是异常的。那么什么样的点算是异常的呢?异常通常分为以下两种:一种是缺失的数据,这没啥好检测的;一种是和周围明显不一样的,比如说一堆都是-1到1之间数,忽然来了个1000,那这个1000就算异常,这种一般是定义一个阈值,再定义一个滑动窗口,计算滑动窗口内的均值,如果当前点的值减去均值和均值的比值超过了指定阈值,就将其判断为异常点。在的异常检测算法一般针对于后面这种数据。
用过的方法很多,可以大致分为两大类,一类是监督学习的,其实就是一个二分问题,用一下各种机器学习里的分类器,像SVM、贝叶斯啥的就行,其实没啥可以做的;而现实世界中,其实有标签的数据是远小于无标签的数据,所以一般异常检测做的都是无监督或者半监督的。一般的思想有两种,一种就是对原数据进行变换,比如傅立叶变换啊,小波变换啊等等,这样想让原来不是那么明显的异常点变得比较尖锐明显,从而很容易和周围的正常点区分开,从而可以检测异常。另外一种是想办法使用正常的时序数据,把原来的时间序列的模式学出来,重构一个时间序列出来,基于VAE、基于GAN、基于LSTM都行,那么对于测试数据,输入模型以后,得到一个重构的时间序列,如果测试数据和重构的时间序列相差太远了,就认为是异常。其实这样也不能算完全的无监督,因为训练的时候,用的都是正常数据,所以只能算半监督。
2.1 研究问题
对于多个时间序列的异常发现和异常诊断。有30个传感器,每隔1分钟采集一次,采集了10000分钟的数据,那么输入就是一个30 * 10000的矩阵。对于这样的数据,想找出对于时刻T,有没有传感器发生异常,如果有的话,是哪一个传感器造成的。
这个问题和常用的时间序列异常检测不一样的地方在于:
一、是对多个时间序列进行同时分析,之前都是针对于单个时间序列,论文认为不同的时间序列之间是有一定的关联的,而挖掘这种关联对时间序列异常检测是有益的。
二、之前的异常检测对于异常都是判断它是异常就行,并没有对异常的重要程度进行划分。论文对异常分了一下轻重缓急,将异常分成三类,一类是轻微异常,一类是中度异常,一类是重度异常。前提是默认异常持续的时间越长,异常便越重要。比如说吧,服务器宕机了30分钟比服务器宕机了1分钟,造成的损失更多,因而也更重要一些。
2.2 研究方法
那么它是怎么做的呢?大致可以分为三个步骤:特征抽取;重构;评估。
一、特征抽取
还是上面的例子,针对于30个传感器的10000分钟的数据,输入是30 * 10000的矩阵。特征抽取,就是设定一个窗口大小w(比如10),和时间间隔g(比如20),将不同时间序列的窗口内的时间序列片段进行内积。比如说第10分钟,将每一个时间序列的前10分钟的值取出来,即有30个长度为10的向量,互相进行内积,得到一个30*30的矩阵。那么对于30*10000的数据,得到的特征矩阵个数应为10000 / 20 = 500,每个特征矩阵大小为30*30。论文中设置了三个窗口长度,分别是10,30,60,所以得到500个30*30*3的特征矩阵。
图1 神经网络架构
二、重构
特征抽取以后,就可以把它输入神经网络,对它进行重构了,神经网络的结构如图一所示。简单来说,就是经过4次卷积,因为卷积使得矩阵尺寸变小,而要想重构尺寸肯定得一样啊,要变回来和原来一样尺寸,那要经过反卷积,经过了4次反卷积。而在反卷积的过程中,在L层反卷积以后,都先加上L-1层卷积层经过基于attention的LSTM卷积得到的结果。比如说,在第四层卷积后,得到4*4*256的矩阵,反卷积后,得到8*8*128的矩阵,这是将这个矩阵和第三层卷积经过基于attention的LSTM卷积得到的结果(一个8*8*128)的矩阵进行拼接,得到8*8*256的矩阵,然后再进行下一次反卷积。最后得到重构矩阵。
由于在训练时,用的都是正常的数据,于是乎,认为神经网络学出了一个正常模式下的时间序列,对于测试数据,如果测试数据和将测试数据输入网络得到的重构矩阵差别很大的话,就认为它是异常的。
在实际实验中,作者将h设为5,什么意思呢?就是每一个输入单元为5*30*30*3。之前说,输入为500个30*30*3的矩阵,他将它们拆成500个5*30*30*3的块,即
然后对于每一个输入(共有5个小单元),他只想重构最后一个小单元,即对于第一块来说,只想重构1,对于-3、-2、-1、0不重构,第二块只想重构2。而在基于attention的lstm中,它想对于每一个输入单元,学出这5个小单元每个小单元对于重构最后一个小单元应该占的比重是多少。
总的来说,整个流程是这样:
对于一个输入5*30*30*3:
卷积得到5*30*30*32矩阵cnn1,基于attention的lstm卷积得到一个30*30*32矩阵lstm1;
将cnn1卷积,得到5*15*15*64矩阵cnn2,基于attention的lstm卷积得到一个15*15*64矩阵lstm2;
将cnn2卷积,得到5*8*8*128矩阵cnn3,基于attention的lstm卷积得到一个8*8*128矩阵lstm3;
将cnn3卷积,得到5*4*4*256矩阵cnn4,基于attention的lstm卷积得到一个4*4*256矩阵lstm4;
然后对lstm4的4*4*256进行反卷积,得到8*8*128的矩阵,再和lstm3连接,得到8*8*256,然后进行反卷积,得到15*15*64,再和lstm2连接,得到15*15*128,再反卷积得到30*30*32,再和lstm1连接,得到30*30*64,再反卷积,得到30*30*3即完成。
三、判断异常与否
对于测试集,也是先对它进行特征抽取,得到特征矩阵,对特征矩阵进行重构,对重构矩阵进行对应元素相减再求平方,对于每个元素,比较其和设定的阈值的大小,计算超过阈值的元素的个数。