0 概论
1 基于隔离森林的异常检测算法
2 基于LOF的异常检测算法
3 基于One-Class SVM的异常检测算法
4 基于高斯概率密度异常检测算法
5 Opprentice——异常检测经典算法最终篇
6 基于重构概率的 VAE 异常检测
7 基于条件VAE异常检测
8 Donut: 基于 VAE 的 Web 应用周期性 KPI 无监督异常检测
9 异常检测资料汇总(持续更新&抛砖引玉)
10 Bagel: 基于条件 VAE 的鲁棒无监督KPI异常检测
11 ADS: 针对大量出现的KPI流快速部署异常检测模型
12 Buzz: 对复杂 KPI 基于VAE对抗训练的非监督异常检测
13 MAD: 基于GANs的时间序列数据多元异常检测
14 对于流数据基于 RRCF 的异常检测
15 通过无监督和主动学习进行实用的白盒异常检测
16 基于VAE和LOF的无监督KPI异常检测算法
17 基于 VAE-LSTM 混合模型的时间异常检测
18 USAD:多元时间序列的无监督异常检测
19 OmniAnomaly:基于随机循环网络的多元时间序列鲁棒异常检测
20 HotSpot:多维特征 Additive KPI 的异常定位
相关:
VAE 模型基本原理简单介绍
GAN 数学原理简单介绍以及代码实践
单指标时间序列异常检测——基于重构概率的变分自编码(VAE)代码实现(详细解释)
论文下载:netman
源码地址:github
数据集:https://s3-us-west-2.amazonaws.com/telemanom/data.zip
数据集对应的标签:https://raw.githubusercontent.com/khundman/telemanom/master/labeled_anomalies.csv
OmniAnomaly是一种将门控递归单元(GRU)和变分自动编码器(VAE)相结合的随机递归神经网络模型,其核心思想是学习多元时间序列的正态模式,并利用重构概率进行异常判断。
可以概括为以下几个关键字:
接下来我们关注一下论文的 contribution。
这部分 contribution 读起来多少有些不适,重新概括大概为:
了解大概内容以后,再看一下论文的总体结构:
接下来看一下论文的具体内容,为了快速抓住重点,加速阅读,我们跳过那些作用不大的背景描述,直接看一些重要部分吧。
对应原文中的 3.3 节
GRU (Gated Recurrent Unit) :门控循环神经⽹络(Gated Recurrent Neural Network)是一种 RNN,它通过可以学习的⻔来控制信息的流动。而 门控循环单元(Gated Recurrent Unit,GRU)是⼀种常⽤的门控循环神经⽹络。论文中应用GRU来捕捉时间序列中复杂的时间相关性。
VAE (Variational Auto-Encoder) :一种深度贝叶斯模型,它通过使用低维度的隐藏层来重构输入数据。从输入数据到隐藏层的过程称为 变分网络(Inferance Network) ,从隐藏层到重构数据的过程称为 生成网络(Generative Network)。
SGVB (Stochastic Gradient Variational Bayes) : 随机梯度变分贝叶斯,是一种变分推理算法,常常用在 VAE 中,来训练参数 ϕ \phi ϕ 和 θ \theta θ 使得 ELBO (Evidence Lower Bound,记作 L ( x t ) \mathcal{L(x_t)} L(xt) ) 最大化。
关于 VAE,我们介绍了很多很多次,可以参考 VAE 模型基本原理简单介绍。
其中 ELBO 的表达式为
L ( x t ) = E q ϕ ( z t ∣ x t ) [ log ( p θ ( x t ∣ z t ) ) ] − D K L [ q ϕ ( z t ∣ x t ) ∣ ∣ p θ ( z t ) ] = E q ϕ ( z t ∣ x t ) [ log ( p θ ( x t ∣ z t ) ) + log ( p θ ( z t ) ) − log ( q ϕ ( z t ∣ x t ) ) ] (1) \begin{aligned} \mathcal{L}\left(\mathbf{x}_{\mathbf{t}}\right) &=\mathbb{E}_{q_{\phi}\left(\mathbf{z}_{\mathbf{t}} | \mathbf{x}_{\mathbf{t}}\right)}\left[\log \left(p_{\theta}\left(\mathbf{x}_{\mathbf{t}} | \mathbf{z}_{\mathbf{t}}\right)\right)\right]-D_{K L}\left[q_{\phi}\left(\mathbf{z}_{\mathbf{t}} | \mathbf{x}_{\mathbf{t}}\right)|| p_{\theta}\left(\mathbf{z}_{\mathbf{t}}\right)\right] \\ &=\mathbb{E}_{q_{\phi}\left(\mathbf{z}_{\mathbf{t}} | \mathbf{x}_{\mathbf{t}}\right)}\left[\log \left(p_{\theta}\left(\mathbf{x}_{\mathbf{t}} | \mathbf{z}_{\mathbf{t}}\right)\right)+\log \left(p_{\theta}\left(\mathbf{z}_{\mathbf{t}}\right)\right)-\log \left(q_{\phi}\left(\mathbf{z}_{\mathbf{t}} | \mathbf{x}_{\mathbf{t}}\right)\right)\right] \end{aligned} \tag{1} L(xt)=Eqϕ(zt∣xt)[log(pθ(xt∣zt))]−DKL[qϕ(zt∣xt)∣∣pθ(zt)]=Eqϕ(zt∣xt)[log(pθ(xt∣zt))+log(pθ(zt))−log(qϕ(zt∣xt))](1)
蒙特卡罗积分(Monte Carlo integration)是一种变分推理算法,可以用来计算公式 1 中的均值,如公式 2 所示,其中, z t ( l ) z_\mathbf{t}^{(l)} zt(l) 是从 q ϕ ( z t ∣ x t ) q_{\phi}\left(\mathbf{z}_{\mathbf{t}} | \mathbf{x}_{\mathbf{t}}\right) qϕ(zt∣xt) 第 l l l 次的采样结果。:
L ( x t ) ≈ 1 L ∑ l = 1 L [ log ( p θ ( x t ∣ z t ( l ) ) ) + log ( p θ ( z t ( l ) ) ) − log ( q ϕ ( z t ( l ) ∣ x t ) ) ] (2) \mathcal{L}\left(\mathbf{x}_{\mathbf{t}}\right) \approx \frac{1}{L} \sum_{l=1}^{L}\left[\log \left(p_{\theta}\left(\mathbf{x}_{\mathbf{t}} | \mathbf{z}_{\mathbf{t}}^{(l)}\right)\right)+\log \left(p_{\theta}\left(\mathbf{z}_{\mathbf{t}}^{(l)}\right)\right)-\log \left(q_{\phi}\left(\mathbf{z}_{\mathbf{t}}^{(l)} | \mathbf{x}_{\mathbf{t}}\right)\right)\right] \tag{2} L(xt)≈L1l=1∑L[log(pθ(xt∣zt(l)))+log(pθ(zt(l)))−log(qϕ(zt(l)∣xt))](2)
在变分网络 q n e t qnet qnet 中, q ϕ ( z t ∣ x t ) q_{\phi}\left(\mathbf{z}_{\mathbf{t}} |\mathbf{x}_{\mathbf{t}}\right) qϕ(zt∣xt) 常假定为对角高斯 (diagonal Gaussian),但是,这个简单的假设会使网络欠拟合 ,因为 q ϕ ( z t ∣ x t ) q_{\phi}\left(\mathbf{z}_{\mathbf{t}} |\mathbf{x}_{\mathbf{t}}\right) qϕ(zt∣xt) 可能不一定遵循高斯分布。为了学习非高斯后验密度 q ϕ ( z t ∣ x t ) q_{\phi}\left(\mathbf{z}_{\mathbf{t}} |\mathbf{x}_{\mathbf{t}}\right) qϕ(zt∣xt) ,文献 [18,Variational Inference with Normalizing Flows] 提出了一种利用可逆映射对 q ϕ ( z t ∣ x t ) q_{\phi}\left(\mathbf{z}_{\mathbf{t}} |\mathbf{x}_{\mathbf{t}}\right) qϕ(zt∣xt) 进行变换的方法 planar NF。
论文首先从 q ϕ ( z t ∣ x t ) q_{\phi}\left(\mathbf{z}_{\mathbf{t}} |\mathbf{x}_{\mathbf{t}}\right) qϕ(zt∣xt) 采样得到 z t 0 z_\mathbf{t}^\mathbf{0} zt0,然后通过一个可逆映射链得到 z t K = f K ( f K − 1 ( … f 1 ( z t 0 ) ) ) z_\mathbf{t}^\mathbf{K} = f^{K}\left(f^{K-1}\left(\ldots f^{1}\left(\mathbf{z}_{\mathrm{t}}^{0}\right)\right)\right) ztK=fK(fK−1(…f1(zt0))),其中 f k ( k = 1 , 2... K ) f^k(k=1,2...K) fk(k=1,2...K) 是可逆映射函数 ( f k ( z t k − 1 ) = z t k − 1 + u tanh ( w T z t k − 1 + b ) \left(f^{k}\left(\mathrm{z}_{\mathrm{t}}^{\mathrm{k}-1}\right)=\mathrm{z}_{\mathrm{t}}^{\mathrm{k}-1}+\mathrm{u} \tanh \left(\mathbf{w}^{\mathrm{T}} \mathrm{z}_{\mathrm{t}}^{\mathrm{k}-1}+\mathrm{b}\right)\right. (fk(ztk−1)=ztk−1+utanh(wTztk−1+b),其中 u , w , b \mathbf{u,w,b} u,w,b 是文献 [18] 中的参数。在 q n e t qnet qnet 中,我们只把planar NF 的最终输出 z t K z^K_t ztK,作为隐藏层的随机变量 z t z_t zt(即 z t = z t K z_t =z^K_t zt=ztK)。
OmniAnomaly的基本思想如下:
OmniAnomaly 模型的概览图,其中左边是指 q n e t qnet qnet 变分网络,右边是指 p n e t pnet pnet 生成网络。
这个结构图片是真的真的不好看……
这个图片类比一下我们在 Donut 和 Bagel 算法中的模型,总体结构是一样的,需要注意 GRU 的添加。
接下来看看是怎么计算,对应着上面的图片进行学习。
其中使用 t t t 时刻的观测数据 x t x_t xt,以及 GRU 中 t − 1 t-1 t−1 时刻的隐变量 e t − 1 e_{t-1} et−1,生成 GRU 中 t t t 时刻的隐变量 e t e_t et,其中的对应关系如下公式 (3a) 所示。同样地,对于 VAE 中 μ \mu μ 和 σ \sigma σ 在 t t t 时刻与隐变量 z t z_t zt 的对应关系如 公式 (3b) (3c) 所示。
e t = ( 1 − c t e ) ∘ tanh ( w e x t + u e ( r t e ∘ e t − 1 ) + b e ) + c t e ∘ e t − 1 (3a) \mathbf{e}_{\mathrm{t}}=\left(1-\mathrm{c}_{\mathrm{t}}^{\mathrm{e}}\right) \circ \tanh \left(\mathbf{w}^{\mathrm{e}} \mathbf{x}_{\mathbf{t}}+\mathbf{u}^{\mathrm{e}}\left(\mathbf{r}_{\mathrm{t}}^{\mathrm{e}} \circ \mathbf{e}_{\mathrm{t}-1}\right)+\mathrm{b}^{\mathrm{e}}\right)+\mathbf{c}_{\mathrm{t}}^{\mathrm{e}} \circ \mathbf{e}_{\mathrm{t}-1} \tag{3a} et=(1−cte)∘tanh(wext+ue(rte∘et−1)+be)+cte∘et−1(3a)
μ z t = w μ z h ϕ ( [ z t − 1 , e t ] ) + b μ z (3b) \mu_{\mathrm{z}_{\mathrm{t}}}=\mathbf{w}^{\boldsymbol{\mu}_{\mathrm{z}}} h^{\phi}\left(\left[\mathbf{z}_{\mathrm{t}-1}, \mathbf{e}_{\mathrm{t}}\right]\right)+\mathbf{b}^{\boldsymbol{\mu}_{\mathrm{z}}} \tag{3b} μzt=wμzhϕ([zt−1,et])+bμz(3b)
σ z t = softplus ( w σ z h ϕ ( [ z t − 1 , e t ] ) + b σ z ) + ϵ σ z (3c) \sigma_{\mathrm{z}_{\mathrm{t}}}=\operatorname{softplus}\left(\mathrm{w}^{\sigma_{\mathrm{z}}} h^{\phi}\left(\left[\mathrm{z}_{\mathrm{t}-1}, \mathbf{e}_{\mathrm{t}}\right]\right)+\mathrm{b}^{\sigma_{\mathrm{z}}}\right)+\epsilon^{\sigma_{\mathrm{z}}} \tag{3c} σzt=softplus(wσzhϕ([zt−1,et])+bσz)+ϵσz(3c)
在公式 3a 中, r t e \mathbf{r^e_t} rte 是决定如何将新的输入数据与前一个结合的重置门,其中 r t e = s i g m o d ( w r e x t + u r e + b r e ) \mathbf{r^e_t} =sigmod(\mathbf{w^{r^e}}\mathbf{x_t}+\mathbf{u^{r^e} + \mathbf{b^{r^e}}}) rte=sigmod(wrext+ure+bre)。
c t e = sigmod ( w c e x t + u c e e t − 1 + b c e ) \mathbf{c}_{\mathbf{t}}^{\mathbf{e}}=\operatorname{sigmod}\left(\mathbf{w}^{\mathbf{c}^{\mathrm{e}}} \mathbf{x}_{\mathbf{t}}+\mathbf{u}^{\mathbf{c}^{\mathrm{e}}} \mathbf{e}_{\mathbf{t}-1}+\mathbf{b}^{\mathbf{c}^{\mathrm{e}}}\right) cte=sigmod(wcext+uceet−1+bce) 是决定需要保留多少以前的内存的更新门。
如图 3(b1) 所示, [ z t − 1 , e t ] ] [\left.\mathbf{z}_{\mathrm{t-1}}, \mathbf{e}_{\mathrm{t}}\right]] [zt−1,et]] 是 z t − 1 \mathbf{z}_{\mathbf{t-1}} zt−1 和 e t \mathbf{e_t} et 的串联。 h ϕ \mathcal{h}^\phi hϕ 表示带有 ReLU 激活函数的隐藏层。 μ z t \mathbf{\mu_{z_t}} μzt 来源于一个线性层, σ z t \mathbf{\sigma_{z_t}} σzt 是通过带有小随机变量 ϵ \epsilon ϵ (以防止数值溢出)的 soft-plus 激活函数而得到的。
所有的 u ∗ − s \mathbf{u}^*-\mathbf{s} u∗−s, w ∗ − s \mathbf{w}^*-\mathbf{s} w∗−s, b ∗ − s \mathbf{b}^*-\mathbf{s} b∗−s 是相应层的参数。 z t 0 \mathbf{z^0_t} zt0 是 q n e t qnet qnet 的输出结果,是对角线高斯并从 N ( μ Z t , σ Z t 2 I ) \mathcal{N}\left(\mu_{Z_{t}}, \sigma_{\mathrm{Z}_{t}}^{2} \mathbf{I}\right) N(μZt,σZt2I)采样而来。 为了学习 q ϕ ( z t ∣ x t ) q_{\phi}\left(\mathbf{z}_{\mathbf{t}} | \mathbf{x}_{\mathbf{t}}\right) qϕ(zt∣xt) 的后验分布,我们使用 planar NF 来最大化 z t \mathbf{z_t} zt。如图 3(b1) 所示, z t \mathbf{z_t} zt (即 z t K \mathbf{z^K_t} ztK)是 z t 0 \mathbf{z^0_t} zt0 通过 planar 映射中 K K K 次转换链 f k f^k fk 而得到的。
如图3(b2)所示, p n e t pnet pnet 尝试使用类似于 q n e t qnet qnet 的结构对 z t z_t zt 进行重构得到 x t x_t xt。 我们利用线性高斯 SSM[8] 来 “连接” q n e t qnet qnet 中的 z z z 空间变量,并使其暂时依赖关系为 z t = O θ ( T θ z t − 1 + v t ) + ϵ t \mathrm{z}_{\mathrm{t}}=\mathrm{O}_{\theta}\left(\mathrm{T}_{\theta} \mathrm{z}_{\mathrm{t}-1}+\mathrm{v}_{\mathrm{t}}\right)+\epsilon_{\mathrm{t}} zt=Oθ(Tθzt−1+vt)+ϵt ,其中 T θ \mathrm{T}_{\theta} Tθ 和 O θ \mathrm{O}_{\theta} Oθ 是转换矩阵和观测矩阵, v t ) \mathbf{v_t)} vt) 和 ϵ t \epsilon_{\mathrm{t}} ϵt 是转换和观测噪声。 在 t t t 时刻的 z t z_t zt 和 t − 1 t-1 t−1时刻的变量 d t − 1 \mathbf{d_{t-1}} dt−1 ,通过GRU单元格来产生确定性变量 d t \mathbf{d_t} dt (公式 4a)。然后 d t \mathbf{d_t} dt 通过稠密层进一步处理,生成变量 KaTeX parse error: Expected group after '^' at position 10: \mathbf{x^̲'t} ( x t \mathbf{x^t} xt 的重构变量) 的均值 μ x t \mu_{x_t} μxt 和标准差 σ x t \sigma_{x_t} σxt (公式4b和公式4c)。
类似于 q n e t qnet qnet, p n e t pnet pnet 可以以如下方式计算:
d t = ( 1 − c t d ) ∘ tanh ( w d z t + u d ( r t d ∘ d t − 1 ) + b d ) + c t d ∘ d t − 1 (4a) \mathbf{d}_{\mathbf{t}}=\left(1-\mathbf{c}_{\mathbf{t}}^{\mathrm{d}}\right) \circ \tanh \left(\mathbf{w}^{\mathrm{d}} \mathrm{z}_{\mathrm{t}}+\mathbf{u}^{\mathrm{d}}\left(\mathrm{r}_{\mathrm{t}}^{\mathrm{d}} \circ \mathbf{d}_{\mathbf{t}-1}\right)+\mathbf{b}^{\mathrm{d}}\right)+\mathbf{c}_{\mathbf{t}}^{\mathrm{d}} \circ \mathbf{d}_{\mathbf{t}-1} \tag{4a} dt=(1−ctd)∘tanh(wdzt+ud(rtd∘dt−1)+bd)+ctd∘dt−1(4a)
μ x t = w μ x h θ ( d t ) + b μ x (4b) \boldsymbol{\mu}_{\mathrm{x}_{\mathrm{t}}}=\mathbf{w}^{\boldsymbol{\mu}_{\mathrm{x}}} h^{\theta}\left(\mathrm{d}_{\mathrm{t}}\right)+\mathrm{b}^{\mu_{\mathrm{x}}} \tag{4b} μxt=wμxhθ(dt)+bμx(4b)
σ x t = softplus ( w σ x h θ ( d t ) + b σ x ) + ϵ σ x (4c) \sigma_{\mathrm{x}_{\mathrm{t}}}=\operatorname{softplus}\left(\mathbf{w}^{\sigma_{\mathrm{x}}} h^{\theta}\left(\mathbf{d}_{\mathrm{t}}\right)+\mathbf{b}^{\sigma_{\mathrm{x}}}\right)+\epsilon^{\sigma_{\mathrm{x}}} \tag{4c} σxt=softplus(wσxhθ(dt)+bσx)+ϵσx(4c)
其中, r t d = sigmod ( w r d z t + u r d d t − 1 + b r d ) \mathbf{r}_{\mathbf{t}}^{\mathbf{d}}=\operatorname{sigmod}\left(\mathbf{w}^{\mathbf{r}^{\mathrm{d}}} \mathbf{z}_{\mathbf{t}}+\mathbf{u}^{\mathbf{r}^{\mathrm{d}}} \mathbf{d}_{\mathbf{t}-1}+\mathbf{b}^{\mathbf{r}^{\mathrm{d}}}\right) rtd=sigmod(wrdzt+urddt−1+brd) 和 r t d = sigmod ( w c d z t + u c d d t − 1 + b c d ) \mathbf{r}_{\mathbf{t}}^{\mathbf{d}}=\operatorname{sigmod}\left(\mathbf{w}^{\mathbf{c}^{\mathrm{d}}} \mathbf{z}_{\mathbf{t}}+\mathbf{u}^{\mathbf{c}^{\mathrm{d}}} \mathbf{d}_{\mathbf{t}-1}+\mathbf{b}^{\mathbf{c}^{\mathrm{d}}}\right) rtd=sigmod(wcdzt+ucddt−1+bcd) 分别为复位门和更新门。
重构数据 x t ′ x^{'}_t xt′ 是从 N ( μ x t , σ x t 2 I ) \mathcal{N}\left(\mu_{\mathbf{x}_{\mathfrak{t}}}, \sigma_{\mathbf{x}_{\mathrm{t}}}^{2} \mathrm{I}\right) N(μxt,σxt2I) 采样,并从 z t z_t zt 中创建。如果 t t t 时刻存在异常,则 x t ′ x^{'}_t xt′ 可能与原始数据 x t x _t xt 显著不同。 因此,我们可以基于 x t x_t xt 的重构概率来检测异常。
O m n i A n o m a l y OmniAnomaly OmniAnomaly 中的 p n e t pnet pnet 和 q n e t qnet qnet 通过同时调整网络参数 ( u ∗ − s u*-s u∗−s、 w ∗ − s w*-s w∗−s 和 b ∗ − s b*-s b∗−s ) 进行训练。 与VAE模型类似,我们可以通过优化ELBO直接训练我们的模型,如3.3节所述。 训练数据集中的每个输入序列数据(例如 x t − T : t ) 的 长 度 为 x{t-T:t})的长度为 xt−T:t)的长度为T+1$。 对于第 l l l 个样本 z t − T : t ( l ) z^{(l)}_{t-T:t} zt−T:t(l),其中 1 ≤ l ≤ L 1\leq l \leq L 1≤l≤L , L L L 是样本长度,损失函数可以公式化如下:
L ~ ( x t − T : t ) ≈ 1 L ∑ l = 1 L [ log ( p θ ( x t − T : t ∣ z t − T : t ( l ) ) ) + log ( p θ ( z t − T : t ( l ) ) ) − log ( q ϕ ( z t − T : t ( l ) ∣ x t − T : t ) ) ] (5) \begin{aligned} \widetilde{\mathcal{L}}\left(\mathbf{x}_{\mathbf{t}-\mathrm{T}: \mathrm{t}}\right) \approx \frac{1}{L} \sum_{l=1}^{L} & {\left[\log \left(p_{\theta}\left(\mathbf{x}_{\mathbf{t}-\mathrm{T}: \mathrm{t}} \mid \mathbf{z}_{\mathbf{t}-\mathrm{T}: \mathrm{t}}^{(l)}\right)\right)+\right.} \\ &\left.\log \left(p_{\theta}\left(\mathbf{z}_{\mathbf{t}-\mathrm{T}: \mathrm{t}}^{(l)}\right)\right)-\log \left(q_{\phi}\left(\mathbf{z}_{\mathbf{t}-\mathrm{T}: \mathrm{t}}^{(l)} \mid \mathbf{x}_{\mathbf{t}-\mathrm{T}: \mathrm{t}}\right)\right)\right] \end{aligned} \tag{5} L (xt−T:t)≈L1l=1∑L[log(pθ(xt−T:t∣zt−T:t(l)))+log(pθ(zt−T:t(l)))−log(qϕ(zt−T:t(l)∣xt−T:t))](5)
对于每一个样本,公式 5 中的第一条的重构错误被忽略: log ( p θ ( x t − T : t ∣ z t − T : t ) ) = ∑ i = t − T t log ( p θ ( x i ∣ z t − T : i ) ) \log \left(p_{\theta}\left(\mathbf{x}_{\mathbf{t}-\mathrm{T}: \mathrm{t}} \mid \mathbf{z}_{\mathbf{t}-\mathrm{T}: \mathrm{t}}\right)\right)=\sum_{i=t-T}^{t} \log \left(p_{\theta}\left(\mathbf{x}_{\mathbf{i}} \mid \mathbf{z}_{\mathbf{t}-\mathrm{T}: \mathbf{i}}\right)\right) log(pθ(xt−T:t∣zt−T:t))=∑i=t−Ttlog(pθ(xi∣zt−T:i)),而 x i \mathbf{x_i} xi 的后验概率可以计算为 p θ ( x i ∣ z t − T : i ) ∼ N ( μ x i , σ x i 2 I ) p_{\theta}\left(\mathbf{x}_{\mathbf{i}} \mid \mathbf{z}_{\mathbf{t}-\mathrm{T}: \mathbf{i}}\right) \sim \mathcal{N}\left(\mu_{\mathbf{x}_{i}}, \sigma_{\mathbf{x}_{i}}^{2} \mathrm{I}\right) pθ(xi∣zt−T:i)∼N(μxi,σxi2I)。第二项和第三项之和是正则的 (即 Kullback-Leibler loss,KL 损失)。第二条 log ( p θ ( z t − T : t ) ) = ∑ i = t − T t log ( p θ ( z i ∣ z i − 1 ) ) \log \left(p_{\theta}\left(\mathbf{z}_{\mathbf{t}-\mathrm{T}: \mathbf{t}}\right)\right)=\sum_{i=t-T}^{t} \log \left(p_{\theta}\left(\mathbf{z}_{\mathbf{i}} \mid \mathbf{z}_{\mathbf{i}-\mathbf{1}}\right)\right) log(pθ(zt−T:t))=∑i=t−Ttlog(pθ(zi∣zi−1)),其中 z i \mathbf{z_i} zi 可以通过线性高斯SSM[8] 用标准多元正态分布初始化得到。 第三项是在 q n e t qnet qnet 中逼近 z i z_i zi 在 z z z 空间中的真实后验分布: − log ( q ϕ ( z t − T : t ∣ x t − T : t ) ) = − ∑ i = t − T t log ( q ϕ ( z i ∣ z i − 1 , x t − T : i ) ) ⋅ z i -\log \left(q_{\phi}\left(\mathbf{z}_{\mathbf{t}-\mathrm{T}: \mathbf{t}} \mid \mathbf{x}_{\mathbf{t}-\mathrm{T}: \mathrm{t}}\right)\right)=-\sum_{i=t-T}^{t} \log \left(q_{\phi}\left(\mathbf{z}_{\mathbf{i}} \mid \mathbf{z}_{\mathbf{i}-1}, \mathbf{x}_{\mathbf{t}-\mathrm{T}: \mathbf{i}}\right)\right) \cdot \mathbf{z}_{\mathbf{i}} −log(qϕ(zt−T:t∣xt−T:t))=−∑i=t−Ttlog(qϕ(zi∣zi−1,xt−T:i))⋅zi (即 z i K \mathbf{z^K_i} ziK 通过 planar NF 进行转换) z i K = f K ( f K − 1 ( … f 1 ( z i 0 ) ) ) \mathbf{z}_{\mathbf{i}}^{\mathbf{K}}=f^{K}\left(f^{K-1}\left(\ldots f^{1}\left(\mathbf{z}_{\mathbf{i}}^{0}\right)\right)\right) ziK=fK(fK−1(…f1(zi0))) ,其中 z i 0 = μ z i + ξ i σ z i \mathrm{z}_{\mathrm{i}}^{0}=\mu_{\mathrm{z}_{\mathrm{i}}}+\xi_{\mathrm{i}} \sigma_{\mathrm{z}_{\mathrm{i}}} zi0=μzi+ξiσzi, ξ i ∼ N ( 0 , I ) \xi_{i} \sim \mathcal{N}(0, \mathrm{I}) ξi∼N(0,I) , f k f^k fk 的计算已经在 3.3 节说明。
现在,我们可以使用训练的 OmniAnomaly 模型来确定在一个时间步长(例如 t t t 时刻,记作 x t x_t xt)上的观测是否异常。注意OmniAnomery的输入是长度为 T + 1 T+1 T+1 的序列数据。因此,我们将序列 x t − T : t x_{t-T:t} xt−T:t,即 x t x_t xt 和在它之前的连续观测作为输入来重建 x t x_t xt。正如文献 [24] 所建议的,这种重构可以用条件概率来进行评估 log ( p θ ( x t ∣ z t − T : t ) ) \log \left(p_{\theta}\left(\mathbf{x}_{\mathbf{t}} \mid \mathbf{z}_{\mathbf{t}-\mathbf{T}: \mathbf{t}}\right)\right) log(pθ(xt∣zt−T:t)) 。 这个重建概率作为我们模型中的异常分值。 x t x_t xt 的异常分值用 S t S_t St表示,所以 S t = log ( P θ ( x t ∣ z t − T : t ) ) S_t=\log (P_\theta(x_t | z_{t-T:t})) St=log(Pθ(xt∣zt−T:t))。高分意味着可以很好地重构输入数据 x t x_t xt。 如果一个观测遵循时间序列的正常模式,就可以以高置信度重构它。 另一方面,分数越小,观测结果越不可能被重构,因此异常的可能性越大。 即,如果 S t S_t St 低于异常阈值,则 x t x_t xt 标记为异常; 否则 x t x_t xt 是正常的。 接下来,我们描述了如何离线自动确定异常阈值。
如图2所示, 在离线训练过程中,我们利用一个多变量的时间序列,为每一个观测量计算一个异常分数。 然后所有异常得分形成一个单变量时间序列 { S 1 , S 2 , . . . , S N ′ } \{S_1,S_2,...,S_{N^{'}}\} {S1,S2,...,SN′}。 接下来,我们遵循极值理论(Extreme Value Theory,EVT) 的原理离线设置异常阈值 t h F th_F thF [22]。
EVT 是一种以寻找极值规律为目标的统计理论,而极值通常位于概率分布的尾部。 EVT 的优点是在求极值时不对数据分布作任何假设。 过峰值阈值 (Peak-Over-Threshold,POT) [22] 是 EVT 中的第二个定理。 POT 的基本思想是用带参数的广义帕累托分布 (Pareto distribution, GPD) 拟合概率分布的尾部。 我们采用 POT 来学习异常分数的阈值。 与传统的 POT 应用程序不同,这些应用程序侧重于“分布高端的值”,我们分析中的异常位于分布的低端。 因此,我们对 GPD 函数进行如下调整:
F ˉ ( s ) = P ( t h − S > s ∣ S < t h ) ∼ ( 1 + γ s β ) − 1 γ (6) \bar{F}(s)=P(t h-S>s \mid S
其中 t h th th 为异常得分的初始阈值, γ \gamma γ 和 β \beta β 为 GPD 的形状和尺度参数, S S S 为 { S 1 , S 2 , . . . , S N ′ } \{S_1, S_2, ..., S_{N^{'}}\} {S1,S2,...,SN′} 中的任意值。低于阈值 t h th th 的部分被表示为 t h − S th-S th−S ,并且根据经验将其设置为低分位数。与[22]类似,我们用极大似然估计(MLE)估计参数 γ ^ \hat{\gamma} γ^ 和 β ^ \hat{\beta} β^ 的值。 最终阈值 t h F th_F thF 如下计算:
t h F ≃ t h − β ^ γ ^ ( ( q N ′ N t h ′ ) − γ ^ − 1 ) (7) th_{F} \simeq t h-\frac{\hat{\beta}}{\hat{\gamma}}\left(\left(\frac{q N^{\prime}}{N_{t h}^{\prime}}\right)^{-\hat{\gamma}}-1\right) \tag{7} thF≃th−γ^β^((Nth′qN′)−γ^−1)(7)
其中 q q q 是观察到的期望概率 S < t h S < th S<th, N ′ N^{'} N′ 是观测数据的数量, N t h ′ N^{'}_{th} Nth′ 是 S i S_i Si 的数量, S i < t h S_i < th Si<th。对于POT方法,只有两个参数(低分位数和 q q q)需要调优。 这两个参数是全模型的,可以根据经验设置:低分位数(例如,小于7%)和 q q q(例如, 1 0 − 4 10^{-4} 10−4 ) [22],见附录 B。
正如第1节所述,我们的异常解释解决方案的目标是用按重建概率排序的前几个单变量时间序列来注释检测到的实体异常。 因此,我们必须求出 x t i x^i_t xti ( x t x_t xt 的第 i i i 个维度) 的重构概率。然而, 在 OmniAnomaly 中,计算了 M M M 维 x t x_t xt 的重构概率。 幸运的是,正如 4,2 章节所述, p θ ( x t ∣ z t − T : t ) ∼ N ( μ x t , σ x t 2 I ) p_{\theta}\left(\mathrm{x}_{\mathrm{t}} \mid \mathrm{z}_{\mathrm{t}-\mathrm{T}: \mathrm{t}}\right) \sim \mathcal{N}\left(\mu_{\mathrm{x}_{\boldsymbol{t}}}, \sigma_{\mathrm{x}_{t}}^{2} \mathrm{I}\right) pθ(xt∣zt−T:t)∼N(μxt,σxt2I) ,因此, p θ ( x t ∣ z t − T : t ) = ∏ i = 1 M p θ ( x t i ∣ z t − T : t ) p_{\theta}\left(\mathbf{x}_{\mathbf{t}} \mid \mathbf{z}_{\mathbf{t}-\mathrm{T}: \mathbf{t}}\right)=\prod_{i=1}^{M} p_{\theta}\left(x_{t}^{i} \mid \mathbf{z}_{\mathbf{t}-\mathrm{T}: \mathbf{t}}\right) pθ(xt∣zt−T:t)=∏i=1Mpθ(xti∣zt−T:t)。因此, x t x_t xt 的条件概率可分解为:
log ( p θ ( x t ∣ z t − T : t ) ) = ∑ i = 1 M log ( p θ ( x t i ∣ z t − T : t ) ) (8) \log \left(p_{\theta}\left(\mathbf{x}_{\mathbf{t}} \mid \mathbf{z}_{\mathrm{t}-\mathrm{T}: \mathrm{t}}\right)\right)=\sum_{i=1}^{M} \log \left(p_{\theta}\left(x_{t}^{i} \mid \mathbf{z}_{\mathrm{t}-\mathrm{T}: \mathrm{t}}\right)\right) \tag{8} log(pθ(xt∣zt−T:t))=i=1∑Mlog(pθ(xti∣zt−T:t))(8)
S t = ∑ i = 1 M S t i S_{t}=\sum_{i=1}^{M} S_{t}^{i} St=∑i=1MSti ,其中 S t i = log ( p θ ( x t i ∣ z t − T : t ) S_{t}^{i}=\log \left(p_{\theta}\left(x_{t}^{i} \mid \mathbf{z}_{\mathbf{t}-\mathrm{T}: \mathrm{t}}\right)\right. Sti=log(pθ(xti∣zt−T:t) ,而 S t i S_{t}^{i} Sti 是 x t i x_t^i xti 的异常值。注意, S t i S_t^i Sti 受益于多元时间序列 x t − t : t − 1 x_{t-t:t-1} xt−t:t−1 中的丰富信息,因此它的解释能力高于仅利用 x t − T : t − 1 i x^i_{t-T:t-1} xt−T:t−1i 获得的异常得分(如单变量时间序列中的异常得分)。
对于一个检测到的异常 x t x_t xt ,我们通过估计 x t x_t xt 各维的贡献(即重构概率)来解释它。我们将 S t i S^i_{t} Sti ( 1 ≤ i ≤ M 1 \le i \le M 1≤i≤M) 按升序排序,形成列表 A S t AS_t ASt。对 x t i x_t^i xti , A S t AS_t ASt 排名越高, S t i S^i_t Sti 越小, x t i x_t^i xti 对 x t x_t xt 的贡献越大。 将有序列表作为异常解释提供给操作员,希望前几个维度能为操作员理解和排除检测到的实体异常提供足够的线索。
注意因式分解公式8 与 p θ ( x t ∣ z t − T : t ) ∼ N ( μ x t , σ x t 2 I ) p_{\theta}\left(\mathbf{x}_{\mathbf{t}} \mid \mathbf{z}_{\mathbf{t}-\mathrm{T}: \mathbf{t}}\right) \sim \mathcal{N}\left(\mu_{\mathrm{x}_{t}}, \sigma_{\mathrm{x}_{t}}^{2} \mathrm{I}\right) pθ(xt∣zt−T:t)∼N(μxt,σxt2I) 一样。因此,我们提出的异常解释方法也适用于其他多元时间序列异常检测算法,如[16]。
实验基于三大数据集下进行:
数据集来源可以参考论文源码 https://github.com/NetManAIOps/OmniAnomaly,概括一下大致如下:
为了方便,我们使用 docker 搭建实验环境,希望对 docker 不了解的小伙伴稍微花费点点时间了解一下即可,整个过程相对以前而言简单很多,具体内容请参考 https://blog.csdn.net/smileyan9/article/details/127592804
OmniAnomaly运行过程视频录制
根据论文实验部分,可以看到论文的实验结果大致如下:
其中的 Donut 与 LSTM-VAE 在本系列博客中已经介绍过,可以自行复现。
实验结果的分析等等内容这里不做介绍。
这里没有提供对论文的全文翻译内容,但最核心部分的内容都已经翻译如文中所示。
算法的核心部件依然是 VAE,但是添加了一些自己的内容,并且使得 VAE 这种基于单指标的算法应用在多特征中。
论文的图片绘制或多或少有些不够漂亮,尤其是图3,实在忍不住想吐槽两句(见谅见谅)。
论文的源码的介绍,以及数据集的介绍都非常详细,总体来说还是很不错的,值得相关领域小伙伴们引用并作为对比实验的。
最后补充一下如非必要,均不用太在意最终输出结果是什么,结果怎么样。最主要的应该是了解论文思路,不停地查资料,来扩充自己对这方面的了解。一般情况下,只有在试图改进这个算法以及需要拿这个算法做对比实验的时候,才需要耐心跑完,分析结果。
感谢各位小伙伴的一路支持 ~ 非常感谢 ~
Smileyan
2022.10.30 23:29