相关:
VAE 模型基本原理简单介绍
论文名称:Variational Autoencoder based Anomaly Detection using Reconstruction Probability
发表时间:2015.12 立即下载
[1] An, Jinwon, and Sungzoon Cho. “Variational autoencoder based anomaly detection using reconstruction probability.” Special Lecture on IE 2.1 (2015): 1-18.
论文总体结构为:
Abstract: 我们提出了一种基于重构概率的异常检测方法
可变自动编码器。
KDD cup 1999
与 MNIST
,并与其他算法进行的比较。接下来会对各部分进行介绍,请根据需要进行查看。
内容包括:
三两句介绍异常的定义、异常检测的意义。
从光谱异常检测技术中引出基于重构误差的检测方法,并指出基于 PCA 的方法属于这种方法。
从降维的角度引出自编码器(Autoencoder),并说明这样的好处:更好提取特征、更高的隐藏层能够获取一些抽象特征。
提出基于 VAE 的异常检测算法,并说明其优点:与自动编码器和PCA相比,VAE的优势在于它提供了一个概率度量,而不是作为异常分数的重建误差,我们称之为重建概率。概率比重建误差更具原则性和客观性,不需要模型特定的阈值来判断异常。
可以用在自己论文中
Hawkins defined an anomaly as an observation which deviates so much from the other observations as to arouse suspicions that it was generated by a different mechanism[5].
异常检测方法总的分类:
Autoencoder 是通过无监督训练得到的网络,包括编码 (encoder) 和解码(decoder) 两部分。encoder 过程对应公式 (1) ,decoder 过程对应公式 (2),而公式 (3) 用于结算编码与解码过程对应原始数据造成的误差。称为重构误差(reconstruction error),训练的目的就是最小化重构误差。
h = σ ( W x h x + b x h ) ( 1 ) h = \sigma(W_{xh}x+b_{xh}) \ \ \ \ \ \ \ \ \ \ (1) h=σ(Wxhx+bxh) (1)
z = σ ( W h x h + b h x ) ( 2 ) z = \sigma(W_{hx}h+b_hx) \ \ \ \ \ \ \ \ \ \ (2) z=σ(Whxh+bhx) (2)
∣ ∣ x − z ∣ ∣ ( 3 ) ||x-z|| \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (3) ∣∣x−z∣∣ (3)
其中的 h h h 称为隐藏层,隐藏层的维度比输入层低,decoder 过程需要根据 h h h 重现输入数据 x x x 。这使得自动编码器对具有白噪声的数据具有鲁棒性,并且只捕获数据的有意义的模式。
自编码器的训练算法大致如下:
基于 AE 的异常检测是一种基于偏差的半监督学习算法,把重构误差 (reconstruction error) 作为异常值(anomaly score)。只把正常数据投入训练,完成训练后再对数据进行编码和解码操作,如果解码后数据与原始数据相近的数据是正常数据;当某数据的重构误差值高,我们认为是异常数据。
基于 AE 的异常检测算法如下:
可以用在自己论文中
Anomaly detection methods can be broadly categorized in to statistical, proximity based, and deviation based [1].
VAE 模型公式推导、更多介绍推荐参考 VAE 模型基本原理简单介绍
重构概率的计算公式在上图中(Algrithm 4)给出,这里特地摘出来方便编码:
r e c o n s t r u c t i o n p r o b a b i l i t y ( i ) = 1 L ∑ l = 1 L p θ ( x ( i ) ∣ μ x ^ ( i , l ) , σ x ^ ( i , l ) ) reconstruction\ probability(i)=\frac{1}{L} \sum^L_{l=1}{p_\theta (x^{(i)}|\mu_{\hat x^{(i,l)}},\sigma_{\hat x^{(i,l)}}}) reconstruction probability(i)=L1l=1∑Lpθ(x(i)∣μx^(i,l),σx^(i,l))
VAE的重构概率与自动编码器的重构误差不同之处包括:
论文用到两个数据集,使用方法如下:
可以用在自己论文中
Datasets used for anomaly detection are MNIST dataset [9] and KDD cup 1999 network intrusion dataset (KDD) [6].
对于两个数据集,
Encoder
和 Decoder
分别对应一个隐藏层,并且维度为 400。中间的隐变量的维度为200。VAE 使用 reconstruction probability 作为异常值。Encoder
和 Decoder
维度分别为 400,200.性能评估方法:
总结全文:提出了一种使用 VAE 进行异常检测的算法,这种算法是通过计算给定数据的重构概率来判断这个数据的异常成都。并且与AE、PCA、kPCA 算法进行的对比,结果显示 VAE 的优于其他三种算法。
结束了论文阅读后就到了编码实验部分了,这篇 2015 年的论文实验讲道理应该不难实现,推荐参考对应的实现(注:不是论文作者),地址如下:
主要问题包括
如果有任何疑问请评论,讨论一下解决问题。
以下代码摘录于: https://github.com/Michedev/VAE_anomaly_detection
并且对该代码进行简单的分析:
from scipy.stats import multivariate_normal
def reconstructed_probability(self, X, L=100):
"""
X 即需要计算重构概率的一组数据。
以 MNIST 为例,如果每次测 32 条数据,那么 X.shape = (32,28,28)
"""
# 初始化每个待测数据的概率为 0
reconstructed_prob = np.zeros((X.shape[0],), dtype='float32')
# 从模型中拿到均值和方差,注意 均值和方差都是数列
mu_hat, sigma_hat = self.session.run([self.mu_post, self.sigma_post], {
self.X: X})
# 进行 L 次采样
for l in range(L):
mu_hat = mu_hat.reshape(X.shape)
sigma_hat = sigma_hat.reshape(X.shape) + 0.00001
# 计算每个测试数据的重构概率
for i in range(X.shape[0]):
p_l = multivariate_normal.pdf(X[i, :], mu_hat[i, :], np.diag(sigma_hat[i, :]))
reconstructed_prob[i] += p_l
# 取平均值
reconstructed_prob /= L
return reconstructed_prob
注意 multivariate_normal
来自于 scipy.stats
,并且根据协方差矩阵的性质而传入方差从而计算概率密度。
注意: 经过编码实践发现改代码存在一个重大的问题——正确率与 L
大小无关。
很明显这个与论文原来的设计思想是不一致的。再看论文算法截图,注意其中部分
for l=1 to L do
...这一行内容
end for
即 μ x ^ ( i , l ) , σ x ^ ( i , l ) = g ϕ ( x ∣ z ( i , l ) ) \mu_{\hat{x}^{(i,l)}},\sigma_{\hat{x}^(i,l)} =g_\phi(x|z^(i,l)) μx^(i,l),σx^(i,l)=gϕ(x∣z(i,l)) 这行的理解。
按照上面摘录的代码,对于每一份测试数据只对应一份隐变量 z z z,也就是说,对每个测试数据其实只经历过一次 encode 得到 μ \mu μ 和 σ \sigma σ ,然后再进行pdf 计算等等,重复 L
次。
然后 L
次计算一模一样,参数一样,数据一样,结果也一样。也就是说,对于上面那份源码 L=100
与 L=10
的结果是一模一样的。感兴趣的伙伴可以测试一下。
解决方法
算法的本意应该是,根据每个输入数据 x i x_i xi 对应的 μ \mu μ 和 σ \sigma σ 可以得到一个 z z z 的分布(注意可以是多元高斯分布),然后再从这个分布中采样 L L L 次,得到 L L L 组 μ ^ \hat\mu μ^ 与 σ ^ \hat\sigma σ^ 然后再计算分别计算概率密度(即输入数据 X X X 在这 L L L 组中的概率密度),再求均值。
为了方便可以考虑 去掉 L 次循环,就执行一次就好了。(注:这个地方很值得讨论一下)
这篇论文介绍的是使用 reconstruction probability 作为异常值,基本思想就是在一个首先构建一个生产正常值的环境 (即由隐变量所确定的隐变量空间),在这个环境中不管如何 sample 拿到的可能与输入数据差别很大,但是这种差别依然是在正常数据的容忍范围内。但是如果不在这个环境中sample 而是投入另外一组异常特征,生成数据与正常数据差异就很大。也就是reconstruction probability 的值很大,我们觉得它与正常数据差别很大,它不属于这个优雅的环境,所以判定它为异常数据。
Smileyan
2020.10.24 15:36
最后更新:2021.1.7 21:14
感谢您的 点赞、 收藏、评论 与 关注