OmniAnomaly
Robust Anomaly Detection for Multivariate Time Series through Stochastic Recurrent Neural Network
基于随机递归神经网络的多元时间序列异常鲁棒检测
pytorch版本代码:https://github.com/imperial-qore/TranAD(里面有OmniAnomaly)
TensorFlow版本代码:https://github.com/NetManAIOps/OmniAnomaly
1. 引言
1.1使用多变量时间序列而不是单变量时间序列的原因
- 运营工程师更关心实体的整体状态,而不是每个组成指标。
- 在给定大量指标的情况下,为每个指标训练和维护一个单独的异常检测模型代价是很大的。
- 一个实体上的事件通常导致多个维度的异常。如果在指标级别检测到异常,则需要基于广泛的知识来做定义,以处理所有指标的异常结果,来确定实体是否异常。
- 直观的讲,对一个单变量时间序列的期望值建模可以受益于同一实体的多变量时间序列中的更多信息。
1.2 先前论文的缺点
- 先前的研究表示,与确定性变量相比,具有适当估计的概率分布的随机变量可以更加精确的捕获序列的随机性。
- 使用确定的方法来来建模。
- 使用随机方法但是忽略了时间序列的相关性。
1.3 观测值与正常模式的差异越大,就越有可能被认为是异常。这个想法面临着两大挑战。
第一个挑战是如何学习鲁棒的潜在表示,同时考虑多变量时间序列的时间依赖性和随机性。
第二个挑战是,在随机深度学习方法的情况下,如何对检测到的实体级异常进行解释。
1.4本文贡献
- OmniAnomaly是第一个多元时间序列异常检测算法,它可以处理随机变量之间的显式时间依赖性,以学习工业设备监控所需的输入数据的稳健表示。
- 我们提出了第一个基于随机的多元时间序列异常检测算法的异常解释方法,不仅适用于OmniAnomaly,还适用于等其他算法。
- 采用GRU、平面NF、随机变量连接和调整阈值超峰法进行异常阈值自动选择等四种关键技术对OmniAnomaly检测效果显著。
2. 问题描述
2.1 问题陈述
时间序列包含连续的观测值,这些观测值通常以相等的间隔时间戳收集。在我们的研究中,我们关注多变量时间序列,定义为
x
=
{
x
1
,
x
2
,
…
,
x
N
}
x=\{x_1, x_2, \ldots, x_N\}
x={x1,x2,…,xN},其中
N
N
N 是
x
x
x 的长度,观测值
x
t
∈
R
M
x_t \in R^M
xt∈RM 是时间
t
t
t(
t
≤
N
t \leq N
t≤N)的
M
M
M 维向量:
x
t
=
[
x
t
1
,
x
t
2
,
x
t
3
,
x
t
4
,
…
,
x
t
M
]
x_t=[x_t^1, x_t^2, x_t^3, x_t^4, \ldots, x_t^M]
xt=[xt1,xt2,xt3,xt4,…,xtM],
x
∈
R
M
×
N
x \in R^{M \times N}
x∈RM×N。
我们用
x
t
−
T
:
t
∈
R
M
×
(
T
+
1
)
x_{t-T:t} \in R^{M\times(T+1)}
xt−T:t∈RM×(T+1) 表示观测序列
{
x
t
−
T
,
x
t
−
T
+
1
,
…
,
x
t
}
\{x_{t-T}, x_{t-T+1}, \ldots, x_t\}
{xt−T,xt−T+1,…,xt} 从时间
t
−
T
t-T
t−T 到
t
t
t。对于多变量时间序列异常检测,目的是确定观测
x
t
x_t
xt 是否异常。
3.2 总体结构
实线表示离线训练
虚线表示在线检测过程
Data Preprocessiong:数据标准化,并通过滑动窗口将其分为序列
Model Training:被送到训练模块训练模型,并且捕获多变量序列的正常部分和输出每一个观测值的观测部分(一周或者一个月进行一次)
Threshold Selection:异常分数被送过去,自动选择阈值
Online Detection:输入:观测值被动到在线模型中。输出:异常分数
Anomaly Result:低于分数的为异常,高于分数的为正常(分数是重构概率,越高越好)。同时我们解释异常的时候,是排序每一个特征的异常分数(重构分数),低的为异常。
2.1数据预处理
通过数据标准化对数据集进行转换,然后通过长度为T+1的滑动窗口将数据集分割成序列。
2.2在线检测模块
在线检测模块存储训练好的模型
2.3 GRU, VAE和Planar NF的基础知识
GRU: GRU(Gate Recurrent Unit)是循环神经网络(Recurrent Neural Network, RNN)的一种。和LSTM(Long-Short Term Memory)一样,也是为了解决长期记忆和反向传播中的梯度等问题而提出来的。
输入:
有一个当前的输入x^ t 和上一个节点传递下来的隐状态 h^(t−1) ,这个隐状态包含了之前节点的相关信息。
输出:
结合 x^t和 h^(t−1) ,GRU会得到当前隐藏节点的输出 y^t 和传递给下一个节点的隐状态 h^t
VAE: 我们做了一个重要的假设来简化这个过程。我们假设潜在分布总是高斯分布。高斯分布可以很容易地用两个值来描述,即均值和方差或标准差(您可以从方差计算出标准差)。
NF: 为了学习非高斯部分,提出了一种称为平面NF的解决方案,该解决方案使用可逆映射来变换来学习
3. 全异常设计(Design of Omnianomaly)
3.1 网络体系结构
1. xt是观察数据,et-1是GRU在t-1时刻隐藏变量,它们首先进入GRU中得到t时刻的隐藏变量et。(et中包含历史信息,有助于帮助模型提取长时间序列数据)。
2. zt-1是t-1时刻的随机变量,[zt-1 , et]进入致密层,得到一个高斯分布,我们在高斯分布中随机采样,得到Z0。(获取潜在变量之间的联系)
3. 为了学习到Z空间中非高斯分布,我们使用可逆映射NF来对Z0进行处理,进行K次处理,得到ZK,然后作为输入进入pnet
4. dt-1(t-1时刻GRU的隐藏变量)和zt进入GRU中,得到dt,进入致密层得到一个高斯分布,从高斯分布中采样得到(x_t ) ̂
3.2 异常检测
- 将序列xt−T:t,即xt和它之前的T个连续观测值作为重建xt的输入。
- 这种重建可以通过条件概率对数来评估(分数越高,重建的越好),这种重建概率作为我们模型中的异常分数
- 使用POT自动选择阈值
- S t i S_t^i Sti 表示 t 时刻第 i 个特征的异常分数,分数越高,重构的越好。
- 排序 t 时刻每个特征的异常分数 S t i S_t^i Sti,分数低的表示异常点。
3.4 异常解释
- S t i S_t^i Sti 表示 t 时刻第 i 个特征的异常分数,分数越高,重构的越好。
- 排序 t 时刻每个特征的异常分数 S t i S_t^i Sti,分数低的表示异常点。
4. 讨论
4.1 Z空间表示的可视化
使用训练好的模型进行测试,我们把错误的数据输入到模型中,错误的数据映射在ZSpace中与正常的很接近,说明模型可以很好的重构。
4.2 经验
- 随机深度贝叶斯模型和确定性的RNN模型是必要的
- 随机变量的连接是必要的,在pnet中Zspace的连接帮助模型从历史随机变量中学习到更多的信息
- 有必要假设z空间中的非高斯分布,这可以通过流模型(如归一化流)来学习。
- 重构模型比预测模型更加稳定
- 对于重构模型来说,获得变量稳定的潜在表示是重要的
- 基于重建的随机方法,提供了具有物理意义的重构机