论文题目:Generative Adversarial Active Learning for Unsupervised Outlier Detection(2019.03被TKDE录用)
论文代码:
https://github.com/leibinghe/GAAL-based-outlier-detectiongithub.com
本文中的两种算法:单目标生成对抗主动学习和多目标生成对抗主动学习在实现上并不复杂,是通用的基于向量数据的异常检测算法,已经被集成在了异常检测的 python 包 pyod 中:
https://github.com/yzhao062/pyodgithub.com
1 背景
异常就是和其他数据的特征不一致的数据。如何准确、快速的检测出这些异常数据在许多实际应用(如入侵检测、欺诈检测、紧急事件检测等)中扮演着重要的角色。
现有的异常检测方法中,基于统计的模型,基于回归的模型,基于聚类的模型,基于重建的模型等,需要假设正常数据的生成机制。然而,缺乏数据特征的先验信息会导致无法选择合适的模型和参数。无参化的方法,如基于亲密度的模型(kNN, LOF 等)不需要考虑数据的分布。但是,随着数据的维度和数据量的增加,模型的效率和有效性会大打折扣。
因此,本文通过人工生成潜在的异常数据,提出了无监督的异常检测算法。(本文有一个假设,原始的数据都是正常的数据。)
本文方法最直观的理解:利用生成对抗的思想,生成器从随机噪声中生成异常数据,判别器判别数据是生成的异常数据还是原始的正常数据。生成器的目标是生成尽可能和正常数据相似的数据,让判别器无法识别出;判别器的目标是尽可能判别出真实数据和异常数据。两者进行博弈,最终达到平衡。
在最后的异常检测过程中,对于给定的一条数据,只需要利用判别器判别出是正常数据还是异常数据,相当于二分类。
本文有两种生成器,单一目标的生成器和多目标的生成器,对应文中的两种算法,具体的设计原理接下来讲解。
2 方法
2.1 将异常检测看作分类问题
给定一个数据集,每个数据会有一个标签表示正常/异常(正常=1,异常=0)。异常检测就是找到一个边界,将异常数据和正常数据分离开。可以通过最小化该目标函数来得到最优边界:
和
表示分错的代价,
为打分函数。需要找到最优的打分函数
来最小化目标函数。
因此,我们可以假设异常数据周围的密度低于正常数据的密度。如下图(a)所示。
基于上诉假设,可以从一个分布
中生成一些异常数据。然后定义一个相对密度函数
和阈值
,判断数据是否为异常:
但是计算相对密度需要大量的计算资源,可以将密度计算替换为分类。具体过程为:从一个分布
中生成一些异常数据,然后直接训练一个分类器,只需要让这个分类器的输出满足基于密度的假设。
然而,随着数据维度的增加,生成有限的异常数据,这些异常数据的密度可能趋近于0,导致分类器无法得到正确的边界。如下图所示:
2.2 基于单目标生成对抗主动学习的异常检测
通过生成对抗网络能够生成足够多的异常数据,从而获得正确的边界。
如上图所示,生成器从随机噪声中生成异常数据,判别器判别数据是生成的异常数据还是原始的正常数据。
不要忘了前提假设:异常数据周围的密度低于正常数据的密度。那么如何能够保证这个假设成立呢?需要考虑如下两点:
- 如何设计生成器的网络结构和初始化参数。防止生成的数据过于集中。
- 多少次迭代次数能保证判别器的性能。
2.3 基于多目标生成对抗主动学习的异常检测
多目前和单目标的区别在于:多目标有 k 个子生成器和一个判别器。
其核心思想:让每一个子生成器从原始数据的子集中生成数据,这样多个生成器可以生成更加多样性的异常数据。
具体过程如下:
(1)根据原始数据的相似性,将原始数据分为 k 个子集
(2)对于每一个子集,根据其对应的生成器,生成异常数据,将子集的真实数据和异常数据送给判别器去判别。