本发明属于信息技术系统智能运维
技术领域:
:,具体涉及一种基于序列化自编码器(自编码器是一种特殊结构的深度神经网络,包括编码器和解码器两个对称的结构)的无监督kpi(keyperformanceindicator,关键性能指标)异常检测方法。
背景技术:
::近年来随着云计算业务的广泛部署、数据中心规模的不断扩大、网络和通信系统的不断发展,互联网企业、运营商、金融机构等内部的it架构在数量和规模上不断扩展,it系统的服务器、存储设备、网络设备等数量越来越多,系统结构也愈加复杂多样,而保障it系统的稳定性、可用性和高效性的运维工作必不可少,且运维人员任务愈加繁重,时常处于“救火”状态。当前it系统的运维人员面临极大的工作压力,传统的依靠人力的运维模式已难以适应大规模it系统发展的需求。同时,相比于传统运维的方式,大数据时代的运维面临着集群规模更大、业务组件更多、监控可视化与智能化更为复杂等诸多难题。综上所述,从机器规模到数据规模的扩大,传统的运维方式和方法已经不能满足现今互联网产品快速迭代的需求,为了保障良好的用户体验和业务效果,亟需更高效、更智能化的系统运维技术。人工智能是撬动it系统智能化的支点。随着大数据时代的到来,在海量数据场景下,利用大数据和人工智能等技术赋能现代化it运维管理是当前运维领域的研究热点。2016年gartner正式提出了智能运维(artificialintelligenceforitoperations,aiops)的概念,即利用人工智能技术赋能it运维,旨在利用ai算法分析海量运维数据,自动、准确地发现和定位问题,提高运维效率。当大数据、人工智能等技术赋能传统行业、驱动变革时,运维结合ai技术则把it行业中原来完全依靠人工经验、重复枯燥的工作,推向了自动化、智能化的运维,引领运维的下一步发展方向,极大减轻了运维和研发人员的负担。运维的技术体系伴随着it系统的快速发展而愈加完善,从最开始的纯人工运维到脚本和开源工具的使用,再到平台建设,运维也紧跟时代的步伐,逐渐向智能化方向发展。在海量数据场景下,aiops开始成为下一代运维技术发展的热点。自动化、智能化的kpi(keyperformanceindicator,关键性能指标)异常检测工作是智能运维的首要和关键环节。kpi可以直观地反应系统的实时状态,因此,为保证系统的可用性、可靠性和稳定性,及时发现故障、解决故障,为用户提供更好的服务体验,运维系统收集和监测各类kpi。kpi可分为两种:一种是业务级kpi(business-relatedkpi),比如页面访问量、app连接错误数量等,此类kpi可以反应系统规模、质量等;另一种是机器级kpi(machine-levelkpi),包括cpu/内存使用率、网卡吞吐率等,此类kpi可以反应系统硬件(服务器、路由器等)的健康状态。it系统中的kpi异常检测工作是当前智能运维领域的研究热点,已有方法取得了一定的效果,但依然还有很多工作值得深入。现有kpi异常检测工作面临以下挑战:1.大规模it系统需要对海量kpi进行监控,运维人员亟需更加自动化、智能化的异常检测方法以迅速、准确地发现问题,进而进行故障的移除和定位;2.实际环境中产生的kpi比较复杂,除故障导致的异常点外,还有缺失点、噪声点等,增加了对kpi建模的难度;3.在kpi中,异常值的分布仅占整体数据的很小部分,这造成了kpi的正负样本不均衡。此外,对于海量kpi,人工标注成本过高。无监督方法可以很好地处理kpi缺乏标签且正负样本不均衡的问题。目前,针对kpi的无监督异常检测方法在工业界主要使用liu等人提出的iforest(liuft,tingkm,zhouzh.isolationforest[c]//2008eighthieeeinternationalconferenceondatamining.ieee,2008:413-422.译为:孤立森林算法)。该算法利用集成学习的方法构造“树”,通过计算各节点到根节点的距离进行异常点的判断,距离根节点越近,异常值越大,即是异常点的可能性也最大。iforest可以实现线性时间复杂度,但需要人工预先设置异常点比例。现有的无监督kpi异常检测的研究点主要集中在深度生成模型的研究与应用上,其中的典型代表包括xu等人提出的基于变分自编码器(variationalautoencoder,vae)的donut算法(xuh,chenw,zhaon,etal.unsupervisedanomalydetectionviavariationalauto-encoderforseasonalkpisinwebapplications[c]//proceedingsofthe2018worldwidewebconference.2018:187-196.译为:基于变分自编码器适用于web应用的无监督异常检测)及其改进版bagel算法(liz,chenw,peid.robustandunsupervisedkpianomalydetectionbasedonconditionalvariationalautoencoder[c]//2018ieee37thinternationalperformancecomputingandcommunicationsconference(ipccc).ieee,2018:1-9.译为:基于条件变分自编码器的鲁棒性无监督异常检测算法)。bagel算法在donut算法的基础上利用条件变分自编码器(conditionalvariationalautoencoder,cvae)将时间信息作为条件,对原始数据进行重构。二者取得了一定的成果,但以上两种方法仅在周期型kpi数据上表现良好。综上所述,现有无监督kpi异常检测方法主要存在以下问题:1.kpi本质上是时间序列数据,时间信息是其本质属性,但现有方法将kpi数据当作非序列数据(non-sequentialdata)进行处理,导致检测准确率不理想;2.需要人工设置异常检测的阈值,这与人工异常检测方法在本质上存在同样的问题:阈值设置过高则漏报率高,阈值设置过低则误报率高。技术实现要素:本发明要解决的技术问题是提供一种基于序列化自编码器的无监督kpi异常检测方法。首先,该方法为kpi提供一种序列化的异常检测方法,通过对现有针对时间序列异常检测模型进行改进,将kpi作为序列数据进行训练和检测,可以实现较高的准确性和鲁棒性;其次,该方法在保证准确性的前提下,支持运维人员设置有效检测时间段,使运维人员可以更加灵活地按需设置有效检测时段,一定程度上减少系统告警数量,进而减缓告警风暴的发生;最后,该方法在数据预处理阶段利用线性插值(linearinterpolation)方法对缺失点进行自动填充,在检测阶段之前利用极值理论(extremevaluetheory,evt)实现自动阈值选择功能,避免人工设置阈值带来的误报率/漏报率权衡的问题。为解决上述技术问题,本发明的技术方案是:在利用自编码器重构数据的基础上,利用集成学习的方法,结合循环神经网络(recurrentneuralnetwork,rnn)和残差网络(residualnetworks,resnet)的思想,通过构造不同结构的序列化自编码器,对原始数据进行重构,在保留前序节点信息的同时保证自编码器结构的随机性,降低模型过拟合的风险,提高kpi异常检测的准确性和鲁棒性。在数据预处理阶段,由于缺失点是否恰当处理将直接影响模型的检测效果,本发明对原始kpi序列中的缺失点采用线性插值方法进行填充,线性插值填充可以避免缺失点直接补零或取中值等方法对数据整体分布的影响,且执行速度不影响系统整体性能。利用极值定理实现自动阈值的选择,可在检测阶段降低漏报率和误报率,提高检测结果的准确性。最后本发明允许在有效窗口内进行异常值的检测,进而在保证系统检测准确性的同时,有效降低告警数量。本发明包括以下具体步骤:第一步,构建基于序列化自编码器的无监督kpi异常检测系统(简称异常检测系统)。异常检测系统由历史kpi序列数据库、在线kpi序列数据库、输入模块、数据预处理模块、离线训练模块、自动阈值选择模块、有效检测窗口设置模块、在线检测模块、输出模块和显示模块组成。历史kpi序列数据库与输入模块相连,该数据库存储历史kpi序列,用于训练模型。历史kpi序列的每一条由三元组(time,value,label)表示,其中:time=(t1,…,ti,…,tt)表示时间向量,按时间升序排列;value=v=(v1,…,vi,…,vt)表示kpi值向量,vi表示第i个时刻历史kpi序列的值,若vi=nan,即空值,则表示该点为缺失点,t为历史kpi序列长度;label=(l1,…,li…,lt)表示标签向量。以一条kpi中的第i条记录为例,1≤i≤t,(ti,vi,li)表示在ti时刻的kpi值为vi,对应的标签为li,li取值为0或者1,0表示正常,1表示异常。标签的值由运维工程师进行标注得到,在无监督训练过程中并未使用,标签的值仅在衡量异常检测系统检测效果时使用。在线kpi序列数据库与输入模块相连,该数据库用于存储在线kpi数据,由二元组(time,value)表示,其中time向量和value向量与历史kpi序列的含义相同。输入模块与历史kpi序列数据库、在线kpi序列数据库和数据预处理模块相连,训练阶段输入模块从历史kpi序列数据库读取历史kpi序列,从中提取历史kpi值向量,将历史kpi值向量发送给数据预处理模块;检测阶段输入模块从在线kpi序列数据库读取在线kpi序列,从中提取在线kpi值向量,将在线kpi值向量发送给数据预处理模块。数据预处理模块与输入模块、离线训练模块和在线检测模块相连,数据预处理模块从输入模块接收kpi值向量(包括历史kpi值向量和在线kpi值向量),首先采用线性插值方法对kpi值向量中的缺失点进行填充,然后对填充后的kpi值向量进行标准化处理,将标准化后的历史kpi值向量发送给离线训练模块,将标准化后的在线kpi值向量发送给在线检测模块。数据预处理模块包含缺失点线性插值填充模块和kpi值向量标准化模块。缺失点线性插值填充模块从输入模块接收kpi值向量(包括历史kpi值向量和在线kpi值向量),处理kpi值向量中的缺失点,采用线性插值方法对kpi值向量中的缺失点进行填充,形成完整的kpi值向量,即填充后的kpi值向量,将填充后的kpi值向量发送给kpi值向量标准化模块。kpi值向量标准化模块从缺失点线性插值填充模块接收填充后的kpi值向量,对填充后的kpi值向量进行标准化计算,获得标准化后的kpi值向量(包括标准化后的历史kpi值向量和标准化后的在线kpi值向量),并将标准化后的历史kpi值向量发送给离线训练模块,将标准化后的在线kpi值向量发送给在线检测模块。离线训练模块(即基于序列化自编码器的kpi异常检测模型训练模块)与数据预处理模块、自动阈值选择模块和在线检测模块相连。离线训练模块从数据预处理模块接收标准化后的历史kpi值向量,将标准化后的历史kpi值向量作为输入对异常检测模型进行训练,得到异常分值和训练好的模型,将异常分值发送到自动阈值选择模块,同时将训练好的模型发送给在线检测模块。自动阈值选择模块与离线训练模块和在线检测模块相连,采用极值理论进行计算并得到阈值,将阈值发送给在线检测模块。有效检测窗口设置模块与在线检测模块相连,有效检测窗口设置模块接收运维人员设置的有效检测窗口值,将有效检测窗口值发送给在线检测模块。在线检测模块与数据预处理模块、离线训练模块、自动阈值选择模块、有效检测窗口设置模块和输出模块相连。在线检测模块从数据预处理模块接收标准化后的在线kpi值向量,从离线训练模块接收训练好的模型,从自动阈值选择模块接收阈值,从有效检测窗口设置模块接收有效窗口值,根据这些输入对在线kpi序列进行异常检测并得到检测结果,将检测结果发送到输出模块。输出模块与在线检测模块相连,从在线检测模块接收检测结果,将检测结果发送到显示模块。显示模块与输出模块相连,动态显示检测结果,若有异常结果则发送告警信息,由运维人员进行处理。第二步:输入模块访问历史kpi序列数据库,从读取到的历史kpi序列提取kpi值向量v,将v发送到数据预处理模块。第三步:数据预处理模块采用缺失点线性插值填充和标准化处理方法对kpi值向量c进行预处理,方法是:3.1缺失点线性插值填充模块采用线性插值方法对c中的缺失点按公式一进行填充,将填充后的kpi值向量v′发送给kpi值向量标准化模块。v′=v.interpolate(method=′linear′)公式一interpolate()函数为pandas库(https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.dataframe.interpolate.html)提供的插值函数,参数method=′linear′表示使用线性方法进行插值计算。v′=(v′1,…,v′i,…,v′t),v′i是填充后的vi。3.2kpi值向量标准化模块对v′进行标准化操作,得到标准化后的kpi值向量vnorm。标准化公式如下:其中:μ代表v′的均值,σ代表v′的方差,向量vnorm代表标准化后的kpi值向量。3.3kpi值向量标准化模块将vnorm发送给离线训练模块。第四步:离线训练模块对vnorm进行切分;然后构建基于序列化自编码器的kpi异常检测模型并对模型进行训练。方法为:4.1离线训练模块从kpi值向量标准化模块接收vnorm;4.2离线训练模块对vnorm进行切分:令切分数为p,p为正整数,优选p=10,利用numpy库(https://numpy.org/)的array_split()函数(https://numpy.org/doc/stable/reference/generated/numpy.array_split.html)对vnorm进行不均等划分,得到切分后的kpi值向量vpart:以为例,为第p个切分向量,1≤p≤p,表示中的第r个值,表示中的最后一个值,r为采用array_split()函数对vnorm切分后的中的值的个数。array_split()函数的切分规则是:对于长度为t的vnorm,前t%p(%是取模操作)个组的大小是剩下组的大小是其中表示对t/p下取整。4.3离线训练模块采用基于随机跨步连接的rnn(randomstepconnectionrnn,rscr)方法构建由n个不同结构的序列化自编码器组成的无监督kpi异常检测模型;再对序列化自编码器组成的无监督kpi异常检测模型进行离线训练,其中n个序列化自编码器均接收vpart作为输入,n为正整数,优选n=20。具体方法是:4.3.1构建基于序列化自编码器的无监督kpi异常检测模型,方法是:4.3.1.1构建n个序列化编码器,方法是:4.3.1.1.1令变量j=0;4.3.1.1.2如果j=0,构建第一个编码器并得到第一个编码器的输出第一元组,方法是:利用tf.nn.dynamic_rnn函数(https://www.tensorflow.org/api_docs/python/tf/compat/v1/nn/dynamic_rnn,tf.nn.dynamic_rnn函数是tensorflow封装的用来实现递归神经网络(rnn)的函数)构造一个隐藏层节点个数为h的lstm(longshort-termmemory,长短时记忆网络),h=16,得到第一个编码器;第一个编码器以作为输入,输出第一元组(e1p,z1p),并保存,其中表示第一神经元输出状态向量,为e1p中第r个值,代表第一隐藏层状态,为z1p中第r个值;转4.3.1.1.6,如果j≠0,转4.3.1.1.3;4.3.1.1.3如果j=1,构建第二个编码器并得到第二个编码器的输出第二元组,方法是利用tf.nn.dynamic_rnn函数构造一个隐藏节点个数为h个的basiclstm(https://www.tensorflow.org/api_docs/python/tf/compat/v1/nn/rnn_cell/basiclstmcell?hl=ko,遗忘偏置为1的lstm,实现方法基于oed(outlierensemblesdetection)方法:参见https://github.com/tungk/oed),h=16,得到第二个编码器;第二个编码器以作为输入:输出第二元组(e2p,z2p),并保存,其中表示第二神经元输出状态向量,为e2p中第r个值,代表第二隐藏层状态,为z2p中第r个值,转4.3.1.1.6;如果j≠1且j≠0转4.3.1.1.4;4.3.1.1.4如果1<j<n,转4.3.1.1.5;如果j≥n,转4.3.1.1.74.3.1.1.5,构建第3到第n个编码器并得到第3到第n个编码器的输出,方法是:4.3.1.1.5.1令变量q=3;4.3.1.1.5.2如果q≤n,转4.3.1.1.5.3;否则转4.3.1.1.6;4.3.1.1.5.3构建第q个编码器并以作为输入:利用tf.nn.dynamic_rnn函数构造一个基于rscr的lstm(简称rscr-lstm),隐藏节点个数h=16。得到第q个编码器;第q个编码器以作为输入:输出第q元组(eqp,zqp),并保存,其中表示第q神经元输出状态向量,为eqp中第r个值,代表第q隐藏层状态,为zqp中第r个值。此处实现也基于oed方法,但与oed方法不同的是隐藏层状态计算方法:由三个元素决定:当前时刻输入直接前序节点隐藏状态值l步前的节点隐藏状态值l表示跨步步长,取1到n之间的随机值,得到为:其中m为随机数,m∈{0,1},0表示无连接,1表示有连接,tanh(·)为一种神经网络激活函数(https://www.tensorflow.org/api_docs/python/tf/math/tanh),sigmoid(·)为另一种神经网络激活函数(https://www.tensorflow.org/api_docs/python/tf/math/sigmoid)。4.3.1.1.5.4令q=q 1,转4.3.1.1.5.2;4.3.1.1.6令变量j=j 1,转4.3.1.1.2;4.3.1.1.7输出n个元组{(e1p,z1p),(e2p,z2p),…,(eqp,zqp),…,(enp,znp)}给共享层,(e1p,z1p)为第一元组,其中表示第一神经元输出状态向量,为e1p中第r个值,代表第一隐藏层状态,为z1p中第r个值;(e2p,z2p)为第二元组,其中表示第二神经元输出状态向量,为e2p中第r个值,代表第二隐藏层状态,为z2p中第r个值;(eqp,zqp)为第q元组,表示第q神经元输出状态向量,为eqp中第r个值,代表第q隐藏层状态,为zqp中第r个值;(enp,znp)为第n元组,表示第n神经元输出状态向量,为enp中第r个值,代表第n隐藏层状态,为znp中第r个值;转4.3.1.2;4.3.1.2构建共享层,方法是:4.3.1.2.1共享层从n个编码器接收n个元组,即{(e1p,z1p),(e2p,z2p),…,(eqp,zqp),…,(enp,znp)}。4.3.1.2.2将权重矩阵w赋初值为0,矩阵大小为16×16;4.3.1.2.3将n个编码器最后一个隐藏节点的状态形成向量将zlast及最后一个节点隐藏层对应的权重串联得到共享层其中concatenate(zlast·wlast)为numpy库的串联函数(https://numpy.org/doc/stable/reference/generated/numpy.concatenate.html),表示将和相乘。4.3.1.3构建n个解码器,将作为n个解码器的输入,方法是:4.3.1.3.1令变量k=0;4.3.1.3.2如果k=0,构造第一个解码器:利用tf.contrib.seq2seq.basicdecoder函数(https://github.com/tensorflow/tensorflow/blob/r1.8/tensorflow/contrib/seq2seq/python/ops/basic_decoder.py)构造一个隐藏节点个数为h′个的lstm,此处h′=h×n,输出重构向量转4.3.1.3.6,如果k≠0,转4.3.1.3.3;4.3.1.3.3如果k=1,构建第二个解码器,利用tf.contrib.seq2seq.basicdecoder函数构建一个隐藏节点个数为h′的lstm,此处h′=h×n,输出重构向量转4.3.1.3.6,如果k≠0且k≠1,转4.3.1.3.4;4.3.1.3.4如果1<k<n,转4.3.1.3.5;如果k≥n,转4.3.1.3.7;4.3.1.3.5构造第3到第n个解码器,方法是:4.3.1.3.5.1令变量g=3;4.3.1.3.5.2如果g≤n,转4.3.1.3.5.3;否则转4.3.1.3.6;4.3.1.3.5.3构建第g个解码器:利用tf.contrib.seq2seq.basicdecoder函数构建隐藏节点个数为h′的rscr-rnn,h′=h×n,输出重构向量4.3.1.3.5.4令g=g 1,转4.3.1.3.5.2;4.3.1.3.6令变量k=k 1,转4.3.1.3.2;4.3.1.3.7输出n个重构向量转4.3.1.3.8;4.3.1.3.8定义损失函数和优化函数,方法为:4.3.1.3.8.1定义损失函数loss:其中:inputr表示输入向量的第r个值;outputr表示输出向量的第r个值;l1_regularizer(zshare)表示对zshare进行l1正则化的函数(https://github.com/tensorflow/tensorflow/blob/r1.8/tensorflow/contrib/layers/python/layers/regularizers.py)。4.3.1.3.8.2采用adam(https://www.tensorflow.org/swift/api_docs/classes/adam)作为模型训练的优化函数。至此,基于序列化自编码器的kpi异常检测模型构建完毕,转4.3.2。4.3.2对基于序列化自编码器的kpi异常检测模型进行离线训练,方法是:4.3.2.1令变量p=1;4.3.2.2将输入至基于序列化自编码器的kpi异常检测模型;4.3.2.3创建tensorflow的会话(session,简称sess)(创建会话方法:https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/client/session.py);4.3.2.2.1令变量iter=0,令迭代次数iter=50;4.3.2.2.2利用sess.run()方法(参见https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/client/session.py)采用输入数据进行训练;4.3.2.2.3如果iter<iter,令iter=iter 1,转4.3.2.2.2,否则训练完成,得到模型对的重构向量记为转4.3.2.3;4.3.2.3计算异常分值,方法是:4.3.2.3.1令变量b=0;4.3.2.3.2根据和计算n个序列化自编码器中第b个自编码器对第p个切分向量的重构误差4.3.2.3.3如果b<n,令b=b 1,转4.3.2.3.2;否则输出第p个切分向量的n个重构误差:0≤b≤n-1,转4.3.2.3.4;4.3.2.3.4取errorp的中位数作为最终异常分值表示取中的中位数。4.3.2.3.5如果p≤p,令变量p=p 1,转4.3.2.2;否则得到最终异常分值向量score,至此,模型训练结束,得到训练后的基于序列化自编码器的无监督kpi异常检测模型(简称异常检测模型),转4.4;4.4离线训练模块将score发送给自动阈值选择模块,将异常检测模型发送给在线检测模块。第五步:自动阈值选择模块根据score计算阈值,方法是:5.1自动阈值选择模块从离线训练模块接收score;5.2自动阈值选择模块采用evt方法(evt方法见文献siffera,fouquepa,termiera,etal.anomalydetectioninstreamswithextremevaluetheory[c]//proceedingsofthe23rdacmsigkddinternationalconferenceonknowledgediscoveryanddatamining.2017:极值理论流数据异常检测中的应用,第4页算法1)分析score分布,得到阈值threshold。5.3自动阈值选择模块将阈值threshold发送给在线检测模块;第六步:有效检测窗口设置模块接收运维人员设置的模块检测有效窗口值w,w为正整数且1≤w≤10,优选取值1、5或10,将w发送给在线检测模块。第七步:输入模块、数据预处理模块、自动阈值选择模块、有效检测窗口设置模块、在线检测模块相互配合,对在线kpi序列进行检测:7.1输入模块读取在线kpi序列数据库,提取在线kpi值向量vonline,用a表示vonline长度,将vonline发送到数据预处理模块。7.2数据预处理模块采用第三步所述的缺失点线性插值填充和标准化处理方法对vonline进行预处理,得到标准化后的在线kpi值向量vonline_norm,记1≤a≤a。7.3在线检测模块利用异常检测模型,利用第五步得到的阈值threshold、第六步设置的有效窗口值w,对vonline_norm进行检测,方法如下:7.3.1在线检测模块将vonline_norm输入至异常检测模型,得到n个重构的kpi值向量,第x个重构kpi值向量记为1≤x≤n,为中第a个值。7.3.2在线检查模块分别计算n个序列化自编码器的重构误差,方法是:7.3.2.1令x=1;7.3.2.2计算并保存第x个自编码器的kpi值向量的重构误差向量方法是:7.3.2.3令x=x 1,如果x≤n,转7.3.1.2,否则计算结束,输出n个自编码器的重构误差向量errorrestore:7.3.3根据errorrestore计算异常检测模型的异常分值,方法是:7.3.3.1令a=1;7.3.3.2读取并保存n个重构误差,方法是:7.3.3.2.1令u=1;7.3.3.2.2从errorrestore读取并保存;7.3.3.2.3令u=u 1,如果u≤n,转7.3.3.2.2,否则输出转7.3.3.2.4;7.3.3.2.4取的中位数作为第a个kpi值的异常分值,并保存,方法是:median()为numpy的中位数计算函数(https://numpy.org/doc/stable/reference/generated/numpy.median.html)。7.3.3.3令a=a 1,如果a≤a,转7.3.2.2;否则输出异常检测模型的异常分值scoreonline:转7.3.4;7.3.4将阈值threshold与scoreonline进行比较,方法是:7.3.4.1令变量a=1;7.3.4.2判断第a个kpi值是否异常,方法是:如果令检测结果ya=0,表示正常,否则令ya=1,表示异常;保存ya,转7.3.4.3。7.3.4.3令a=a 1,如果a≤a,转7.3.3.2;否则比较完毕,输出检测结果向量y,y=(y1,…,ya,…,ya)。7.3.5根据窗口值w,向在线检测模块输入检测结果向量y,在线检测模块计算窗口内的异常值向量其中方法为:7.3.5.1令d=1;7.3.5.2计算表示在窗口范围内对向量值yd、yd 1、…、yd w-1进行“或”计算,如果表示异常窗口,如果表示正常窗口。7.3.5.3若d≤m,令d=d 1,转7.3.5.2;若d>m,说明计算完毕,得到最终的检测结果yw,转7.3.6;7.3.6将yw发送给输出模块,转第八步。第八步:输出模块从在线检测模块接收检测结果yw,将检测结果发送到显示模块。第九步:显示模块显示检测结果yw,若yw中有“异常”结果(即有)则显示告警信息,提醒运维人员处理。采用本发明可以达到以下技术效果:1.本发明第一步设计了能够对不同分布特征的kpi序列进行准确检测的异常检测系统,第四步采用随机跨步连接方法构建了基于序列化自编码器的无监督kpi异常检测模型,将不同结构的序列化自编码器对历史kpi序列进行训练,能够有效提高kpi异常检测的准确率。2.本发明第四步构建基于序列化自编码器的kpi异常检测模型,并对模型进行训练,通过计算重构误差进行异常值的判断,可解释性强,同时第五步提供了自动阈值选择功能,有效缓解了固定阈值方法带来的误报率或漏报率较高的问题。3.本发明为运维人员提供了有效检测窗口值,运维人员通过有效检测窗口值对应的有效检测窗口可以根据需要灵活设置有效检测时间,从而降低系统告警数量,有效减缓告警风暴的产生。附图说明图1是本发明第一步构建的基于序列化自编码器的无监督kpi异常检测系统逻辑结构图。图2是本发明总体流程图。图3是本发明第四步离线训练模块对vnorm进行切分并构建基于序列化自编码器的kpi异常检测模型并对模型进行训练的流程图。图4是本发明第七步:输入模块、数据预处理模块、自动阈值选择模块、有效检测窗口设置模块、在线检测模块相互配合对在线kpi序列进行检测的流程图。具体实施方式:图2是本发明总体流程图。如图2所示,本发明包括以下步骤:第一步,构建基于序列化自编码器的无监督kpi异常检测系统(简称异常检测系统)。异常检测系统如图1所示,由历史kpi序列数据库、在线kpi序列数据库、输入模块、数据预处理模块、离线训练模块、自动阈值选择模块、有效检测窗口设置模块、在线检测模块、输出模块和显示模块组成。历史kpi序列数据库与输入模块相连,该数据库存储历史kpi序列,用于训练模型。历史kpi序列的每一条由三元组(time,value,label)表示,其中:time=(t1,…,ti,…,tt)表示时间向量,按时间升序排列;value=v=(v1,…,vi,…,vt)表示kpi值向量,vi表示第i个时刻历史kpi序列的值,若vi=nan,即空值,则表示该点为缺失点,t为历史kpi序列长度;label=(l1,…,li…,lt)表示标签向量。以一条kpi中的第i条记录为例,1≤i≤t,(ti,vi,li)表示在ti时刻的kpi值为vi,对应的标签为li,li取值为0或者1,0表示正常,1表示异常。标签的值由运维工程师进行标注得到,在无监督训练过程中并未使用,标签的值仅在衡量异常检测系统检测效果时使用。在线kpi序列数据库与输入模块相连,该数据库用于存储在线kpi数据,由二元组(time,value)表示,其中time向量和value向量与历史kpi序列的含义相同。输入模块与历史kpi序列数据库、在线kpi序列数据库和数据预处理模块相连,训练阶段输入模块从历史kpi序列数据库读取历史kpi序列,从中提取历史kpi值向量,将历史kpi值向量发送给数据预处理模块;检测阶段输入模块从在线kpi序列数据库读取在线kpi序列,从中提取在线kpi值向量,将在线kpi值向量发送给数据预处理模块。数据预处理模块与输入模块、离线训练模块和在线检测模块相连,数据预处理模块从输入模块接收kpi值向量(包括历史kpi值向量和在线kpi值向量),首先采用线性插值方法对kpi值向量中的缺失点进行填充,然后对填充后的kpi值向量进行标准化处理,将标准化后的历史kpi值向量发送给离线训练模块,将标准化后的在线kpi值向量发送给在线检测模块。数据预处理模块包含缺失点线性插值填充模块和kpi值向量标准化模块。缺失点线性插值填充模块从输入模块接收kpi值向量(包括历史kpi值向量和在线kpi值向量),处理kpi值向量中的缺失点,采用线性插值方法对kpi值向量中的缺失点进行填充,形成完整的kpi值向量,即填充后的kpi值向量,将填充后的kpi值向量发送给kpi值向量标准化模块。kpi值向量标准化模块从缺失点线性插值填充模块接收填充后的kpi值向量,对填充后的kpi值向量进行标准化计算,获得标准化后的kpi值向量(包括标准化后的历史kpi值向量和标准化后的在线kpi值向量),并将标准化后的历史kpi值向量发送给离线训练模块,将标准化后的在线kpi值向量发送给在线检测模块。离线训练模块(即基于序列化自编码器的kpi异常检测模型训练模块)与数据预处理模块、自动阈值选择模块和在线检测模块相连。离线训练模块从数据预处理模块接收标准化后的历史kpi值向量,将标准化后的历史kpi值向量作为输入对异常检测模型进行训练,得到异常分值和训练好的模型,将异常分值发送到自动阈值选择模块,同时将训练好的模型发送给在线检测模块。自动阈值选择模块与离线训练模块和在线检测模块相连,采用极值理论进行计算并得到阈值,将阈值发送给在线检测模块。有效检测窗口设置模块与在线检测模块相连,有效检测窗口设置模块接收运维人员设置的有效检测窗口值,将有效检测窗口值发送给在线检测模块。在线检测模块与数据预处理模块、离线训练模块、自动阈值选择模块、有效检测窗口设置模块和输出模块相连。在线检测模块从数据预处理模块接收标准化后的在线kpi值向量,从离线训练模块接收训练好的模型,从自动阈值选择模块接收阈值,从有效检测窗口设置模块接收有效窗口值,根据这些输入对在线kpi序列进行异常检测并得到检测结果,将检测结果发送到输出模块。输出模块与在线检测模块相连,从在线检测模块接收检测结果,将检测结果发送到显示模块。显示模块与输出模块相连,动态显示检测结果,若有异常结果则发送告警信息,由运维人员进行处理。第二步:输入模块访问历史kpi序列数据库,从读取到的历史kpi序列提取kpi值向量v,将v发送到数据预处理模块。第三步:数据预处理模块采用缺失点线性插值填充和标准化处理方法对kpi值向量v进行预处理,方法是:3.1缺失点线性插值填充模块采用线性插值方法对v中的缺失点按公式一进行填充,将填充后的kpi值向量v′发送给kpi值向量标准化模块。v′=v.interpolate(method=′linear′)公式一interpolate()函数为pandas库(https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.dataframe.interpolate.html)提供的插值函数,参数method=′linear′表示使用线性方法进行插值计算。v′=(v′1,…,v′i,…,v′t),v′i是填充后的vi。3.2kpi值向量标准化模块对v′进行标准化操作,得到标准化后的kpi值向量vnorm。标准化公式如下:其中:μ代表v′的均值,σ代表v′的方差,向量vnorm代表标准化后的kpi值向量。3.3kpi值向量标准化模块将vnorm发送给离线训练模块。第四步:如图3所示,离线训练模块对vnorm进行切分;然后构建基于序列化自编码器的kpi异常检测模型并对模型进行训练。方法为:4.1离线训练模块从kpi值向量标准化模块接收vnorm;4.2离线训练模块对vnorm进行切分:令切分数为p,p为正整数,优选p=10,利用numpy库的array_split()函数对vnorm进行不均等划分,得到切分后的kpi值向量vpart:以为例,为第p个切分向量,1≤p≤p,表示中的第r个值,表示中的最后一个值,r为采用array_split()函数对vnorm切分后的中的值的个数。array_split()函数的切分规则是:对于长度为t的vnorm,前t%p(%是取模操作)个组的大小是 1,剩下组的大小是其中表示对t/p下取整。4.3离线训练模块采用基于随机跨步连接的rnn方法构建由n个不同结构的序列化自编码器组成的无监督kpi异常检测模型;再对序列化自编码器组成的无监督kpi异常检测模型进行离线训练,其中n个序列化自编码器均接收vpart作为输入,n为正整数,优选n=20。具体方法是:4.3.1构建基于序列化自编码器的无监督kpi异常检测模型,方法是:4.3.1.1构建n个序列化编码器,方法是:4.3.1.1.1令变量j=0;4.3.1.1.2如果j=0,构建第一个编码器并得到第一个编码器的输出第一元组,方法是:利用tf.nn.dynamic_rnn函数构造一个隐藏层节点个数为h的lstm(longshort-termmemory,长短时记忆网络),h=16,得到第一个编码器;第一个编码器以作为输入,输出第一元组(e1p,z1p),并保存,其中表示第一神经元输出状态向量,为e1p中第r个值,代表第一隐藏层状态,为z1p中第r个值;转4.3.1.1.6,如果j≠0,转4.3.1.1.3;4.3.1.1.3如果j=1,构建第二个编码器并得到第二个编码器的输出第二元组,方法是利用tf.nn.dynamic_rnn函数构造一个隐藏节点个数为h个的basiclstm(https://www.tensorflow.org/api_docs/python/tf/compat/v1/nn/rnn_cell/basiclstmcell?hl=ko,遗忘偏置为1的lstm,实现方法基于oed方法:h=16,得到第二个编码器;第二个编码器以作为输入:输出第二元组(e2p,z2p),并保存,其中表示第二神经元输出状态向量,为e2p中第r个值,代表第二隐藏层状态,为z2p中第r个值,转4.3.1.1.6;如果j≠1且j≠0转4.3.1.1.4;4.3.1.1.4如果1<j<n,转4.3.1.1.5;如果j≥n,转4.3.1.1.7;4.3.1.1.5,构建第3到第n个编码器并得到第3到第n个编码器的输出,方法是:4.3.1.1.5.1令变量q=3;4.3.1.1.5.2如果q≤n,转4.3.1.1.5.3;否则转4.3.1.1.6;4.3.1.1.5.3构建第q个编码器并以作为输入:利用tf.nn.dynamic_rnn函数构造一个基于rscr的lstm(简称rscr-lstm),隐藏节点个数h=16。得到第q个编码器;第q个编码器以作为输入:输出第q元组(eqp,zqp),并保存,其中表示第q神经元输出状态向量,为eqp中第r个值,代表第q隐藏层状态,为zqp中第r个值。此处实现也基于oed方法,但与oed方法不同的是隐藏层状态计算方法:由三个元素决定:当前时刻输入直接前序节点隐藏状态值l步前的节点隐藏状态值l表示跨步步长,取1到n之间的随机值,得到为:其中m为随机数,m∈{0,1},0表示无连接,1表示有连接,tanh(·)为一种神经网络激活函数,sigmoid(·)为另一种神经网络激活函数。4.3.1.1.5.4令q=q 1,转4.3.1.1.5.2;4.3.1.1.6令变量j=j 1,转4.3.1.1.2;4.3.1.1.7输出n个元组{(e1p,z1p),(e2p,z2p),…,(eqp,zqp),…,(enp,znp)}给共享层,(e1p,z1p)为第一元组,其中表示第一神经元输出状态向量,为e1p中第r个值,代表第一隐藏层状态,为z1p中第r个值;(e2p,z2p)为第二元组,其中表示第二神经元输出状态向量,为e2p中第r个值,代表第二隐藏层状态,为z2p中第r个值;(eqp,zqp)为第q元组,表示第q神经元输出状态向量,为eqp中第r个值,代表第q隐藏层状态,为xqp中第r个值;(enp,znp)为第n元组,表示第n神经元输出状态向量,为enp中第r个值,代表第n隐藏层状态,为znp中第r个值;转4.3.1.2;4.3.1.2构建共享层,方法是:4.3.1.2.1共享层从n个编码器接收n个元组,即{(e1p,z1p),(e2p,z2p),…,(eqp,zqp),…,(enp,znp)}。4.3.1.2.2将权重矩阵w赋初值为0,矩阵大小为16×16;4.3.1.2.3将n个编码器最后一个隐藏节点的状态形成向量将zlast及最后一个节点隐藏层对应的权重串联得到共享层其中concatenate(zlast·wlast)为numpy库的串联函数,表示将和相乘。4.3.1.3构建n个解码器,将作为n个解码器的输入,方法是:4.3.1.3.1令变量k=0;4.3.1.3.2如果k=0,构造第一个解码器:利用tf.contrib.seq2seq.basicdecoder函数构造一个隐藏节点个数为h′个的lstm,此处h′=h×n,输出重构向量转4.3.1.3.6,如果k≠0,转4.3.1.3.3;4.3.1.3.3如果k=1,构建第二个解码器,利用tf.contrib.seq2seq.basicdecoder函数构建一个隐藏节点个数为h′的lstm,此处h′=h×n,输出重构向量转4.3.1.3.6,如果k≠0且k≠1,转4.3.1.3.4;4.3.1.3.4如果1<k<n,转4.3.1.3.5;如果k≥n,转4.3.1.3.7;4.3.1.3.5构造第3到第n个解码器,方法是:4.3.1.3.5.1令变量g=3;4.3.1.3.5.2如果g≤n,转4.3.1.3.5.3;否则转4.3.1.3.6;4.3.1.3.5.3构建第g个解码器:利用tf.contrib.seq2seq.basicdecoder函数构建隐藏节点个数为h′的rscr-rnn,h′=h×n,输出重构向量4.3.1.3.5.4令g=g 1,转4.3.1.3.5.2;4.3.1.3.6令变量k=k 1,转4.3.1.3.2;4.3.1.3.7输出n个重构向量转4.3.1.3.8;4.3.1.3.8定义损失函数和优化函数,方法为:4.3.1.3.8.1定义损失函数loss:其中:inputr表示输入向量的第r个值;outputr表示输出向量的第r个值;l1_regularizer(zshare)表示对zshare进行l1正则化的函数。4.3.1.3.8.2采用adam作为模型训练的优化函数。至此,基于序列化自编码器的kpi异常检测模型构建完毕,转4.3.2。4.3.2对基于序列化自编码器的kpi异常检测模型进行离线训练,方法是:4.3.2.1令变量p=1;4.3.2.2将输入至基于序列化自编码器的kpi异常检测模型;4.3.2.3创建tensorflow的会话(session,简称sess);4.3.2.2.1令变量iter=0,令迭代次数iter=50;4.3.2.2.2利用sess.run()方采用输入数据进行训练;4.3.2.2.3如果iter<iter,令iter=iter 1,转4.3.2.2.2,否则训练完成,得到模型对的重构向量记为转4.3.2.3;4.3.2.3计算异常分值,方法是:4.3.2.3.1令变量b=0;4.3.2.3.2根据和计算n个序列化自编码器中第b个自编码器对第p个切分向量的重构误差4.3.2.3.3如果b<n,令b=b 1,转4.3.2.3.2;否则输出第p个切分向量的n个重构误差:0≤b≤n-1,转4.3.2.3.4;4.3.2.3.4取errorp的中位数作为最终异常分值表示取中的中位数。4.3.2.3.5如果p≤p,令变量p=p 1,转4.3.2.2;否则得到最终异常分值向量score,至此,模型训练结束,得到训练后的基于序列化自编码器的无监督kpi异常检测模型(简称异常检测模型),转4.4;4.4离线训练模块将score发送给自动阈值选择模块,将异常检测模型发送给在线检测模块。第五步:自动阈值选择模块根据score计算阈值,方法是:5.1自动阈值选择模块从离线训练模块接收score;5.2自动阈值选择模块采用evt方法分析score分布,得到阈值threshold。5.3自动阈值选择模块将阈值threshold发送给在线检测模块;第六步:有效检测窗口设置模块接收运维人员设置的模块检测有效窗口值w,w为正整数且1≤w≤10,优选取值1、5或10,将w发送给在线检测模块。第七步:如图4所示,输入模块、数据预处理模块、自动阈值选择模块、有效检测窗口设置模块、在线检测模块相互配合,对在线kpi序列进行检测:7.1输入模块读取在线kpi序列数据库,提取在线kpi值向量vonline,用a表示vonline长度,将vonline发送到数据预处理模块。7.2数据预处理模块采用第三步所述的缺失点线性插值填充和标准化处理方法对vonline进行预处理,得到标准化后的在线kpi值向量vonline_norm,记1≤a≤a。7.3在线检测模块利用异常检测模型,利用第五步得到的阈值threshold、第六步设置的有效窗口值w,对vonline_norm进行检测,方法如下:7.3.1在线检测模块将vonline_norm输入至异常检测模型,得到n个重构的kpi值向量,第x个重构kpi值向量记为1≤x≤n,为中第a个值。7.3.2在线检查模块分别计算n个序列化自编码器的重构误差,方法是:7.3.2.1令x=1;7.3.2.2计算并保存第x个自编码器的kpi值向量的重构误差向量方法是:7.3.2.3令x=x 1,如果x≤n,转7.3.1.2,否则计算结束,输出n个自编码器的重构误差向量errorrestore:7.3.3根据errorrestore计算异常检测模型的异常分值,方法是:7.3.3.1令a=1;7.3.3.2读取并保存n个重构误差,方法是:7.3.3.2.1令u=1;7.3.3.2.2从errorrestore读取并保存;7.3.3.2.3令u=u 1,如果u≤n,转7.3.3.2.2,否则输出转7.3.3.2.4;7.3.3.2.4取的中位数作为第a个kpi值的异常分值,并保存,方法是:median()为numpy的中位数计算函数。7.3.3.3令a=a 1,如果a≤a,转7.3.2.2;否则输出异常检测模型的异常分值scoreonline:转7.3.4;7.3.4将阈值threshold与scoreonline进行比较,方法是:7.3.4.1令变量a=1;7.3.4.2判断第a个kpi值是否异常,方法是:如果令检测结果ya=0,表示正常,否则令ya=1,表示异常;保存ya,转7.3.4.3。7.3.4.3令a=a 1,如果a≤a,转7.3.3.2;否则比较完毕,输出检测结果向量y,y=(y1,…,ya,…,ya)。7.3.5根据窗口值w,向在线检测模块输入检测结果向量y,在线检测模块计算窗口内的异常值向量其中方法为:7.3.5.1令d=1;7.3.5.2计算表示在窗口范围内对向量值yd、yd 1、…、yd w-1进行“或”计算,如果表示异常窗口,如果表示正常窗口。7.3.5.3若d≤m,令d=d 1,转7.3.5.2;若d>m,说明计算完毕,得到最终的检测结果yw,转7.3.6;7.3.6将yw发送给输出模块,转第八步。第八步:输出模块从在线检测模块接收检测结果yw,将检测结果发送到显示模块。第九步:显示模块显示检测结果yw,若yw中有“异常”结果(即有)则显示告警信息,提醒运维人员处理。当前第1页1 2 3 当前第1页1 2 3 
技术特征:1.一种基于序列化自编码器的无监督kpi异常检测方法,其特征在于包括以下步骤:
第一步,构建基于序列化自编码器的无监督kpi异常检测系统,简称异常检测系统;异常检测系统由历史kpi序列数据库、在线kpi序列数据库、输入模块、数据预处理模块、离线训练模块、自动阈值选择模块、有效检测窗口设置模块、在线检测模块、输出模块和显示模块组成;
历史kpi序列数据库与输入模块相连,该数据库存储历史kpi序列,用于训练模型;历史kpi序列的每一条由三元组(time,value,label)表示,其中:time=(t1,...,ti,...,tt)表示时间向量,按时间升序排列;value=v=(v1,...,vi,...,vt)表示kpi值向量,vi表示第i个时刻历史kpi序列的值,若vi=nan,即空值,则表示该点为缺失点,t为历史kpi序列长度;label=(l1,...,li...,lt)表示标签向量;第i条记录(ti,vi,li)表示在ti时刻的kpi值为vi,对应的标签为li,li取值为0或者1,0表示正常,1表示异常;1≤i≤t;
在线kpi序列数据库与输入模块相连,该数据库用于存储在线kpi数据,由二元组(time,value)表示,其中time向量和value向量与历史kpi序列的含义相同;
输入模块与历史kpi序列数据库、在线kpi序列数据库和数据预处理模块相连,训练阶段输入模块从历史kpi序列数据库读取历史kpi序列,从中提取历史kpi值向量,将历史kpi值向量发送给数据预处理模块;检测阶段输入模块从在线kpi序列数据库读取在线kpi序列,从中提取在线kpi值向量,将在线kpi值向量发送给数据预处理模块;
数据预处理模块与输入模块、离线训练模块和在线检测模块相连,数据预处理模块从输入模块历史kpi值向量和在线kpi值向量,采用线性插值方法对kpi值向量中的缺失点进行填充,并对填充后的kpi值向量进行标准化处理,将标准化后的历史kpi值向量发送给离线训练模块,将标准化后的在线kpi值向量发送给在线检测模块;数据预处理模块包含缺失点线性插值填充模块和kpi值向量标准化模块;
缺失点线性插值填充模块从输入模块接收历史kpi值向量和在线kpi值向量,处理kpi值向量中的缺失点,采用线性插值方法对kpi值向量中的缺失点进行填充,形成完整的kpi值向量,即填充后的kpi值向量,将填充后的kpi值向量发送给kpi值向量标准化模块;
kpi值向量标准化模块从缺失点线性插值填充模块接收填充后的kpi值向量,对填充后的kpi值向量进行标准化计算,获得标准化后的历史kpi值向量和标准化后的在线kpi值向量,将标准化后的历史kpi值向量发送给离线训练模块,将标准化后的在线kpi值向量发送给在线检测模块;
离线训练模块即基于序列化自编码器的kpi异常检测模型训练模块与数据预处理模块、自动阈值选择模块和在线检测模块相连;离线训练模块从数据预处理模块接收标准化后的历史kpi值向量,将标准化后的历史kpi值向量作为输入对异常检测模型进行训练,得到异常分值和训练好的模型,将异常分值发送到自动阈值选择模块,同时将训练好的模型发送给在线检测模块;
自动阈值选择模块与离线训练模块和在线检测模块相连,采用极值理论进行计算并得到阈值,将阈值发送给在线检测模块;
有效检测窗口设置模块与在线检测模块相连,有效检测窗口设置模块接收运维人员设置的有效检测窗口值,将有效检测窗口值发送给在线检测模块;
在线检测模块与数据预处理模块、离线训练模块、自动阈值选择模块、有效检测窗口设置模块和输出模块相连;在线检测模块从数据预处理模块接收标准化后的在线kpi值向量,从离线训练模块接收训练好的模型,从自动阈值选择模块接收阈值,从有效检测窗口设置模块接收有效窗口值,根据这些输入对在线kpi序列进行异常检测并得到检测结果,将检测结果发送到输出模块;
输出模块与在线检测模块相连,从在线检测模块接收检测结果,将检测结果发送到显示模块;
显示模块与输出模块相连,动态显示检测结果,若有异常结果则发送告警信息,由运维人员进行处理;
第二步:输入模块访问历史kpi序列数据库,从读取到的历史kpi序列提取kpi值向量v,将v发送到数据预处理模块;
第三步:数据预处理模块采用缺失点线性插值填充和标准化处理方法对kpi值向量v进行预处理,方法是:
3.1缺失点线性插值填充模块采用线性插值方法对v中的缺失点进行填充,将填充后的kpi值向量v′发送给kpi值向量标准化模块;v′=(v′1,...,v′i,...,v′t),v′i是填充后的vi;
3.2kpi值向量标准化模块对v′进行标准化操作,得到标准化后的kpi值向量vnorm;
3.3kpi值向量标准化模块将vnorm发送给离线训练模块;
第四步:离线训练模块对vnorm进行切分;然后构建基于序列化自编码器的kpi异常检测模型,并对模型进行训练;方法为:
4.1离线训练模块从kpi值向量标准化模块接收vnorm;
4.2离线训练模块对vnorm进行切分,得到切分后的kpi值向量vpart:
为第p个切分向量,1≤p≤p,p为切分数,为正整数,表示中的第r个值,表示中的最后一个值,r为vnorm切分后的中的值的个数;
4.3离线训练模块采用基于随机跨步连接的rnn方法构建由n个不同结构的序列化自编码器组成的无监督kpi异常检测模型;再对序列化自编码器组成的无监督kpi异常检测模型进行离线训练,其中n个序列化自编码器均接收vpart作为输入,n为正整数;具体方法是:
4.3.1离线训练模块构建基于序列化自编码器的无监督kpi异常检测模型,得到基于序列化自编码器的kpi异常检测模型;
4.3.2对基于序列化自编码器的kpi异常检测模型进行离线训练,得到异常分值向量score,和训练后的基于序列化自编码器的无监督kpi异常检测模型,简称异常检测模型;为最终异常分值:
表示取中的中位数;为n个序列化自编码器中第b个自编码器对第p个切分向量的重构误差;0≤b≤n-1;
4.4离线训练模块将score发送给自动阈值选择模块,将异常检测模型发送给在线检测模块;
第五步:自动阈值选择模块根据score计算阈值,方法是:
5.1自动阈值选择模块从离线训练模块接收score;
5.2自动阈值选择模块采用evt方法分析score分布,得到阈值threshold;
5.3自动阈值选择模块将阈值threshold发送给在线检测模块;
第六步:有效检测窗口设置模块接收运维人员设置的模块检测有效窗口值w,w为正整数且1≤w≤10,将w发送给在线检测模块;
第七步:输入模块、数据预处理模块、自动阈值选择模块、有效检测窗口设置模块、在线检测模块相互配合,对在线kpi序列进行检测:
7.1输入模块读取在线kpi序列数据库,提取在线kpi值向量vonline,用a表示vonline长度,将vonline发送到数据预处理模块;
7.2数据预处理模块采用第三步所述的缺失点线性插值填充和标准化处理方法对vonline进行预处理,得到标准化后的在线kpi值向量vonline_norm,记
7.3在线检测模块利用异常检测模型,利用第五步得到的阈值threshold、第六步设置的有效窗口值w,对vonline_norm进行检测,方法如下:
7.3.1在线检测模块将vonline_norm输入至异常检测模型,得到n个重构的kpi值向量,第x个重构kpi值向量记为为中第a个值;
7.3.2在线检查模块分别计算n个序列化自编码器的重构误差,方法是:
7.3.2.1令x=1;
7.3.2.2计算并保存第x个自编码器的kpi值向量的重构误差向量方法是:
7.3.2.3令x=x 1,如果x≤n,转7.3.1.2,否则计算结束,输出n个自编码器的重构误差向量errorrestore:
7.3.3根据errorrestore计算异常检测模型的异常分值,方法是:
7.3.3.1令a=1;
7.3.3.2读取并保存n个重构误差,方法是:
7.3.3.2.1令u=1;
7.3.3.2.2从errorrestore读取并保存;
7.3.3.2.3令u=u 1,如果u≤n,转7.3.3.2.2,否则输出转7.3.3.2.4;
7.3.3.2.4取的中位数作为第a个kpi值的异常分值,并保存,方法是:
median()为numpy的中位数计算函数;
7.3.3.3令a=a 1,如果a≤a,转7.3.2.2;否则输出异常检测模型的异常分值scoreonline:
转7.3.4;
7.3.4将阈值threshold与scoreonline进行比较,方法是:
7.3.4.1令变量a=1;
7.3.4.2判断第a个kpi值是否异常,方法是:
如果令检测结果ya=0,表示正常,否则令ya=1,表示异常;保存ya,转7.3.4.3;
7.3.4.3令a=a 1,如果a≤a,转7.3.3.2;否则比较完毕,输出检测结果向量y,y=(y1,…,ya,…,ya);
7.3.5根据窗口值w,向在线检测模块输入检测结果向量y,在线检测模块计算窗口内的异常值向量其中方法为:
7.3.5.1令d=1;
7.3.5.2计算表示在窗口范围内对向量值yd、yd 1、...、yd w-1进行“或”计算,如果表示异常窗口,如果表示正常窗口;
7.3.5.3若d≤m,令d=d 1,转7.3.5.2;若d>m,说明计算完毕,得到最终的检测结果yw,转7.3.6;
7.3.6将yw发送给输出模块,转第八步;
第八步:输出模块从在线检测模块接收检测结果yw,将检测结果发送到显示模块;
第九步:显示模块显示检测结果yw,若yw中有“异常”结果,即有则显示告警信息,提醒运维人员处理。
2.如权利要求1所述的一种基于序列化自编码器的无监督kpi异常检测方法,其特征在于3.1步所述缺失点线性插值填充模块采用线性插值方法对v中的缺失点进行填充的方法是按公式一进行填充,得到填充后的kpi值向量v′:
v′=v.interpolate(method=′linear′)公式一
interpolate()函数为pandas库提供的插值函数,参数method=′linear′表示使用线性方法进行插值计算;v′=(v′1,...,v′i,...,v′t)。
3.如权利要求1所述的一种基于序列化自编码器的无监督kpi异常检测方法,其特征在于3.2步所述kpi值向量标准化模块对v′进行标准化操作的方法是采用公式二进行标准化,得到标准化后的kpi值向量vnorm:
其中:μ代表v′的均值,σ代表v′的方差。
4.如权利要求1所述的一种基于序列化自编码器的无监督kpi异常检测方法,其特征在于4.2步所述离线训练模块对vnorm进行切分的方法是:利用numpy库的array_split()函数对vnorm进行不均等划分,得到切分后的kpi值向量vpart:
array_split()函数的切分规则是:对于长度为t的vnorm,前t%p个组的大小是剩下组的大小是其中%是取模操作,表示对t/p下取整。
5.如权利要求1所述的一种基于序列化自编码器的无监督kpi异常检测方法,其特征在于4.2步所述切分数p=10;4.3步所述n为20;第六步所述w取值1、5或10。
6.如权利要求1所述的一种基于序列化自编码器的无监督kpi异常检测方法,其特征在于4.3.1步所述离线训练模块构建基于序列化自编码器的无监督kpi异常检测模型的方法是:
4.3.1.1.2如果j=0,构建第一个编码器并得到第一个编码器的输出第一元组,方法是:利用tf.nn.dynamic_rnn函数构造一个隐藏层节点个数为h的lstm,h=16,得到第一个编码器;第一个编码器以作为输入,输出第一元组(e1p,z1p),并保存,其中表示第一神经元输出状态向量,为e1p中第r个值,代表第一隐藏层状态,为z1p中第r个值;转4.3.1.1.6,如果j≠0,转4.3.1.1.3;
4.3.1.1.3如果j=1,构建第二个编码器并得到第二个编码器的输出第二元组,方法是利用tf.nn.dynamic_rnn函数构造一个隐藏节点个数为h个的basiclstm,h=16,得到第二个编码器;第二个编码器以作为输入:输出第二元组(e2p,z2p),并保存,其中表示第二神经元输出状态向量,为e2p中第r个值,代表第二隐藏层状态,为z2p中第r个值,转4.3.1.1.6;如果j≠1且j≠0转4.3.1.1.4;
4.3.1.1.4如果1<j<n,转4.3.1.1.5;如果j≥n,转4.3.1.1.7;
4.3.1.1.5,构建第3到第n个编码器并得到第3到第n个编码器的输出,方法是:
4.3.1.1.5.1令变量q=3;
4.3.1.1.5.2如果q≤n,转4.3.1.1.5.3;否则转4.3.1.1.6;
4.3.1.1.5.3构建第q个编码器并以作为输入:利用tf.nn.dynamic_mn函数构造一个基于rscr的lstm,隐藏节点个数h=16,得到第q个编码器;第q个编码器以作为输入:输出第q元组(eqp,zqp),并保存,其中表示第q神经元输出状态向量,为eqp中第r个值,代表第q隐藏层状态,为zqp中第r个值;
4.3.1.1.5.4令q=q 1,转4.3.1.1.5.2;
4.3.1.1.6令变量j=j 1,转4.3.1.1.2;
4.3.1.1.7输出n个元组{(e1p,z1p),(e2p,z2p),…,(eqp,zqp),…,(enp,znp)}给共享层,(e1p,z1p)为第一元组,其中表示第一神经元输出状态向量,为e1p中第r个值,代表第一隐藏层状态,为z1p中第r个值;(e2p,z2p)为第二元组,其中表示第二神经元输出状态向量,为e2p中第r个值,代表第二隐藏层状态,为z2p中第r个值;(eqp,zqp)为第q元组,表示第q神经元输出状态向量,为eqp中第r个值,代表第q隐藏层状态,为zqp中第r个值;(enp,znp)为第n元组,表示第n神经元输出状态向量,为enp中第r个值,代表第n隐藏层状态,为znp中第r个值;
转4.3.1.2;
4.3.1.2构建共享层,方法是:
4.3.1.2.1共享层从n个编码器接收n个元组,即{(e1p,z1p),(e2p,z2p),…,(eqp,zqp),…,(enp,znp)};
4.3.1.2.2将权重矩阵w赋初值为0,矩阵大小为16×16;
4.3.1.2.3将n个编码器最后一个隐藏节点的状态形成向量将zlast及最后一个节点隐藏层对应的权重串联得到共享层
其中concatenate(zlast·wlast)为numpy库的串联函数,表示将和相乘。
4.3.1.3构建n个解码器,将作为n个解码器的输入,方法是:
4.3.1.3.1令变量k=0;
4.3.1.3.2如果k=0,构造第一个解码器:利用tf.contrib.seq2seq.basicdecoder函数构造一个隐藏节点个数为h′个的lstm,h′=h×n,输出重构向量转4.3.1.3.6,如果k≠0,转4.3.1.3.3;
4.3.1.3.3如果k=1,构建第二个解码器,利用tf.contrib.seq2seq.basicdecoder函数构建一个隐藏节点个数为h′的lstm,h′=h×n,输出重构向量转4.3.1.3.6,如果k≠0且k≠1,转4.3.1.3.4;
4.3.1.3.4如果1<k<n,转4.3.1.3.5;如果若k≥n,转4.3.1.3.7;
4.3.1.3.5构造第3到第n个解码器,方法是:
4.3.1.3.5.1令变量g=3;
4.3.1.3.5.2如果g≤n,转4.3.1.3.5.3;否则转4.3.1.3.6;
4.3.1.3.5.3构建第g个解码器:利用tf.contrib.seq2seq.basicdecoder函数构建隐藏节点个数为h′的rscr-rnn,h′=h×n,输出重构向量
4.3.1.3.5.4令g=g 1,转4.3.1.3.5.2;
4.3.1.3.6令变量k=k 1,转4.3.1.3.2;
4.3.1.3.7输出n个重构向量转4.3.1.3.8;
4.3.1.3.8定义损失函数和优化函数,方法为:
4.3.1.3.8.1定义损失函数loss:
其中:inputr表示输入向量的第r个值;outputr表示输出向量的第r个值;l1_regularizer(zshare)表示对zshare进行l1正则化的函数;
4.3.1.3.8.2采用adam作为模型训练的优化函数,基于序列化自编码器的kpi异常检测模型构建完毕。
7.如权利要求6所述的一种基于序列化自编码器的无监督kpi异常检测方法,其特征在于4.3.1.1.5.3步所述构建第q个编码器时基于oed方法,但隐藏层状态计算方法与oed方法不同:由三个元素决定:当前时刻输入vpr,直接前序节点隐藏状态值l步前的节点隐藏状态值l表示跨步步长,取1到n之间的随机值,得到为:
其中m为随机数,m∈{0,1},0表示无连接,1表示有连接,tanh(·)为一种神经网络激活函数,sigmoid(·)为另一种神经网络激活函数。
8.如权利要求l所述的一种基于序列化自编码器的无监督kpi异常检测方法,其特征在于4.3.2步所述对基于序列化自编码器的kpi异常检测模型进行离线训练的方法是:
4.3.2.1令变量p=1;
4.3.2.2将输入至基于序列化自编码器的kpi异常检测模型;
4.3.2.3创建tensorflow的会话sess;
4.3.2.2.1令变量iter=0,令迭代次数iter=50;
4.3.2.2.2利用sess.run()方法采用输入数据进行训练;
4.3.2.2.3如果iter<iter,令iter=iter 1,转4.3.2.2.2,否则训练完成,得到模型对的重构向量记为转4.3.2.3;
4.3.2.3计算异常分值,方法是:
4.3.2.3.1令变量b=0;
4.3.2.3.2根据和计算n个序列化自编码器中第b个自编码器对第p个切分向量的重构误差
4.3.2.3.3如果b<n,令b=b 1,转4.3.2.3.2;否则输出第p个切分向量的n个重构误差:转4.3.2.3.4;
4.3.2.3.4取errorp的中位数作为最终异常分值
表示取中的中位数;
4.3.2.3.5如果p≤p,令变量p=p 1,转4.3.2.2;否则得到最终异常分值向量score,模型训练结束,得到训练后的基于序列化自编码器的无监督kpi异常检测模型。
技术总结本发明公开了一种基于序列化自编码器的无监督KPI异常检测方法,目的是提高KPI异常检测的准确性和鲁棒性。技术方案是构建基于序列化自编码器的无监督KPI异常检测系统;输入模块提取KPI值向量;数据预处理模块对KPI值向量进行预处理;离线训练模块对标准化后的KPI值向量进行切分,构建异常检测模型并对模型进行训练;自动阈值选择模块计算阈值;有效检测窗口设置模块获取有效窗口值;输入模块、数据预处理模块、自动阈值选择模块、有效检测窗口设置模块、在线检测模块相互配合,对在线KPI序列进行检测,得到检测结果;显示模块显示检测结果。采用本发明可解决漏报率高、误报率高等问题,有效提高KPI异常检测的准确率。
技术研发人员:苏金树;赵娜;韩彪;蔡阳;陈曙晖;陶静;赵宝康;赵锋;魏子令
受保护的技术使用者:中国人民解放军国防科技大学
技术研发日:2021.05.31
技术公布日:2021.08.03