自编码器-异常检测
1.1 VAE
Paper:Variational Autoencoder based Anomaly Detection using Reconstruction Probability
2015,J An, S Cho - Special Lecture on IE
1.1.1 autoencoder based anomaly detection
一般认为使用正常样本将编码器训练好之后,正常样本能够很好地被重构出来, 而异常样本不能被很好地重构出来。
loss function:
detection, anomaly score ( reconstrction error):
1.1.2 Variational autoencoder based anomaly detection
一般假设z的先验分布是标准正态分布:
z的后验分布是正态分布:
这个$\mu{\mathbf{z}}$ 和 $\sigma {\mathbf{z}}$ 就是编码器生成的z的均值和方差。
解码器(decoder)输出的, 是x的后验分布 $p_{\theta}(\mathrm{x} \mid \mathrm{z})$,的均值, 在这个分布上采样, 才得到我们想要的重构后的$\vec{x}^{\prime}$。
object function, 最小化以下函数 :
其中,前一项, $D{K L}\left(q{\phi}\left(z \mid x^{(i)}\right) | p{\theta}(z)\right)$,是z的近似后验分布 $q{\phi}\left(z \mid x^{(i)}\right)$ , 和z的先验分布 $p\theta z =\mathcal{N}(0, \mathrm{I})$, 这两个分布的KL散度,放在损失函数里面,是希望 encoder 生成的z的后验分布 $q{\phi}\left(z \mid x^{(i)}\right)$ ,逼近假设的z的先验分布 $p_\theta z =\mathcal{N}(0, \mathrm{I})$。
其中,后一项,$\frac{1}{L} \sum{l=1}^{L}\left(\log p{\theta}\left(x^{(i)} \mid z^{(i, l)}\right)\right)$, 用来度量输入样本x和x的后验分布的距离。用正态分布来举例:
正态分布:
综上所述,在vae训练过程中,目标函数不仅约束了重构样本$\hat{x}$, 还约束了中间隐变量z,让z的分布往假设的先验分布$p_\theta z =\mathcal{N}(0, \mathrm{I})$靠近。
在检测阶段,异常分数为:
重构的样本与输入样本越相近, 这个异常分数越小。设定一个阈值, 当这个重构概率大于阈值时, 就认为它是异常样本。
1. 2. donut(VAE)
Paper:Unsupervised Anomaly Detection via Variational Auto-Encoder for Seasonal KPIs in Web Applications
2018, 裴丹, The Web Conference 2018 - Proceedings of the World Wide Web Conference, WWW 2018
关键词:周期性KPI
大体上还是VAE, 中间加了一些小技巧。
trick1:计算方差时使用soft plus
一般的vae获得方差$\sigma$的方式:方差$\sigma >= 0$, 隐藏层输出$h$不符合这个条件。可以假设$h = log \sigma$, 这样$\sigma = exp(h)$ 就满足大于等于0的条件。而在异常检测场景中,我们感兴趣的KPI的局部变化非常小,即$\sigma \rightarrow 0$, 导致$h \rightarrow -\infty$, 在计算的时候会问题。
改用softplus:$\sigma_=\operatorname{SoftPlus}(h)+{\epsilon}=log(1+exp(h))+\epsilon$, 其中$\epsilon$是很小的,大于零的超参,本文设置为$\epsilon=10^{-4}$。
trick2:修改损失函数
原来的vae目标函数为
考虑缺失点和异常值点, 修改目标函数为:
$\alphaw\in \left{ 0,1 \right} $, 正常点取1,异常点取0, $\beta$是放缩系数,$\beta=\left(\sum{w=1}^{W} \alpha_{w}\right) / W$
trick3:检测时, 异常值和缺失值补全
在一个窗口中,异常点和缺失点,先使用训练好的vae,经过M次迭代, 得到新的窗口序列, 然后再进行异常检测.
效果: 降噪
甚至修复:
1.3. bagel(CVAE)
Paper:Robust and Unsupervised KPI Anomaly Detection Based on Conditional Variational Autoencoder
2018 ,裴丹, 2018 IEEE 37th International Performance Computing and Communications Conference, IPCCC
time information related anomalies:
如上图的周期性KPI, 在最右边的蓝色框内为正常序列, 但是前后被异常序列包围. 由于Donut是使用滑动窗口的方法采样,而且训练的时候是将样本顺序打乱之后输入到网络中,所以面对这样的样本时, 很容易出现虚假警报. 本文提出使用CVAE的方法, 引入时间信息来解决这个问题.
2. buzz(adversarial training VAE)
Paper:Unsupervised Anomaly Detection for Intricate KPIs via Adversarial Training of VAE
2019,裴丹, Proceedings - IEEE INFOCOM
以上介绍的方法, 都只适用于周期性的KPI. 本文的模型适用于复杂的kpi
复杂的kpi:
KPI分为两种, 一种为周期平滑的KPI, 另外一种为复杂的KPI. 前者通常是服务级别的指标,比如每分钟交易次数. 后者是更加底层的指标,比如 每秒的I/O请求数量, 通常粒度更细. 通常可以认为, 周期性kpi的噪声是独立的高斯噪声, 而复杂KPI的噪声不是这种简单的高斯噪声.
复杂的kpi 虽然局部的抖动很严重, 但是 总体上还是有一定的模式.
网络结构:
window size=128, reshape: [8, 16], 然后卷积
训练流程:
两个超参数:s=32, b=8
取时刻点集合$\mathcal{W}= \left{w{1}, w{2}, \ldots, w{b}\right}$, 是一个mini_batch的时刻点集合. 满足一下条件:$w{i}$是s的倍数, 这样, 每个单元的数据是$\mathbf{x}^{(w)}, \mathbf{x}^{(w+1)}, \ldots, \mathbf{x}^{(w+s-1)}$,
训练过程中, 每经过40个epoch, 更新$s = s /2, b=b*2$, 直到$s=1$
目标函数:
最大化该函数
令判别器为 $F$, 生成器为$G$,
其中一项:
$\mathcal{K}$是隐变量$z$的先验分布和后验分布的KL散度, 意义是让z的后验分布往先验分布靠拢.
其中另外一项:
目的是让判别器F, 判别原始样本$\mathbf{x}^{(w+i)}$, 判别生成的样本$G(\mathbf{z})$.两者的输出差距越大越好.
检测方法:
先用训练好的vae,重构x,得到$\overline{\mathbf{x}} \leftarrow \mathbf{x}$, 然后计算$\log p{\theta}(\mathbf{x})-\log p{\theta}(\overline{\mathbf{x}})$,
结果: