zoukankan      html  css  js  c++  java
  • 基于概率建模的多维时间序列的异常检测

    摘要:亚马逊提出的deepar算法基于seq2seq模型对单维时间序列进行建模、预测,基于预测结果对时间序列中的异常点进行识别,但这种方法不适用于多维度的时间序列建模。在利用IoT+AI对现实世界中的物理设备进行异常检测的过程中,一个设备的运转/健康状态往往是由一系列指标共同决定的,指标之间并非相互独立的关系。本文吸收deepar算法的概率建模思想,以电机设备为例,提出一个对多维度指标进行异常检测的神经网络算法。

    主要原理:

    1、使用编码器将多维度时间序列编码为一个语义向量,编码器可以是一个LSTM网络或者卷积网络;

    2、解码器(一个MLP)对该向量进行解码,将其映射为两个参数,分别是:当前时刻多维指标的均值向量和协方差矩阵,这两个参数表征了一个多维高斯分布;

    3、概率层摄取高斯分布的参数,计算当前时刻设备状态的概率密度的负对数,通常认为异常状态所对应的概率密度值应远小于正常状态,因此通过为该输出设置阈值,即可用于异常检测;

    4、训练过程,只需最小化模型输出即可;

    通过输出多维高斯分布的均值向量和协方差矩阵对设备状态的概率密度进行刻画,面临的一个数学问题是,协方差矩阵必须为对称正定矩阵,如果直接通过MLP将语义向量映射为一个方阵,则无法满足对称正定约束,也无法训练。

    解决这个问题的方法为cholesky分解,对称正定矩阵总是可以分解为一个对角线元素全为正的上/下三角矩阵及其转置的乘积,反之也成立。

    因此,我们在解码器层,不直接输出协方差矩阵,而是输出precision矩阵(协方差矩阵的逆)的cholesky分解,并保证cholesky分解的对角线元素大于0即可(softplus),进一步可计算得到precision矩阵。

    我们仍然使用一个MLP(cov_net)将输入映射为一个方阵,但是只用其上三角部分,并对对角线部分作softplus转换,保证其非负性,作为precision矩阵的cholesky分解。

    在概率层,协方差矩阵行列式的计算,可直接使用cholesky分解的对角线乘积的平方即可。

    然后,在概率层计算真实数据的负对数似然。

    最后模型的优化,只需最小化模型输出即可,通过自定义以下损失函数,训练时将truth设置为0即可达到优化的目的。

    与deepar算法的比较:

    1、deepar针对单维度时间序列进行建模,本算法针对多维序列进行建模;

    2、deepar是一个seq2seq模型,本算法也是encoder-decoder架构,但是只对单点进行建模;

    3、deepar输出时间序列的预测值,本算法输出的是数据的负对数似然,即本算法将deepar中概率计算过程从loss拿到了概率层;

    4、异常检测方式:deepar使用ancestral sampling重复多次采样,通过计算采样值的上下百分位数作为异常检测的边界,这样的方法存在两个问题:误差累积和计算量大;针对多维数据,无法采用这样的方式,因为多维空间要比一维空间稀疏得多,要想用一系列采样值来表征一个多维分布,样本量必须充分大,这在计算上是不可行的,因此本算法采用单步预测方式,避免了采样带来的问题。

    5、deepar向前预测时间序列的未来值,本算法在给定序列值的前提下计算其“合理性”;

    6、deepar要求序列未来时刻的协变量是必须是可预知的,本算法无此要求。

    以下为将本算法应用于实时电机异常检测的整体过程。

    总体流程:

     

    详细过程:

    原理:

    本文提出一种基于编码器、解码器、概率层的三层神经网络结构,对电机的状态进行条件概率建模:

    其中,Z代表要建模的目标变量,X代表协变量,下标代表时刻。

    主要步骤如下:

    1. 对实时电机状态数据流进行特征提取,如三相电流和、day of week、hour of day等;
    2. 特征提取后,对电机状态数据流进行缓存,获得长度为k的电机状态时序数据,时序数据中既包含了电机的当前时刻状态,也包含了电机的历史状态数据;
    3. 将电机状态时序数据划分为目标变量序列Zt-k: t和协变量序列Xt-k: t。目标变量指要对其进行建模的变量,表征了电机的健康状态,可以包括电机温度、电机震动、链条震动、三相电流等;协变量表示电机当前所处的工作模式等非指示电机健康状态的变量,可以包括R位置值、day of week、hour of day等;
    4. 将序列数据转换为待预测的目标数据Zt和上下文序列数据{Zt-k: t-1,  Xt-k+1: t};
    5. 编码器基于一维卷积神经网络,将待检测的当前时刻电机状态的上下文序列数据{Zt-k: t-1, Xt-k: t}编码为一个一维向量Encoded;
    6. 解码器包含两个全连接神经网络,分别负责将编码器的输出Encoded解码为一个概率分布的位置参数和形状参数,对本文而言,使用多维高斯分布对电机状态进行建模,解码器的输出为多维高斯分布的均值向量miu和协方差矩阵covariance;
    7. 概率层以解码器的输出作为概率分布参数,建立当前时刻电机状态的多维高斯概率分布Gaussian;
    8. 计算电机当前时刻目标变量实际值的概率密度的负对数P;
    9. 概率层输出的概率密度P和阈值T比较,超出阈值则判定为异常,否则判定为正常;

    原理框图如下,其中各个变量的含义为:

    X:协变量

    Z:目标变量,也即要进行概率建模的变量

    t:当前时刻

    k:序列长度

    Encoded:对序列的编码

    miu:高斯分布的均值向量

    covariance:高斯分布的协方差矩阵

    Gaussian:高斯分布表示的概率层

    P:目标变量概率密度的负对数

     

     

  • 相关阅读:
    【用程序思维学习英语】
    【python3】修饰器简单理解
    【FLASK】发送QQ邮件
    【FLASK】数据库迁移
    【python3】with的用法
    【flask】工厂函数和蓝本的作用
    使用Python中的xltpl模块填充excel表格模板文件
    Python添加excel表格的批注
    在原有表格基础上面进行添加内容修改格式等操作
    Python操作excel表格库的介绍
  • 原文地址:https://www.cnblogs.com/zcsh/p/13839632.html
Copyright © 2011-2022 走看看