精华内容
下载资源
问答
  • vae异常检测
    千次阅读 热门讨论
    2022-03-02 09:20:36

    《异常检测——从经典算法到深度学习》

    相关:

    17. 基于 VAE-LSTM 混合模型的时间异常检测

    论文题目:Anomaly Dection For Time Series using VAE-LSTM hybrid model
    CCF B类会议 ICASSP 2020
    论文下载:源地址 | 蓝奏云地址2
    论文翻译 | 源码地址

    17.1 论文概述

    论文提出一种 VAE 与 LSTM 的组合模型,并通过实验证明自己的模型是可靠的,有效的。

    这是一篇小论文(共5页,参考文献占1页),简单精悍类型的,值得一读。

    我们需要重点关注作者是如何结合这两个模型、以及实验是怎么完成的。

    17.2 如何结合VAE与LSTM两个模型

    在这里插入图片描述
    从上往下看,首先是一个原始的时间窗口,接下进行编码(VAE 的 encoder),得到的是低维度的向量集。把它们内嵌(embedding)到 LSTM 中,用来预测下一个窗口的内嵌(embedding)。再进行 解码(VAE的Decoder),得到的是重构的窗口。

    从左往右看,首先 异常检测值=预测误差。中间是整个网络结构,右边是对每一层的解释。

    总结一下,变分自编码的隐变量(即图片中的embedding)作为LSTM的输入,用来预测下一个隐变量(embedding),最后将预测误差作为异常值。

    17.3 如何训练VAE-LSTM模型

    在这里插入图片描述
    图片左侧不含异常数据,用于训练。

    训练VAE的过程没有做修改,使用的是默认的ELBO作为损失函数。

    训练LSTM的过程与其他LSTM一样,希望训练后的模型具有很好的预测能力。

    [ e ^ t 2 , ⋅ ⋅ ⋅ , e ^ t k ] = LSTM ( [ e t 1 , ⋅ ⋅ ⋅ , e t k − 1 ] ) (1) [\hat{e}_t^2, \cdot\cdot\cdot, \hat{e}_t^k] = \text{LSTM}([e_t^1,\cdot\cdot\cdot,e_t^{k-1}]) \tag{1} [e^t2,,e^tk]=LSTM([et1,,etk1])(1)

    这个地方省略了LSTM的原理,损失函数,就把它当成一个预测回归模型即可。

    17.4 VAE-LSTM如何进行异常检测

    完成训练以后,VAE-LSTM已经具备很好的预测能力,注意是预测下一个窗口的对应的VAE的隐变量,并根据这个隐变量,使用训练好的VAE进行重构。

    w ^ t − ( k − i ) × p = Decoder ( e ^ t i ) ,     i = 2 , . . . , k . (2) \hat{w}_{t-(k-i)\times p}=\text{Decoder}(\hat{e}_t^i), \ \ \ i=2,...,k. \tag{2} w^t(ki)×p=Decoder(e^ti),   i=2,...,k.(2)

    对于重构的窗口,可以定义一个函数 d t d_t dt,通过总结 w t w_t wt 的预测误差来评估是否异常。

    d t = ∑ i = 2 k ∥ w ^ t − ( k − i ) × p − w t − ( k − i ) × p ∥ (3) d_t= \sum_{i=2}^k \left\| \hat{w}_{t-(k-i)\times p} -w_{t-(k-i)\times p} \right\| \tag{3} dt=i=2k w^t(ki)×pwt(ki)×p (3)

    然后根据实际情况定义一个阈值 θ \theta θ ,将 d t d_t dt 的输入转换成0或者1的异常标志。

    17.5 实验部分

    17.5.1 数据集与实验效果

    论文使用了五个数据集,对比实验包括 VAE与ARMA。
    在这里插入图片描述
    具体的数据集可以在 github 源码上看到,具体地址是:https://github.com/lin-shuyu/VAE-LSTM-for-anomaly-detection/tree/master/datasets

    17.5.2 使用源码

    源码地址

    步骤1 克隆源码到本地。

    $ git clone https://github.com/lin-shuyu/VAE-LSTM-for-anomaly-detection
    

    步骤 2 查看一下本地是不是安装了 tennsorflow,并看一下版本。

    $ pip show tensorflow
    

    如果安装了高版本的tensorflow,尽量降低到1.x,避免后面出现问题。需要注意的是如果出现如下问题是python版本太高而导致的,需要降低python版本后再安装 tensorflow 1.x ,我环境下python的版本是3.7,安装的tensorflow是 1.15.4
    在这里插入图片描述
    确保tensorflow1.x安装完成以后,就可以准备跑代码了。

    步骤4 安装其他所需依赖

    $ cd VAE-LSTM-for-anomaly-detection
    $ pip install -r requirements.txt
    

    步骤5 跑源码提供的测试代码。

    注意首先要跳转到 code 目录下,然后执行以下的 train.py 脚本。

    $ cd code
    $ python train.py --config NAB_config.json
    

    需要大概几分钟的时候,训练完成以后,再打开源码提供的 NAB-anomaly-detection.ipynb,因此需要环境安装了 anaconda,打开后,就可以Restart & Run All 即可。

    在这里插入图片描述
    在这里插入图片描述
    运行后会生成一个文件夹,experiments 训练与测试均已完成。
    在这里插入图片描述

    为了查看效果,可以考虑运行一下项目中自带的 ipynb 文件,如下图所示:

    在这里插入图片描述
    在这里插入图片描述

    17.6 总结

    小论文言简意赅,主要收获应该包括:

    • 了解如何做一个组合模型;
    • 跑通源码后可以基于这个基础上修改,实现一些自己的算法;
    • 数据集在git仓库中提供,可以拿过来用。

    Smileyan
    2022.3.28 15:42

    感谢您的 点赞收藏评论关注,您的支持是我继续更新的动力!

    更多相关内容
  • 6 基于 VAE异常检测算法 6. 基于 VAE异常检测算法 论文名称:Variational Autoencoder based Anomaly Detection using Reconstruction Probability 发表时间:2015.12 立即下载 论文总体

    《异常检测——从经典算法到深度学习》

    相关:

    6. 基于重构概率的 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: 我们提出了一种基于重构概率的异常检测方法
    可变自动编码器。

    1. Introduction
    2. Backgroud
      2.1 Anomaly detection:介绍异常检常用几个方法。
      2.2 Autoencoder and anomaly detection: 介绍自编码器(autoencoder) 如何进行异常检测。
      2.3 Variational Autoencoder:介绍 VAE 的核心内容、VAE 与 AE 的区别 以及 VAE 训练算法。
    3. Proposed method
      3.1 Algorithm: 总体介绍基于 VAE 模型的异常检测算法。
      3.2 Reconstruction Probability:介绍上述算法中用的 reconstruction probability。
      3.3 Difference from an autoencoder based anomaly detection: 介绍两种算法的区别。
    4. Experimental Results
      实验部分用到了两个数据集 KDD cup 1999MNIST,并与其他算法进行的比较。

    接下来会对各部分进行介绍,请根据需要进行查看。

    6.1 Introduction

    内容包括:

    • 三两句介绍异常的定义、异常检测的意义。

    • 从光谱异常检测技术中引出基于重构误差的检测方法,并指出基于 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].

    6.2 Background

    6.2.1 Anomaly detection

    异常检测方法总的分类:

    • 统计异常检测假设数据是从指定的概率分布建模的。参数模型(如高斯混合模型)或非参数模型(如核密度估计)可用于定义概率分布。如果从模型中生成数据点的概率低于某个阈值,则将其定义为异常。这种模型的优点是给出了概率作为判断异常的决策规则,具有客观和理论上的合理性。
    • 基于邻近度的异常检测假设异常数据与大多数数据隔离。用这种方法对异常进行建模有三种方法,即基于聚类的、基于密度的和基于距离的。对于基于聚类的异常检测,将聚类算法应用于数据,以识别数据中存在的密集区域或簇。对每一个异常点的关系进行评估,形成每一个异常点的关系。这些标准包括到星团质心的距离和最近的星团的大小。如果到簇质心的距离高于阈值或最近的簇的大小低于阈值,则数据点被定义为异常。基于密度的异常检测将异常定义为位于数据稀疏区域的数据点。例如,如果数据点的局部区域内的数据点数量低于阈值,则将其定义为异常。基于距离的异常检测使用与给定数据点的相邻数据点相关的测量。K近邻距离可用于这样一种情况,即具有较大K近邻距离的数据点被定义为异常。
    • 基于偏差的异常检测主要基于光谱异常检测,以重建误差作为异常分数。第一步是使用降维方法(如主成分分析或自动编码器)重建数据。利用k-最显著主成分对输入进行重构,并测量其原始数据点与重构数据点的差值,从而产生重构误差,作为异常评分。将重建误差较大的数据点定义为异常。

    6.2.2 Autoencoder and anomaly detection

    • 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) ∣∣xz∣∣                              (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].

    6.2.3 Variational Autoencoder

    VAE 模型公式推导、更多介绍推荐参考 VAE 模型基本原理简单介绍

    • 变分自动编码器(VAE)是一种有向概率图形模型(DPGM),其后验由神经网络逼近,结构类似于自动编码器。如图一所示 : 在这里插入图片描述
      编码与解码过程如图二所示: 在这里插入图片描述
      编码与解码过程分别交给两个神经网络完成,VAE 的整体结构如图三所示:
      在这里插入图片描述
      关于 VAE 更详细的介绍推荐参考 VAE 模型基本原理简单介绍
    • VAE和自动编码器之间的主要区别是,VAE是一个随机生成模型,可以提供校准的概率,而自动编码器是一个确定性的判别模型,没有概率基础。这一点很明显,因为VAE对上述分布的参数进行了建模。
    • VAE 模型的训练算法如图所示
      在这里插入图片描述

    6.3 Proposed method

    6.3.1 Algorithm

    在这里插入图片描述
    请务必结合上图理解下面的算法步骤:

    • 使用正常数据进行训练,训练过程中 decoder 和 encoder 共同确定隐变量的参数(即多个正态分布的 σ \sigma σ μ \mu μ)。对应图片中的
      ϕ , θ ← \phi,\theta \leftarrow ϕ,θ train a variational autoencoder using the normal dataset X
    • 对于N个测试数据循环遍历,对于每个测试数据 x i x^i xi 操作如下:
      • 对于每个测试数据 x i x^i xi,通过训练好的 VAE 模型得到 μ z ( i ) \mu_z{(i)} μz(i) σ z ( i ) \sigma_z{(i)} σz(i)
      • 根据刚刚得到 μ z ( i ) \mu_z{(i)} μz(i) σ z ( i ) \sigma_z{(i)} σz(i) 得到关于z的正态分布 N ( μ z ( i ) , σ z ( i ) ) N(\mu_z(i),\sigma_z(i)) N(μz(i),σz(i)) ,从中抽取样本 L。
      • 对于抽取样本L中的每一个数据 z ( i , l ) z^{(i, l)} z(i,l),关于 l l l 的循环:
        • 进行 decode 操作,得到 x ^ \hat x x^,这里可能是为了表示 μ ( l ) \mu (l) μ(l) σ ( l ) \sigma(l) σ(l) x ^ ( i ) \hat x(i) x^(i) 的关系,记作 μ x ^ ( i , l ) \mu_{\hat x}{(i,l)} μx^(i,l) σ x ^ ( i , l ) \sigma_{\hat x}{(i,l)} σx^(i,l)
        • 循环结束后得到多个 μ x ^ ( i , l ) \mu_{\hat x}{(i,l)} μx^(i,l) σ x ^ ( i , l ) \sigma_{\hat x}{(i,l)} σx^(i,l). 其实就是多个 x ^ \hat x x^
      • 通过多个 x ^ i \hat x_i x^i 与训练好的 VAE 模型生成原来的测试数据 x i x_i xi,并计算重构概率(reconstruction probability)。
      • 这里计算的重构概率是对 E q φ ( z ∣ x ) [ l o g p θ ( x ∣ z ) ] E_{q_φ(z|x)}[log p_\theta(x|z)] Eqφ(zx)[logpθ(xz)] 的 蒙特卡罗估计(Monte Carlo
        estimate
        ),当数据的重构概率很高时被归类为异常。

    6.3.2 Reconstruction Probability

    重构概率的计算公式在上图中(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=1Lpθ(x(i)μx^(i,l),σx^(i,l))

    • 重构概率(reconstruction probability) 由随机隐变量计算,这些隐变量可以输出原始输入变量分布的参数,而不是输入数据本身。(注: 然后使用这些参数和生成网络生成数据,所以说,不是重构输入数据本身)从本质上讲,这是从后验分布中提取的确定的隐变量生成数据的概率。由于从隐变量分布中提取了大量样本,这使得重构概率能够考虑隐变量空间的可变性,这是该方法与基于自动编码器的异常检测方法的主要区别之一。可以使用适合数据的输入变量空间的其他分布。
    • 对于连续数据,正态分布可以用在算法4中。对于二进制数据,可以使用伯努利分布。在隐变量空间分布的情况下,一个简单的连续分布,如各向同性正态分布是首选。这可以通过谱异常检测的假设来证明,隐变量空间比输入变量空间简单得多。

    6.3.3 Difference from an autoencoder based anomaly detection

    VAE的重构概率与自动编码器的重构误差不同之处包括:

    • 隐变量是随机变量。AE的隐变量由确定性映射定义,但 VAE 使用概率编码器来模拟隐变量的分布,而不是隐变量本身,因此可以从采样过程中考虑隐变量空间的可变性。VAE 相对 AE 而言扩展了表达能力,因为即使正常数据和异常数据可能共享相同的平均值,可变性也可能不同。据推测,异常数据的方差较大,重构概率较低。由于 AE 的确定性映射可以看作是到 δ \delta δ 分布平均值的映射,所以 AE 缺乏处理变化的能力。(通俗来说讲,AE 太实诚了,不懂得变通)
    • 重构的是随机变量。重构概率不仅考虑了重构与原始输入的差异,而且考虑了分布函数的方差参数对重构结果的影响。这一特性使得对根据变量方差重构的选择性敏感。方差较大的变量可以容忍重构过程中与原始数据之间的较大差异,而方差较小的变量将显著降低重构概率。这也是 AE 由于其确定性映射关系缺少的特性。
    • 重构是概率度量。基于 AE 的异常检测使用重构误差作为异常值,如果输入变量是异构的,则很难计算出异常值。为了总结异构数据的差异,需要加权求和。但没有一种通用的客观方法来确定合适的权重,因为权重会因数据而异。而且,即使在权值确定之后,确定重构误差的阈值也很麻烦。没有明确的客观门槛。相比之下,重构概率的计算不需要对异构数据的重建误差进行加权,因为每个变量的概率分布允许它们根据自身的可变性分别计算。对于任何数据,1% 的概率总是 1%。因此,与重构误差阈值的确定相比,重构误差阈值的确定更为客观、合理、易于理解。

    6.4 Experimental Results

    6.4.1 Datasets and setup

    论文用到两个数据集,使用方法如下:

    • KDD cup 1999:将数据按 80% 与 20% 的比重分为正常数据与异常数据,训练时用到其中的正常数据。KDD 元数据包含五类数据,如下图 (Table 1) 所示。预处理时对于分类用到了 one-hot 方法,对于数值变量,采用0均值标准化和单位方差处理。
    • MNIST:把某个数字对应的数据作为异常,而其他9个数字作为正常数据。(比如说假设1为异常数据局而其他9个数字对应的数据都为正常数据)
      在这里插入图片描述

    可以用在自己论文中
    Datasets used for anomaly detection are MNIST dataset [9] and KDD cup 1999 network intrusion dataset (KDD) [6].

    6.4.2 Model setup

    对于两个数据集,

    • VAE 模型的 EncoderDecoder 分别对应一个隐藏层,并且维度为 400。中间的隐变量的维度为200。VAE 使用 reconstruction probability 作为异常值。
    • AE 使用两个隐藏层分别用于 EncoderDecoder 维度分别为 400,200.
    • linear PCA 和 kernel PCA (kPCA) with a Gausssian kernel 。

    6.4.3 Performance evaluation

    性能评估方法:

    • AUC-ROC (Area under the curve of the receiver operating characteristic )
    • AUC-PRC (average precision
      or Area under the curve of the precision recall curve)
    • f1-score

    在这里插入图片描述
    在这里插入图片描述

    6.5 Conclusion

    总结全文:提出了一种使用 VAE 进行异常检测的算法,这种算法是通过计算给定数据的重构概率来判断这个数据的异常成都。并且与AE、PCA、kPCA 算法进行的对比,结果显示 VAE 的优于其他三种算法。

    6.6 代码实现

    结束了论文阅读后就到了编码实验部分了,这篇 2015 年的论文实验讲道理应该不难实现,推荐参考对应的实现(注:不是论文作者),地址如下:

    主要问题包括

    • 使用tensorflow 1.x 实现
    • 没有关于 PCA、kPCA、AE 等的实现

    如果有任何疑问请评论,讨论一下解决问题。

    6.7 重构概率计算

    以下代码摘录于: 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ϕ(xz(i,l)) 这行的理解。

    按照上面摘录的代码,对于每一份测试数据只对应一份隐变量 z z z,也就是说,对每个测试数据其实只经历过一次 encode 得到 μ \mu μ σ \sigma σ ,然后再进行pdf 计算等等,重复 L 次。

    然后 L 次计算一模一样,参数一样,数据一样,结果也一样。也就是说,对于上面那份源码 L=100L=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 次循环,就执行一次就好了。(注:这个地方很值得讨论一下)

    重要补充

    2021.7.20 补充

    感谢 DoinNN 提醒,https://github.com/Michedev/VAE_anomaly_detection 已经更新,上面提到的内容对应的是
    旧版本,更新内容主要包括:

    • 之前使用的是 tensorflow 1.x ,现在替换为 pytorch,具体内容参考其中的 requirements.txt 。
    • 将以前的单文件 VAE.py 替换成为多文件,使用这份代码时需要根据自己需要重写 dataset.py,需要稍微了解一下 pytorch 中的 Dataset, TensorDataset

    额,依然基本没有注释,以后有时间的话我自己写一下简单的实现 demo。

    对应的数据集问题可以考虑使用 MNIST,需要指定哪个数字为异常数据,而其他数据为正常数据。当然,这个并不会很合适,但如这篇论文所言,作者使用的就是这个简单的数据集。

    运行的时候可能会遇到很多问题,需要有耐心慢慢修改,找一些同学朋友探讨探讨——最后记得请喝杯奶茶吃吃烧烤。

    已经解决这份代码如何运行的童鞋也写个博客做做笔记,把自己的博客地址贴在评论区,我一定过去点赞与星星。感谢!

    6.8 总结

    这篇论文介绍的是使用 reconstruction probability 作为异常值,基本思想就是在一个首先构建一个生产正常值的环境 (即由隐变量所确定的隐变量空间),在这个环境中不管如何 sample 拿到的可能与输入数据差别很大,但是这种差别依然是在正常数据的容忍范围内。但是如果不在这个环境中 sample 而是投入另外一组异常特征,生成数据与正常数据差异就很大。也就是reconstruction probability 的值很大,我们觉得它与正常数据差别很大,它不属于这个优雅的环境,所以判定它为异常数据。

    Smileyan
    2020.10.24 15:36
    最后更新:2021.7.20 12:46

    感谢您的 点赞收藏评论关注

    展开全文
  • 《异常检测——从经典算法到深度学习》 0 概论 ...7. 基于条件的VAE异常检测 论文名称:Anomaly Detection With Conditional Variational Autoencoders 发表时间:2019.12 立即下载 论文总体结构:

    《异常检测——从经典算法到深度学习》

    相关:

    7. 基于条件VAE异常检测

    论文名称:Anomaly Detection With Conditional Variational Autoencoders
    发表时间:2019.12 立即下载

    论文总体结构:

    1. INTRODUCTION :引出并总体介绍CVAE,概括论文亮点,介绍论文结构。

    2. PROBLEM STATEMENT:简单陈述问题,引出需要的解决方法。

    3. BACKGROUND AND PROPOSED METHOD:介绍 VAE、CVAE 、CVAE 异常检测的度量方法、VAE 异常检测。

    4. EXPERIMENTS ON BENCHMARKS :基于 MNIST 与 Fashion-MNIST 的异常检测实验、综合问题。

    5. EXPERIMENTS ON CMS TRIGGER RATE MONITORING:基于CMS数据的实验。

    6. CONCLUSIONS AND FUTURE WORK:总结

    7.1 INTRODUCTION

    7.1.1 总体介绍 CVAE (Conditional Variational Autoencoders)

    CVAE是一种条件有向图模型,输入观测值对产生输出的隐变量的先验值进行调制,以便将高维输出空间的分布建模为以输入观测值为条件的生成模型。

    CVAE is a conditional directed graphical model where input observations modulate the prior on latent variables that generate the outputs, in order to model the distribution of high-dimensional output space as a generative model conditioned on the input observation

    这种定义性质的话可能并不那么容易理解,但是通过结合图模型可能可以方便很多。

    CVAE
    其中的实现表示生成模型 p θ ( x ∣ u , k ) p_\theta {(x|u,k)} pθ(xu,k),虚线表示变分似然 q ϕ ( u ∣ x , k ) q_\phi{(u|x,k)} qϕ(ux,k)。其中 θ \theta θ ϕ \phi ϕ 都是变分参数,与 VAE 训练过程是相同的,分别在 decode 和 encode 过程中生成。

    与 VAE 模型相比,多了另外参数 k ,可以认为这是额外的输入数据(extra input),也可以认为是条件,在多了 k 的影响下,VAE 便成了 Conditional VAE.

    如果对 VAE 有所了解的话,那么理解 CVAE 就非常简单了。

    推荐参考:

    7.1.2 概括论文亮点 (Contributions)

    • 定义了新的损失函数 (loss function),让模型能够学习最佳重构方案( reconstruction resolution)。
    • 设计新的与 CVAE 相关联的异常度量指标,在经典机器学习和粒子物理特定数据集上都具有了优异的性能。
    • 提出基于MNIST数据集,新的异常检测实验方案。

    7.2 问题陈述

    首先论文吐槽了一下没找到合适的数据集,所以不得不选择了手写数字数据集 (MNIST)。

    然后给出条件 k k k(已知),输入数据 x x x,以及隐变量 u u u (未知) 之间的关系 x = f ( k , u ) x = f(k,u) x=f(k,u)

    对于很多观测数据 X = [ x 1 , x 2 , . . . , x n ] X=[x_1,x_2,...,x_n] X=[x1,x2,...,xn],我们需要重点观测的实例包括:

    • 单一特征的大变化,我们称之为 A 类型异常;
    • 变化小但是系统化的特征,我们称之为 B 类型 异常。

    不需要着重观测的数据:

    • 不相关特征且严重程度较小

    总之,我们需要一种算法,利用数据中已知的因果结构,找出上面列出的两种类型的问题,将其推广到不可见的情况,并使用数据而不是依赖于特征工程。在目标应用程序的上下文中,推理时间可以忽略不计。

    7.3 背景介绍与方法提出

    7.3.1 VAE & CVAE

    VAE 基本原理在 VAE 模型基本原理简单介绍 已经比较详细的介绍了,这里只介绍对 VAE 模型的改进部分(CVAE)。

    CVAE
    通常情况下训练 VAE 模型时,使用 MSE ( mean squared error ) 来计算输入数据 x 与 decoder 生成数据之间的差异。

    计算差异的公式可以由正态分布概率密度函数推导:

    f ( x ) = 1 2 π σ e x p ( − ( x − μ ) 2 2 σ 2 )          ( 1 ) f(x)= {1\over \sqrt {2\pi}\sigma} exp(-{(x-\mu)^2\over 2\sigma^2}) \ \ \ \ \ \ \ \ (1) f(x)=2π σ1exp(2σ2(xμ)2)        (1)

    取对数后,得

    log ⁡ f ( x ) = log ⁡ 1 2 π σ + ( − ( x − μ ) 2 2 σ 2 ) log ⁡ f ( x ) = − log ⁡ 2 π σ − ( x − μ ) 2 2 σ 2        ( 2 ) \log f(x) = \log {1\over \sqrt {2\pi}\sigma} + (-{(x-\mu)^2\over 2\sigma^2})\\ \log f(x) = -\log {\sqrt {2\pi}\sigma} -{(x-\mu)^2\over 2\sigma^2} \ \ \ \ \ \ (2) logf(x)=log2π σ1+(2σ2(xμ)2)logf(x)=log2π σ2σ2(xμ)2      (2)

    这篇论文认为,认为可以固定方差 σ = 1 \sigma = 1 σ=1。当 σ = 1 \sigma =1 σ=1 时,极大似然的 log 值计算公式为:

    However, this is equivalent to setting the observation model pθ(x|z) as a normal distribution of fixed variance σ = 1. Indeed, the log-likelihood of a normal distribution with fixed variance of 1 is given as:

    − log ⁡ N ( x ; μ , 1 ) = ∣ ∣ x − μ ∣ ∣ 2 + log ⁡ ( 2 π )          ( 3 ) -\log \N(x;\mu,1)=||x-\mu||^2+\log(\sqrt{2\pi}) \ \ \ \ \ \ \ \ (3) logN(x;μ,1)=∣∣xμ2+log(2π )        (3)

    注:

    从公式(2) 到公式(3) 存在问题,即代入 σ = 1 \sigma =1 σ=1 ,原来的式子(2)应该多一项 1 2 1\over 2 21,也就是说,导入后正确结果是:

    − log ⁡ N ( x ; μ , 1 ) = ∣ ∣ x − μ ∣ ∣ 2 2 + log ⁡ ( 2 π )          ( 4 ) -\log \N(x;\mu,1)={||x-\mu||^2\over 2}+\log(\sqrt{2\pi}) \ \ \ \ \ \ \ \ (4) logN(x;μ,1)=2∣∣xμ2+log(2π )        (4)

    很明显,这样的假设 ( σ = 1 \sigma=1 σ=1) 是存在很大的问题的,初始化若干个正态分布,然后根据数据特征的实际情况而进行调整数据特征的均值和方差。如果直接添加这项限制,对 VAE 的随机性特征会有很大限制。

    但除非事先知道数据的相关信息,否则数据的分布是不需要很大的特征振幅。

    所以可以通过学习MSE重构的方差,模型可以找到重建数据的每个特征的最佳误差方案,从而从相关性中分离固有噪声。这在经验上给出了类似的结果,关联一个微调的加权参数,同时消除了调整所述超参数的需要。

    7.3.2 CVAE 改进部分

    CVAE 结构中,有三种类型的变量(参见图1)。对于随机可观测变量 x x x u u u(未知,未观测)和k(已知,观测)是独立的随机隐变量。

    条件似然函数 p θ ( x ∣ u , k ) p_\theta{(x|u,k)} pθ(xu,k) 是非线性转换而来的, ϕ \phi ϕ 是另一个非线性函数,近似于推理后验 q ϕ ( u ∣ k , x ) = N ( μ , σ I ) q_\phi{(u|k,x)}=N(\mu,\sigma I) qϕ(uk,x)=N(μ,σI).

    隐变量 u u u 允许在 x x x 与给定 k k k 的条件分布下对多个模式进行建模,使得该模型足以对一个相互映射进行建模。

    为了近似 ϕ \phi ϕ θ \theta θ ,对 ELBO 进行调整:

    在这里插入图片描述
    其中隐变量 z z z 用于捕捉不可观测的变异因子 u u u .

    损失函数为:

    在这里插入图片描述

    注:

    如果不了解 ELBO 的话,请参考 VAE 模型基本原理简单介绍

    我们的模型虽然是基于 CVAE 但是着重于异常检测输出变量的条件分布。

    我们使用Keras和TensorFlow作为后端,使用Adam优化器和早期停止准则训练模型。一旦模型参数被学习,我们就可以使用不同的度量来检测异常:

    • A 类问题:从隐变量 z z z 采样,通过计算重构损失 ∣ ∣ 1 σ ( x − x ^ ) 2 ∣ ∣ ∞ ||{1\over \sigma} {(x-\hat x)^2}||_\infty ∣∣σ1(xx^)2
    • B 类问题:通过计算KL平均散度。

    7.3.3 CVAE 异常检测的一种度量

    对于给定数据 (x,k),VAE 的评估方法 L ( x , k ) L(x,k) L(x,k) l o g   p θ ( x ∣ k ) log\ p_\theta{(x|k)} log pθ(xk) 的近似上限,测量x与给定k的模型之间的差异。因此,对这种损失的价值进行阈值化是处理AD的一种自然方法。因此,CVAE在这里提供了一个模型,可以自然地估计x是如何异常的,而不是计算(x,k)的异常程度。这意味着如果存在一个稀有的k值和一个适当的x值相关联,那么应该被视为正常的。

    方程6中的损失函数,可以分解为两个独立问题。由于两个独立的异常场景,我们不会组合各个指标到一个总体得分中,而是使用逻辑 O R OR OR 来确定异常实例。

    • 第一种情况,我们对识别单个特征上的异常感兴趣。当大多数特征没有表现出异常并降低异常分数时,通常使用的重建误差均值可能是一个错误的选择.
    • 第二种情况,我们期望 μ z μ_z μz落在异常情况下分布的尾部。如[11]中所述, D K L D_{KL} DKL 度量了表示后验分布所需的额外信息量,给定了用于解释当前观察结果的隐变量的先验值。 D K L D_{KL} DKL 的绝对值越低,观察到的状态越可预测。

    最后,VAE 的使用让该方法可以推广到文献[12]中所讨论的不可见的观测值问题。

    [11] Mevlana Gemici, Chia-Chun Hung, Adam Santoro, Greg Wayne, Shakir Mohamed, Danilo J Rezende, David Amos, and Timothy Lillicrap. Generative temporal models with memory. arXiv preprint arXiv:1702.04649, 2017.
    [12] Durk P Kingma, Shakir Mohamed, Danilo Jimenez Rezende, and Max Welling. Semi-supervised learning with deep generative models. In Advances in NeurIPS, pages 3581–3589, 2014.

    7.3.4 VAE 异常检测

    这一部分总体上介绍了基于VAE 的异常检测一些方法。

    这里暂时略过了,如有需要可以仔细了解。

    7.4 实验

    7.4.1 基于MNIST & Fashion-MNIST 的异常检测

    首先解释了一下为什么用这两个数据集(略)。

    其次,论文对异常的定义与很多论文不同。一般情况下 MNIST 数据集用于异常检测是把某个数字对应的数据看作异常,其他的作为异常。

    这篇论文中,使用 LeNet-5 对数据进行分类,再用 LeNet-5 算法与人为指定的阈值进行分类,分类后的结果作为这次CVAE实验的数据集。

    下面的图片是使用不同分类算法提出来的它们认为可能是异常的数据。最终实验时只采用了 LeNet-5 的分类结果。
    在这里插入图片描述
    实验中,我们给向量 k k k 指定了一个类标签,而 u u u 应该包含关于其他变化因素的信息,例如用来写数字的手。检测异常的问题类似于 B型问题。在这种情况下,我们期望 μ ( D K L ) \mu(D_{KL}) μ(DKL) 在标签错误或不常见的情况下会更高。

    在这里插入图片描述

    在实验中,选取了10,000 个样本作为测试集。如下图所示,实验把 CVAE 算法与其他三种算法进行了比较。左图是基于 MNIST 的实验结果,右图是基于 Fashion-MNIST 的实验结构。
    在这里插入图片描述

    7.4.2 合成问题

    合成的数据集使用了正态分布( μ = 0 \mu = 0 μ=0 σ = 1 \sigma = 1 σ=1),连续并且相互独立的隐变量 u u u k k k。可观测的 x x x 仅仅是 u u u k k k 和其他噪声 ϵ \epsilon ϵ 共同生成的: x j = f j ( μ → ) ⋅ ∑ i = 0 m S j i k i + ϵ x_j = f_j{(\overrightarrow{\mu})} \cdot \sum_{i=0}^{m}{S_{ji}k_i}+\epsilon xj=fj(μ )i=0mSjiki+ϵ
    其中
    * j j j x → \overrightarrow x x 的索引。

    • 二元矩阵 S S S 是描述了哪一个 k k k 用于计算特征 j j j
      在这里插入图片描述
    • 函数 f ( u → ) f(\overrightarrow u) f(u ) 描述了哪个 u u u 进入了定义每个特征 j j j 的产品: f j ( u → ) = ∏ o u o f_j(\overrightarrow u)= \prod_{o} u_o fj(u )=ouo

    对每个样本, S S S f ( u → ) f(\overrightarrow u) f(u ) 保持不变,而 k k k u u u 发生改变。为简单起见,我们确保每个 j j j 只依赖于一个 k k k 并且依赖是均匀分布的。最后,我们可以操作 o o o m m m 的值。例如,第一列 x 0 x_0 x0 可以用 k 0 k_0 k0 u 1 u_1 u1 u 4 u_4 u4表示: x 0 = k 0 u 1 u 4 x_0=k_0u_1u_4 x0=k0u1u4 x 9 9 x_99 x99 可能通过 k 4 k_4 k4 u 0 u_0 u0 生成等等。

    我们生成 x x x 为100维 ( n = 100 n = 100 n=100) 且 m = o = 5 m = o = 5 m=o=5 的样本。相关矩阵的一个例子如下图(图5)所示。

    在这里插入图片描述
    对于测试,我们根据 表 I 生成样本。选择 5 σ \sigma σ 和 3 σ \sigma σ来自于我们的目标应用程序的遗留需求。该异常检测算法的执行方式是:

    • A类问题: 比较 decoder 的输出和 encoder 的输入,以发现仅在一个特征上观察到的问题 ;

    • B类问题:比较属于相同因果关系组(即输入时使用相同的 k k k 值)的样本的所有特征的 D K L D_{KL} DKL 域。
      dd
      两个问题对应的ROC曲线如图6(下图)所示。给定A型异常的高阶偏差,算法很容易发现这些类型的问题。在层次结构的背景下,算法需要建立一个映射模型,从单一输入到多个可能的输出。
      在这里插入图片描述
      如 [3] 中讨论我们需要能够进行不同预测的模型,B类问题给出了良好的结果,优于普通的 VAE ,证明了CVAE 适合这样的任务。

      [3] Kihyuk Sohn, Honglak Lee, and Xinchen Yan. Learning structured output representation using deep conditional generative models. In Advances in neural information processing systems, pages 3483–3491, 2015.

    7.5 基于 CMS 的实验

    7.5.1 动机

    这项工作的出现直接从明确的紧急监测的CMS[29]实验。CERN LHC[30 ]的CMS实验以每秒4000万次粒子碰撞(事件)的惊人速度运行。每个事件对应大约1 MB未处理的数据。由于可以理解的存储限制和技术限制(例如,足够快的电子读出),这个实验需要实时地将记录的数据数量从每秒4000万件减少到1000件。为了达到这个目的,一组被统称为触发器系统的分层算法被用来处理和过滤进入的数据流,这是物理事件选择过程的开始。

    触发算法[31]旨在降低事件率,同时保持实验的物理范围。CMS触发系统的结构分为两个阶段,使用越来越复杂的信息和更精细的算法:

    1. L1 触发:在定制设计的电子产品上实施; 把输入速率从 40 MHz 减少到 100 kHz, 时间小于 10 μ \mu μs。
    2. 高等级触发(HLT):一个在计算机场上运行的碰撞重建软件;将L1触发器的100 kHz速率输出降低到1 kHz ,时间小于 300 ms

    L1和HLT系统都实现了一组规则来执行选择(称为路径)。HLT是由一组可配置的L1触发路径选择的事件来种子的。

    在典型的运行条件下,触发系统可以调节观测到的碰撞产生的海量数据。通过对每个检测器子系统的独立监控,保证了记录数据的质量(比如说电压),通过监控触发率事件接受率会受到问题数量的影响,例如检测故障,软件问题等。根据问题的性质,与特定路径相关的比率可能会改变到不可接受的水平。危急情况包括降到零或增加到极值。在这种情况下,系统应该向值班人员发出警报,要求进行问题诊断和干预。

    HLT路径通常是非常强相关的。这是由于一组路径选择了类似的物理对象(因此重构了相同的事件)和/或通过L1触发路径的相同选择来种子。奇异路径的速率偏差临界水平应视为异常,而随机触发路径数量上的偏差较小则可能是统计波动的结果。另一方面,在一组由类似物理或使用相同硬件基础设施相关的触发路径上的可观察到的相干漂移(甚至很小),是在触发系统或硬件组件中可能存在故障的指示。

    我们在算法中探索了这种层次结构。每个HLT路径都有一个直接的、预先配置的链接,通过指定的配置链接到一组L1触发器路径,如图7(下图)所示。配置变化很少,例如节点被添加、禁用或更正。因此,HLT系统的性能直接与L1触发器的状态有关。

    我们不关注最小化推断时间,因为异常可以在几分钟内标记出来,这对于所有考虑的算法来说已经足够长了。
    在这里插入图片描述

    [29] Serguei Chatrchyan et al. The CMS experiment at the CERN LHC. JINST, 3:S08004, 2008.
    [30] The LHC Study Group. The Large Hadron Collider, conceptual design. Technical report, CERN/AC/95-05 (LHC) Geneva, 1995.
    [31] V ardan Khachatryan et al. The CMS trigger system. JINST, 12(01):P01020, 2017

    7.5.2 实验

    把 HLT 速率用作 x x x,把 L1 触发率 用作 k k k,我们的原型使用了4条L1触发路径,每条都包含6条唯一的HLT路径。我们仅从配置中存在所有选择路径的样本中提取速率。最终得到102895个样本,然后将样本分为训练集、验证集和测试集,我们的测试集有2800个样本。操作人员为每个 CMS 子检测器和每个样本设置质量标签。由于全局质量标志是由所有子系统的贡献组成的,一个样本可以被认为是坏的,因为与我们选择的触发路径集无关的检测器组件的性能不佳,或者与我们试图解决的问题无关。因此,我们不能在测试集中使用这些标签。相反,我们考虑可能在生产环境中发生的假想情况,类似于用于合成问题的情况。我们以与合成数据集相似的方式操作我们的测试集,生成四个合成测试数据集。我们检测一个HLT路径上的孤立问题-类型A;在同一L1触发路径上的HLT路径存在问题-类型B。

    我们将结果报告在图6中。该算法在CMS数据集上的性能与合成算法的性能相当。CMS实验目前没有提供任何工具来跟踪属于B类的问题。鉴于所提方法的良好性能,我们相信可以考虑部署该解决方案,并在生产环境中提供进一步的测试和改进。

    7.6 总结

    本文介绍了利用 CVAE 异常样本的方法。结合CMS触发率监控的具体案例,对现有的监控功能进行了扩展,显示了良好的检测性能。该算法不依赖于训练时的合成异常,也不依赖于附加的特征工程。我们证明了该方法不受CMS实验的限制,并且具有跨不同领域工作的潜力。然而,需要对更困难的数据集进行更多的测试,比如说在 CIFAR,提供了更多的类和更高的方差。我们没有对任何实验进行超参数扫描,因此我们期望进一步优化后的结果会更好。后续研究预测使用CMS触发器系统的完整配置。该方法的一个有趣的扩展是学习潜存空间中未知变化因素的正确编码,这在目前是不受限制的(例如MNIST数据集中数字的倾斜或粗体)。

    7.7 相关代码

    复现论文思路的代码很难,如果有小伙伴找到对应的代码实现,欢迎分享在下方的评论中。感谢!

    首先提出两个重要假设:

    1. Conditional VAE 结构中的 Condition 结构及具体数值必须根据实际情况调整。
    2. Conditional VAE 不一定需要额外的输入,但是需要额外的条件。论文中图2 中输入层 含有的 k k k 以及 博客 https://ijdykeman.github.io/ml/2016/12/21/cvae.html 提到的 CVAE 中的条件不一定是指输入时的条件,也可以是隐变量映射的高斯分布的一些特征条件。比如说论文中提到,定义方差等于1,这也是一种 condition。对隐变量映射的高斯分布所加的一些约束条件。

    关于 CVAE 的代码部分这里暂时没有合适的例子,有时间的话再补上。另外分享一下找到的相关的另外一份代码,推荐了解一下,请关注里面的 condition 具体指的是什么。https://github.com/amunategui/CVAE-Financial-Anomaly-Detection

    Smileyan
    2020.11.25 15:33

    感谢您的 点赞收藏评论关注 .

    展开全文
  • 在化工原料、服装、食品原料等的出货检验中,需要检测... ■ 使用深度学习 (CAE) 进行异常检测和定位https://jp.mathworks.com/matlabcentral/fileexchange/72444-anomaly-detection-and-localization-using-deep-learn
  • 2021异常检测论文ppt
  • 1、VAE原理的直观理解 使用(VAE)生成建模,理解可变自动编码器背后的数学原理 一般设先验分布为标准正态分布,但是也可以是其他分布。 KL项目的是使得q(z|x)与p(z|x)相似,只是后面ELBO经过推导转换成了q(z|x)和...

    1、VAE原理的直观理解
    使用(VAE)生成建模,理解可变自动编码器背后的数学原理
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    一般设先验分布为标准正态分布,但是也可以是其他分布。

    在这里插入图片描述
    KL项目的是使得q(z|x)与p(z|x)相似,只是后面ELBO经过推导转换成了q(z|x)和p(z)尽可能靠近的问题。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    基于序列的VAE生成模型
    在这里插入图片描述
    变分自编码器VAE:原来是这么一回事 | 附开源代码
    VAE希望训练一个模型 X=g(Z),这个模型能够将原来的概率分布映射到训练集的概率分布,也就是说,它的目的都是进行分布之间的变换。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    对于这张图,我感到疑惑。AE是降维,比如一张人脸图片X(一个列向量)的潜在空间Z是几个表示提取的特征的正态分布,X到Z显然是降维了;但是按照这张图的说法,每个x对应一个正态分布Z(两个参数),如果x是个图片,那就是只提取了一个特征用来表示这张图片?
    如果X是个窗口为W的序列,那也是只提取一个序列的整体特征来重构它?—所以Unsupervised Anomaly Detection via Variational Auto-Encoder for Seasonal KPIs in Web Applications对于VAE能够异常检测的解释是VAE可以学习到序列整体的正常模式,但是很可能会因为维度的缩减而丢失掉异常点的特征,所以重构出来的xt……xt+w接近于正常的数据,可以用来和输入序列中的异常相比。
    还有一些多元时间序列论文中是step-wise,也就是每个xt对应一个zt,但是这个xt并不是一个单值,而是D维度的一个向量,因为有D个传感器,而时间步之间的依赖则利用LSTM或者GRU去学习;另一些是block_wise,即每一个sensor的长度为W的序列对应一个VAE,如果每个VAE中的前向网络是LSTM或GRU的话,那么也能够学习时间依赖,只是无法学习sensors之间的关系了。

    首先,我们希望重构 X,也就是最小化 D(X̂k,Xk)^2,但是这个重构过程受到噪声(这个噪声指的是不同于AE中直接把X编码成Z,而是编码成一个高斯分布,从高斯分布中采样就未必可以取到均值)的影响,因为Zk 是通过重新采样过的,不是直接由 encoder 算出来的。采样的过程中运用了重采样技巧,在Z的均值的基础上加了个从标准正态分布中采样的方差,便于反向梯度传播。显然噪声会增加重构的难度,不过好在这个噪声强度(也就是方差)通过一个神经网络算出来的,所以最终模型为了重构得更好,肯定会想尽办法让方差为0(试想一下,类似AE的情况,X被映射到Z分布,均值就是最能代表X的值,重构效果最好)。而方差为 0 的话,也就没有随机性了,所以不管怎么采样其实都只是得到确定的结果(也就是均值)。
    说白了,模型会慢慢退化成普通的 AutoEncoder,噪声不再起作用。
    这样不就白费力气了吗?说好的生成模型呢?
    别急别急,其实 VAE 还让所有的 p(Z|X) 都向标准正态分布看齐,这样就防止了噪声为零,同时保证了模型具有生成能力
    怎么理解“保证了生成能力”呢?如果所有的 p(Z|X) 都很接近标准正态分布 N(0,I),那么根据定义:
    在这里插入图片描述
    **为了使模型具有生成能力,VAE 要求每个 p(Z|X) 都向标准正态分布看齐。**那怎么让所有的 p(Z|X) 都向 N(0,I) 看齐呢?

    原论文直接算了一般(各分量独立的)正态分布与标准正态分布的 KL 散度KL(N(μ,σ^2)‖N(0,I))作为这个额外的 loss,计算结果为:
    在这里插入图片描述
    这里的 d 是隐变量 Z 的维度,而 μ(i) 和 σ_{(i)}^{2} 分别代表一般正态分布的均值向量和方差向量的第 i 个分量。
    这个 loss 可以分两部分理解:
    在这里插入图片描述
    从上式也可以看出,生成均值和方差的是不同的神经网络,有不同的参数。在 VAE 中,它的 Encoder 有两个,一个用来计算均值,一个用来计算方差。
    KL具体推导:
    在这里插入图片描述
    在这里插入图片描述
    说白了,重构的过程是希望没噪声的,而 KL loss 则希望有高斯噪声的,两者是对立的。

    深度学习-李宏毅GAN学习之VAE
    关于VAE中的采样问题:
    推断网络把高维的X映射到低维的Z,这个Z一般是个高斯混合分布,有几个分布就有几对均值方差参数,至于这个Z究竟是几维(几个混合分布)的,那就是自己规定的K。从Z分布中采样,采样几次呢?比如人脸图片的那个采样似乎是从每个Z分布中取一个点(从q(z;f(x,φ))中采样)(特征),最终经过解码构成一个完整的图片的向量表示。那么就是Z是几维(有几个分布)就采样几次。但是据上面这篇博客分析,每个X对应一个Z,重构出一个X,那么只需要采样一次就好。最终的X自然是由每一个重构的Xi组成的。采样得到Z也就可以送入解码器,训练得到解码器P(x|z)的参数,采样多少个Z就有多少个p(x|z),想要得到重构的X^,则从p(x|z)中抽样得到,一般取均值即可。
    而似然考虑的是从采样得到的Z中重构x的概率,也就是p(x|z)是个高斯分布,多个点的概率高斯分布堆叠起来就是个混合高斯分布。
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    其中,q(z|x)和p(x|z)的参数都是用神经网络学到的。
    在这里插入图片描述
    本质上就是用自编码器去产生很多高斯分布,去拟合样本的分布,然后某个x对应的高斯分布里采样z,然后复原成x。这个是完全去模仿分布,只能生成数据中已有的图片,很难创造新的图片,最多也就是插值图片了。也可以理解成图片的特征向量z采样于某种高斯分布,我们要把他给找出来,我们希望这个分布贴近标准正太分布,然后通过编码器生成对应均值和方差,然后采样z,希望z又能复原图片,这样就找到了这个z背后的高斯分布。

    公式推导一文看懂变分自编码器(VAE)原理
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    图像去噪的自动编码器
    自动编码器由两个连接的人工神经网络组成: 编码器模型和解码器模型。自动编码器的目标是找到一种将输入图像编码成压缩形式(也称为潜在空间)的方法,使得解码后的图像版本尽可能接近输入图像。下面的网络提供了原始图像 x,以及它们的噪声版本 x ~ 。网络试图重建它的输出 x’尽可能接近原始图像 x,通过这样做,它学会了如何对图像进行去噪。
    在这里插入图片描述
    如图所示,编码器模型将输入转换为小的密集表示。解码器模型可以看作是能够生成特定特征的生成模型。

    编码器和解码器网络通常作为一个整体进行训练。损失函数惩罚网络以创建与原始输入 x 不同的输出 x’。

    通过这样做,编码器学会在潜在空间中保存尽可能多的相关信息,尽可能的去除不相关部分(例如噪声)。解码器则学习获取潜在空间的信息并将其重构为无错的输入。

    AE为何能用于时间序列的异常检测?

    基于自编码器的时间序列异常检测算法
    自编码器(Auto Encoder)也是一种无监督的数据压缩算法,或者说特征提取算法。其目标函数就是为了拟合一个恒等函数。并且编码器和解码器都是前馈神经网络。对于自编码器而言,它的输入层的维度等于输出层的维度,隐藏层的维度是需要小于输入层的维度的。只有这样,自编码器才可以学习到数据分布的最显著特征。对于自编码器而言,其本质上也是一个神经网络,那么它的激活函数其实不仅可以选择 sigmoid, 还可以使用 tanh,ReLU,LeakyReLU 等其余激活函数,其本质上都是为了拟合一个恒等变换,中间层则作为一个特征提取的工具。在训练的时候,同样是使用反向传播算法,可以使用不同的优化函数,例如 SGD,Momentum,AdaGrad,RMSProp,Adam 等。

    在这里插入图片描述
    在图像领域,有学者尝试使用自编码器来进行图像的重构工作,图像的特征提取等内容,整体来看也能达到不错的效果,请看下图:
    在这里插入图片描述
    从上图来看,基于均方误差的自编码器是无法重构出乒乓球的。由于该自编码器的容量有限,目标函数是均方误差,因此自编码器并没有意识到乒乓球是图片中的一个重要物品。那么根据异常检测的观点来看,小乒乓球其实就可以作为图片中的异常点。只要在图片的局部,重构出来的图片和之前的图片存在着巨大的误差,那么原始图片上的点就有理由认为是异常点。

    在这个思想下,针对时间序列异常检测而言,异常对于正常来说其实是少数。如果我们使用自编码器重构出来的时间序列跟之前有所差异的话,其实我们就有理由认为当前的时间序列存在了异常。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    VAE与GAN做异常检测的原理
    近几年,有大量的人用VAE和GAN来做异常检测,用这两个模型做异常检测的假设都是一样的,即假定正常数据是服从某一种分布的,而异常数据是不能够拟合进这个分布的,因此我们可以用VAE和GAN来找到正常数据的分布,从而用这个分布来做异常检测。

    1、VAE

    VAE是变分自编码器的简称,该模型最开始提出的目的是为了找到训练数据的分布,从而用这个分布来生成数据。从另一个角度而言,如果我们能够找到正常数据的分布,那么我们就可以用这个分布来做异常检测。具体来说,我们在训练数据上训练好一个VAE,该VAE的encoder能够将输入数据X映射到隐变量Z,decoder将隐变量Z再映射回X,当我们训练好一个VAE之后,如果我们输入一个异常数据,该模型很大概率会将该异常数据重构成一个正常数据(因为原始数据经过降维之后,异常特征很可能被丢掉),因此我们就可以判别输入数据是否是一个正常数据。用一句话概括,就是正常数据重构成正常数据的概率会很高,而异常数据重构成异常数据的概率会很低,而且一般来说我们输入一个异常数据,VAE也会将其重构成一个正常数据。

    2、GAN

    GAN做异常检测的原理和VAE是一样的,只不过这两者得到正常数据的分布的方式不同,VAE通过变分推断来得到训练数据的分布,而GAN直接使用生成器来模拟数据的分布,用判别器来判断生成器模拟的分布的好坏。

    这两者都可以用来做异常检测,也都是基于训练数据的分布,但是VAE的鲁棒性比GAN更好,但是GAN在调优之后效果比VAE更好。

    经典论文:Unsupervised Anomaly Detection via Variational Auto-Encoder for Seasonal KPIs in Web Applications
    这篇论文研究的是单时间序列异常检测,以滑动窗口长度为W的时间序列作为VAE的输入,输出也是W长的序列;
    The philosophy is to focus on normal patterns instead of anomalies. Roughly speaking, they all first recognize “normal” regions in the original or some latent feature space,and then compute the anomaly score by measuring “how far” an observation is from the normal regions.
    在这里插入图片描述
    对于部分异常的x4,降维将使甜甜圈能够识别其正常模式˜x,并使qϕ(z|x)约为qϕ(z|˜x)。这种影响是由以下原因引起的。训练甜甜圈以最大的努力重建训练样本中的正常点,而降维则使甜甜圈只能从x中捕获少量的信息。因此,只有整体形状被编码为qϕ(z|x)。异常信息在此过程中很可能被丢弃。然而,如果一个x太异常,甜甜圈可能无法识别任何正常的˜x,因此qϕ(z|x)就会变得不明确。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    上图运用了蒙特卡罗方法从Z中抽样L次,分别重构序列X,L次的期望就是ELBO的第二项重构概率。

    下面是一篇针对这篇论文的分析博客。
    AIOps探索:基于VAE模型的周期性KPI异常检测方法——VAE异常检测
    VAE也实现了跟AutoEncoder类似的作用,输入一个序列,得到一个隐变量(从隐变量的分布中采样得到),然后将隐变量重构成原始输入。不同的是,VAE学习到的是隐变量的分布(允许隐变量存在一定的噪声和随机性),因此可以具有类似正则化防止过拟合的作用。基于VAE的周期性KPI异常检测方法其实跟AutoEncoder基本一致,可以使用重构误差来判断异常,下面是结果,上图是原始输入,下图是重构结果。我们检测异常是通过对比重构后的结果与原始输入的差距,通过设置异常阈值来判断是否异常。
    在这里插入图片描述
    可以看出,输入序列的异常处经过重构被减轻甚至消失(降维丢失部分特征),我们认为重构出来的为近似正常数据,和原始带有异常的数据做差,差距大的地方就是异常。

    论文2015:Variational Autoencoder based Anomaly Detection using Reconstruction Probability
    AE:
    在这里插入图片描述

    基于自动编码器的异常检测是一种基于半监督学习的基于偏差的异常检测方法。它使用重构误差作为异常评分。具有高重建度的数据点被认为是异常的。只有具有正常实例的数据才被用于训练自动编码器。经过训练后,自动编码器将很好地重构正常数据,而自动编码器没有遇到的异常数据。算法2显示了利用自动编码器重构误差的异常检测算法。

    输入和输出为长度为N的数据X;
    在这里插入图片描述
    在这里插入图片描述
    VAE:
    在这里插入图片描述
    VAE的目标是最大化数据的边际似然值,(p(x)属于0~1越大,即log为负越大,说明重构效果越好),
    在这里插入图片描述

    单个点的边际似然为:
    在这里插入图片描述
    方程右边的第一项是近似后验和先验的KL散度。方程右边的第二项是数据点i的边际似然值上的变分下界。
    由于KL总是大于0,上式可以写成
    在这里插入图片描述
    于是,最大化边际似然的问题转换为最大化最大化变分下界ELBO,而ELBO又包括两项。第一项是潜在可变z的近似后验和先验之间的KL散度,此项迫使后验分布类似于先验分布,作为一个正则化项。第二项可以理解为通过后验分布qφ(z|x)和似然pθ(x|z)重建x。
    VAE利用神经网络对近似后验qφ(z|x)的参数进行建模。这是VAE可以与自动编码器相关联的地方。如图2所示,在自动编码器的类比中,近似的后验qφ(z|x)是编码器,有向概率图形模型pθ(x|z)是解码器。值得强调的是,VAE建模的是分布的参数,而不是值本身。也就是说,编码器中的f(x,φ)输出近似后验qφ(z|x)的参数,要获得潜在变量z的实际值,需要从q(z;f(x,φ))中采样。因此,VAE的编码器和解码器可以被称为概率编码器和解码器。f(x,φ)是一个神经网络,表示数据x和潜在变量z之间的复杂关系。为了得到重构ˆx,给定样本z,通过g(z,θ)得到pθ(x|z)的参数,其中重构ˆx从pθ(x;g(z,θ))中采样。总之,在VAE中建模的是分布参数,而不是值本身。对分布的选择适用于任何类型的参数分布。为本研究对象的分布潜变量z,即pθ(z)和qφ(z|x),常见的选择是各向同性正态,因为假设潜变量空间中变量之间的关系比原始输入数据空间要简单得多。可能性pθ(x|z)的分布取决于数据的性质。如果数据为二进制形式,则使用伯努利分布。如果数据是连续的形式,则使用多元高斯分布。z不一定要服从高斯分布,也可以是其他分布,不会有影响,因为我们的神经网络足够强大,只要通过学习,理论上可以表示任何函数。
    VAE和自动编码器之间的主要区别是,VAE是一个随机生成模型,可以给出校准的概率,而自动编码器是一个没有概率基础的确定性判别模型。这很明显,VAE模拟了上述的分布参数。
    反向传播用于训练VAE。此外,还运用了重参数化技巧。方程(7)上的第二项应该通过蒙特卡罗方法来计算。对于每个输入数据xi,需要采样L个Z来运用蒙特卡罗方法计算ELBO的第二项。但不要混淆,N个Xi只被映射到一个分布Z。采样L个Z只是为了在训练时求ELBO的第二项,在测试时计算重构概率(比ELBO第二项少了log,就是p(x)重构的平均概率)。
    在这里插入图片描述
    算法图中的只是单个数据Xi的重构概率;对于时间序列预测问题,我们要关注的就是单个时间步的重构概率
    在这里插入图片描述
    异常检测任务采用半监督框架,仅使用正常实例的数据来训练VAE。概率编码器fφ和解码器gθ分别在潜在变量空间和原始输入变量空间中优化了各向同性正态分布。为了测试,从训练的VAE的概率编码器中提取一些样本。对于编码器中的每个样本,概率解码器输出均值和方差参数。利用这些参数,计算了从分布中生成原始数据的概率。平均概率被用作异常得分,被称为重建概率。这里计算的重建概率是Eqφ(z|x)(logpθ(x|z))的蒙特卡罗估计,这是方程(7)右边的第二项。重构概率高的数据点被划分为异常数据点。
    利用推导出原始输入变量分布参数的随机潜变量计算重构概率。正在重建的是输入变量分布的参数,而不是输入变量本身。这本质上是从近似后验分布中提取的给定潜在变量所产生的数据的概率。由于
    从潜在变量分布中抽取了大量的样本,这使得重构概率可以考虑到潜在变量空间的可变性
    ,这是所提出的方法与基于自编码器的异常检测之间的主要区别之一。可以使用适合于数据的输入变量空间的其他分布。对于连续数据,算法4可以采用正态分布。对于二进制数据,可以使用伯努利分布。在潜变量空间的分布情况下,最好采用简单的连续分布,如各向同性正态分布。

    重构概率与自编码器的重构误差有两种不同。首先,潜在变量是随机变量。在自动编码器中,潜在变量被确定性映射去定义。然而,由于VAE使用概率编码器来建模潜在变量的分布,而不是潜在变量本身,因此可以从抽样过程中考虑潜在空间的可变性。与自动编码器相比,这扩展了VAE的表达能力,因为即使正常数据和异常数据可能共享相同的平均值,可变性也可能有所不同。推测异常数据将有较大的方差和较低的重建概率。由于自动编码器的确定性映射可以被认为是对dirac增量分布值的平均值的映射,因此自动编码器缺乏处理可变性的能力。
    第二,重构是随机变量。重构概率不仅考虑了重构与原始输入之间的差值,而且还通过考虑分布函数的方差参数来考虑重构的变异性。这一特性使其对根据可变方差进行的重建具有选择性的敏感性。方差较大的变量可以容忍重构和原始数据的较大差异作为正常行为,而方差较小的变量可以显著降低重构概率。这也是自动编码器由于其确定性而缺乏的一个特性。
    第三,重建是概率度量。基于自动编码器的异常检测将重构误差作为异常分数,如果输入变量是异构的,则难以计算。为了总结异构数据的差异,需要一个加权和。问题是,没有一种通用的客观方法来确定合适的权值,因为权值会根据您所拥有的数据而有所不同。此外,即使在确定了权值之后,确定重建误差的阈值也是很麻烦的。这将没有明确的客观门槛。相比之下,重构概率的计算不需要对异构数据的重构误差进行加权,因为每个变量的概率分布允许它们通过其自身的变异性分别计算。对于任何数据,1%的概率总是1%。因此,确定重构误差的阈值比重构误差的阈值更客观、更合理、更容易理解。

    一些思考:
    AE把一个长度为L的序列映射到M维的特征潜在表示,想象一下,假设编码器是简单的线性神经网络,那么M维中的每一个值可以看作是L个Xi值的加权求和,不同的权重得到不同的特征,比如人脸的眼睛,鼻子,嘴巴,Z中的每一维度都可以认为是一个特征,根据这些特征再去还原X。那么VAE呢?唯一不同的只是VAE的Z变成了概率分布,比如高斯分布,就用均值和方差来表示,一个L长度的序列对应“”“一个(并不是1个)”均值和方差,但这不仅仅是一个简单的高斯分布,而是混合高斯分布。同样地,想象一下,L个Xi映射出M个特征,每个特征对应一个高斯分布,这M个高斯分布是独立的,所以可以相乘得到最终的混合高斯分布,保存的参数,均值和方差的对数也有M对,这样看来,参数是AE的两倍。但是实际上的高斯分布波形只有一个,就是混合后的,而采样Z的时候也是从这一个波形里面采样出L个来重构X。

    那么,AE为啥能够用来异常检测呢?训练中学到的正常模式是如何在测试中起作用的呢?

    在训练中用的都是正常数据,通过不断的LOSS反向传播,编码器可以很好地捕捉到可以重构X的那些正常特征,也就是编码神经网络的参数W1矩阵(LXM尺寸)被训练好了,比如人脸,我知道怎么样的权重分配可以得到眼睛,鼻子这些特征了。现在我们把带有异常的测试数据送入编码器,比如其中一个Xi突然变很大,而它的权重W没变,经过加权会导致M个Zi都发生不同程度的变化(学到的眼睛鼻子变形了),而此时的解码器参数矩阵W2还是正常模式下的,这就会导致重构出来的整个X都误差较大(L个Xi中正常的因为Z的变化而不能很好地重构(把我眼睛鼻子的原材料整偏了),异常的因为没有W1无法使得它得到它的特征Z而无法很好地重构(我从丹凤眼变成了杏眼,你没捕捉到,而且重构的时候还用的原来的分配比例,重构出来就会啥也不太像))。迁移到时间序列问题,对于某个单元时间序列,[t-w,t]这个切片的所有的Xi重构误差都比较大,那整个切片得分较高,被视为异常段。我们称t时刻,第J个传感器异常。

    再迁移到VAE,编码器表现为q(Z|X),本质上也有个W1矩阵,把X映射到M对均值和方差,构成混合高斯分布q(z|x),ELBO中的重构项引导者更加有效的重构,而正则化项使得q(z|x)和p(z)靠近。训练好之后,也就得到了q(z|x)和p(x|z),也就是得到了W1和W2,现在送入带有异常的测试数据,和AE道理相似,突如其来的异常波动我学不到你的特征(W1不变,调料变了,比例没变),所以尖端重构出来可能就平缓了,就导致异常点的重构概率小(重构效果不好),被视为异常。

    注意,VAE的编码器和解码器网络经常被换成RNN或者GCN,此时,最终也都得经过两个线性神经网络,分别得到均值和方差,主要是实现维度的变换(L到M)。

    展开全文
  • AIOps探索:基于VAE模型的周期性KPI异常检测方法 from:jinjinlin.com   作者:林锦进 前言 在智能运维领域中,由于缺少异常样本,有监督方法的使用场景受限。因此,如何利用无监督方法对海量KPI进行异常...
  • VAE与GAN做异常检测的原理

    千次阅读 2020-08-12 22:19:53
    近几年,有大量的人用VAE和GAN来做异常检测,用这两个模型做异常检测的假设都是一样的,即假定正常数据是服从某一种分布的,而异常数据是不能够拟合进这个分布的,因此我们可以用VAE和GAN来找到正常数据的分布,从而...
  • 变分自编码(VAE)用于时序异常检测的 demo 实现过程详细介绍。
  • VAE异常检测论文复现——Anomaly Detection for Skin Disease Images Using Variational Autoencoder数据集下载数据集预处理及数据集调用深度学习网络结构Loss函数的选择实验结果  今天内容是复现论文Anomaly ...
  • 《异常检测——从经典算法到深度...7 基于条件VAE异常检测 8 Donut: 基于 VAE 的 Web 应用周期性 KPI 无监督异常检测 9 异常检测资料汇总(持续更新&抛砖引玉) 10 基于条件 VAE 的鲁棒无监督KPI异常检测 11 针对
  • 基于VAE 利用重建概率的异常检测

    千次阅读 2020-06-23 21:54:13
    1 VAE和AE的区别 AE 将输入变量直接编码成隐藏层变量,再解码成输出变量,VAE 也有编码和...摘要: 本文提出了一种利用变分自动编码器重构概率的异常检测方法, https://www.cnblogs.com/asawang/p/10407551.html ..
  • VAE逻辑整理及VAE异常检测中的小实验(附代码)Variance和control variate两种常见的分类器相应代码Minst数据集的训练和重构KDD99数据  本文主要讲解一下整个VAE变分推理在实践当中的逻辑,其中会结合案例讲一讲...
  • 基于变分自编码器(VAE)利用重建概率的异常检测 本文为博主翻译自:Jinwon的Variational Autoencoder based Anomaly Detection using Reconstruction Probability,如侵立删 ... ...我们提出了一种利用变分自动...
  • 《异常检测——从经典算法到深度学习...7 基于条件VAE异常检测 8 Donut: 基于 VAE 的 Web 应用周期性 KPI 无监督异常检测 9 异常检测资料汇总(持续更新&抛砖引玉) 10 Bagel: 基于条件 VAE 的鲁棒无监督KPI异常检
  • 异常检测是异常值分析中的一项统计任务,但是如果我们开发一个机器学习模型来自动化地进行异常检测,可以节省很多时间。异常检测有很多用例,包括信用卡欺诈检测、故障机器检测、基于异常特征的硬件系统检测、基于...
  • 异常检测 综述
  • VQ-VAE + Transformer真香!其中用到了Performer模型,表现SOTA!性能优于AE等网络。 Unsupervised Brain Anomaly Detection and Segmentation with Transformers 作者单位:伦敦国王学院, 伦敦大学学院 论文...
  • 异常检测

    2021-02-20 11:51:50
    异常检测算法这些算法可以直接运行:(可以在“ Vae”目录中找到数据集结构)BeatGAN:B.Zhou,S.Liu,B.Hooi,X.Cheng和J.Ye,“ Beatgan:使用对抗性生成的时间序列进行异常节律检测”,IJCAI,2019年,第4433–...
  • 基于变分自编码器(VAE)利用重建概率的异常检测
  • 《异常检测——从经典算法到...7 基于条件VAE异常检测 8 (实验一)基于重构概率的 VAE 异常检测 8. (实验一)基于重构概率的 VAE 异常检测 8.1 实验概述 8.1.1 实验目的 通过本次实验实现论文 《Variational Auto

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 674
精华内容 269
关键字:

vae异常检测