【问题标题】:Practical determination of anomaly threshold in (variational) autoencoders(变分)自编码器中异常阈值的实际确定
【发布时间】:2018-11-07 21:55:27
【问题描述】:

虽然严格来说不是一个编程问题,但我在这个网站上没有找到任何关于这个主题的信息。我目前正在处理(变分)自动编码器((V)AE),并计划部署它们来检测异常。出于测试目的,我在 tensorflow 中实现了一个 VAE 来检测手写数字。

训练进行得很顺利,重建的图像与原始图像非常相似。但是对于实际使用自动编码器,我必须通过将其与阈值进行比较来确定输入自动编码器的新图像是否为数字。

此时,我有两个主要问题:

1.) 对于训练,我使用了由两个组件组成的损失。第一个是重构误差,它是一个交叉熵函数:

# x: actual input
# x_hat: reconstructed input
epsilon = 1e-10  # <-- small number for numeric stability within log
recons_loss = - f.reduce_sum( x * tf.log( epsilon + x_hat) + (1 - x) * tf.log( epsilon + 1 - x_hat),
                             axis=1)

第二个是 KL 散度,它衡量两个概率分布的相似程度,因为我们要求潜在变量空间是类似于高斯分布的分布。

# z_mean: vector representing the means of the latent distribution
# z_log_var: vector representing the variances of the latent distribution
KL_div = -0.5 * tf.reduce_sum( 1 + z_log_var - tf.square(z_mean) - tf.exp(z_log_var),
                              axis=1)

为了确定新图像的重建误差,我是否必须使用训练损失的两个部分?直观地说,我会说不,直接使用 recon_loss。

2.) 如何确定阈值?是否已经实现了我可以使用的 tf 功能?

如果您有任何相关的好资源,请分享链接!

谢谢!

【问题讨论】:

    标签: python tensorflow threshold autoencoder


    【解决方案1】:

    我最近遇到了类似的问题。 VAE 非常擅长将高维数据投影到低维潜在空间中。改变潜在向量并将其馈送到解码器部分会创建新样本。

    我希望你的问题是正确的,你尝试在低维潜在空间上使用编码器部分进行异常检测?

    我猜你已经在 MNIST 上训练了你的 VAE。您可以做的是获取 MNIST 数字的所有潜在向量,并通过与它们的欧几里得距离比较新数字的潜在向量。阈值将是您设置的最大距离。

    代码是这样的:

    x_mnist_encoded = encoder.predict(x_mnist, batch_size=batch_size) #array of MNIST latent vectors
    test_digit_encoded = encoder.predict(x_testdigit, batch_size=1) #your testdigit latent vector
    
    #calc the distance
    from scipy.spatial import distance
    threshold = 0.3 #min eucledian distance
    
    for vector in x_mnist_encoded:
     dst = distance.euclidean(vector,test_digit_encoded[0])
    
     if dst <= threshold:
      return True
    

    VAE 代码来自https://blog.keras.io/building-autoencoders-in-keras.html

    【讨论】:

    • 为了清楚起见:我已经在 MNIST 上训练了我的 VAE,现在我想测试它是否可以检测到是否输入了非数字图像,例如。 G。一个“X”。这应该以某种方式表示。我认为我使用了编码器和解码器这两个部分,并以某种方式将原始图像与我的重建图像进行了比较。我不知道欧几里得距离是否适合这个。
    • 你描述的是一个简单的二元分类问题。如果您真的想将 VAE 模型用作某种无监督模型。您将只使用编码器部分的潜在向量表示。
    • 解码器很酷,可以生成新数字。进行分类的另一种方法是在 MNIST 潜在向量上拟合 oneclassSVM。
    • 好的,这很有道理。但是,将新图像与潜在空间中的所有 MNIST 数字进行比较在计算上不是很昂贵吗?另外,假设我的潜在空间是二维的,公式会是什么样子?对我来说,总结均值和方差的平方差似乎很奇怪,因为这就像把苹果加到香蕉上一样。
    • 另外,我发现了一篇有趣的论文here。它不使用模型的潜在表示,而是重建其输入并使用自定义重建概率来评估输入是否异常。这与你的提议相矛盾。你能澄清一下吗? @丹尼尔特雷默
    猜你喜欢
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 2017-08-04
    • 2022-01-14
    • 1970-01-01
    • 2013-07-22
    相关资源
    最近更新 更多